github.com/lzy4123/fabric@v2.1.1+incompatible/gossip/metrics/metrics.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package metrics
     8  
     9  import "github.com/hyperledger/fabric/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 (
    86  	LeaderDeclerationOpts = metrics.GaugeOpts{
    87  		Namespace:    "gossip",
    88  		Subsystem:    "leader_election",
    89  		Name:         "leader",
    90  		Help:         "Peer is leader (1) or follower (0)",
    91  		LabelNames:   []string{"channel"},
    92  		StatsdFormat: "%{#fqname}.%{channel}",
    93  	}
    94  )
    95  
    96  // CommMetrics encapsulates gossip communication related metrics
    97  type CommMetrics struct {
    98  	SentMessages     metrics.Counter
    99  	BufferOverflow   metrics.Counter
   100  	ReceivedMessages metrics.Counter
   101  }
   102  
   103  func newCommMetrics(p metrics.Provider) *CommMetrics {
   104  	return &CommMetrics{
   105  		SentMessages:     p.NewCounter(SentMessagesOpts),
   106  		BufferOverflow:   p.NewCounter(BufferOverflowOpts),
   107  		ReceivedMessages: p.NewCounter(ReceivedMessagesOpts),
   108  	}
   109  }
   110  
   111  var (
   112  	SentMessagesOpts = metrics.CounterOpts{
   113  		Namespace:    "gossip",
   114  		Subsystem:    "comm",
   115  		Name:         "messages_sent",
   116  		Help:         "Number of messages sent",
   117  		StatsdFormat: "%{#fqname}",
   118  	}
   119  
   120  	BufferOverflowOpts = metrics.CounterOpts{
   121  		Namespace:    "gossip",
   122  		Subsystem:    "comm",
   123  		Name:         "overflow_count",
   124  		Help:         "Number of outgoing queue buffer overflows",
   125  		StatsdFormat: "%{#fqname}",
   126  	}
   127  
   128  	ReceivedMessagesOpts = metrics.CounterOpts{
   129  		Namespace:    "gossip",
   130  		Subsystem:    "comm",
   131  		Name:         "messages_received",
   132  		Help:         "Number of messages received",
   133  		StatsdFormat: "%{#fqname}",
   134  	}
   135  )
   136  
   137  // MembershipMetrics encapsulates gossip channel membership related metrics
   138  type MembershipMetrics struct {
   139  	Total metrics.Gauge
   140  }
   141  
   142  func newMembershipMetrics(p metrics.Provider) *MembershipMetrics {
   143  	return &MembershipMetrics{
   144  		Total: p.NewGauge(TotalOpts),
   145  	}
   146  }
   147  
   148  var (
   149  	TotalOpts = metrics.GaugeOpts{
   150  		Namespace:    "gossip",
   151  		Subsystem:    "membership",
   152  		Name:         "total_peers_known",
   153  		Help:         "Total known peers",
   154  		LabelNames:   []string{"channel"},
   155  		StatsdFormat: "%{#fqname}.%{channel}",
   156  	}
   157  )
   158  
   159  // PrivdataMetrics encapsulates gossip private data related metrics
   160  type PrivdataMetrics struct {
   161  	ValidationDuration             metrics.Histogram
   162  	ListMissingPrivateDataDuration metrics.Histogram
   163  	FetchDuration                  metrics.Histogram
   164  	CommitPrivateDataDuration      metrics.Histogram
   165  	PurgeDuration                  metrics.Histogram
   166  	SendDuration                   metrics.Histogram
   167  	ReconciliationDuration         metrics.Histogram
   168  	PullDuration                   metrics.Histogram
   169  	RetrieveDuration               metrics.Histogram
   170  }
   171  
   172  func newPrivdataMetrics(p metrics.Provider) *PrivdataMetrics {
   173  	return &PrivdataMetrics{
   174  		ValidationDuration:             p.NewHistogram(ValidationDurationOpts),
   175  		ListMissingPrivateDataDuration: p.NewHistogram(ListMissingPrivateDataDurationOpts),
   176  		FetchDuration:                  p.NewHistogram(FetchDurationOpts),
   177  		CommitPrivateDataDuration:      p.NewHistogram(CommitPrivateDataDurationOpts),
   178  		PurgeDuration:                  p.NewHistogram(PurgeDurationOpts),
   179  		SendDuration:                   p.NewHistogram(SendDurationOpts),
   180  		ReconciliationDuration:         p.NewHistogram(ReconciliationDurationOpts),
   181  		PullDuration:                   p.NewHistogram(PullDurationOpts),
   182  		RetrieveDuration:               p.NewHistogram(RetrieveDurationOpts),
   183  	}
   184  }
   185  
   186  var (
   187  	ValidationDurationOpts = metrics.HistogramOpts{
   188  		Namespace:    "gossip",
   189  		Subsystem:    "privdata",
   190  		Name:         "validation_duration",
   191  		Help:         "Time it takes to validate a block (in seconds)",
   192  		LabelNames:   []string{"channel"},
   193  		StatsdFormat: "%{#fqname}.%{channel}",
   194  	}
   195  
   196  	ListMissingPrivateDataDurationOpts = metrics.HistogramOpts{
   197  		Namespace:    "gossip",
   198  		Subsystem:    "privdata",
   199  		Name:         "list_missing_duration",
   200  		Help:         "Time it takes to list the missing private data (in seconds)",
   201  		LabelNames:   []string{"channel"},
   202  		StatsdFormat: "%{#fqname}.%{channel}",
   203  	}
   204  
   205  	FetchDurationOpts = metrics.HistogramOpts{
   206  		Namespace:    "gossip",
   207  		Subsystem:    "privdata",
   208  		Name:         "fetch_duration",
   209  		Help:         "Time it takes to fetch missing private data from peers (in seconds)",
   210  		LabelNames:   []string{"channel"},
   211  		StatsdFormat: "%{#fqname}.%{channel}",
   212  	}
   213  
   214  	CommitPrivateDataDurationOpts = metrics.HistogramOpts{
   215  		Namespace:    "gossip",
   216  		Subsystem:    "privdata",
   217  		Name:         "commit_block_duration",
   218  		Help:         "Time it takes to commit private data and the corresponding block (in seconds)",
   219  		LabelNames:   []string{"channel"},
   220  		StatsdFormat: "%{#fqname}.%{channel}",
   221  	}
   222  
   223  	PurgeDurationOpts = metrics.HistogramOpts{
   224  		Namespace:    "gossip",
   225  		Subsystem:    "privdata",
   226  		Name:         "purge_duration",
   227  		Help:         "Time it takes to purge private data (in seconds)",
   228  		LabelNames:   []string{"channel"},
   229  		StatsdFormat: "%{#fqname}.%{channel}",
   230  	}
   231  
   232  	SendDurationOpts = metrics.HistogramOpts{
   233  		Namespace:    "gossip",
   234  		Subsystem:    "privdata",
   235  		Name:         "send_duration",
   236  		Help:         "Time it takes to send a missing private data element (in seconds)",
   237  		LabelNames:   []string{"channel"},
   238  		StatsdFormat: "%{#fqname}.%{channel}",
   239  	}
   240  
   241  	ReconciliationDurationOpts = metrics.HistogramOpts{
   242  		Namespace:    "gossip",
   243  		Subsystem:    "privdata",
   244  		Name:         "reconciliation_duration",
   245  		Help:         "Time it takes for reconciliation to complete (in seconds)",
   246  		LabelNames:   []string{"channel"},
   247  		StatsdFormat: "%{#fqname}.%{channel}",
   248  	}
   249  
   250  	PullDurationOpts = metrics.HistogramOpts{
   251  		Namespace:    "gossip",
   252  		Subsystem:    "privdata",
   253  		Name:         "pull_duration",
   254  		Help:         "Time it takes to pull a missing private data element (in seconds)",
   255  		LabelNames:   []string{"channel"},
   256  		StatsdFormat: "%{#fqname}.%{channel}",
   257  	}
   258  
   259  	RetrieveDurationOpts = metrics.HistogramOpts{
   260  		Namespace:    "gossip",
   261  		Subsystem:    "privdata",
   262  		Name:         "retrieve_duration",
   263  		Help:         "Time it takes to retrieve missing private data elements from the ledger (in seconds)",
   264  		LabelNames:   []string{"channel"},
   265  		StatsdFormat: "%{#fqname}.%{channel}",
   266  	}
   267  )