blob: b46fd782ee4dda21f497ed1d7d833f05df6c03e4 [file] [log] [blame]
khenaidood948f772021-08-11 17:49:24 -04001// 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
15package mvcc
16
17import (
18 "sync"
19
20 "github.com/prometheus/client_golang/prometheus"
21)
22
23var (
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
251func 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.
279func ReportEventReceived(n int) {
280 pendingEventsGauge.Sub(float64(n))
281 totalEventsCounter.Add(float64(n))
282}