metrics.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. package les
  17. import (
  18. "github.com/ethereum/go-ethereum/metrics"
  19. "github.com/ethereum/go-ethereum/p2p"
  20. )
  21. var (
  22. miscInPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/total", nil)
  23. miscInTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/total", nil)
  24. miscInHeaderPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/header", nil)
  25. miscInHeaderTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/header", nil)
  26. miscInBodyPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/body", nil)
  27. miscInBodyTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/body", nil)
  28. miscInCodePacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/code", nil)
  29. miscInCodeTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/code", nil)
  30. miscInReceiptPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/receipt", nil)
  31. miscInReceiptTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/receipt", nil)
  32. miscInTrieProofPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/proof", nil)
  33. miscInTrieProofTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/proof", nil)
  34. miscInHelperTriePacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/helperTrie", nil)
  35. miscInHelperTrieTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/helperTrie", nil)
  36. miscInTxsPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/txs", nil)
  37. miscInTxsTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/txs", nil)
  38. miscInTxStatusPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/txStatus", nil)
  39. miscInTxStatusTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/txStatus", nil)
  40. miscOutPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/total", nil)
  41. miscOutTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/total", nil)
  42. miscOutHeaderPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/header", nil)
  43. miscOutHeaderTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/header", nil)
  44. miscOutBodyPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/body", nil)
  45. miscOutBodyTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/body", nil)
  46. miscOutCodePacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/code", nil)
  47. miscOutCodeTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/code", nil)
  48. miscOutReceiptPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/receipt", nil)
  49. miscOutReceiptTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/receipt", nil)
  50. miscOutTrieProofPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/proof", nil)
  51. miscOutTrieProofTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/proof", nil)
  52. miscOutHelperTriePacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/helperTrie", nil)
  53. miscOutHelperTrieTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/helperTrie", nil)
  54. miscOutTxsPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/txs", nil)
  55. miscOutTxsTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/txs", nil)
  56. miscOutTxStatusPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/txStatus", nil)
  57. miscOutTxStatusTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/txStatus", nil)
  58. miscServingTimeHeaderTimer = metrics.NewRegisteredTimer("les/misc/serve/header", nil)
  59. miscServingTimeBodyTimer = metrics.NewRegisteredTimer("les/misc/serve/body", nil)
  60. miscServingTimeCodeTimer = metrics.NewRegisteredTimer("les/misc/serve/code", nil)
  61. miscServingTimeReceiptTimer = metrics.NewRegisteredTimer("les/misc/serve/receipt", nil)
  62. miscServingTimeTrieProofTimer = metrics.NewRegisteredTimer("les/misc/serve/proof", nil)
  63. miscServingTimeHelperTrieTimer = metrics.NewRegisteredTimer("les/misc/serve/helperTrie", nil)
  64. miscServingTimeTxTimer = metrics.NewRegisteredTimer("les/misc/serve/txs", nil)
  65. miscServingTimeTxStatusTimer = metrics.NewRegisteredTimer("les/misc/serve/txStatus", nil)
  66. connectionTimer = metrics.NewRegisteredTimer("les/connection/duration", nil)
  67. serverConnectionGauge = metrics.NewRegisteredGauge("les/connection/server", nil)
  68. clientConnectionGauge = metrics.NewRegisteredGauge("les/connection/client", nil)
  69. totalCapacityGauge = metrics.NewRegisteredGauge("les/server/totalCapacity", nil)
  70. totalRechargeGauge = metrics.NewRegisteredGauge("les/server/totalRecharge", nil)
  71. totalConnectedGauge = metrics.NewRegisteredGauge("les/server/totalConnected", nil)
  72. blockProcessingTimer = metrics.NewRegisteredTimer("les/server/blockProcessingTime", nil)
  73. requestServedMeter = metrics.NewRegisteredMeter("les/server/req/avgServedTime", nil)
  74. requestServedTimer = metrics.NewRegisteredTimer("les/server/req/servedTime", nil)
  75. requestEstimatedMeter = metrics.NewRegisteredMeter("les/server/req/avgEstimatedTime", nil)
  76. requestEstimatedTimer = metrics.NewRegisteredTimer("les/server/req/estimatedTime", nil)
  77. relativeCostHistogram = metrics.NewRegisteredHistogram("les/server/req/relative", nil, metrics.NewExpDecaySample(1028, 0.015))
  78. relativeCostHeaderHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/header", nil, metrics.NewExpDecaySample(1028, 0.015))
  79. relativeCostBodyHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/body", nil, metrics.NewExpDecaySample(1028, 0.015))
  80. relativeCostReceiptHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/receipt", nil, metrics.NewExpDecaySample(1028, 0.015))
  81. relativeCostCodeHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/code", nil, metrics.NewExpDecaySample(1028, 0.015))
  82. relativeCostProofHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/proof", nil, metrics.NewExpDecaySample(1028, 0.015))
  83. relativeCostHelperProofHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/helperTrie", nil, metrics.NewExpDecaySample(1028, 0.015))
  84. relativeCostSendTxHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/txs", nil, metrics.NewExpDecaySample(1028, 0.015))
  85. relativeCostTxStatusHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/txStatus", nil, metrics.NewExpDecaySample(1028, 0.015))
  86. globalFactorGauge = metrics.NewRegisteredGauge("les/server/globalFactor", nil)
  87. recentServedGauge = metrics.NewRegisteredGauge("les/server/recentRequestServed", nil)
  88. recentEstimatedGauge = metrics.NewRegisteredGauge("les/server/recentRequestEstimated", nil)
  89. sqServedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/served", nil)
  90. sqQueuedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/queued", nil)
  91. clientConnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/connected", nil)
  92. clientRejectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/rejected", nil)
  93. clientKickedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/kicked", nil)
  94. clientDisconnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/disconnected", nil)
  95. clientFreezeMeter = metrics.NewRegisteredMeter("les/server/clientEvent/freeze", nil)
  96. clientErrorMeter = metrics.NewRegisteredMeter("les/server/clientEvent/error", nil)
  97. requestRTT = metrics.NewRegisteredTimer("les/client/req/rtt", nil)
  98. requestSendDelay = metrics.NewRegisteredTimer("les/client/req/sendDelay", nil)
  99. serverSelectableGauge = metrics.NewRegisteredGauge("les/client/serverPool/selectable", nil)
  100. serverDialedMeter = metrics.NewRegisteredMeter("les/client/serverPool/dialed", nil)
  101. serverConnectedGauge = metrics.NewRegisteredGauge("les/client/serverPool/connected", nil)
  102. sessionValueMeter = metrics.NewRegisteredMeter("les/client/serverPool/sessionValue", nil)
  103. totalValueGauge = metrics.NewRegisteredGauge("les/client/serverPool/totalValue", nil)
  104. suggestedTimeoutGauge = metrics.NewRegisteredGauge("les/client/serverPool/timeout", nil)
  105. )
  106. // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of
  107. // accumulating the above defined metrics based on the data stream contents.
  108. type meteredMsgReadWriter struct {
  109. p2p.MsgReadWriter // Wrapped message stream to meter
  110. version int // Protocol version to select correct meters
  111. }
  112. // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the
  113. // metrics system is disabled, this function returns the original object.
  114. func newMeteredMsgWriter(rw p2p.MsgReadWriter, version int) p2p.MsgReadWriter {
  115. if !metrics.Enabled {
  116. return rw
  117. }
  118. return &meteredMsgReadWriter{MsgReadWriter: rw, version: version}
  119. }
  120. func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
  121. // Read the message and short circuit in case of an error
  122. msg, err := rw.MsgReadWriter.ReadMsg()
  123. if err != nil {
  124. return msg, err
  125. }
  126. // Account for the data traffic
  127. packets, traffic := miscInPacketsMeter, miscInTrafficMeter
  128. packets.Mark(1)
  129. traffic.Mark(int64(msg.Size))
  130. return msg, err
  131. }
  132. func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {
  133. // Account for the data traffic
  134. packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
  135. packets.Mark(1)
  136. traffic.Mark(int64(msg.Size))
  137. // Send the packet to the p2p layer
  138. return rw.MsgReadWriter.WriteMsg(msg)
  139. }