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