寫在前面
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"}
返回status
為OK
表明系統健康。(狀態碼為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
進行抓取展示。