metrics.go 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. totalCapacityGauge = metrics.NewRegisteredGauge("les/server/totalCapacity", nil)
  69. totalRechargeGauge = metrics.NewRegisteredGauge("les/server/totalRecharge", nil)
  70. blockProcessingTimer = metrics.NewRegisteredTimer("les/server/blockProcessingTime", nil)
  71. requestServedMeter = metrics.NewRegisteredMeter("les/server/req/avgServedTime", nil)
  72. requestServedTimer = metrics.NewRegisteredTimer("les/server/req/servedTime", nil)
  73. requestEstimatedMeter = metrics.NewRegisteredMeter("les/server/req/avgEstimatedTime", nil)
  74. requestEstimatedTimer = metrics.NewRegisteredTimer("les/server/req/estimatedTime", nil)
  75. relativeCostHistogram = metrics.NewRegisteredHistogram("les/server/req/relative", nil, metrics.NewExpDecaySample(1028, 0.015))
  76. relativeCostHeaderHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/header", nil, metrics.NewExpDecaySample(1028, 0.015))
  77. relativeCostBodyHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/body", nil, metrics.NewExpDecaySample(1028, 0.015))
  78. relativeCostReceiptHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/receipt", nil, metrics.NewExpDecaySample(1028, 0.015))
  79. relativeCostCodeHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/code", nil, metrics.NewExpDecaySample(1028, 0.015))
  80. relativeCostProofHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/proof", nil, metrics.NewExpDecaySample(1028, 0.015))
  81. relativeCostHelperProofHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/helperTrie", nil, metrics.NewExpDecaySample(1028, 0.015))
  82. relativeCostSendTxHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/txs", nil, metrics.NewExpDecaySample(1028, 0.015))
  83. relativeCostTxStatusHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/txStatus", nil, metrics.NewExpDecaySample(1028, 0.015))
  84. globalFactorGauge = metrics.NewRegisteredGauge("les/server/globalFactor", nil)
  85. recentServedGauge = metrics.NewRegisteredGauge("les/server/recentRequestServed", nil)
  86. recentEstimatedGauge = metrics.NewRegisteredGauge("les/server/recentRequestEstimated", nil)
  87. sqServedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/served", nil)
  88. sqQueuedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/queued", nil)
  89. clientFreezeMeter = metrics.NewRegisteredMeter("les/server/clientEvent/freeze", nil)
  90. clientErrorMeter = metrics.NewRegisteredMeter("les/server/clientEvent/error", nil)
  91. requestRTT = metrics.NewRegisteredTimer("les/client/req/rtt", nil)
  92. requestSendDelay = metrics.NewRegisteredTimer("les/client/req/sendDelay", nil)
  93. serverSelectableGauge = metrics.NewRegisteredGauge("les/client/serverPool/selectable", nil)
  94. serverDialedMeter = metrics.NewRegisteredMeter("les/client/serverPool/dialed", nil)
  95. serverConnectedGauge = metrics.NewRegisteredGauge("les/client/serverPool/connected", nil)
  96. sessionValueMeter = metrics.NewRegisteredMeter("les/client/serverPool/sessionValue", nil)
  97. totalValueGauge = metrics.NewRegisteredGauge("les/client/serverPool/totalValue", nil)
  98. suggestedTimeoutGauge = metrics.NewRegisteredGauge("les/client/serverPool/timeout", nil)
  99. )
  100. // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of
  101. // accumulating the above defined metrics based on the data stream contents.
  102. type meteredMsgReadWriter struct {
  103. p2p.MsgReadWriter // Wrapped message stream to meter
  104. version int // Protocol version to select correct meters
  105. }
  106. // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the
  107. // metrics system is disabled, this function returns the original object.
  108. func newMeteredMsgWriter(rw p2p.MsgReadWriter, version int) p2p.MsgReadWriter {
  109. if !metrics.Enabled {
  110. return rw
  111. }
  112. return &meteredMsgReadWriter{MsgReadWriter: rw, version: version}
  113. }
  114. func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
  115. // Read the message and short circuit in case of an error
  116. msg, err := rw.MsgReadWriter.ReadMsg()
  117. if err != nil {
  118. return msg, err
  119. }
  120. // Account for the data traffic
  121. packets, traffic := miscInPacketsMeter, miscInTrafficMeter
  122. packets.Mark(1)
  123. traffic.Mark(int64(msg.Size))
  124. return msg, err
  125. }
  126. func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {
  127. // Account for the data traffic
  128. packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
  129. packets.Mark(1)
  130. traffic.Mark(int64(msg.Size))
  131. // Send the packet to the p2p layer
  132. return rw.MsgReadWriter.WriteMsg(msg)
  133. }