Hyperledger Fabric 1.4 特性调研之Operations Service(二)

Operations Service提供监控管理服务,主要包括:

  • 日志等级管理(/logspec):动态获取和设置peer和orderer的日志等级。
  • 健康检查(/healthz ):检查peer和orderer是否存活以及健康状态。
  • 运维信息监控(/metrics ):提供运维指标数据,支持Prometheus和StatsD统计数据。

适用场景

  • 日志等级管理:适用于联盟链管理人员或者开发人员对Fabric的日志等级进行实时变更以定位问题。
  • 健康检查:可以获知节点的健康状况,兼容Kubernetes的容器检测探针liveness probe等。
  • 运维信息监控:主要对外提供运维信息数据,适用于联盟链管理人员对Fabric的运行情况进行实时监控;可以支持第三方运维工具的集成,对Fabric运行状况和性能进行分析。

技术实现

Operation Service在peer或orderer启动的过程中,创建了一个http服务器处理日志等级管理、健康检查和运维信息获取三类请求。

1)日志等级管理

日志管理主体功能模块位于common/flogging,主要基于高性能的zap日志库,对zapcore进行了定制开发。通过重写zapcore的Check函数(common/flogging/core.go,在Write之前调用),对将要写入的日志进行等级判断,实现日志等级的实时变更。

2)健康检查

健康检查通过查询Docker服务的状态来确定peer和orderer是否仍处于健康状态。只要结构体实现HealthCheck(context.Context) error(位于github.com/hyperledger/fabric-lib-go/healthz/checker.go)的健康检查接口,并且通过RegisterChecker函数进行注册,则可以实现对应功能的健康检查。官网上说暂时只支持对docker容器的检查,目前本文调研时使用的版本(commitID为334a66f17e91666d583ec1e5720419de38153ebd)可以支持如下检查:

  • peer:couchdb是否可以正常连接;docker容器是否可以连接;
  • orderer:是否可以向kafka发送消息。

3)运维信息监控

运维信息监控包括Prometheus和StatsD两种第三方组件的接入:

A. Prometheus

Prometheus是开源的监控框架。Fabric支持Prometheus接入,主要使用go-kit库和Prometheus库。
Prometheus记载的时序数据分为四种:Counter, Gauge, Histogram, Summary。Fabric仅使用了前三种,这三种类型的简介如下:

  • Counter:单调递增的计数器,常用于记录服务请求总量、任务完成数目、错误总数等。
  • Gauge:一个单独的数值,可以增加或减少,常用于记录内存使用率、磁盘使用率、并发请求数等。
  • Histogram:直方图采样数据,对一段时间范围内的数据进行采样,按照指定区间和总数进行统计,会生成三个记录数据<basename>_bucket,<basename>_count和<basename>_sum。其中bucket形式为<basename>_bucket{le="<upper inclusive bound>"};count是bucket数目,即<basename>_bucket{le="+Inf"}的值;sum是总数。
    Fabric在需要记录信息的模块,创建相应的结构体,比如peer endorser模块的EndorserMetrics:
var (
    proposalDurationHistogramOpts = metrics.HistogramOpts{
        Namespace:    "endorser",
        Name:         "propsal_duration",
        Help:         "The time to complete a proposal.",
        LabelNames:   []string{"channel", "chaincode", "success"},
        StatsdFormat: "%{#fqname}.%{channel}.%{chaincode}.%{success}",
    }

    receivedProposalsCounterOpts = metrics.CounterOpts{
        Namespace: "endorser",
        Name:      "proposals_received",
        Help:      "The number of proposals received.",
    }

    successfulProposalsCounterOpts = metrics.CounterOpts{
        Namespace: "endorser",
        Name:      "successful_proposals",
        Help:      "The number of successful proposals.",
    }
    ……
)
func NewEndorserMetrics(p metrics.Provider) *EndorserMetrics {
    return &EndorserMetrics{
        ProposalDuration:         p.NewHistogram(proposalDurationHistogramOpts),
        ProposalsReceived:        p.NewCounter(receivedProposalsCounterOpts),
        SuccessfulProposals:      p.NewCounter(successfulProposalsCounterOpts),
        ProposalValidationFailed: p.NewCounter(proposalValidationFailureCounterOpts),
        ProposalACLCheckFailed:   p.NewCounter(proposalChannelACLFailureOpts),
        InitFailed:               p.NewCounter(initFailureCounterOpts),
        EndorsementsFailed:       p.NewCounter(endorsementFailureCounterOpts),
        DuplicateTxsFailure:      p.NewCounter(duplicateTxsFailureCounterOpts),
    }
}

