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