github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/les/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:39</date>
    10  //</624450095537983488>
    11  
    12  
    13  package les
    14  
    15  import (
    16  	"github.com/ethereum/go-ethereum/metrics"
    17  	"github.com/ethereum/go-ethereum/p2p"
    18  )
    19  
    20  var (
    21   /*proptxninpacketsmeter=metrics.newmeter(“eth/prop/txns/in/packets”)。
    22    proptxninttrafficmeter=metrics.newmeter(“eth/prop/txns/in/traffic”)。
    23    proptxnoutpacketsmeter=metrics.newmeter(“eth/prop/txns/out/packets”)。
    24    NewMeter(“ETH/PROP/TXNS/OUT /流量”)
    25    propashinpacketsmeter=metrics.newmeter(“eth/prop/hashes/in/packets”)。
    26    NewMeter(“ET/PROP/散列/IN /流量”)
    27    propashoutpacketsmeter=metrics.newmeter(“eth/prop/hashes/out/packets”)。
    28    propashouttrafficmeter=metrics.newmeter(“eth/prop/hashes/out/traffic”)。
    29    propblockinpacketsmeter=metrics.newmeter(“eth/prop/blocks/in/packets”)。
    30    propBlockInTrafficMeter   = metrics.NewMeter("eth/prop/blocks/in/traffic")
    31    propblockoutpacketsmeter=metrics.newmeter(“eth/prop/blocks/out/packets”)。
    32    PropBlockOutTrafficMeter=metrics.newMeter(“eth/prop/blocks/out/traffic”)。
    33    reqhashinpacketsmeter=metrics.newmeter(“eth/req/hashes/in/packets”)。
    34    reqhashIntraffimeter=metrics.newmeter(“eth/req/hashes/in/traffic”)。
    35    reqhashoutpacketsmeter=metrics.newmeter(“eth/req/hashes/out/packets”)。
    36    reqhashouttrafficmeter=metrics.newmeter(“eth/req/hashes/out/traffic”)。
    37    reqBlockInPacketsMeter    = metrics.NewMeter("eth/req/blocks/in/packets")
    38    reqBlockIntraffimeter=metrics.newmeter(“eth/req/blocks/in/traffic”)。
    39    reqblockoutpacketsmeter=metrics.newmeter(“eth/req/blocks/out/packets”)。
    40    reqblockouttrafficmeter=metrics.newmeter(“eth/req/blocks/out/traffic”)。
    41    reqHeaderInpacketsMeter=metrics.newMeter(“eth/req/headers/in/packets”)。
    42    reqheaderIntrafficemeter=metrics.newmeter(“eth/req/headers/in/traffic”)。
    43    reqHeaderOutPacketsMeter=metrics.newMeter(“eth/req/headers/out/packets”)。
    44    reqHeaderOutTrafficMeter=metrics.newMeter(“eth/req/headers/out/traffic”)。
    45    reqbodyinpacketsmeter=metrics.newmeter(“eth/req/bodies/in/packets”)。
    46    reqbodyIntraffimeter=metrics.newmeter(“eth/req/bodies/in/traffic”)。
    47    reqbodyoutpacketsmeter=metrics.newmeter(“eth/req/body/out/packets”)。
    48    reqbodyouttrafficmeter=metrics.newmeter(“eth/req/bodys/out/traffic”)。
    49    reqstateinpacketsmeter=metrics.newmeter(“eth/req/states/in/packets”)。
    50    reqstateIntraffimeter=metrics.newmeter(“eth/req/states/in/traffic”)。
    51    reqStateOutPacketsMeter   = metrics.NewMeter("eth/req/states/out/packets")
    52    reqstateouttrafficmeter=metrics.newmeter(“eth/req/states/out/traffic”)。
    53    reqReceiptInPacketsMeter  = metrics.NewMeter("eth/req/receipts/in/packets")
    54    reqReceiptInterffimeter=metrics.newmeter(“eth/req/receipts/in/traffic”)。
    55    reqReceiptOutPacketsMeter=metrics.newMeter(“eth/req/receipts/out/packets”)。
    56    reqReceiptOutTrafficMeter=metrics.newMeter(“eth/req/receipts/out/traffic”*/
    57  
    58  	miscInPacketsMeter  = metrics.NewRegisteredMeter("les/misc/in/packets", nil)
    59  	miscInTrafficMeter  = metrics.NewRegisteredMeter("les/misc/in/traffic", nil)
    60  	miscOutPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets", nil)
    61  	miscOutTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic", nil)
    62  )
    63  
    64  //meteredmsgreadwriter是p2p.msgreadwriter的包装器,能够
    65  //基于数据流内容累积上述定义的度量。
    66  type meteredMsgReadWriter struct {
    67  p2p.MsgReadWriter     //将消息流打包到仪表
    68  version           int //选择正确仪表的协议版本
    69  }
    70  
    71  //newmeteredmsgwriter使用计量支持包装p2p msgreadwriter。如果
    72  //度量系统被禁用,此函数返回原始对象。
    73  func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter {
    74  	if !metrics.Enabled {
    75  		return rw
    76  	}
    77  	return &meteredMsgReadWriter{MsgReadWriter: rw}
    78  }
    79  
    80  //init设置流使用的协议版本,以知道要
    81  //协议版本之间的消息ID重叠时递增。
    82  func (rw *meteredMsgReadWriter) Init(version int) {
    83  	rw.version = version
    84  }
    85  
    86  func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
    87  //读取信息,并在出现错误时短路
    88  	msg, err := rw.MsgReadWriter.ReadMsg()
    89  	if err != nil {
    90  		return msg, err
    91  	}
    92  //计算数据流量
    93  	packets, traffic := miscInPacketsMeter, miscInTrafficMeter
    94  	packets.Mark(1)
    95  	traffic.Mark(int64(msg.Size))
    96  
    97  	return msg, err
    98  }
    99  
   100  func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {
   101  //计算数据流量
   102  	packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
   103  	packets.Mark(1)
   104  	traffic.Mark(int64(msg.Size))
   105  
   106  //将数据包发送到P2P层
   107  	return rw.MsgReadWriter.WriteMsg(msg)
   108  }
   109