github.com/neatlab/neatio@v1.7.3-0.20220425043230-d903e92fcc75/neatptc/metrics.go (about)

     1  package neatptc
     2  
     3  import (
     4  	"github.com/neatlab/neatio/chain/consensus"
     5  	"github.com/neatlab/neatio/network/p2p"
     6  	"github.com/neatlab/neatio/utilities/metrics"
     7  )
     8  
     9  var (
    10  	propTxnInPacketsMeter     = metrics.NewRegisteredMeter("eth/prop/txns/in/packets", nil)
    11  	propTxnInTrafficMeter     = metrics.NewRegisteredMeter("eth/prop/txns/in/traffic", nil)
    12  	propTxnOutPacketsMeter    = metrics.NewRegisteredMeter("eth/prop/txns/out/packets", nil)
    13  	propTxnOutTrafficMeter    = metrics.NewRegisteredMeter("eth/prop/txns/out/traffic", nil)
    14  	propHashInPacketsMeter    = metrics.NewRegisteredMeter("eth/prop/hashes/in/packets", nil)
    15  	propHashInTrafficMeter    = metrics.NewRegisteredMeter("eth/prop/hashes/in/traffic", nil)
    16  	propHashOutPacketsMeter   = metrics.NewRegisteredMeter("eth/prop/hashes/out/packets", nil)
    17  	propHashOutTrafficMeter   = metrics.NewRegisteredMeter("eth/prop/hashes/out/traffic", nil)
    18  	propBlockInPacketsMeter   = metrics.NewRegisteredMeter("eth/prop/blocks/in/packets", nil)
    19  	propBlockInTrafficMeter   = metrics.NewRegisteredMeter("eth/prop/blocks/in/traffic", nil)
    20  	propBlockOutPacketsMeter  = metrics.NewRegisteredMeter("eth/prop/blocks/out/packets", nil)
    21  	propBlockOutTrafficMeter  = metrics.NewRegisteredMeter("eth/prop/blocks/out/traffic", nil)
    22  	reqHeaderInPacketsMeter   = metrics.NewRegisteredMeter("eth/req/headers/in/packets", nil)
    23  	reqHeaderInTrafficMeter   = metrics.NewRegisteredMeter("eth/req/headers/in/traffic", nil)
    24  	reqHeaderOutPacketsMeter  = metrics.NewRegisteredMeter("eth/req/headers/out/packets", nil)
    25  	reqHeaderOutTrafficMeter  = metrics.NewRegisteredMeter("eth/req/headers/out/traffic", nil)
    26  	reqBodyInPacketsMeter     = metrics.NewRegisteredMeter("eth/req/bodies/in/packets", nil)
    27  	reqBodyInTrafficMeter     = metrics.NewRegisteredMeter("eth/req/bodies/in/traffic", nil)
    28  	reqBodyOutPacketsMeter    = metrics.NewRegisteredMeter("eth/req/bodies/out/packets", nil)
    29  	reqBodyOutTrafficMeter    = metrics.NewRegisteredMeter("eth/req/bodies/out/traffic", nil)
    30  	reqStateInPacketsMeter    = metrics.NewRegisteredMeter("eth/req/states/in/packets", nil)
    31  	reqStateInTrafficMeter    = metrics.NewRegisteredMeter("eth/req/states/in/traffic", nil)
    32  	reqStateOutPacketsMeter   = metrics.NewRegisteredMeter("eth/req/states/out/packets", nil)
    33  	reqStateOutTrafficMeter   = metrics.NewRegisteredMeter("eth/req/states/out/traffic", nil)
    34  	reqReceiptInPacketsMeter  = metrics.NewRegisteredMeter("eth/req/receipts/in/packets", nil)
    35  	reqReceiptInTrafficMeter  = metrics.NewRegisteredMeter("eth/req/receipts/in/traffic", nil)
    36  	reqReceiptOutPacketsMeter = metrics.NewRegisteredMeter("eth/req/receipts/out/packets", nil)
    37  	reqReceiptOutTrafficMeter = metrics.NewRegisteredMeter("eth/req/receipts/out/traffic", nil)
    38  	miscInPacketsMeter        = metrics.NewRegisteredMeter("eth/misc/in/packets", nil)
    39  	miscInTrafficMeter        = metrics.NewRegisteredMeter("eth/misc/in/traffic", nil)
    40  	miscOutPacketsMeter       = metrics.NewRegisteredMeter("eth/misc/out/packets", nil)
    41  	miscOutTrafficMeter       = metrics.NewRegisteredMeter("eth/misc/out/traffic", nil)
    42  )
    43  
    44  type meteredMsgReadWriter struct {
    45  	p2p.MsgReadWriter
    46  	version int
    47  }
    48  
    49  func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter {
    50  	if !metrics.Enabled {
    51  		return rw
    52  	}
    53  	return &meteredMsgReadWriter{MsgReadWriter: rw}
    54  }
    55  
    56  func (rw *meteredMsgReadWriter) Init(version int) {
    57  	rw.version = version
    58  }
    59  
    60  func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
    61  
    62  	msg, err := rw.MsgReadWriter.ReadMsg()
    63  	if err != nil {
    64  		return msg, err
    65  	}
    66  
    67  	packets, traffic := miscInPacketsMeter, miscInTrafficMeter
    68  	switch {
    69  	case msg.Code == BlockHeadersMsg:
    70  		packets, traffic = reqHeaderInPacketsMeter, reqHeaderInTrafficMeter
    71  	case msg.Code == BlockBodiesMsg:
    72  		packets, traffic = reqBodyInPacketsMeter, reqBodyInTrafficMeter
    73  
    74  	case rw.version >= consensus.Eth63 && msg.Code == NodeDataMsg:
    75  		packets, traffic = reqStateInPacketsMeter, reqStateInTrafficMeter
    76  	case rw.version >= consensus.Eth63 && msg.Code == ReceiptsMsg:
    77  		packets, traffic = reqReceiptInPacketsMeter, reqReceiptInTrafficMeter
    78  
    79  	case msg.Code == NewBlockHashesMsg:
    80  		packets, traffic = propHashInPacketsMeter, propHashInTrafficMeter
    81  	case msg.Code == NewBlockMsg:
    82  		packets, traffic = propBlockInPacketsMeter, propBlockInTrafficMeter
    83  	case msg.Code == TxMsg:
    84  		packets, traffic = propTxnInPacketsMeter, propTxnInTrafficMeter
    85  	}
    86  	packets.Mark(1)
    87  	traffic.Mark(int64(msg.Size))
    88  
    89  	return msg, err
    90  }
    91  
    92  func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {
    93  
    94  	packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
    95  	switch {
    96  	case msg.Code == BlockHeadersMsg:
    97  		packets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter
    98  	case msg.Code == BlockBodiesMsg:
    99  		packets, traffic = reqBodyOutPacketsMeter, reqBodyOutTrafficMeter
   100  
   101  	case rw.version >= consensus.Eth63 && msg.Code == NodeDataMsg:
   102  		packets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter
   103  	case rw.version >= consensus.Eth63 && msg.Code == ReceiptsMsg:
   104  		packets, traffic = reqReceiptOutPacketsMeter, reqReceiptOutTrafficMeter
   105  
   106  	case msg.Code == NewBlockHashesMsg:
   107  		packets, traffic = propHashOutPacketsMeter, propHashOutTrafficMeter
   108  	case msg.Code == NewBlockMsg:
   109  		packets, traffic = propBlockOutPacketsMeter, propBlockOutTrafficMeter
   110  	case msg.Code == TxMsg:
   111  		packets, traffic = propTxnOutPacketsMeter, propTxnOutTrafficMeter
   112  	}
   113  	packets.Mark(1)
   114  	traffic.Mark(int64(msg.Size))
   115  
   116  	return rw.MsgReadWriter.WriteMsg(msg)
   117  }