Fabric将需要记录的信息写入相应的指标记录器中,代码如下:

// ProcessProposal process the Proposal
func (e *Endorser) ProcessProposal(ctx context.Context, signedProp *pb.SignedProposal) (*pb.ProposalResponse, error) {
    // start time for computing elapsed time metric for successfully endorsed proposals
    startTime := time.Now()
    // 请求接收数目加1
    e.Metrics.ProposalsReceived.Add(1)
……
            meterLabels := []string{
                "channel", chainID,
                "chaincode", hdrExt.ChaincodeId.Name + ":" + hdrExt.ChaincodeId.Version,
                "success", strconv.FormatBool(success),
            }
            // 添加请求时长值
            e.Metrics.ProposalDuration.With(meterLabels...).Observe(time.Since(startTime).Seconds())

目前Fabric统计的指标具体参见:https://hyperledger-fabric.readthedocs.io/en/release-1.4/metrics_reference.html

B. StatsD

StatsD是一个简单的网络守护进程,基于 Node.js,通过 UDP 或者 TCP 方式侦听各种统计信息,并发送聚合信息到后端服务,如 Graphite。Fabric支持StatsD接入,主要使用go-kit库,记载的时序数据也是分为Counter, Gauge, Histogram(实际上是StatsD中的Timer)三种,使用逻辑和Prometheus类似,但是读取数据的方式上看,Prometheus是从Fabric拉取数据,而StatsD是Fabric向StatsD推送数据。

实际操作

Operations Service可以配置监听地址和TLS,配置内容如下:

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:        # most operations service endpoints require client authentication when TLS        # is enabled. clientAuthRequired requires client certificate authentication        # at the TLS layer to access all resources.        clientAuthRequired: false        # paths to PEM encoded ca certificates to trust for client authentication        clientRootCAs:            files: []

1)日志等级管理

查看日志等级可以使用如下命令:

curl http://127.0.0.1:9443/logspec

其中地址和端口为peer或orderer映射出的地址和端口(默认端口是9443),获得信息示例如下:

{"spec":"info"}

设置日志等级可以使用如下命令:

curl -i -X PUT -H "Content-Type: application/json" -d "{\"spec\":\"debug\"}" http://127.0.0.1:9443/logspec

设置以后可以查看log,实时生效。
设置日志等级时传入参数的格式如下,可以支持多模块不同日志等级。

[<logger>[,<logger>...]=]<level>[:[<logger>[,<logger>...]=]<level>...]

目前,不同模块设置不同日志等级的情况,只有官网提供的修改合约日志等级的参数,如下所示:

{"spec":"chaincode=debug:info"}

2)健康检查

查看健康情况可以使用如下命令:

curl http://127.0.0.1:9443/healthz

其中地址和端口为peer或orderer映射出的地址和端口(默认端口是9443),正常情况下获得信息示例如下:

{"status":"OK","time":"2019-06-04T09:31:39.2034071Z"}

目前peer可以检查docker容器和couchdb是否可以正常连接;orderer可以检查kafka是否可以向其发送消息。如果peer的couchdb容器宕机了,获得信息如下:

{
    "status": "Service Unavailable",
    "time": "2019-06-05T03:33:58.4322205Z",
    "failed_checks": [
        {
            "component": "couchdb",
            "reason": "failed to connect to couch db [Head http://couchdb0:5984: dial tcp: lookup couchdb0 on 127.0.0.11:53: no such host]"
        }
    ]
}

3)运维信息监控

