以太坊 指标测量与监控

以太坊使用开源的指标测量工具 go-metrics 来对系统各模块的功能和性能指标进行测量,并对go-metrics的使用做了些简单的封装。

指标测量与监控功能,默认关闭。可通过在启动geth时指定参数 --metrics 来开启测量。

一、支持的测量类型

1、Counter

计数器,对数量进行统计,这是最简单的测量类型。

2、Meter

物理仪表,用于测量某种东西的流量和速率,要测量的东西可以是任意内容,如字节量、区块量等等。它可以实时报告以下内容:

  • 流经仪表的总数量
  • 从启动以来的平均流速(事件数/秒)
  • 过去1分钟、5分钟、15分钟的加权流速(加权指的是最近的数量拥有更高权重,对流速正向影响更大)

3、Timer

Timer是耗统计。和meter类似,timer也能测量任意事物,但需要再额外指定其耗时。

除了meter能生成的报告外,Timer还能生成如下报告:

  • 百分数(5,20,50,80,95),代表相应比例的事件执行时间在所报告的值以内(例如,百分数 20 = 1.5s 意味着有20%的事件耗时小于等于1.5秒)

二、指标测量的使用

在metrics包下封装了对象构造函数,构造函数会根据启动配置,决定是返回标准的测量对象还是打桩用的Nil对象。

测量对象具体的函数功能,参见类库文档:https://godoc.org/github.com/rcrowley/go-metrics

使用起来很简单,示例:

//1.定义包级变量
//计数器,其中构造函数中的name参数,代表测量对象的名称,使用斜杠分隔可表示其路径,这个路径在最终输出报告时用来归类用,为了报告的合理美观,这需要适当设置。
pendingDiscardCounter   = metrics.NewCounter( "txpool/pending/discard" )
ingressConnectMeter = metrics.NewMeter( "p2p/InboundConnects" )
blockInsertTimer = metrics.NewTimer( "chain/inserts" )

//2.在需要测量的地方
pendingDiscardCounter.Inc( 1 )
ingressConnectMeter.Mark( 1 )
bstart := time.Now()
//DO some thing ...
blockInsertTimer.UpdateSince(bstart)

三、测量报告查看及实时监控

开启测量后,可在控制台或通过RPC接口查看报告。

接口为:debug.metrics(bool),参数表示是否按原始数量输出,true代表按原始数量输出,false代表使用K、M、G、T这种千进制单位做合理转换后输出。

如:

debug.metrics(false) 输出系统中所有的指标报告。如果有些指标定义得层次比较深,那么在控制台将看不见具体值,而是用 {...}表示。

这种时候,可以只展示当前自己想查看的指标,如:debug.metrics(false).p2p 查看p2p路径下的所有指标,debug.metrics(false).p2p.InboundConnects 只查看具体的一项指标。

以太坊还提供了一个控制台图形化的实时监控,方式如下:

geth monitor [--attach=api-endpoint] metric1 metric2 ... metricN

输出示例:

四、其他测量类型

go-metrics还提供了其他几种测量类型,如:

  •  Gauge:包含一个整数,可以随意设置。好像用处不大。
  • EWMA:基于外部时钟持续计算一个指数权重移动平均值。
  • Histogram:从一系列整数数值中计算其分布统计数据,提供计数、最大值、最小值、百分位值等数据。
  • Sample:从一个stream中抽取具有统计学意义的样本,提供计数、最大值、最小值、百分位值等数据。

什么是 ABI?ABI 全称 Application Binary Interface,字面意思是应用程序二进制接口,可以通俗的理解为合约的接口说明,当合约被编译后,它对应的abi也就确定了。ABI 有点类似于程序中的 ...