github.com/pingcap/badger@v1.5.1-0.20230103063557-828f39b09b6d/y/metrics.go (about) 1 /* 2 * Copyright (C) 2017 Dgraph Labs, Inc. and Contributors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package y 18 19 import ( 20 "github.com/prometheus/client_golang/prometheus" 21 ) 22 23 const ( 24 namespace = "badger" 25 labelPath = "path" 26 labelLevel = "target_level" 27 ) 28 29 var ( 30 // LSMSize has size of the LSM in bytes 31 LSMSize = prometheus.NewGaugeVec(prometheus.GaugeOpts{ 32 Namespace: namespace, 33 Name: "lsm_size", 34 }, []string{labelPath}) 35 // VlogSize has size of the value log in bytes 36 VlogSize = prometheus.NewGaugeVec(prometheus.GaugeOpts{ 37 Namespace: namespace, 38 Name: "vlog_size", 39 }, []string{labelPath}) 40 41 // These are cumulative 42 43 // NumReads has cumulative number of reads 44 NumReads = prometheus.NewCounterVec(prometheus.CounterOpts{ 45 Namespace: namespace, 46 Name: "num_reads", 47 }, []string{labelPath}) 48 // NumWrites has cumulative number of writes 49 NumWrites = prometheus.NewCounterVec(prometheus.CounterOpts{ 50 Namespace: namespace, 51 Name: "num_writes", 52 }, []string{labelPath}) 53 // NumBytesRead has cumulative number of bytes read 54 NumBytesRead = prometheus.NewCounterVec(prometheus.CounterOpts{ 55 Namespace: namespace, 56 Name: "num_bytes_read", 57 }, []string{labelPath}) 58 // NumVLogBytesWritten has cumulative number of bytes written 59 NumVLogBytesWritten = prometheus.NewCounterVec(prometheus.CounterOpts{ 60 Namespace: namespace, 61 Name: "num_bytes_written", 62 }, []string{labelPath}) 63 // NumGets is number of gets 64 NumGets = prometheus.NewCounterVec(prometheus.CounterOpts{ 65 Namespace: namespace, 66 Name: "num_gets", 67 }, []string{labelPath}) 68 // NumPuts is number of puts 69 NumPuts = prometheus.NewCounterVec(prometheus.CounterOpts{ 70 Namespace: namespace, 71 Name: "num_puts", 72 }, []string{labelPath}) 73 // NumMemtableGets is number of memtable gets 74 NumMemtableGets = prometheus.NewCounterVec(prometheus.CounterOpts{ 75 Namespace: namespace, 76 Name: "num_memtable_gets", 77 }, []string{labelPath}) 78 79 // Level statistics 80 81 // NumCompactionBytesWrite has cumulative size of keys read during compaction. 82 NumCompactionBytesWrite = prometheus.NewCounterVec(prometheus.CounterOpts{ 83 Namespace: namespace, 84 Name: "num_compaction_bytes_write", 85 }, []string{labelPath, labelLevel}) 86 // NumCompactionBytesRead has cumulative size of keys write during compaction. 87 NumCompactionBytesRead = prometheus.NewCounterVec(prometheus.CounterOpts{ 88 Namespace: namespace, 89 Name: "num_compaction_bytes_read", 90 }, []string{labelPath, labelLevel}) 91 // NumCompactionBytesRead has cumulative size of discarded keys after compaction. 92 NumCompactionBytesDiscard = prometheus.NewCounterVec(prometheus.CounterOpts{ 93 Namespace: namespace, 94 Name: "num_compaction_bytes_discard", 95 }, []string{labelPath, labelLevel}) 96 // NumCompactionKeysWrite has cumulative count of keys write during compaction. 97 NumCompactionKeysWrite = prometheus.NewCounterVec(prometheus.CounterOpts{ 98 Namespace: namespace, 99 Name: "num_compaction_keys_write", 100 }, []string{labelPath, labelLevel}) 101 // NumCompactionKeysRead has cumulative count of keys read during compaction. 102 NumCompactionKeysRead = prometheus.NewCounterVec(prometheus.CounterOpts{ 103 Namespace: namespace, 104 Name: "num_compaction_keys_read", 105 }, []string{labelPath, labelLevel}) 106 // NumCompactionKeysDiscard has cumulative count of discarded keys after compaction. 107 NumCompactionKeysDiscard = prometheus.NewCounterVec(prometheus.CounterOpts{ 108 Namespace: namespace, 109 Name: "num_compaction_keys_discard", 110 }, []string{labelPath, labelLevel}) 111 // NumLSMGets is number of LMS gets 112 NumLSMGets = prometheus.NewCounterVec(prometheus.CounterOpts{ 113 Namespace: namespace, 114 Name: "num_lsm_gets", 115 }, []string{labelPath, labelLevel}) 116 // NumLSMBloomFalsePositive is number of LMS bloom hits 117 NumLSMBloomFalsePositive = prometheus.NewCounterVec(prometheus.CounterOpts{ 118 Namespace: namespace, 119 Name: "num_lsm_bloom_false_positive", 120 }, []string{labelPath, labelLevel}) 121 122 // Histograms 123 124 VlogSyncDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{ 125 Namespace: namespace, 126 Name: "vlog_sync_duration", 127 Buckets: prometheus.ExponentialBuckets(0.001, 1.5, 20), 128 }, []string{labelPath}) 129 130 WriteLSMDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{ 131 Namespace: namespace, 132 Name: "write_lsm_duration", 133 Buckets: prometheus.ExponentialBuckets(0.0003, 1.5, 20), 134 }, []string{labelPath}) 135 136 LSMGetDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{ 137 Namespace: namespace, 138 Name: "lsm_get_duration", 139 Buckets: prometheus.ExponentialBuckets(0.0003, 1.5, 20), 140 }, []string{labelPath}) 141 142 LSMMultiGetDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{ 143 Namespace: namespace, 144 Name: "lsm_multi_get_duration", 145 Buckets: prometheus.ExponentialBuckets(0.0003, 1.5, 20), 146 }, []string{labelPath}) 147 ) 148 149 type MetricsSet struct { 150 path string 151 LSMSize prometheus.Gauge 152 VlogSize prometheus.Gauge 153 NumReads prometheus.Counter 154 NumWrites prometheus.Counter 155 NumBytesRead prometheus.Counter 156 NumVLogBytesWritten prometheus.Counter 157 NumGets prometheus.Counter 158 NumPuts prometheus.Counter 159 NumMemtableGets prometheus.Counter 160 VlogSyncDuration prometheus.Observer 161 WriteLSMDuration prometheus.Observer 162 LSMGetDuration prometheus.Observer 163 LSMMultiGetDuration prometheus.Observer 164 } 165 166 func NewMetricSet(path string) *MetricsSet { 167 return &MetricsSet{ 168 path: path, 169 LSMSize: LSMSize.WithLabelValues(path), 170 VlogSize: VlogSize.WithLabelValues(path), 171 NumReads: NumReads.WithLabelValues(path), 172 NumWrites: NumWrites.WithLabelValues(path), 173 NumBytesRead: NumBytesRead.WithLabelValues(path), 174 NumVLogBytesWritten: NumVLogBytesWritten.WithLabelValues(path), 175 176 NumGets: NumGets.WithLabelValues(path), 177 NumPuts: NumPuts.WithLabelValues(path), 178 NumMemtableGets: NumMemtableGets.WithLabelValues(path), 179 VlogSyncDuration: VlogSyncDuration.WithLabelValues(path), 180 WriteLSMDuration: WriteLSMDuration.WithLabelValues(path), 181 LSMGetDuration: LSMGetDuration.WithLabelValues(path), 182 LSMMultiGetDuration: LSMMultiGetDuration.WithLabelValues(path), 183 } 184 } 185 186 func (m *MetricsSet) NewLevelMetricsSet(levelLabel string) *LevelMetricsSet { 187 return &LevelMetricsSet{ 188 MetricsSet: m, 189 NumLSMGets: NumLSMGets.WithLabelValues(m.path, levelLabel), 190 NumLSMBloomFalsePositive: NumLSMBloomFalsePositive.WithLabelValues(m.path, levelLabel), 191 NumCompactionKeysRead: NumCompactionKeysRead.WithLabelValues(m.path, levelLabel), 192 NumCompactionBytesRead: NumCompactionBytesRead.WithLabelValues(m.path, levelLabel), 193 NumCompactionKeysWrite: NumCompactionKeysWrite.WithLabelValues(m.path, levelLabel), 194 NumCompactionBytesWrite: NumCompactionBytesWrite.WithLabelValues(m.path, levelLabel), 195 NumCompactionKeysDiscard: NumCompactionKeysDiscard.WithLabelValues(m.path, levelLabel), 196 NumCompactionBytesDiscard: NumCompactionBytesDiscard.WithLabelValues(m.path, levelLabel), 197 } 198 } 199 200 type LevelMetricsSet struct { 201 *MetricsSet 202 NumCompactionKeysRead prometheus.Counter 203 NumCompactionBytesRead prometheus.Counter 204 NumCompactionKeysWrite prometheus.Counter 205 NumCompactionBytesWrite prometheus.Counter 206 NumCompactionKeysDiscard prometheus.Counter 207 NumCompactionBytesDiscard prometheus.Counter 208 NumLSMGets prometheus.Counter 209 NumLSMBloomFalsePositive prometheus.Counter 210 } 211 212 type CompactionStats struct { 213 KeysRead int 214 BytesRead int 215 KeysWrite int 216 BytesWrite int 217 KeysDiscard int 218 BytesDiscard int 219 } 220 221 func (m *LevelMetricsSet) UpdateCompactionStats(stats *CompactionStats) { 222 m.NumCompactionKeysRead.Add(float64(stats.KeysRead)) 223 m.NumCompactionBytesRead.Add(float64(stats.BytesRead)) 224 225 m.NumCompactionKeysWrite.Add(float64(stats.KeysWrite)) 226 m.NumCompactionBytesWrite.Add(float64(stats.BytesWrite)) 227 228 m.NumCompactionKeysDiscard.Add(float64(stats.KeysDiscard)) 229 m.NumCompactionBytesDiscard.Add(float64(stats.BytesDiscard)) 230 } 231 232 // These variables are global and have cumulative values for all kv stores. 233 func init() { 234 prometheus.MustRegister(LSMSize) 235 prometheus.MustRegister(VlogSize) 236 prometheus.MustRegister(NumReads) 237 prometheus.MustRegister(NumWrites) 238 prometheus.MustRegister(NumBytesRead) 239 prometheus.MustRegister(NumVLogBytesWritten) 240 prometheus.MustRegister(NumLSMGets) 241 prometheus.MustRegister(NumLSMBloomFalsePositive) 242 prometheus.MustRegister(NumGets) 243 prometheus.MustRegister(NumPuts) 244 prometheus.MustRegister(NumMemtableGets) 245 prometheus.MustRegister(VlogSyncDuration) 246 prometheus.MustRegister(WriteLSMDuration) 247 prometheus.MustRegister(LSMGetDuration) 248 prometheus.MustRegister(LSMMultiGetDuration) 249 prometheus.MustRegister(NumCompactionBytesWrite) 250 prometheus.MustRegister(NumCompactionBytesRead) 251 prometheus.MustRegister(NumCompactionBytesDiscard) 252 prometheus.MustRegister(NumCompactionKeysRead) 253 prometheus.MustRegister(NumCompactionKeysWrite) 254 prometheus.MustRegister(NumCompactionKeysDiscard) 255 }