github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/gossip/metrics/metrics.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package metrics 8 9 import "github.com/hechain20/hechain/common/metrics" 10 11 // GossipMetrics encapsulates all of gossip metrics 12 type GossipMetrics struct { 13 StateMetrics *StateMetrics 14 ElectionMetrics *ElectionMetrics 15 CommMetrics *CommMetrics 16 MembershipMetrics *MembershipMetrics 17 PrivdataMetrics *PrivdataMetrics 18 } 19 20 func NewGossipMetrics(p metrics.Provider) *GossipMetrics { 21 return &GossipMetrics{ 22 StateMetrics: newStateMetrics(p), 23 ElectionMetrics: newElectionMetrics(p), 24 CommMetrics: newCommMetrics(p), 25 MembershipMetrics: newMembershipMetrics(p), 26 PrivdataMetrics: newPrivdataMetrics(p), 27 } 28 } 29 30 // StateMetrics encapsulates gossip state related metrics 31 type StateMetrics struct { 32 Height metrics.Gauge 33 CommitDuration metrics.Histogram 34 PayloadBufferSize metrics.Gauge 35 } 36 37 func newStateMetrics(p metrics.Provider) *StateMetrics { 38 return &StateMetrics{ 39 Height: p.NewGauge(HeightOpts), 40 CommitDuration: p.NewHistogram(CommitDurationOpts), 41 PayloadBufferSize: p.NewGauge(PayloadBufferSizeOpts), 42 } 43 } 44 45 var ( 46 HeightOpts = metrics.GaugeOpts{ 47 Namespace: "gossip", 48 Subsystem: "state", 49 Name: "height", 50 Help: "Current ledger height", 51 LabelNames: []string{"channel"}, 52 StatsdFormat: "%{#fqname}.%{channel}", 53 } 54 55 CommitDurationOpts = metrics.HistogramOpts{ 56 Namespace: "gossip", 57 Subsystem: "state", 58 Name: "commit_duration", 59 Help: "Time it takes to commit a block in seconds", 60 LabelNames: []string{"channel"}, 61 StatsdFormat: "%{#fqname}.%{channel}", 62 } 63 64 PayloadBufferSizeOpts = metrics.GaugeOpts{ 65 Namespace: "gossip", 66 Subsystem: "payload_buffer", 67 Name: "size", 68 Help: "Size of the payload buffer", 69 LabelNames: []string{"channel"}, 70 StatsdFormat: "%{#fqname}.%{channel}", 71 } 72 ) 73 74 // ElectionMetrics encapsulates gossip leader election related metrics 75 type ElectionMetrics struct { 76 Declaration metrics.Gauge 77 } 78 79 func newElectionMetrics(p metrics.Provider) *ElectionMetrics { 80 return &ElectionMetrics{ 81 Declaration: p.NewGauge(LeaderDeclerationOpts), 82 } 83 } 84 85 var LeaderDeclerationOpts = metrics.GaugeOpts{ 86 Namespace: "gossip", 87 Subsystem: "leader_election", 88 Name: "leader", 89 Help: "Peer is leader (1) or follower (0)", 90 LabelNames: []string{"channel"}, 91 StatsdFormat: "%{#fqname}.%{channel}", 92 } 93 94 // CommMetrics encapsulates gossip communication related metrics 95 type CommMetrics struct { 96 SentMessages metrics.Counter 97 BufferOverflow metrics.Counter 98 ReceivedMessages metrics.Counter 99 } 100 101 func newCommMetrics(p metrics.Provider) *CommMetrics { 102 return &CommMetrics{ 103 SentMessages: p.NewCounter(SentMessagesOpts), 104 BufferOverflow: p.NewCounter(BufferOverflowOpts), 105 ReceivedMessages: p.NewCounter(ReceivedMessagesOpts), 106 } 107 } 108 109 var ( 110 SentMessagesOpts = metrics.CounterOpts{ 111 Namespace: "gossip", 112 Subsystem: "comm", 113 Name: "messages_sent", 114 Help: "Number of messages sent", 115 StatsdFormat: "%{#fqname}", 116 } 117 118 BufferOverflowOpts = metrics.CounterOpts{ 119 Namespace: "gossip", 120 Subsystem: "comm", 121 Name: "overflow_count", 122 Help: "Number of outgoing queue buffer overflows", 123 StatsdFormat: "%{#fqname}", 124 } 125 126 ReceivedMessagesOpts = metrics.CounterOpts{ 127 Namespace: "gossip", 128 Subsystem: "comm", 129 Name: "messages_received", 130 Help: "Number of messages received", 131 StatsdFormat: "%{#fqname}", 132 } 133 ) 134 135 // MembershipMetrics encapsulates gossip channel membership related metrics 136 type MembershipMetrics struct { 137 Total metrics.Gauge 138 } 139 140 func newMembershipMetrics(p metrics.Provider) *MembershipMetrics { 141 return &MembershipMetrics{ 142 Total: p.NewGauge(TotalOpts), 143 } 144 } 145 146 var TotalOpts = metrics.GaugeOpts{ 147 Namespace: "gossip", 148 Subsystem: "membership", 149 Name: "total_peers_known", 150 Help: "Total known peers", 151 LabelNames: []string{"channel"}, 152 StatsdFormat: "%{#fqname}.%{channel}", 153 } 154 155 // PrivdataMetrics encapsulates gossip private data related metrics 156 type PrivdataMetrics struct { 157 ValidationDuration metrics.Histogram 158 ListMissingPrivateDataDuration metrics.Histogram 159 FetchDuration metrics.Histogram 160 CommitPrivateDataDuration metrics.Histogram 161 PurgeDuration metrics.Histogram 162 SendDuration metrics.Histogram 163 ReconciliationDuration metrics.Histogram 164 PullDuration metrics.Histogram 165 RetrieveDuration metrics.Histogram 166 } 167 168 func newPrivdataMetrics(p metrics.Provider) *PrivdataMetrics { 169 return &PrivdataMetrics{ 170 ValidationDuration: p.NewHistogram(ValidationDurationOpts), 171 ListMissingPrivateDataDuration: p.NewHistogram(ListMissingPrivateDataDurationOpts), 172 FetchDuration: p.NewHistogram(FetchDurationOpts), 173 CommitPrivateDataDuration: p.NewHistogram(CommitPrivateDataDurationOpts), 174 PurgeDuration: p.NewHistogram(PurgeDurationOpts), 175 SendDuration: p.NewHistogram(SendDurationOpts), 176 ReconciliationDuration: p.NewHistogram(ReconciliationDurationOpts), 177 PullDuration: p.NewHistogram(PullDurationOpts), 178 RetrieveDuration: p.NewHistogram(RetrieveDurationOpts), 179 } 180 } 181 182 var ( 183 ValidationDurationOpts = metrics.HistogramOpts{ 184 Namespace: "gossip", 185 Subsystem: "privdata", 186 Name: "validation_duration", 187 Help: "Time it takes to validate a block (in seconds)", 188 LabelNames: []string{"channel"}, 189 StatsdFormat: "%{#fqname}.%{channel}", 190 } 191 192 ListMissingPrivateDataDurationOpts = metrics.HistogramOpts{ 193 Namespace: "gossip", 194 Subsystem: "privdata", 195 Name: "list_missing_duration", 196 Help: "Time it takes to list the missing private data (in seconds)", 197 LabelNames: []string{"channel"}, 198 StatsdFormat: "%{#fqname}.%{channel}", 199 } 200 201 FetchDurationOpts = metrics.HistogramOpts{ 202 Namespace: "gossip", 203 Subsystem: "privdata", 204 Name: "fetch_duration", 205 Help: "Time it takes to fetch missing private data from peers (in seconds)", 206 LabelNames: []string{"channel"}, 207 StatsdFormat: "%{#fqname}.%{channel}", 208 } 209 210 CommitPrivateDataDurationOpts = metrics.HistogramOpts{ 211 Namespace: "gossip", 212 Subsystem: "privdata", 213 Name: "commit_block_duration", 214 Help: "Time it takes to commit private data and the corresponding block (in seconds)", 215 LabelNames: []string{"channel"}, 216 StatsdFormat: "%{#fqname}.%{channel}", 217 } 218 219 PurgeDurationOpts = metrics.HistogramOpts{ 220 Namespace: "gossip", 221 Subsystem: "privdata", 222 Name: "purge_duration", 223 Help: "Time it takes to purge private data (in seconds)", 224 LabelNames: []string{"channel"}, 225 StatsdFormat: "%{#fqname}.%{channel}", 226 } 227 228 SendDurationOpts = metrics.HistogramOpts{ 229 Namespace: "gossip", 230 Subsystem: "privdata", 231 Name: "send_duration", 232 Help: "Time it takes to send a missing private data element (in seconds)", 233 LabelNames: []string{"channel"}, 234 StatsdFormat: "%{#fqname}.%{channel}", 235 } 236 237 ReconciliationDurationOpts = metrics.HistogramOpts{ 238 Namespace: "gossip", 239 Subsystem: "privdata", 240 Name: "reconciliation_duration", 241 Help: "Time it takes for reconciliation to complete (in seconds)", 242 LabelNames: []string{"channel"}, 243 StatsdFormat: "%{#fqname}.%{channel}", 244 } 245 246 PullDurationOpts = metrics.HistogramOpts{ 247 Namespace: "gossip", 248 Subsystem: "privdata", 249 Name: "pull_duration", 250 Help: "Time it takes to pull a missing private data element (in seconds)", 251 LabelNames: []string{"channel"}, 252 StatsdFormat: "%{#fqname}.%{channel}", 253 } 254 255 RetrieveDurationOpts = metrics.HistogramOpts{ 256 Namespace: "gossip", 257 Subsystem: "privdata", 258 Name: "retrieve_duration", 259 Help: "Time it takes to retrieve missing private data elements from the ledger (in seconds)", 260 LabelNames: []string{"channel"}, 261 StatsdFormat: "%{#fqname}.%{channel}", 262 } 263 )