Prometheus

A. 安装Prometheus

首先,从官网(https://prometheus.io/download/)下载Prometheus的软件包,直接解压到相应目录即可,命令如下:

tar xvfz prometheus-*.tar.gz
cd prometheus-*

B. 修改Prometheus相关配置文件

【此处使用fabric-sample中提供的first-network示例】
修改Fabric的docker-compose.yaml文件,在peer的环境变量中添加:

- CORE_METRICS_PROVIDER=prometheus

在orderer的环境变量中添加:

- CORE_METRICS_PROVIDER=prometheus

需要修改prometheus.yml文件,添加Fabric环境中的peer和orderer参数,具体参照如下内容:

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
scrape_configs:
  - job_name:       'fabric'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9443']
        labels:
          group: 'peer0_org1'

      - targets: ['localhost:10443']
        labels:
          group: 'peer1_org1'

      - targets: ['localhost:11443']
        labels:
          group: 'peer0_org2'

      - targets: ['localhost:12443']
        labels:
          group: 'peer1_org2'

      - targets: ['localhost:8443']
        labels:
          group: 'orderer'

主要关注scrape_configs,其中添加了名字为fabric的job,其中static_configs中添加需要监控的节点,targets中填写operations服务的地址和监听端口(默认是9443),labels.group中填写分组的名称。以上示例把peer分成不同的组,也可以根据组织合并为一个组,如下所示:

static_configs:
      - targets: ['localhost:9443', 'localhost:10443']
        labels:
          group: 'peers_org1'

      - targets: ['localhost:11443', 'localhost:12443']
        labels:
          group: 'peers_org2'

C. 启动Prometheus

首先启动Fabric环境,待Fabric环境启动完成后,运行如下命令启动Prometheus:

./prometheus --config.file=prometheus.yml

使用浏览器访问http://localhost:9090即可查看Prometheus监控面板,可以选择指标或者写入查询语句,点击execute查看图表,如下图所示:

image.png

D. 可以配置Grafana可视化工具

参照官网说明(https://grafana.com/grafana/download)下载Grafana软件后,使用浏览器访问http://localhost:3000(默认用户名admin,密码admin),配置数据源为Prometheus,即可定制可视化监控界面。具体流程可参照https://prometheus.io/docs/visualization/grafana/。界面如下图所示:

image.png

StatsD

A. 下载StatsD + Graphite + Grafana的docker镜像

Graphite主要由监听器carbon,时序数据库whisper和图形展示django-webapp三个组件构成。一般使用StatsD + Graphite + Grafana这三个框架搭建运维可视化界面。该镜像集成了StatsD + Graphite + Grafana 4 + Kamon(https://hub.docker.com/r/kamon/grafana_graphite)。使用如下命令拉取镜像:

docker pull kamon/grafana_graphite

B. 启动docker容器

使用如下命令启动容器:

docker run -d\
 --name graphite\
 --restart=always\
 -p 80:80\
 -p 81:81\
 -p 2003:2003\
 -p 8125:8125/udp\
 -p 8126:8126\
 kamon/grafana_graphite

C. 修改Fabric配置文件

【此处使用fabric-sample中提供的first-network示例】
修改Fabric的docker-compose.yaml文件,在peer的环境变量中添加:

- CORE_METRICS_PROVIDER= statsd
- CORE_METRICS_STATSD_PREFIX=peer0_org1
- CORE_METRICS_STATSD_ADDRESS=192.168.101.76:8125

在orderer的环境变量中添加:

- ORDERER_METRICS_PROVIDER=statsd
- ORDERER_METRICS_STATSD_PREFIX=orderer
- ORDERER_METRICS_STATSD_ADDRESS=192.168.101.76:8125

如上所示,需要配置prefix用于区分节点,配置address是StatsD的地址和端口,即docker容器映射的地址和端口。

D. 查看界面

访问http://localhost:81可以查看Graphite界面,如下:

image.png

访问http://localhost可以查看Grafana界面,具体配置方法见前面Prometheus的描述。界面如下:

image.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容