fabric 新特性 Operations 服務試用

寫在前面

fabric 1.4 版本重點圍繞生成可用性進行了更新支持。其中新增了一套 Operations 的 RESTful 服務,提供了部分運維管理功能:

  • 日志級別管理
  • 健康檢查
  • 可用Prometheus消費的系統運行指標

本文基于 fabric-sample 提供的例子部署啟動上述服務,試用相關功能,記錄過程便于需要時翻閱。

部署

operations 服務配置

operations 服務可在 peer節點、orderer節點開啟,相關配置分別在 peer 的 core.yaml 和 orderer 的 orderer.yaml 的一級配置項operations中。兩者配置項名稱稍有不通,但內容一。以 peer 的 core.yaml 舉例:

###############################################################################
#
#    Operations section
#
###############################################################################
operations:
    # host and port for the operations server
    listenAddress: 127.0.0.1:9443

    # TLS configuration for the operations endpoint
    tls:
        # TLS enabled
        enabled: false

        # path to PEM encoded server certificate for the operations server
        cert:
            file:

        # path to PEM encoded server key for the operations server
        key:
            file:

        # require client certificate authentication to access all resources
        clientAuthRequired: false

        # paths to PEM encoded ca certificates to trust for client authentication
        clientRootCAs:
            files: []

listenAddress 配置項定義了 RESTful 服務的地址和端口;tls 配置項下定義了是否啟用 TLS 以及相關證書。

第一次嘗試

使用 dev_byfn.sh 啟動一個 1.4 的 fabric 網絡。

dev_byfn.sh 基于 fabric-sample 的 byfn.sh修改,網絡結構調整為單 peer 單 orderer,方便開發及測試

進入 cli 容器嘗試訪問日志級別管理服務端點/logsepc

?  first-network git:(bb39b6e) ? docker exec -it cli bash
root@5bdadcd7d615:/opt/gopath/src/github.com/hyperledger/fabric/peer# curl http://peer0.org1.example.com:9443/logspec
curl: (7) Failed to connect to peer0.org1.example.com port 9443: Connection refused

結果顯示連接被拒絕。
嘗試直接進入 peer 節點容器訪問(由于peer鏡像中未添加bash,缺少 curl命令,采用wget命令代替):

?  first-network git:(bb39b6e) ? docker exec -it peer0.org1.example.com bash
root@c18909ad41da:/opt/gopath/src/github.com/hyperledger/fabric/peer# curl      
bash: curl: command not found
root@c18909ad41da:/opt/gopath/src/github.com/hyperledger/fabric/peer# wget http://peer0.org1.example.com:9443/logspec
--2019-01-17 07:15:37--  http://peer0.org1.example.com:9443/logspec
Resolving peer0.org1.example.com (peer0.org1.example.com)... 192.168.240.3
Connecting to peer0.org1.example.com (peer0.org1.example.com)|192.168.240.3|:9443... failed: Connection refused.

連接依然拒絕,查詢 peer 服務所用配置確定連接信息是否有誤(peer容器內,配置文件路徑為 /etc/hyperledger/fabric/core.yaml)

root@c18909ad41da:/opt/gopath/src/github.com/hyperledger/fabric/peer# cat /etc/hyperledger/fabric/core.yaml |grep -A 10 operations:
operations:
    # host and port for the operations server
    listenAddress: 127.0.0.1:9443

    # TLS configuration for the operations endpoint
    tls:
        # TLS enabled
        enabled: false

服務監聽地址為127.0.0.1:9443,綁定了本地環回地址,所以外部無法訪問。只能在本機使用 127.0.0.1 地址才行。驗證如下:

root@c18909ad41da:/opt/gopath/src/github.com/hyperledger/fabric/peer# wget http://127.0.0.1:9443/logspec
--2019-01-17 07:25:51--  http://127.0.0.1:9443/logspec
Connecting to 127.0.0.1:9443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16 [text/plain]
Saving to: 'logspec.2'

logspec.2                                    100%[============================================================================================>]      16  --.-KB/s    in 0s      

2019-01-17 07:25:51 (204 KB/s) - 'logspec.2' saved [16/16]

root@c18909ad41da:/opt/gopath/src/github.com/hyperledger/fabric/peer# cat logspec.2 
{"spec":"info"}

果然,得到服務正確的返回結果{"spec":"info"}

配置修改

