github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/eth/metrics.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:37</date>
    10  //</624450089351385088>
    11  
    12  
    13  package eth
    14  
    15  import (
    16  	"github.com/ethereum/go-ethereum/metrics"
    17  	"github.com/ethereum/go-ethereum/p2p"
    18  )
    19  
    20  var (
    21  	propTxnInPacketsMeter     = metrics.NewRegisteredMeter("eth/prop/txns/in/packets", nil)
    22  	propTxnInTrafficMeter     = metrics.NewRegisteredMeter("eth/prop/txns/in/traffic", nil)
    23  	propTxnOutPacketsMeter    = metrics.NewRegisteredMeter("eth/prop/txns/out/packets", nil)
    24  	propTxnOutTrafficMeter    = metrics.NewRegisteredMeter("eth/prop/txns/out/traffic", nil)
    25  	propHashInPacketsMeter    = metrics.NewRegisteredMeter("eth/prop/hashes/in/packets", nil)
    26  	propHashInTrafficMeter    = metrics.NewRegisteredMeter("eth/prop/hashes/in/traffic", nil)
    27  	propHashOutPacketsMeter   = metrics.NewRegisteredMeter("eth/prop/hashes/out/packets", nil)
    28  	propHashOutTrafficMeter   = metrics.NewRegisteredMeter("eth/prop/hashes/out/traffic", nil)
    29  	propBlockInPacketsMeter   = metrics.NewRegisteredMeter("eth/prop/blocks/in/packets", nil)
    30  	propBlockInTrafficMeter   = metrics.NewRegisteredMeter("eth/prop/blocks/in/traffic", nil)
    31  	propBlockOutPacketsMeter  = metrics.NewRegisteredMeter("eth/prop/blocks/out/packets", nil)
    32  	propBlockOutTrafficMeter  = metrics.NewRegisteredMeter("eth/prop/blocks/out/traffic", nil)
    33  	reqHeaderInPacketsMeter   = metrics.NewRegisteredMeter("eth/req/headers/in/packets", nil)
    34  	reqHeaderInTrafficMeter   = metrics.NewRegisteredMeter("eth/req/headers/in/traffic", nil)
    35  	reqHeaderOutPacketsMeter  = metrics.NewRegisteredMeter("eth/req/headers/out/packets", nil)
    36  	reqHeaderOutTrafficMeter  = metrics.NewRegisteredMeter("eth/req/headers/out/traffic", nil)
    37  	reqBodyInPacketsMeter     = metrics.NewRegisteredMeter("eth/req/bodies/in/packets", nil)
    38  	reqBodyInTrafficMeter     = metrics.NewRegisteredMeter("eth/req/bodies/in/traffic", nil)
    39  	reqBodyOutPacketsMeter    = metrics.NewRegisteredMeter("eth/req/bodies/out/packets", nil)
    40  	reqBodyOutTrafficMeter    = metrics.NewRegisteredMeter("eth/req/bodies/out/traffic", nil)
    41  	reqStateInPacketsMeter    = metrics.NewRegisteredMeter("eth/req/states/in/packets", nil)
    42  	reqStateInTrafficMeter    = metrics.NewRegisteredMeter("eth/req/states/in/traffic", nil)
    43  	reqStateOutPacketsMeter   = metrics.NewRegisteredMeter("eth/req/states/out/packets", nil)
    44  	reqStateOutTrafficMeter   = metrics.NewRegisteredMeter("eth/req/states/out/traffic", nil)
    45  	reqReceiptInPacketsMeter  = metrics.NewRegisteredMeter("eth/req/receipts/in/packets", nil)
    46  	reqReceiptInTrafficMeter  = metrics.NewRegisteredMeter("eth/req/receipts/in/traffic", nil)
    47  	reqReceiptOutPacketsMeter = metrics.NewRegisteredMeter("eth/req/receipts/out/packets", nil)
    48  	reqReceiptOutTrafficMeter = metrics.NewRegisteredMeter("eth/req/receipts/out/traffic", nil)
    49  	miscInPacketsMeter        = metrics.NewRegisteredMeter("eth/misc/in/packets", nil)
    50  	miscInTrafficMeter        = metrics.NewRegisteredMeter("eth/misc/in/traffic", nil)
    51  	miscOutPacketsMeter       = metrics.NewRegisteredMeter("eth/misc/out/packets", nil)
    52  	miscOutTrafficMeter       = metrics.NewRegisteredMeter("eth/misc/out/traffic", nil)
    53  )
    54  
    55  //meteredmsgreadwriter是p2p.msgreadwriter的包装器,能够
    56  //基于数据流内容累积上述定义的度量。
    57  type meteredMsgReadWriter struct {
    58  p2p.MsgReadWriter     //将消息流打包到仪表
    59  version           int //选择正确仪表的协议版本
    60  }
    61  
    62  //newmeteredmsgwriter使用计量支持包装p2p msgreadwriter。如果
    63  //度量系统被禁用,此函数返回原始对象。
    64  func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter {
    65  	if !metrics.Enabled {
    66  		return rw
    67  	}
    68  	return &meteredMsgReadWriter{MsgReadWriter: rw}
    69  }
    70  
    71  //init设置流使用的协议版本,以知道要
    72  //协议版本之间的消息ID重叠时递增。
    73  func (rw *meteredMsgReadWriter) Init(version int) {
    74  	rw.version = version
    75  }
    76  
    77  func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
    78  //读取信息,并在出现错误时短路
    79  	msg, err := rw.MsgReadWriter.ReadMsg()
    80  	if err != nil {
    81  		return msg, err
    82  	}
    83  //计算数据流量
    84  	packets, traffic := miscInPacketsMeter, miscInTrafficMeter
    85  	switch {
    86  	case msg.Code == BlockHeadersMsg:
    87  		packets, traffic = reqHeaderInPacketsMeter, reqHeaderInTrafficMeter
    88  	case msg.Code == BlockBodiesMsg:
    89  		packets, traffic = reqBodyInPacketsMeter, reqBodyInTrafficMeter
    90  
    91  	case rw.version >= eth63 && msg.Code == NodeDataMsg:
    92  		packets, traffic = reqStateInPacketsMeter, reqStateInTrafficMeter
    93  	case rw.version >= eth63 && msg.Code == ReceiptsMsg:
    94  		packets, traffic = reqReceiptInPacketsMeter, reqReceiptInTrafficMeter
    95  
    96  	case msg.Code == NewBlockHashesMsg:
    97  		packets, traffic = propHashInPacketsMeter, propHashInTrafficMeter
    98  	case msg.Code == NewBlockMsg:
    99  		packets, traffic = propBlockInPacketsMeter, propBlockInTrafficMeter
   100  	case msg.Code == TxMsg:
   101  		packets, traffic = propTxnInPacketsMeter, propTxnInTrafficMeter
   102  	}
   103  	packets.Mark(1)
   104  	traffic.Mark(int64(msg.Size))
   105  
   106  	return msg, err
   107  }
   108  
   109  func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {
   110  //计算数据流量
   111  	packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
   112  	switch {
   113  	case msg.Code == BlockHeadersMsg:
   114  		packets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter
   115  	case msg.Code == BlockBodiesMsg:
   116  		packets, traffic = reqBodyOutPacketsMeter, reqBodyOutTrafficMeter
   117  
   118  	case rw.version >= eth63 && msg.Code == NodeDataMsg:
   119  		packets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter
   120  	case rw.version >= eth63 && msg.Code == ReceiptsMsg:
   121  		packets, traffic = reqReceiptOutPacketsMeter, reqReceiptOutTrafficMeter
   122  
   123  	case msg.Code == NewBlockHashesMsg:
   124  		packets, traffic = propHashOutPacketsMeter, propHashOutTrafficMeter
   125  	case msg.Code == NewBlockMsg:
   126  		packets, traffic = propBlockOutPacketsMeter, propBlockOutTrafficMeter
   127  	case msg.Code == TxMsg:
   128  		packets, traffic = propTxnOutPacketsMeter, propTxnOutTrafficMeter
   129  	}
   130  	packets.Mark(1)
   131  	traffic.Mark(int64(msg.Size))
   132  
   133  //将数据包发送到P2P层
   134  	return rw.MsgReadWriter.WriteMsg(msg)
   135  }
   136