github.com/c4dt/go-ethereum@v1.9.2/les/metrics.go (about) 1 // Copyright 2016 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package les 18 19 import ( 20 "github.com/ethereum/go-ethereum/metrics" 21 "github.com/ethereum/go-ethereum/p2p" 22 ) 23 24 var ( 25 miscInPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets", nil) 26 miscInTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic", nil) 27 miscOutPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets", nil) 28 miscOutTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic", nil) 29 30 connectionTimer = metrics.NewRegisteredTimer("les/connectionTime", nil) 31 32 totalConnectedGauge = metrics.NewRegisteredGauge("les/server/totalConnected", nil) 33 totalCapacityGauge = metrics.NewRegisteredGauge("les/server/totalCapacity", nil) 34 totalRechargeGauge = metrics.NewRegisteredGauge("les/server/totalRecharge", nil) 35 blockProcessingTimer = metrics.NewRegisteredTimer("les/server/blockProcessingTime", nil) 36 requestServedTimer = metrics.NewRegisteredTimer("les/server/requestServed", nil) 37 requestServedMeter = metrics.NewRegisteredMeter("les/server/totalRequestServed", nil) 38 requestEstimatedMeter = metrics.NewRegisteredMeter("les/server/totalRequestEstimated", nil) 39 relativeCostHistogram = metrics.NewRegisteredHistogram("les/server/relativeCost", nil, metrics.NewExpDecaySample(1028, 0.015)) 40 recentServedGauge = metrics.NewRegisteredGauge("les/server/recentRequestServed", nil) 41 recentEstimatedGauge = metrics.NewRegisteredGauge("les/server/recentRequestEstimated", nil) 42 sqServedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/served", nil) 43 sqQueuedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/queued", nil) 44 clientConnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/connected", nil) 45 clientRejectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/rejected", nil) 46 clientKickedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/kicked", nil) 47 clientDisconnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/disconnected", nil) 48 clientFreezeMeter = metrics.NewRegisteredMeter("les/server/clientEvent/freeze", nil) 49 clientErrorMeter = metrics.NewRegisteredMeter("les/server/clientEvent/error", nil) 50 ) 51 52 // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of 53 // accumulating the above defined metrics based on the data stream contents. 54 type meteredMsgReadWriter struct { 55 p2p.MsgReadWriter // Wrapped message stream to meter 56 version int // Protocol version to select correct meters 57 } 58 59 // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the 60 // metrics system is disabled, this function returns the original object. 61 func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter { 62 if !metrics.Enabled { 63 return rw 64 } 65 return &meteredMsgReadWriter{MsgReadWriter: rw} 66 } 67 68 // Init sets the protocol version used by the stream to know which meters to 69 // increment in case of overlapping message ids between protocol versions. 70 func (rw *meteredMsgReadWriter) Init(version int) { 71 rw.version = version 72 } 73 74 func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) { 75 // Read the message and short circuit in case of an error 76 msg, err := rw.MsgReadWriter.ReadMsg() 77 if err != nil { 78 return msg, err 79 } 80 // Account for the data traffic 81 packets, traffic := miscInPacketsMeter, miscInTrafficMeter 82 packets.Mark(1) 83 traffic.Mark(int64(msg.Size)) 84 85 return msg, err 86 } 87 88 func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error { 89 // Account for the data traffic 90 packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter 91 packets.Mark(1) 92 traffic.Mark(int64(msg.Size)) 93 94 // Send the packet to the p2p layer 95 return rw.MsgReadWriter.WriteMsg(msg) 96 }