以太坊 指标测量与监控
以太坊使用开源的指标测量工具 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 有点类似于程序中的 ...