github.com/m3shine/gochain@v2.2.26+incompatible/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  	"context"
    21  
    22  	"github.com/gochain-io/gochain/metrics"
    23  	"github.com/gochain-io/gochain/p2p"
    24  )
    25  
    26  var (
    27  	/*	propTxnInPacketsMeter     = metrics.NewRegisteredMeter("eth/prop/txns/in/packets")
    28  		propTxnInTrafficMeter     = metrics.NewRegisteredMeter("eth/prop/txns/in/traffic")
    29  		propTxnOutPacketsMeter    = metrics.NewRegisteredMeter("eth/prop/txns/out/packets")
    30  		propTxnOutTrafficMeter    = metrics.NewRegisteredMeter("eth/prop/txns/out/traffic")
    31  		propHashInPacketsMeter    = metrics.NewRegisteredMeter("eth/prop/hashes/in/packets")
    32  		propHashInTrafficMeter    = metrics.NewRegisteredMeter("eth/prop/hashes/in/traffic")
    33  		propHashOutPacketsMeter   = metrics.NewRegisteredMeter("eth/prop/hashes/out/packets")
    34  		propHashOutTrafficMeter   = metrics.NewRegisteredMeter("eth/prop/hashes/out/traffic")
    35  		propBlockInPacketsMeter   = metrics.NewRegisteredMeter("eth/prop/blocks/in/packets")
    36  		propBlockInTrafficMeter   = metrics.NewRegisteredMeter("eth/prop/blocks/in/traffic")
    37  		propBlockOutPacketsMeter  = metrics.NewRegisteredMeter("eth/prop/blocks/out/packets")
    38  		propBlockOutTrafficMeter  = metrics.NewRegisteredMeter("eth/prop/blocks/out/traffic")
    39  		reqHashInPacketsMeter     = metrics.NewRegisteredMeter("eth/req/hashes/in/packets")
    40  		reqHashInTrafficMeter     = metrics.NewRegisteredMeter("eth/req/hashes/in/traffic")
    41  		reqHashOutPacketsMeter    = metrics.NewRegisteredMeter("eth/req/hashes/out/packets")
    42  		reqHashOutTrafficMeter    = metrics.NewRegisteredMeter("eth/req/hashes/out/traffic")
    43  		reqBlockInPacketsMeter    = metrics.NewRegisteredMeter("eth/req/blocks/in/packets")
    44  		reqBlockInTrafficMeter    = metrics.NewMeter("eth/req/blocks/in/traffic")
    45  		reqBlockOutPacketsMeter   = metrics.NewMeter("eth/req/blocks/out/packets")
    46  		reqBlockOutTrafficMeter   = metrics.NewMeter("eth/req/blocks/out/traffic")
    47  		reqHeaderInPacketsMeter   = metrics.NewMeter("eth/req/headers/in/packets")
    48  		reqHeaderInTrafficMeter   = metrics.NewMeter("eth/req/headers/in/traffic")
    49  		reqHeaderOutPacketsMeter  = metrics.NewMeter("eth/req/headers/out/packets")
    50  		reqHeaderOutTrafficMeter  = metrics.NewMeter("eth/req/headers/out/traffic")
    51  		reqBodyInPacketsMeter     = metrics.NewMeter("eth/req/bodies/in/packets")
    52  		reqBodyInTrafficMeter     = metrics.NewMeter("eth/req/bodies/in/traffic")
    53  		reqBodyOutPacketsMeter    = metrics.NewMeter("eth/req/bodies/out/packets")
    54  		reqBodyOutTrafficMeter    = metrics.NewMeter("eth/req/bodies/out/traffic")
    55  		reqStateInPacketsMeter    = metrics.NewMeter("eth/req/states/in/packets")
    56  		reqStateInTrafficMeter    = metrics.NewMeter("eth/req/states/in/traffic")
    57  		reqStateOutPacketsMeter   = metrics.NewMeter("eth/req/states/out/packets")
    58  		reqStateOutTrafficMeter   = metrics.NewMeter("eth/req/states/out/traffic")
    59  		reqReceiptInPacketsMeter  = metrics.NewMeter("eth/req/receipts/in/packets")
    60  		reqReceiptInTrafficMeter  = metrics.NewMeter("eth/req/receipts/in/traffic")
    61  		reqReceiptOutPacketsMeter = metrics.NewMeter("eth/req/receipts/out/packets")
    62  		reqReceiptOutTrafficMeter = metrics.NewMeter("eth/req/receipts/out/traffic")*/
    63  	miscInPacketsMeter  = metrics.NewRegisteredMeter("les/misc/in/packets", nil)
    64  	miscInTrafficMeter  = metrics.NewRegisteredMeter("les/misc/in/traffic", nil)
    65  	miscOutPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets", nil)
    66  	miscOutTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic", nil)
    67  )
    68  
    69  // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of
    70  // accumulating the above defined metrics based on the data stream contents.
    71  type meteredMsgReadWriter struct {
    72  	p2p.MsgReadWriter     // Wrapped message stream to meter
    73  	version           int // Protocol version to select correct meters
    74  }
    75  
    76  // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the
    77  // metrics system is disabled, this function returns the original object.
    78  func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter {
    79  	if !metrics.Enabled {
    80  		return rw
    81  	}
    82  	return &meteredMsgReadWriter{MsgReadWriter: rw}
    83  }
    84  
    85  // Init sets the protocol version used by the stream to know which meters to
    86  // increment in case of overlapping message ids between protocol versions.
    87  func (rw *meteredMsgReadWriter) Init(version int) {
    88  	rw.version = version
    89  }
    90  
    91  func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
    92  	// Read the message and short circuit in case of an error
    93  	msg, err := rw.MsgReadWriter.ReadMsg()
    94  	if err != nil {
    95  		return msg, err
    96  	}
    97  	// Account for the data traffic
    98  	packets, traffic := miscInPacketsMeter, miscInTrafficMeter
    99  	packets.Mark(1)
   100  	traffic.Mark(int64(msg.Size))
   101  
   102  	return msg, err
   103  }
   104  
   105  func (rw *meteredMsgReadWriter) WriteMsg(ctx context.Context, msg p2p.Msg) error {
   106  	// Account for the data traffic
   107  	packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
   108  	packets.Mark(1)
   109  	traffic.Mark(int64(msg.Size))
   110  
   111  	// Send the packet to the p2p layer
   112  	return rw.MsgReadWriter.WriteMsg(ctx, msg)
   113  }