go.etcd.io/etcd@v3.3.27+incompatible/mvcc/metrics.go (about)

     1  // Copyright 2015 The etcd Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package mvcc
    16  
    17  import (
    18  	"sync"
    19  
    20  	"github.com/prometheus/client_golang/prometheus"
    21  )
    22  
    23  var (
    24  	rangeCounter = prometheus.NewCounter(
    25  		prometheus.CounterOpts{
    26  			Namespace: "etcd_debugging",
    27  			Subsystem: "mvcc",
    28  			Name:      "range_total",
    29  			Help:      "Total number of ranges seen by this member.",
    30  		})
    31  
    32  	putCounter = prometheus.NewCounter(
    33  		prometheus.CounterOpts{
    34  			Namespace: "etcd_debugging",
    35  			Subsystem: "mvcc",
    36  			Name:      "put_total",
    37  			Help:      "Total number of puts seen by this member.",
    38  		})
    39  
    40  	deleteCounter = prometheus.NewCounter(
    41  		prometheus.CounterOpts{
    42  			Namespace: "etcd_debugging",
    43  			Subsystem: "mvcc",
    44  			Name:      "delete_total",
    45  			Help:      "Total number of deletes seen by this member.",
    46  		})
    47  
    48  	txnCounter = prometheus.NewCounter(
    49  		prometheus.CounterOpts{
    50  			Namespace: "etcd_debugging",
    51  			Subsystem: "mvcc",
    52  			Name:      "txn_total",
    53  			Help:      "Total number of txns seen by this member.",
    54  		})
    55  
    56  	keysGauge = prometheus.NewGauge(
    57  		prometheus.GaugeOpts{
    58  			Namespace: "etcd_debugging",
    59  			Subsystem: "mvcc",
    60  			Name:      "keys_total",
    61  			Help:      "Total number of keys.",
    62  		})
    63  
    64  	watchStreamGauge = prometheus.NewGauge(
    65  		prometheus.GaugeOpts{
    66  			Namespace: "etcd_debugging",
    67  			Subsystem: "mvcc",
    68  			Name:      "watch_stream_total",
    69  			Help:      "Total number of watch streams.",
    70  		})
    71  
    72  	watcherGauge = prometheus.NewGauge(
    73  		prometheus.GaugeOpts{
    74  			Namespace: "etcd_debugging",
    75  			Subsystem: "mvcc",
    76  			Name:      "watcher_total",
    77  			Help:      "Total number of watchers.",
    78  		})
    79  
    80  	slowWatcherGauge = prometheus.NewGauge(
    81  		prometheus.GaugeOpts{
    82  			Namespace: "etcd_debugging",
    83  			Subsystem: "mvcc",
    84  			Name:      "slow_watcher_total",
    85  			Help:      "Total number of unsynced slow watchers.",
    86  		})
    87  
    88  	totalEventsCounter = prometheus.NewCounter(
    89  		prometheus.CounterOpts{
    90  			Namespace: "etcd_debugging",
    91  			Subsystem: "mvcc",
    92  			Name:      "events_total",
    93  			Help:      "Total number of events sent by this member.",
    94  		})
    95  
    96  	pendingEventsGauge = prometheus.NewGauge(
    97  		prometheus.GaugeOpts{
    98  			Namespace: "etcd_debugging",
    99  			Subsystem: "mvcc",
   100  			Name:      "pending_events_total",
   101  			Help:      "Total number of pending events to be sent.",
   102  		})
   103  
   104  	indexCompactionPauseDurations = prometheus.NewHistogram(
   105  		prometheus.HistogramOpts{
   106  			Namespace: "etcd_debugging",
   107  			Subsystem: "mvcc",
   108  			Name:      "index_compaction_pause_duration_milliseconds",
   109  			Help:      "Bucketed histogram of index compaction pause duration.",
   110  			// 0.5ms -> 1second
   111  			Buckets: prometheus.ExponentialBuckets(0.5, 2, 12),
   112  		})
   113  
   114  	dbCompactionPauseDurations = prometheus.NewHistogram(
   115  		prometheus.HistogramOpts{
   116  			Namespace: "etcd_debugging",
   117  			Subsystem: "mvcc",
   118  			Name:      "db_compaction_pause_duration_milliseconds",
   119  			Help:      "Bucketed histogram of db compaction pause duration.",
   120  			// 1ms -> 4second
   121  			Buckets: prometheus.ExponentialBuckets(1, 2, 13),
   122  		})
   123  
   124  	dbCompactionTotalDurations = prometheus.NewHistogram(
   125  		prometheus.HistogramOpts{
   126  			Namespace: "etcd_debugging",
   127  			Subsystem: "mvcc",
   128  			Name:      "db_compaction_total_duration_milliseconds",
   129  			Help:      "Bucketed histogram of db compaction total duration.",
   130  			// 100ms -> 800second
   131  			Buckets: prometheus.ExponentialBuckets(100, 2, 14),
   132  		})
   133  
   134  	dbCompactionKeysCounter = prometheus.NewCounter(
   135  		prometheus.CounterOpts{
   136  			Namespace: "etcd_debugging",
   137  			Subsystem: "mvcc",
   138  			Name:      "db_compaction_keys_total",
   139  			Help:      "Total number of db keys compacted.",
   140  		})
   141  
   142  	dbTotalSizeDebugging = prometheus.NewGaugeFunc(prometheus.GaugeOpts{
   143  		Namespace: "etcd_debugging",
   144  		Subsystem: "mvcc",
   145  		Name:      "db_total_size_in_bytes",
   146  		Help:      "Total size of the underlying database physically allocated in bytes. Use etcd_mvcc_db_total_size_in_bytes",
   147  	},
   148  		func() float64 {
   149  			reportDbTotalSizeInBytesMu.RLock()
   150  			defer reportDbTotalSizeInBytesMu.RUnlock()
   151  			return reportDbTotalSizeInBytes()
   152  		},
   153  	)
   154  	dbTotalSize = prometheus.NewGaugeFunc(prometheus.GaugeOpts{
   155  		Namespace: "etcd",
   156  		Subsystem: "mvcc",
   157  		Name:      "db_total_size_in_bytes",
   158  		Help:      "Total size of the underlying database physically allocated in bytes.",
   159  	},
   160  		func() float64 {
   161  			reportDbTotalSizeInBytesMu.RLock()
   162  			defer reportDbTotalSizeInBytesMu.RUnlock()
   163  			return reportDbTotalSizeInBytes()
   164  		},
   165  	)
   166  	// overridden by mvcc initialization
   167  	reportDbTotalSizeInBytesMu sync.RWMutex
   168  	reportDbTotalSizeInBytes   = func() float64 { return 0 }
   169  
   170  	dbTotalSizeInUse = prometheus.NewGaugeFunc(prometheus.GaugeOpts{
   171  		Namespace: "etcd",
   172  		Subsystem: "mvcc",
   173  		Name:      "db_total_size_in_use_in_bytes",
   174  		Help:      "Total size of the underlying database logically in use in bytes.",
   175  	},
   176  		func() float64 {
   177  			reportDbTotalSizeInUseInBytesMu.RLock()
   178  			defer reportDbTotalSizeInUseInBytesMu.RUnlock()
   179  			return reportDbTotalSizeInUseInBytes()
   180  		},
   181  	)
   182  	// overridden by mvcc initialization
   183  	reportDbTotalSizeInUseInBytesMu sync.RWMutex
   184  	reportDbTotalSizeInUseInBytes   func() float64 = func() float64 { return 0 }
   185  
   186  	hashDurations = prometheus.NewHistogram(prometheus.HistogramOpts{
   187  		Namespace: "etcd",
   188  		Subsystem: "mvcc",
   189  		Name:      "hash_duration_seconds",
   190  		Help:      "The latency distribution of storage hash operation.",
   191  
   192  		// 100 MB usually takes 100 ms, so start with 10 MB of 10 ms
   193  		// lowest bucket start of upper bound 0.01 sec (10 ms) with factor 2
   194  		// highest bucket start of 0.01 sec * 2^14 == 163.84 sec
   195  		Buckets: prometheus.ExponentialBuckets(.01, 2, 15),
   196  	})
   197  
   198  	hashRevDurations = prometheus.NewHistogram(prometheus.HistogramOpts{
   199  		Namespace: "etcd",
   200  		Subsystem: "mvcc",
   201  		Name:      "hash_rev_duration_seconds",
   202  		Help:      "The latency distribution of storage hash by revision operation.",
   203  
   204  		// 100 MB usually takes 100 ms, so start with 10 MB of 10 ms
   205  		// lowest bucket start of upper bound 0.01 sec (10 ms) with factor 2
   206  		// highest bucket start of 0.01 sec * 2^14 == 163.84 sec
   207  		Buckets: prometheus.ExponentialBuckets(.01, 2, 15),
   208  	})
   209  
   210  	currentRev = prometheus.NewGaugeFunc(prometheus.GaugeOpts{
   211  		Namespace: "etcd_debugging",
   212  		Subsystem: "mvcc",
   213  		Name:      "current_revision",
   214  		Help:      "The current revision of store.",
   215  	},
   216  		func() float64 {
   217  			reportCurrentRevMu.RLock()
   218  			defer reportCurrentRevMu.RUnlock()
   219  			return reportCurrentRev()
   220  		},
   221  	)
   222  	// overridden by mvcc initialization
   223  	reportCurrentRevMu sync.RWMutex
   224  	reportCurrentRev   = func() float64 { return 0 }
   225  
   226  	compactRev = prometheus.NewGaugeFunc(prometheus.GaugeOpts{
   227  		Namespace: "etcd_debugging",
   228  		Subsystem: "mvcc",
   229  		Name:      "compact_revision",
   230  		Help:      "The revision of the last compaction in store.",
   231  	},
   232  		func() float64 {
   233  			reportCompactRevMu.RLock()
   234  			defer reportCompactRevMu.RUnlock()
   235  			return reportCompactRev()
   236  		},
   237  	)
   238  	// overridden by mvcc initialization
   239  	reportCompactRevMu sync.RWMutex
   240  	reportCompactRev   = func() float64 { return 0 }
   241  
   242  	totalPutSizeGauge = prometheus.NewGauge(
   243  		prometheus.GaugeOpts{
   244  			Namespace: "etcd_debugging",
   245  			Subsystem: "mvcc",
   246  			Name:      "total_put_size_in_bytes",
   247  			Help:      "The total size of put kv pairs seen by this member.",
   248  		})
   249  )
   250  
   251  func init() {
   252  	prometheus.MustRegister(rangeCounter)
   253  	prometheus.MustRegister(putCounter)
   254  	prometheus.MustRegister(deleteCounter)
   255  	prometheus.MustRegister(txnCounter)
   256  	prometheus.MustRegister(keysGauge)
   257  	prometheus.MustRegister(watchStreamGauge)
   258  	prometheus.MustRegister(watcherGauge)
   259  	prometheus.MustRegister(slowWatcherGauge)
   260  	prometheus.MustRegister(totalEventsCounter)
   261  	prometheus.MustRegister(pendingEventsGauge)
   262  	prometheus.MustRegister(indexCompactionPauseDurations)
   263  	prometheus.MustRegister(dbCompactionPauseDurations)
   264  	prometheus.MustRegister(dbCompactionTotalDurations)
   265  	prometheus.MustRegister(dbCompactionKeysCounter)
   266  	prometheus.MustRegister(dbTotalSizeDebugging)
   267  	prometheus.MustRegister(dbTotalSize)
   268  	prometheus.MustRegister(dbTotalSizeInUse)
   269  	prometheus.MustRegister(hashDurations)
   270  	prometheus.MustRegister(hashRevDurations)
   271  	prometheus.MustRegister(currentRev)
   272  	prometheus.MustRegister(compactRev)
   273  	prometheus.MustRegister(totalPutSizeGauge)
   274  }
   275  
   276  // ReportEventReceived reports that an event is received.
   277  // This function should be called when the external systems received an
   278  // event from mvcc.Watcher.
   279  func ReportEventReceived(n int) {
   280  	pendingEventsGauge.Sub(float64(n))
   281  	totalEventsCounter.Add(float64(n))
   282  }