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  )