metrics.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. connectionTimer = metrics.NewRegisteredTimer("les/connection/duration", nil)
  59. serverConnectionGauge = metrics.NewRegisteredGauge("les/connection/server", nil)
  60. clientConnectionGauge = metrics.NewRegisteredGauge("les/connection/client", nil)
  61. totalCapacityGauge = metrics.NewRegisteredGauge("les/server/totalCapacity", nil)
  62. totalRechargeGauge = metrics.NewRegisteredGauge("les/server/totalRecharge", nil)
  63. totalConnectedGauge = metrics.NewRegisteredGauge("les/server/totalConnected", nil)
  64. blockProcessingTimer = metrics.NewRegisteredTimer("les/server/blockProcessingTime", nil)
  65. requestServedMeter = metrics.NewRegisteredMeter("les/server/req/avgServedTime", nil)
  66. requestServedTimer = metrics.NewRegisteredTimer("les/server/req/servedTime", nil)
  67. requestEstimatedMeter = metrics.NewRegisteredMeter("les/server/req/avgEstimatedTime", nil)
  68. requestEstimatedTimer = metrics.NewRegisteredTimer("les/server/req/estimatedTime", nil)
  69. relativeCostHistogram = metrics.NewRegisteredHistogram("les/server/req/relative", nil, metrics.NewExpDecaySample(1028, 0.015))
  70. recentServedGauge = metrics.NewRegisteredGauge("les/server/recentRequestServed", nil)
  71. recentEstimatedGauge = metrics.NewRegisteredGauge("les/server/recentRequestEstimated", nil)
  72. sqServedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/served", nil)
  73. sqQueuedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/queued", nil)
  74. clientConnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/connected", nil)
  75. clientRejectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/rejected", nil)
  76. clientKickedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/kicked", nil)
  77. clientDisconnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/disconnected", nil)
  78. clientFreezeMeter = metrics.NewRegisteredMeter("les/server/clientEvent/freeze", nil)
  79. clientErrorMeter = metrics.NewRegisteredMeter("les/server/clientEvent/error", nil)
  80. requestRTT = metrics.NewRegisteredTimer("les/client/req/rtt", nil)
  81. requestSendDelay = metrics.NewRegisteredTimer("les/client/req/sendDelay", nil)
  82. )
  83. // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of
  84. // accumulating the above defined metrics based on the data stream contents.
  85. type meteredMsgReadWriter struct {
  86. p2p.MsgReadWriter // Wrapped message stream to meter
  87. version int // Protocol version to select correct meters
  88. }
  89. // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the
  90. // metrics system is disabled, this function returns the original object.
  91. func newMeteredMsgWriter(rw p2p.MsgReadWriter, version int) p2p.MsgReadWriter {
  92. if !metrics.Enabled {
  93. return rw
  94. }
  95. return &meteredMsgReadWriter{MsgReadWriter: rw, version: version}
  96. }
  97. func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
  98. // Read the message and short circuit in case of an error
  99. msg, err := rw.MsgReadWriter.ReadMsg()
  100. if err != nil {
  101. return msg, err
  102. }
  103. // Account for the data traffic
  104. packets, traffic := miscInPacketsMeter, miscInTrafficMeter
  105. packets.Mark(1)
  106. traffic.Mark(int64(msg.Size))
  107. return msg, err
  108. }
  109. func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {
  110. // Account for the data traffic
  111. packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
  112. packets.Mark(1)
  113. traffic.Mark(int64(msg.Size))
  114. // Send the packet to the p2p layer
  115. return rw.MsgReadWriter.WriteMsg(msg)
  116. }