metrics.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright 2015 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 eth
  17. import (
  18. "github.com/ethereum/go-ethereum/metrics"
  19. "github.com/ethereum/go-ethereum/p2p"
  20. )
  21. var (
  22. propTxnInPacketsMeter = metrics.NewMeter("eth/prop/txns/in/packets")
  23. propTxnInTrafficMeter = metrics.NewMeter("eth/prop/txns/in/traffic")
  24. propTxnOutPacketsMeter = metrics.NewMeter("eth/prop/txns/out/packets")
  25. propTxnOutTrafficMeter = metrics.NewMeter("eth/prop/txns/out/traffic")
  26. propHashInPacketsMeter = metrics.NewMeter("eth/prop/hashes/in/packets")
  27. propHashInTrafficMeter = metrics.NewMeter("eth/prop/hashes/in/traffic")
  28. propHashOutPacketsMeter = metrics.NewMeter("eth/prop/hashes/out/packets")
  29. propHashOutTrafficMeter = metrics.NewMeter("eth/prop/hashes/out/traffic")
  30. propBlockInPacketsMeter = metrics.NewMeter("eth/prop/blocks/in/packets")
  31. propBlockInTrafficMeter = metrics.NewMeter("eth/prop/blocks/in/traffic")
  32. propBlockOutPacketsMeter = metrics.NewMeter("eth/prop/blocks/out/packets")
  33. propBlockOutTrafficMeter = metrics.NewMeter("eth/prop/blocks/out/traffic")
  34. reqHashInPacketsMeter = metrics.NewMeter("eth/req/hashes/in/packets")
  35. reqHashInTrafficMeter = metrics.NewMeter("eth/req/hashes/in/traffic")
  36. reqHashOutPacketsMeter = metrics.NewMeter("eth/req/hashes/out/packets")
  37. reqHashOutTrafficMeter = metrics.NewMeter("eth/req/hashes/out/traffic")
  38. reqBlockInPacketsMeter = metrics.NewMeter("eth/req/blocks/in/packets")
  39. reqBlockInTrafficMeter = metrics.NewMeter("eth/req/blocks/in/traffic")
  40. reqBlockOutPacketsMeter = metrics.NewMeter("eth/req/blocks/out/packets")
  41. reqBlockOutTrafficMeter = metrics.NewMeter("eth/req/blocks/out/traffic")
  42. reqHeaderInPacketsMeter = metrics.NewMeter("eth/req/header/in/packets")
  43. reqHeaderInTrafficMeter = metrics.NewMeter("eth/req/header/in/traffic")
  44. reqHeaderOutPacketsMeter = metrics.NewMeter("eth/req/header/out/packets")
  45. reqHeaderOutTrafficMeter = metrics.NewMeter("eth/req/header/out/traffic")
  46. reqStateInPacketsMeter = metrics.NewMeter("eth/req/state/in/packets")
  47. reqStateInTrafficMeter = metrics.NewMeter("eth/req/state/in/traffic")
  48. reqStateOutPacketsMeter = metrics.NewMeter("eth/req/state/out/packets")
  49. reqStateOutTrafficMeter = metrics.NewMeter("eth/req/state/out/traffic")
  50. miscInPacketsMeter = metrics.NewMeter("eth/misc/in/packets")
  51. miscInTrafficMeter = metrics.NewMeter("eth/misc/in/traffic")
  52. miscOutPacketsMeter = metrics.NewMeter("eth/misc/out/packets")
  53. miscOutTrafficMeter = metrics.NewMeter("eth/misc/out/traffic")
  54. )
  55. // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of
  56. // accumulating the above defined metrics based on the data stream contents.
  57. type meteredMsgReadWriter struct {
  58. p2p.MsgReadWriter
  59. }
  60. // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the
  61. // metrics system is disabled, this fucntion returns the original object.
  62. func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter {
  63. if !metrics.Enabled {
  64. return rw
  65. }
  66. return &meteredMsgReadWriter{rw}
  67. }
  68. func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {
  69. // Read the message and short circuit in case of an error
  70. msg, err := rw.MsgReadWriter.ReadMsg()
  71. if err != nil {
  72. return msg, err
  73. }
  74. // Account for the data traffic
  75. packets, traffic := miscInPacketsMeter, miscInTrafficMeter
  76. switch msg.Code {
  77. case BlockHashesMsg:
  78. packets, traffic = reqHashInPacketsMeter, reqHashInTrafficMeter
  79. case BlocksMsg:
  80. packets, traffic = reqBlockInPacketsMeter, reqBlockInTrafficMeter
  81. case BlockHeadersMsg:
  82. packets, traffic = reqHeaderInPacketsMeter, reqHeaderInTrafficMeter
  83. case NodeDataMsg:
  84. packets, traffic = reqStateInPacketsMeter, reqStateInTrafficMeter
  85. case NewBlockHashesMsg:
  86. packets, traffic = propHashInPacketsMeter, propHashInTrafficMeter
  87. case NewBlockMsg:
  88. packets, traffic = propBlockInPacketsMeter, propBlockInTrafficMeter
  89. case TxMsg:
  90. packets, traffic = propTxnInPacketsMeter, propTxnInTrafficMeter
  91. }
  92. packets.Mark(1)
  93. traffic.Mark(int64(msg.Size))
  94. return msg, err
  95. }
  96. func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {
  97. // Account for the data traffic
  98. packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter
  99. switch msg.Code {
  100. case BlockHashesMsg:
  101. packets, traffic = reqHashOutPacketsMeter, reqHashOutTrafficMeter
  102. case BlocksMsg:
  103. packets, traffic = reqBlockOutPacketsMeter, reqBlockOutTrafficMeter
  104. case BlockHeadersMsg:
  105. packets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter
  106. case NodeDataMsg:
  107. packets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter
  108. case NewBlockHashesMsg:
  109. packets, traffic = propHashOutPacketsMeter, propHashOutTrafficMeter
  110. case NewBlockMsg:
  111. packets, traffic = propBlockOutPacketsMeter, propBlockOutTrafficMeter
  112. case TxMsg:
  113. packets, traffic = propTxnOutPacketsMeter, propTxnOutTrafficMeter
  114. }
  115. packets.Mark(1)
  116. traffic.Mark(int64(msg.Size))
  117. // Send the packet to the p2p layer
  118. return rw.MsgReadWriter.WriteMsg(msg)
  119. }