github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/les/metrics.go (about)

     1  package les
     2  
     3  import (
     4  	"github.com/quickchainproject/quickchain/metrics"
     5  	"github.com/quickchainproject/quickchain/p2p"
     6  )
     7  
     8  var (
     9  	/*	propTxnInPacketsMeter     = metrics.NewMeter("let/prop/txns/in/packets")
    10  		propTxnInTrafficMeter     = metrics.NewMeter("let/prop/txns/in/traffic")
    11  		propTxnOutPacketsMeter    = metrics.NewMeter("let/prop/txns/out/packets")
    12  		propTxnOutTrafficMeter    = metrics.NewMeter("let/prop/txns/out/traffic")
    13  		propHashInPacketsMeter    = metrics.NewMeter("let/prop/hashes/in/packets")
    14  		propHashInTrafficMeter    = metrics.NewMeter("let/prop/hashes/in/traffic")
    15  		propHashOutPacketsMeter   = metrics.NewMeter("let/prop/hashes/out/packets")
    16  		propHashOutTrafficMeter   = metrics.NewMeter("let/prop/hashes/out/traffic")
    17  		propBlockInPacketsMeter   = metrics.NewMeter("let/prop/blocks/in/packets")
    18  		propBlockInTrafficMeter   = metrics.NewMeter("let/prop/blocks/in/traffic")
    19  		propBlockOutPacketsMeter  = metrics.NewMeter("let/prop/blocks/out/packets")
    20  		propBlockOutTrafficMeter  = metrics.NewMeter("let/prop/blocks/out/traffic")
    21  		reqHashInPacketsMeter     = metrics.NewMeter("let/req/hashes/in/packets")
    22  		reqHashInTrafficMeter     = metrics.NewMeter("let/req/hashes/in/traffic")
    23  		reqHashOutPacketsMeter    = metrics.NewMeter("let/req/hashes/out/packets")
    24  		reqHashOutTrafficMeter    = metrics.NewMeter("let/req/hashes/out/traffic")
    25  		reqBlockInPacketsMeter    = metrics.NewMeter("let/req/blocks/in/packets")
    26  		reqBlockInTrafficMeter    = metrics.NewMeter("let/req/blocks/in/traffic")
    27  		reqBlockOutPacketsMeter   = metrics.NewMeter("let/req/blocks/out/packets")
    28  		reqBlockOutTrafficMeter   = metrics.NewMeter("let/req/blocks/out/traffic")
    29  		reqHeaderInPacketsMeter   = metrics.NewMeter("let/req/headers/in/packets")
    30  		reqHeaderInTrafficMeter   = metrics.NewMeter("let/req/headers/in/traffic")
    31  		reqHeaderOutPacketsMeter  = metrics.NewMeter("let/req/headers/out/packets")
    32  		reqHeaderOutTrafficMeter  = metrics.NewMeter("let/req/headers/out/traffic")
    33  		reqBodyInPacketsMeter     = metrics.NewMeter("let/req/bodies/in/packets")
    34  		reqBodyInTrafficMeter     = metrics.NewMeter("let/req/bodies/in/traffic")
    35  		reqBodyOutPacketsMeter    = metrics.NewMeter("let/req/bodies/out/packets")
    36  		reqBodyOutTrafficMeter    = metrics.NewMeter("let/req/bodies/out/traffic")
    37  		reqStateInPacketsMeter    = metrics.NewMeter("let/req/states/in/packets")
    38  		reqStateInTrafficMeter    = metrics.NewMeter("let/req/states/in/traffic")
    39  		reqStateOutPacketsMeter   = metrics.NewMeter("let/req/states/out/packets")
    40  		reqStateOutTrafficMeter   = metrics.NewMeter("let/req/states/out/traffic")
    41  		reqReceiptInPacketsMeter  = metrics.NewMeter("let/req/receipts/in/packets")
    42  		reqReceiptInTrafficMeter  = metrics.NewMeter("let/req/receipts/in/traffic")
    43  		reqReceiptOutPacketsMeter = metrics.NewMeter("let/req/receipts/out/packets")
    44  		reqReceiptOutTrafficMeter = metrics.NewMeter("let/req/receipts/out/traffic")*/
    45  	miscInPacketsMeter  = metrics.NewRegisteredMeter("les/misc/in/packets", nil)
    46  	miscInTrafficMeter  = metrics.NewRegisteredMeter("les/misc/in/traffic", nil)
    47  	miscOutPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets", nil)
    48  	miscOutTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic", nil)
    49  )
    50  
    51  // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of
    52  // accumulating the above defined metrics based on the data stream contents.
    53  type meteredMsgReadWriter struct {
    54  	p2p.MsgReadWriter     // Wrapped message stream to meter
    55  	version           int // Protocol version to select correct meters
    56  }
    57  
    58  // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the
    59  // metrics system is disabled, this function returns the original object.
    60  func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter {
    61  	if !metrics.Enabled {
    62  		return rw
    63  	}
    64  	return &meteredMsgReadWriter{MsgReadWriter: rw}
    65  }
    66  
    67  // Init sets the protocol version used by the stream to know which meters to
    68  // increment in case of overlapping message ids between protocol versions.
    69  func (rw *meteredMsgReadWriter) Init(version int) {
    70  	rw.version = version
    71  }
    72  
    73  func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
    74  	// Read the message and short circuit in case of an error
    75  	msg, err := rw.MsgReadWriter.ReadMsg()
    76  	if err != nil {
    77  		return msg, err
    78  	}
    79  	// Account for the data traffic
    80  	packets, traffic := miscInPacketsMeter, miscInTrafficMeter
    81  	packets.Mark(1)
    82  	traffic.Mark(int64(msg.Size))
    83  
    84  	return msg, err
    85  }
    86  
    87  func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {
    88  	// Account for the data traffic
    89  	packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
    90  	packets.Mark(1)
    91  	traffic.Mark(int64(msg.Size))
    92  
    93  	// Send the packet to the p2p layer
    94  	return rw.MsgReadWriter.WriteMsg(msg)
    95  }