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进行抓取展示。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容