生產應用時,這個配置肯定需要修改,以提供外部訪問。
fabric 配置模塊使用 viper 包進行配置文件解析,支持通過環境變量進行配置項的覆蓋替換。閱讀相關源碼可知,peer 對 core.yaml 的配置解析,設置了 CORE 作為環境變量配置項的前綴,需要用環境修改某個配置項時,設置一個以CORE為前綴然后具體配置項路徑用短下劃線連接起來環境變量并賦新值即可。我們需要修改listenAddress配置項,因此需要設置環境變量CORE_OPERATIONS_LISTENADDRESS,設置其值為peer0.org1.example.com:9443。(修改啟動容器的 docker-compose 文件)

environment:
    ...
    - CORE_OPERATIONS_LISTENADDRESS=peer0.org1.example.com:9443
    ...

如果網絡外需要訪問,則還需要為 peer/orderer 容器設置端口映射

ports:
      - 9443:9443

再次嘗試

修改配置,重新啟動網絡,進入 cli 容器進行訪問:

?  first-network git:(bb39b6e) ? docker exec -it cli bash
root@8abe1cf5cb9d:/opt/gopath/src/github.com/hyperledger/fabric/peer# curl http://peer0.org1.example.com:9443/logspec
{"spec":"info"}

成功得到日志級別信息。
logspec 端點支持 GET 請求獲取日志信息,同時支持PUT 設置新的日志級別:

root@8abe1cf5cb9d:/opt/gopath/src/github.com/hyperledger/fabric/peer# curl --request PUT http://peer0.org1.example.com:9443/logspec -d '{"spec":"chaincode=debug:info"}'
root@8abe1cf5cb9d:/opt/gopath/src/github.com/hyperledger/fabric/peer# curl http://peer0.org1.example.com:9443/logspec                                     
{"spec":"chaincode=debug:info"}

這對于生產問題排查來說,應該很有用

健康檢查

同樣訪問健康檢查端點/healthz:

root@8abe1cf5cb9d:/opt/gopath/src/github.com/hyperledger/fabric/peer# curl http://peer0.org1.example.com:9443/healthz
{"status":"OK","time":"2019-01-17T07:44:46.7200463Z"}

返回statusOK表明系統健康。(狀態碼為200)
根據官方文檔介紹,如果檢查失敗,則會返回503,并有相關的 JSON 信息:

{
  "status": "Service Unavailable",
  "time": "2009-11-10T23:00:00Z",
  "failed_checks": [
    {
      "component": "docker",
      "reason": "failed to connect to Docker daemon: invalid endpoint"
    }
  ]
}

目前僅支持對 docker 是否可用的狀態進行檢測。(攤手.jpg)

運行指標

關于運行指標,其相關配置如下:

###############################################################################
#
#    Metrics section
#
###############################################################################
metrics:
    # metrics provider is one of statsd, prometheus, or disabled
    provider: disabled

通過 RESTful 端點服務提供指標信息的用于 prometheus,所以我們需要先將metrics.provider設置為prometheus。根據之前的方法,我們設置環境變量CORE_METRICS_PROVIDER:

 environment:
    ...
    - CORE_METRICS_PROVIDER=prometheus
    ...

進入 cli 容器訪問指標端點/metrics:

?  first-network git:(bb39b6e) ? docker exec -it cli bash  
root@8abe1cf5cb9d:/opt/gopath/src/github.com/hyperledger/fabric/peer# curl http://peer0.org1.example.com:9443/metrics   
# HELP chaincode_launch_duration The time to launch a chaincode.
# TYPE chaincode_launch_duration histogram
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="0.005"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="0.01"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="0.025"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="0.05"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="0.1"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="0.25"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="0.5"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="1"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="2.5"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="5"} 1
chaincode_launch_duration_bucket{chaincode="cscc:1.4.0",success="true",le="10"} 1
......

metric 提供的指標很多,包括賬本、交易、cc等各方面的運行數據,非常豐富,具體可見官網Metrics Reference

總結

  • 日志級別信息的動態獲取及設置,對生產問題排查來說很有用,可以在運行中修改日志級別;
  • 健康檢查目前很雞肋,只能用于檢查 docker 可用性,期待后續的其他檢查點的支持;
  • 運行指標很有用。很多鏈上的信息不需要第三方平臺或者客戶端自己去存儲、記錄獲取了,直接開啟運行指標,然后用prometheus或者StatsD進行抓取展示。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容