Coverage Report

Created: 2026-09-28 07:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/rocksdb/monitoring/statistics.cc
Line
Count
Source
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2
//  This source code is licensed under both the GPLv2 (found in the
3
//  COPYING file in the root directory) and Apache 2.0 License
4
//  (found in the LICENSE.Apache file in the root directory).
5
//
6
#include "rocksdb/statistics.h"
7
8
#include <algorithm>
9
#include <cinttypes>
10
#include <cstdio>
11
12
#include "monitoring/statistics_impl.h"
13
#include "rocksdb/convenience.h"
14
#include "rocksdb/utilities/customizable_util.h"
15
#include "rocksdb/utilities/options_type.h"
16
#include "util/string_util.h"
17
18
namespace ROCKSDB_NAMESPACE {
19
20
// The order of items listed in  Tickers should be the same as
21
// the order listed in TickersNameMap
22
const std::vector<std::pair<Tickers, std::string>> TickersNameMap = {
23
    {BLOCK_CACHE_MISS, "rocksdb.block.cache.miss"},
24
    {BLOCK_CACHE_HIT, "rocksdb.block.cache.hit"},
25
    {BLOCK_CACHE_ADD, "rocksdb.block.cache.add"},
26
    {BLOCK_CACHE_ADD_FAILURES, "rocksdb.block.cache.add.failures"},
27
    {BLOCK_CACHE_INDEX_MISS, "rocksdb.block.cache.index.miss"},
28
    {BLOCK_CACHE_INDEX_HIT, "rocksdb.block.cache.index.hit"},
29
    {BLOCK_CACHE_INDEX_ADD, "rocksdb.block.cache.index.add"},
30
    {BLOCK_CACHE_INDEX_BYTES_INSERT, "rocksdb.block.cache.index.bytes.insert"},
31
    {BLOCK_CACHE_FILTER_MISS, "rocksdb.block.cache.filter.miss"},
32
    {BLOCK_CACHE_FILTER_HIT, "rocksdb.block.cache.filter.hit"},
33
    {BLOCK_CACHE_FILTER_ADD, "rocksdb.block.cache.filter.add"},
34
    {BLOCK_CACHE_FILTER_BYTES_INSERT,
35
     "rocksdb.block.cache.filter.bytes.insert"},
36
    {BLOCK_CACHE_DATA_MISS, "rocksdb.block.cache.data.miss"},
37
    {BLOCK_CACHE_DATA_HIT, "rocksdb.block.cache.data.hit"},
38
    {BLOCK_CACHE_DATA_ADD, "rocksdb.block.cache.data.add"},
39
    {BLOCK_CACHE_DATA_BYTES_INSERT, "rocksdb.block.cache.data.bytes.insert"},
40
    {BLOCK_CACHE_BYTES_READ, "rocksdb.block.cache.bytes.read"},
41
    {BLOCK_CACHE_BYTES_WRITE, "rocksdb.block.cache.bytes.write"},
42
    {BLOCK_CACHE_COMPRESSION_DICT_MISS,
43
     "rocksdb.block.cache.compression.dict.miss"},
44
    {BLOCK_CACHE_COMPRESSION_DICT_HIT,
45
     "rocksdb.block.cache.compression.dict.hit"},
46
    {BLOCK_CACHE_COMPRESSION_DICT_ADD,
47
     "rocksdb.block.cache.compression.dict.add"},
48
    {BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT,
49
     "rocksdb.block.cache.compression.dict.bytes.insert"},
50
    {BLOCK_CACHE_ADD_REDUNDANT, "rocksdb.block.cache.add.redundant"},
51
    {BLOCK_CACHE_INDEX_ADD_REDUNDANT,
52
     "rocksdb.block.cache.index.add.redundant"},
53
    {BLOCK_CACHE_FILTER_ADD_REDUNDANT,
54
     "rocksdb.block.cache.filter.add.redundant"},
55
    {BLOCK_CACHE_DATA_ADD_REDUNDANT, "rocksdb.block.cache.data.add.redundant"},
56
    {BLOCK_CACHE_COMPRESSION_DICT_ADD_REDUNDANT,
57
     "rocksdb.block.cache.compression.dict.add.redundant"},
58
    {SECONDARY_CACHE_HITS, "rocksdb.secondary.cache.hits"},
59
    {SECONDARY_CACHE_FILTER_HITS, "rocksdb.secondary.cache.filter.hits"},
60
    {SECONDARY_CACHE_INDEX_HITS, "rocksdb.secondary.cache.index.hits"},
61
    {SECONDARY_CACHE_DATA_HITS, "rocksdb.secondary.cache.data.hits"},
62
    {COMPRESSED_SECONDARY_CACHE_DUMMY_HITS,
63
     "rocksdb.compressed.secondary.cache.dummy.hits"},
64
    {COMPRESSED_SECONDARY_CACHE_HITS,
65
     "rocksdb.compressed.secondary.cache.hits"},
66
    {COMPRESSED_SECONDARY_CACHE_PROMOTIONS,
67
     "rocksdb.compressed.secondary.cache.promotions"},
68
    {COMPRESSED_SECONDARY_CACHE_PROMOTION_SKIPS,
69
     "rocksdb.compressed.secondary.cache.promotion.skips"},
70
    {BLOOM_FILTER_USEFUL, "rocksdb.bloom.filter.useful"},
71
    {BLOOM_FILTER_FULL_POSITIVE, "rocksdb.bloom.filter.full.positive"},
72
    {BLOOM_FILTER_FULL_TRUE_POSITIVE,
73
     "rocksdb.bloom.filter.full.true.positive"},
74
    {BLOOM_FILTER_PREFIX_CHECKED, "rocksdb.bloom.filter.prefix.checked"},
75
    {BLOOM_FILTER_PREFIX_USEFUL, "rocksdb.bloom.filter.prefix.useful"},
76
    {BLOOM_FILTER_PREFIX_TRUE_POSITIVE,
77
     "rocksdb.bloom.filter.prefix.true.positive"},
78
    {PERSISTENT_CACHE_HIT, "rocksdb.persistent.cache.hit"},
79
    {PERSISTENT_CACHE_MISS, "rocksdb.persistent.cache.miss"},
80
    {SIM_BLOCK_CACHE_HIT, "rocksdb.sim.block.cache.hit"},
81
    {SIM_BLOCK_CACHE_MISS, "rocksdb.sim.block.cache.miss"},
82
    {MEMTABLE_HIT, "rocksdb.memtable.hit"},
83
    {MEMTABLE_MISS, "rocksdb.memtable.miss"},
84
    {GET_HIT_L0, "rocksdb.l0.hit"},
85
    {GET_HIT_L1, "rocksdb.l1.hit"},
86
    {GET_HIT_L2_AND_UP, "rocksdb.l2andup.hit"},
87
    {COMPACTION_KEY_DROP_NEWER_ENTRY, "rocksdb.compaction.key.drop.new"},
88
    {COMPACTION_KEY_DROP_OBSOLETE, "rocksdb.compaction.key.drop.obsolete"},
89
    {COMPACTION_KEY_DROP_RANGE_DEL, "rocksdb.compaction.key.drop.range_del"},
90
    {COMPACTION_KEY_DROP_USER, "rocksdb.compaction.key.drop.user"},
91
    {COMPACTION_RANGE_DEL_DROP_OBSOLETE,
92
     "rocksdb.compaction.range_del.drop.obsolete"},
93
    {COMPACTION_OPTIMIZED_DEL_DROP_OBSOLETE,
94
     "rocksdb.compaction.optimized.del.drop.obsolete"},
95
    {COMPACTION_CANCELLED, "rocksdb.compaction.cancelled"},
96
    {COMPACTION_ABORTED, "rocksdb.compaction.aborted"},
97
    {NUMBER_KEYS_WRITTEN, "rocksdb.number.keys.written"},
98
    {NUMBER_KEYS_READ, "rocksdb.number.keys.read"},
99
    {NUMBER_KEYS_UPDATED, "rocksdb.number.keys.updated"},
100
    {BYTES_WRITTEN, "rocksdb.bytes.written"},
101
    {BYTES_READ, "rocksdb.bytes.read"},
102
    {NUMBER_DB_SEEK, "rocksdb.number.db.seek"},
103
    {NUMBER_DB_NEXT, "rocksdb.number.db.next"},
104
    {NUMBER_DB_PREV, "rocksdb.number.db.prev"},
105
    {NUMBER_DB_SEEK_FOUND, "rocksdb.number.db.seek.found"},
106
    {NUMBER_DB_NEXT_FOUND, "rocksdb.number.db.next.found"},
107
    {NUMBER_DB_PREV_FOUND, "rocksdb.number.db.prev.found"},
108
    {ITER_BYTES_READ, "rocksdb.db.iter.bytes.read"},
109
    {NUMBER_ITER_SKIP, "rocksdb.number.iter.skip"},
110
    {NUMBER_OF_RESEEKS_IN_ITERATION, "rocksdb.number.reseeks.iteration"},
111
    {NO_ITERATOR_CREATED, "rocksdb.num.iterator.created"},
112
    {NO_ITERATOR_DELETED, "rocksdb.num.iterator.deleted"},
113
    {NO_FILE_OPENS, "rocksdb.no.file.opens"},
114
    {NO_FILE_ERRORS, "rocksdb.no.file.errors"},
115
    {STALL_MICROS, "rocksdb.stall.micros"},
116
    {DB_MUTEX_WAIT_MICROS, "rocksdb.db.mutex.wait.micros"},
117
    {NUMBER_MULTIGET_CALLS, "rocksdb.number.multiget.get"},
118
    {NUMBER_MULTIGET_KEYS_READ, "rocksdb.number.multiget.keys.read"},
119
    {NUMBER_MULTIGET_BYTES_READ, "rocksdb.number.multiget.bytes.read"},
120
    {NUMBER_MULTIGET_KEYS_FOUND, "rocksdb.number.multiget.keys.found"},
121
    {NUMBER_MERGE_FAILURES, "rocksdb.number.merge.failures"},
122
    {GET_UPDATES_SINCE_CALLS, "rocksdb.getupdatessince.calls"},
123
    {WAL_FILE_SYNCED, "rocksdb.wal.synced"},
124
    {WAL_FILE_BYTES, "rocksdb.wal.bytes"},
125
    {WAL_PRECREATE_HIT, "rocksdb.wal.precreate.hit"},
126
    {WAL_PRECREATE_MISS, "rocksdb.wal.precreate.miss"},
127
    {WAL_PRECREATE_WAITED, "rocksdb.wal.precreate.waited"},
128
    {WAL_PRECREATE_WAIT_MICROS, "rocksdb.wal.precreate.wait.micros"},
129
    {WAL_PRECREATE_FAILED, "rocksdb.wal.precreate.failed"},
130
    {WRITE_DONE_BY_SELF, "rocksdb.write.self"},
131
    {WRITE_DONE_BY_OTHER, "rocksdb.write.other"},
132
    {WRITE_WITH_WAL, "rocksdb.write.wal"},
133
    {COMPACT_READ_BYTES, "rocksdb.compact.read.bytes"},
134
    {COMPACT_WRITE_BYTES, "rocksdb.compact.write.bytes"},
135
    {FLUSH_WRITE_BYTES, "rocksdb.flush.write.bytes"},
136
    {COMPACT_READ_BYTES_MARKED, "rocksdb.compact.read.marked.bytes"},
137
    {COMPACT_READ_BYTES_PERIODIC, "rocksdb.compact.read.periodic.bytes"},
138
    {COMPACT_READ_BYTES_TTL, "rocksdb.compact.read.ttl.bytes"},
139
    {COMPACT_WRITE_BYTES_MARKED, "rocksdb.compact.write.marked.bytes"},
140
    {COMPACT_WRITE_BYTES_PERIODIC, "rocksdb.compact.write.periodic.bytes"},
141
    {COMPACT_WRITE_BYTES_TTL, "rocksdb.compact.write.ttl.bytes"},
142
    {NUMBER_DIRECT_LOAD_TABLE_PROPERTIES,
143
     "rocksdb.number.direct.load.table.properties"},
144
    {NUMBER_SUPERVERSION_ACQUIRES, "rocksdb.number.superversion_acquires"},
145
    {NUMBER_SUPERVERSION_RELEASES, "rocksdb.number.superversion_releases"},
146
    {NUMBER_SUPERVERSION_CLEANUPS, "rocksdb.number.superversion_cleanups"},
147
    {NUMBER_BLOCK_COMPRESSED, "rocksdb.number.block.compressed"},
148
    {NUMBER_BLOCK_DECOMPRESSED, "rocksdb.number.block.decompressed"},
149
    {BYTES_COMPRESSED_FROM, "rocksdb.bytes.compressed.from"},
150
    {BYTES_COMPRESSED_TO, "rocksdb.bytes.compressed.to"},
151
    {BYTES_COMPRESSION_BYPASSED, "rocksdb.bytes.compression_bypassed"},
152
    {BYTES_COMPRESSION_REJECTED, "rocksdb.bytes.compression.rejected"},
153
    {NUMBER_BLOCK_COMPRESSION_BYPASSED,
154
     "rocksdb.number.block_compression_bypassed"},
155
    {NUMBER_BLOCK_COMPRESSION_REJECTED,
156
     "rocksdb.number.block_compression_rejected"},
157
    {BYTES_DECOMPRESSED_FROM, "rocksdb.bytes.decompressed.from"},
158
    {BYTES_DECOMPRESSED_TO, "rocksdb.bytes.decompressed.to"},
159
    {MERGE_OPERATION_TOTAL_TIME, "rocksdb.merge.operation.time.nanos"},
160
    {FILTER_OPERATION_TOTAL_TIME, "rocksdb.filter.operation.time.nanos"},
161
    {COMPACTION_CPU_TOTAL_TIME, "rocksdb.compaction.total.time.cpu_micros"},
162
    {ROW_CACHE_HIT, "rocksdb.row.cache.hit"},
163
    {ROW_CACHE_MISS, "rocksdb.row.cache.miss"},
164
    {READ_AMP_ESTIMATE_USEFUL_BYTES, "rocksdb.read.amp.estimate.useful.bytes"},
165
    {READ_AMP_TOTAL_READ_BYTES, "rocksdb.read.amp.total.read.bytes"},
166
    {NUMBER_RATE_LIMITER_DRAINS, "rocksdb.number.rate_limiter.drains"},
167
    {RATE_LIMITER_BYTES_READ, "rocksdb.rate.limiter.bytes.read"},
168
    {RATE_LIMITER_BYTES_WRITE, "rocksdb.rate.limiter.bytes.write"},
169
    {RATE_LIMITER_REQUESTS_READ, "rocksdb.rate.limiter.requests.read"},
170
    {RATE_LIMITER_REQUESTS_WRITE, "rocksdb.rate.limiter.requests.write"},
171
    {RATE_LIMITER_DELAYED_REQUESTS_READ,
172
     "rocksdb.rate.limiter.delayed.requests.read"},
173
    {RATE_LIMITER_DELAYED_REQUESTS_WRITE,
174
     "rocksdb.rate.limiter.delayed.requests.write"},
175
    {RATE_LIMITER_TOTAL_WAIT_MICROS_READ,
176
     "rocksdb.rate.limiter.total.wait.micros.read"},
177
    {RATE_LIMITER_TOTAL_WAIT_MICROS_WRITE,
178
     "rocksdb.rate.limiter.total.wait.micros.write"},
179
    {BLOB_DB_NUM_PUT, "rocksdb.blobdb.num.put"},
180
    {BLOB_DB_NUM_WRITE, "rocksdb.blobdb.num.write"},
181
    {BLOB_DB_NUM_GET, "rocksdb.blobdb.num.get"},
182
    {BLOB_DB_NUM_MULTIGET, "rocksdb.blobdb.num.multiget"},
183
    {BLOB_DB_NUM_SEEK, "rocksdb.blobdb.num.seek"},
184
    {BLOB_DB_NUM_NEXT, "rocksdb.blobdb.num.next"},
185
    {BLOB_DB_NUM_PREV, "rocksdb.blobdb.num.prev"},
186
    {BLOB_DB_NUM_KEYS_WRITTEN, "rocksdb.blobdb.num.keys.written"},
187
    {BLOB_DB_NUM_KEYS_READ, "rocksdb.blobdb.num.keys.read"},
188
    {BLOB_DB_BYTES_WRITTEN, "rocksdb.blobdb.bytes.written"},
189
    {BLOB_DB_BYTES_READ, "rocksdb.blobdb.bytes.read"},
190
    {BLOB_DB_WRITE_INLINED_DEPRECATED, "rocksdb.blobdb.write.inlined"},
191
    {BLOB_DB_WRITE_INLINED_TTL_DEPRECATED, "rocksdb.blobdb.write.inlined.ttl"},
192
    {BLOB_DB_WRITE_BLOB, "rocksdb.blobdb.write.blob"},
193
    {BLOB_DB_WRITE_BLOB_TTL, "rocksdb.blobdb.write.blob.ttl"},
194
    {BLOB_DB_BLOB_FILE_BYTES_WRITTEN, "rocksdb.blobdb.blob.file.bytes.written"},
195
    {BLOB_DB_BLOB_FILE_BYTES_READ, "rocksdb.blobdb.blob.file.bytes.read"},
196
    {BLOB_DB_BLOB_FILE_SYNCED, "rocksdb.blobdb.blob.file.synced"},
197
    {BLOB_DB_BLOB_INDEX_EXPIRED_COUNT,
198
     "rocksdb.blobdb.blob.index.expired.count"},
199
    {BLOB_DB_BLOB_INDEX_EXPIRED_SIZE, "rocksdb.blobdb.blob.index.expired.size"},
200
    {BLOB_DB_BLOB_INDEX_EVICTED_COUNT,
201
     "rocksdb.blobdb.blob.index.evicted.count"},
202
    {BLOB_DB_BLOB_INDEX_EVICTED_SIZE, "rocksdb.blobdb.blob.index.evicted.size"},
203
    {BLOB_DB_GC_NUM_FILES, "rocksdb.blobdb.gc.num.files"},
204
    {BLOB_DB_GC_NUM_NEW_FILES, "rocksdb.blobdb.gc.num.new.files"},
205
    {BLOB_DB_GC_FAILURES, "rocksdb.blobdb.gc.failures"},
206
    {BLOB_DB_GC_NUM_KEYS_RELOCATED, "rocksdb.blobdb.gc.num.keys.relocated"},
207
    {BLOB_DB_GC_BYTES_RELOCATED, "rocksdb.blobdb.gc.bytes.relocated"},
208
    {BLOB_DB_FIFO_NUM_FILES_EVICTED, "rocksdb.blobdb.fifo.num.files.evicted"},
209
    {BLOB_DB_FIFO_NUM_KEYS_EVICTED, "rocksdb.blobdb.fifo.num.keys.evicted"},
210
    {BLOB_DB_FIFO_BYTES_EVICTED, "rocksdb.blobdb.fifo.bytes.evicted"},
211
    {BLOB_DB_CACHE_MISS, "rocksdb.blobdb.cache.miss"},
212
    {BLOB_DB_CACHE_HIT, "rocksdb.blobdb.cache.hit"},
213
    {BLOB_DB_CACHE_ADD, "rocksdb.blobdb.cache.add"},
214
    {BLOB_DB_CACHE_ADD_FAILURES, "rocksdb.blobdb.cache.add.failures"},
215
    {BLOB_DB_CACHE_BYTES_READ, "rocksdb.blobdb.cache.bytes.read"},
216
    {BLOB_DB_CACHE_BYTES_WRITE, "rocksdb.blobdb.cache.bytes.write"},
217
    {TXN_PREPARE_MUTEX_OVERHEAD, "rocksdb.txn.overhead.mutex.prepare"},
218
    {TXN_OLD_COMMIT_MAP_MUTEX_OVERHEAD,
219
     "rocksdb.txn.overhead.mutex.old.commit.map"},
220
    {TXN_DUPLICATE_KEY_OVERHEAD, "rocksdb.txn.overhead.duplicate.key"},
221
    {TXN_SNAPSHOT_MUTEX_OVERHEAD, "rocksdb.txn.overhead.mutex.snapshot"},
222
    {TXN_GET_TRY_AGAIN, "rocksdb.txn.get.tryagain"},
223
    {FILES_MARKED_TRASH, "rocksdb.files.marked.trash"},
224
    {FILES_DELETED_FROM_TRASH_QUEUE, "rocksdb.files.marked.trash.deleted"},
225
    {FILES_DELETED_IMMEDIATELY, "rocksdb.files.deleted.immediately"},
226
    {ERROR_HANDLER_BG_ERROR_COUNT, "rocksdb.error.handler.bg.error.count"},
227
    {ERROR_HANDLER_BG_IO_ERROR_COUNT,
228
     "rocksdb.error.handler.bg.io.error.count"},
229
    {ERROR_HANDLER_BG_RETRYABLE_IO_ERROR_COUNT,
230
     "rocksdb.error.handler.bg.retryable.io.error.count"},
231
    {ERROR_HANDLER_AUTORESUME_COUNT, "rocksdb.error.handler.autoresume.count"},
232
    {ERROR_HANDLER_AUTORESUME_RETRY_TOTAL_COUNT,
233
     "rocksdb.error.handler.autoresume.retry.total.count"},
234
    {ERROR_HANDLER_AUTORESUME_SUCCESS_COUNT,
235
     "rocksdb.error.handler.autoresume.success.count"},
236
    {MEMTABLE_PAYLOAD_BYTES_AT_FLUSH,
237
     "rocksdb.memtable.payload.bytes.at.flush"},
238
    {MEMTABLE_GARBAGE_BYTES_AT_FLUSH,
239
     "rocksdb.memtable.garbage.bytes.at.flush"},
240
    {VERIFY_CHECKSUM_READ_BYTES, "rocksdb.verify_checksum.read.bytes"},
241
    {BACKUP_READ_BYTES, "rocksdb.backup.read.bytes"},
242
    {BACKUP_WRITE_BYTES, "rocksdb.backup.write.bytes"},
243
    {REMOTE_COMPACT_READ_BYTES, "rocksdb.remote.compact.read.bytes"},
244
    {REMOTE_COMPACT_WRITE_BYTES, "rocksdb.remote.compact.write.bytes"},
245
    {REMOTE_COMPACT_RESUMED_BYTES, "rocksdb.remote.compact.resumed.bytes"},
246
    {HOT_FILE_READ_BYTES, "rocksdb.hot.file.read.bytes"},
247
    {WARM_FILE_READ_BYTES, "rocksdb.warm.file.read.bytes"},
248
    {COOL_FILE_READ_BYTES, "rocksdb.cool.file.read.bytes"},
249
    {COLD_FILE_READ_BYTES, "rocksdb.cold.file.read.bytes"},
250
    {ICE_FILE_READ_BYTES, "rocksdb.ice.file.read.bytes"},
251
    {HOT_FILE_READ_COUNT, "rocksdb.hot.file.read.count"},
252
    {WARM_FILE_READ_COUNT, "rocksdb.warm.file.read.count"},
253
    {COOL_FILE_READ_COUNT, "rocksdb.cool.file.read.count"},
254
    {COLD_FILE_READ_COUNT, "rocksdb.cold.file.read.count"},
255
    {ICE_FILE_READ_COUNT, "rocksdb.ice.file.read.count"},
256
    {LAST_LEVEL_READ_BYTES, "rocksdb.last.level.read.bytes"},
257
    {LAST_LEVEL_READ_COUNT, "rocksdb.last.level.read.count"},
258
    {NON_LAST_LEVEL_READ_BYTES, "rocksdb.non.last.level.read.bytes"},
259
    {NON_LAST_LEVEL_READ_COUNT, "rocksdb.non.last.level.read.count"},
260
    {LAST_LEVEL_SEEK_FILTERED, "rocksdb.last.level.seek.filtered"},
261
    {LAST_LEVEL_SEEK_FILTER_MATCH, "rocksdb.last.level.seek.filter.match"},
262
    {LAST_LEVEL_SEEK_DATA, "rocksdb.last.level.seek.data"},
263
    {LAST_LEVEL_SEEK_DATA_USEFUL_NO_FILTER,
264
     "rocksdb.last.level.seek.data.useful.no.filter"},
265
    {LAST_LEVEL_SEEK_DATA_USEFUL_FILTER_MATCH,
266
     "rocksdb.last.level.seek.data.useful.filter.match"},
267
    {NON_LAST_LEVEL_SEEK_FILTERED, "rocksdb.non.last.level.seek.filtered"},
268
    {NON_LAST_LEVEL_SEEK_FILTER_MATCH,
269
     "rocksdb.non.last.level.seek.filter.match"},
270
    {NON_LAST_LEVEL_SEEK_DATA, "rocksdb.non.last.level.seek.data"},
271
    {NON_LAST_LEVEL_SEEK_DATA_USEFUL_NO_FILTER,
272
     "rocksdb.non.last.level.seek.data.useful.no.filter"},
273
    {NON_LAST_LEVEL_SEEK_DATA_USEFUL_FILTER_MATCH,
274
     "rocksdb.non.last.level.seek.data.useful.filter.match"},
275
    {BLOCK_CHECKSUM_COMPUTE_COUNT, "rocksdb.block.checksum.compute.count"},
276
    {BLOCK_CHECKSUM_MISMATCH_COUNT, "rocksdb.block.checksum.mismatch.count"},
277
    {MULTIGET_COROUTINE_COUNT, "rocksdb.multiget.coroutine.count"},
278
    {READ_ASYNC_MICROS, "rocksdb.read.async.micros"},
279
    {ASYNC_READ_ERROR_COUNT, "rocksdb.async.read.error.count"},
280
    {TABLE_OPEN_PREFETCH_TAIL_MISS, "rocksdb.table.open.prefetch.tail.miss"},
281
    {TABLE_OPEN_PREFETCH_TAIL_HIT, "rocksdb.table.open.prefetch.tail.hit"},
282
    {TIMESTAMP_FILTER_TABLE_CHECKED, "rocksdb.timestamp.filter.table.checked"},
283
    {TIMESTAMP_FILTER_TABLE_FILTERED,
284
     "rocksdb.timestamp.filter.table.filtered"},
285
    {READAHEAD_TRIMMED, "rocksdb.readahead.trimmed"},
286
    {FIFO_MAX_SIZE_COMPACTIONS, "rocksdb.fifo.max.size.compactions"},
287
    {FIFO_TTL_COMPACTIONS, "rocksdb.fifo.ttl.compactions"},
288
    {FIFO_CHANGE_TEMPERATURE_COMPACTIONS,
289
     "rocksdb.fifo.change_temperature.compactions"},
290
    {PREFETCH_BYTES, "rocksdb.prefetch.bytes"},
291
    {PREFETCH_BYTES_USEFUL, "rocksdb.prefetch.bytes.useful"},
292
    {PREFETCH_HITS, "rocksdb.prefetch.hits"},
293
    {SST_FOOTER_CORRUPTION_COUNT, "rocksdb.footer.corruption.count"},
294
    {FILE_READ_CORRUPTION_RETRY_COUNT,
295
     "rocksdb.file.read.corruption.retry.count"},
296
    {FILE_READ_CORRUPTION_RETRY_SUCCESS_COUNT,
297
     "rocksdb.file.read.corruption.retry.success.count"},
298
    {NUMBER_WBWI_INGEST, "rocksdb.number.wbwi.ingest"},
299
    {SST_USER_DEFINED_INDEX_LOAD_FAIL_COUNT,
300
     "rocksdb.sst.user.defined.index.load.fail.count"},
301
    {MULTISCAN_PREPARE_CALLS, "rocksdb.multiscan.prepare.calls"},
302
    {MULTISCAN_PREPARE_ERRORS, "rocksdb.multiscan.prepare.errors"},
303
    {MULTISCAN_BLOCKS_PREFETCHED, "rocksdb.multiscan.blocks.prefetched"},
304
    {MULTISCAN_BLOCKS_FROM_CACHE, "rocksdb.multiscan.blocks.from.cache"},
305
    {MULTISCAN_PREFETCH_BYTES, "rocksdb.multiscan.prefetch.bytes"},
306
    {MULTISCAN_PREFETCH_BLOCKS_WASTED,
307
     "rocksdb.multiscan.prefetch.blocks.wasted"},
308
    {MULTISCAN_IO_REQUESTS, "rocksdb.multiscan.io.requests"},
309
    {MULTISCAN_IO_COALESCED_NONADJACENT,
310
     "rocksdb.multiscan.io.coalesced.nonadjacent"},
311
    {MULTISCAN_SEEK_ERRORS, "rocksdb.multiscan.seek.errors"},
312
    {PREFETCH_MEMORY_BYTES_GRANTED, "rocksdb.prefetch.memory.bytes.granted"},
313
    {PREFETCH_MEMORY_BYTES_RELEASED, "rocksdb.prefetch.memory.bytes.released"},
314
    {PREFETCH_MEMORY_REQUESTS_BLOCKED,
315
     "rocksdb.prefetch.memory.requests.blocked"},
316
    {READ_PATH_RANGE_TOMBSTONES_INSERTED,
317
     "rocksdb.read.path.range.tombstones.inserted"},
318
    {READ_PATH_RANGE_TOMBSTONES_DISCARDED,
319
     "rocksdb.read.path.range.tombstones.discarded"},
320
    {FILE_OPEN_METADATA_RETRIEVED, "rocksdb.file.open.metadata.retrieved"},
321
    {FILE_OPEN_METADATA_PASSED, "rocksdb.file.open.metadata.passed"},
322
    {MANIFEST_VALIDATION_FAILURE_COUNT,
323
     "rocksdb.manifest.validation.failure.count"},
324
    {FLUSH_REASON_WRITE_BUFFER_FULL, "rocksdb.flush.reason.write_buffer_full"},
325
    {FLUSH_REASON_WRITE_BUFFER_MANAGER,
326
     "rocksdb.flush.reason.write_buffer_manager"},
327
    {FLUSH_REASON_MEMTABLE_MAX_RANGE_DELETIONS,
328
     "rocksdb.flush.reason.memtable_max_range_deletions"},
329
    {ATOMIC_FLUSH_REQUEST_REASON_WRITE_BUFFER_FULL,
330
     "rocksdb.atomic_flush.request.reason.write_buffer_full"},
331
    {ATOMIC_FLUSH_REQUEST_REASON_WRITE_BUFFER_MANAGER,
332
     "rocksdb.atomic_flush.request.reason.write_buffer_manager"},
333
    {ATOMIC_FLUSH_REQUEST_REASON_MEMTABLE_MAX_RANGE_DELETIONS,
334
     "rocksdb.atomic_flush.request.reason.memtable_max_range_deletions"},
335
    {ATOMIC_FLUSH_REQUEST_REASON_OTHER,
336
     "rocksdb.atomic_flush.request.reason.other"},
337
    {CHECKPOINT_READ_BYTES, "rocksdb.checkpoint.read.bytes"},
338
    {CHECKPOINT_WRITE_BYTES, "rocksdb.checkpoint.write.bytes"},
339
    {FILE_SUBMIT_ASYNC_READ_FALLBACK,
340
     "rocksdb.file.submit.async.read.fallback"},
341
    {BLOB_DB_LAZY_READ_COUNT, "rocksdb.blobdb.lazy.read.count"},
342
    {BLOB_DB_LAZY_READ_BYTES, "rocksdb.blobdb.lazy.read.bytes"},
343
    {BLOB_DB_LAZY_PARTIAL_READ_COUNT, "rocksdb.blobdb.lazy.partial.read.count"},
344
    {BLOB_DB_LAZY_PARTIAL_BYTES_SAVED,
345
     "rocksdb.blobdb.lazy.partial.bytes.saved"},
346
};
347
348
const std::vector<std::pair<Histograms, std::string>> HistogramsNameMap = {
349
    {DB_GET, "rocksdb.db.get.micros"},
350
    {DB_WRITE, "rocksdb.db.write.micros"},
351
    {COMPACTION_TIME, "rocksdb.compaction.times.micros"},
352
    {COMPACTION_CPU_TIME, "rocksdb.compaction.times.cpu_micros"},
353
    {SUBCOMPACTION_SETUP_TIME, "rocksdb.subcompaction.setup.times.micros"},
354
    {TABLE_SYNC_MICROS, "rocksdb.table.sync.micros"},
355
    {COMPACTION_OUTFILE_SYNC_MICROS, "rocksdb.compaction.outfile.sync.micros"},
356
    {WAL_FILE_SYNC_MICROS, "rocksdb.wal.file.sync.micros"},
357
    {MANIFEST_FILE_SYNC_MICROS, "rocksdb.manifest.file.sync.micros"},
358
    {TABLE_OPEN_IO_MICROS, "rocksdb.table.open.io.micros"},
359
    {DB_MULTIGET, "rocksdb.db.multiget.micros"},
360
    {READ_BLOCK_COMPACTION_MICROS, "rocksdb.read.block.compaction.micros"},
361
    {READ_BLOCK_GET_MICROS, "rocksdb.read.block.get.micros"},
362
    {WRITE_RAW_BLOCK_MICROS, "rocksdb.write.raw.block.micros"},
363
    {NUM_FILES_IN_SINGLE_COMPACTION, "rocksdb.numfiles.in.singlecompaction"},
364
    {DB_SEEK, "rocksdb.db.seek.micros"},
365
    {WRITE_STALL, "rocksdb.db.write.stall"},
366
    {SST_READ_MICROS, "rocksdb.sst.read.micros"},
367
    {FILE_READ_FLUSH_MICROS, "rocksdb.file.read.flush.micros"},
368
    {FILE_READ_COMPACTION_MICROS, "rocksdb.file.read.compaction.micros"},
369
    {FILE_READ_DB_OPEN_MICROS, "rocksdb.file.read.db.open.micros"},
370
    {FILE_READ_GET_MICROS, "rocksdb.file.read.get.micros"},
371
    {FILE_READ_MULTIGET_MICROS, "rocksdb.file.read.multiget.micros"},
372
    {FILE_READ_DB_ITERATOR_MICROS, "rocksdb.file.read.db.iterator.micros"},
373
    {FILE_READ_VERIFY_DB_CHECKSUM_MICROS,
374
     "rocksdb.file.read.verify.db.checksum.micros"},
375
    {FILE_READ_VERIFY_FILE_CHECKSUMS_MICROS,
376
     "rocksdb.file.read.verify.file.checksums.micros"},
377
    {SST_WRITE_MICROS, "rocksdb.sst.write.micros"},
378
    {FILE_WRITE_FLUSH_MICROS, "rocksdb.file.write.flush.micros"},
379
    {FILE_WRITE_COMPACTION_MICROS, "rocksdb.file.write.compaction.micros"},
380
    {FILE_WRITE_DB_OPEN_MICROS, "rocksdb.file.write.db.open.micros"},
381
    {NUM_SUBCOMPACTIONS_SCHEDULED, "rocksdb.num.subcompactions.scheduled"},
382
    {BYTES_PER_READ, "rocksdb.bytes.per.read"},
383
    {BYTES_PER_WRITE, "rocksdb.bytes.per.write"},
384
    {BYTES_PER_MULTIGET, "rocksdb.bytes.per.multiget"},
385
    {COMPRESSION_TIMES_NANOS, "rocksdb.compression.times.nanos"},
386
    {DECOMPRESSION_TIMES_NANOS, "rocksdb.decompression.times.nanos"},
387
    {READ_NUM_MERGE_OPERANDS, "rocksdb.read.num.merge_operands"},
388
    {BLOB_DB_KEY_SIZE, "rocksdb.blobdb.key.size"},
389
    {BLOB_DB_VALUE_SIZE, "rocksdb.blobdb.value.size"},
390
    {BLOB_DB_WRITE_MICROS, "rocksdb.blobdb.write.micros"},
391
    {BLOB_DB_GET_MICROS, "rocksdb.blobdb.get.micros"},
392
    {BLOB_DB_MULTIGET_MICROS, "rocksdb.blobdb.multiget.micros"},
393
    {BLOB_DB_SEEK_MICROS, "rocksdb.blobdb.seek.micros"},
394
    {BLOB_DB_NEXT_MICROS, "rocksdb.blobdb.next.micros"},
395
    {BLOB_DB_PREV_MICROS, "rocksdb.blobdb.prev.micros"},
396
    {BLOB_DB_BLOB_FILE_WRITE_MICROS, "rocksdb.blobdb.blob.file.write.micros"},
397
    {BLOB_DB_BLOB_FILE_READ_MICROS, "rocksdb.blobdb.blob.file.read.micros"},
398
    {BLOB_DB_BLOB_FILE_SYNC_MICROS, "rocksdb.blobdb.blob.file.sync.micros"},
399
    {BLOB_DB_COMPRESSION_MICROS, "rocksdb.blobdb.compression.micros"},
400
    {BLOB_DB_DECOMPRESSION_MICROS, "rocksdb.blobdb.decompression.micros"},
401
    {FLUSH_TIME, "rocksdb.db.flush.micros"},
402
    {SST_BATCH_SIZE, "rocksdb.sst.batch.size"},
403
    {MULTIGET_IO_BATCH_SIZE, "rocksdb.multiget.io.batch.size"},
404
    {NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL,
405
     "rocksdb.num.index.and.filter.blocks.read.per.level"},
406
    {NUM_SST_READ_PER_LEVEL, "rocksdb.num.sst.read.per.level"},
407
    {NUM_LEVEL_READ_PER_MULTIGET, "rocksdb.num.level.read.per.multiget"},
408
    {ERROR_HANDLER_AUTORESUME_RETRY_COUNT,
409
     "rocksdb.error.handler.autoresume.retry.count"},
410
    {ASYNC_READ_BYTES, "rocksdb.async.read.bytes"},
411
    {POLL_WAIT_MICROS, "rocksdb.poll.wait.micros"},
412
    {COMPACTION_PREFETCH_BYTES, "rocksdb.compaction.prefetch.bytes"},
413
    {PREFETCHED_BYTES_DISCARDED, "rocksdb.prefetched.bytes.discarded"},
414
    {ASYNC_PREFETCH_ABORT_MICROS, "rocksdb.async.prefetch.abort.micros"},
415
    {TABLE_OPEN_PREFETCH_TAIL_READ_BYTES,
416
     "rocksdb.table.open.prefetch.tail.read.bytes"},
417
    {NUM_OP_PER_TRANSACTION, "rocksdb.num.op.per.transaction"},
418
    {MULTISCAN_PREPARE_ITERATORS,
419
     "rocksdb.multiscan.op.prepare.iterators.micros"},
420
    {MULTISCAN_PREPARE_MICROS, "rocksdb.multiscan.prepare.micros"},
421
    {MULTISCAN_BLOCKS_PER_PREPARE, "rocksdb.multiscan.blocks.per.prepare"},
422
    {IO_DISPATCHER_ASYNC_READ_OBSERVED_COMPLETION_MICROS,
423
     "rocksdb.iodispatcher.async.read.observed.completion.micros"},
424
    {IO_DISPATCHER_ASYNC_READ_POLL_WAIT_MICROS,
425
     "rocksdb.iodispatcher.async.read.poll.wait.micros"},
426
    {IO_DISPATCHER_ASYNC_READ_PREFETCH_LEAD_MICROS,
427
     "rocksdb.iodispatcher.async.read.prefetch.lead.micros"},
428
    {BLOCK_KEY_DISTRIBUTION_CV, "rocksdb.block.key.distribution.cv"},
429
    {INGEST_EXTERNAL_FILE_PREPARE_TIME,
430
     "rocksdb.ingest.external.file.prepare.micros"},
431
    {INGEST_EXTERNAL_FILE_RUN_TIME, "rocksdb.ingest.external.file.run.micros"},
432
    {RATE_LIMITER_WAIT_MICROS_READ, "rocksdb.rate.limiter.wait.micros.read"},
433
    {RATE_LIMITER_WAIT_MICROS_WRITE, "rocksdb.rate.limiter.wait.micros.write"},
434
    {FLUSH_MEMTABLE_MEMORY_BYTES, "rocksdb.flush.memtable.memory.bytes"},
435
    {FLUSH_MEMTABLE_TOTAL_DATA_SIZE,
436
     "rocksdb.flush.memtable.total.data.size.bytes"},
437
    {FLUSH_WRITE_BUFFER_FULL_MEMTABLE_MEMORY_BYTES,
438
     "rocksdb.flush.write_buffer_full.memtable.memory.bytes"},
439
    {FLUSH_WRITE_BUFFER_MANAGER_MEMTABLE_MEMORY_BYTES,
440
     "rocksdb.flush.write_buffer_manager.memtable.memory.bytes"},
441
    {OPEN_AND_COMPACT_DB_OPEN_MICROS,
442
     "rocksdb.open.and.compact.db.open.micros"},
443
};
444
445
0
std::shared_ptr<Statistics> CreateDBStatistics() {
446
0
  return std::make_shared<StatisticsImpl>(nullptr);
447
0
}
448
449
static int RegisterBuiltinStatistics(ObjectLibrary& library,
450
0
                                     const std::string& /*arg*/) {
451
0
  library.AddFactory<Statistics>(
452
0
      StatisticsImpl::kClassName(),
453
0
      [](const std::string& /*uri*/, std::unique_ptr<Statistics>* guard,
454
0
         std::string* /* errmsg */) {
455
0
        guard->reset(new StatisticsImpl(nullptr));
456
0
        return guard->get();
457
0
      });
458
0
  return 1;
459
0
}
460
461
Status Statistics::CreateFromString(const ConfigOptions& config_options,
462
                                    const std::string& id,
463
0
                                    std::shared_ptr<Statistics>* result) {
464
0
  static std::once_flag once;
465
0
  std::call_once(once, [&]() {
466
0
    RegisterBuiltinStatistics(*(ObjectLibrary::Default().get()), "");
467
0
  });
468
0
  Status s;
469
0
  if (id == "" || id == StatisticsImpl::kClassName()) {
470
0
    result->reset(new StatisticsImpl(nullptr));
471
0
  } else if (id == kNullptrString) {
472
0
    result->reset();
473
0
  } else {
474
0
    s = LoadSharedObject<Statistics>(config_options, id, result);
475
0
  }
476
0
  return s;
477
0
}
478
479
static std::unordered_map<std::string, OptionTypeInfo> stats_type_info = {
480
    {"inner", OptionTypeInfo::AsCustomSharedPtr<Statistics>(
481
                  0, OptionVerificationType::kByNameAllowFromNull,
482
                  OptionTypeFlags::kCompareNever)},
483
};
484
485
StatisticsImpl::StatisticsImpl(std::shared_ptr<Statistics> stats)
486
0
    : stats_(std::move(stats)) {
487
0
  RegisterOptions("StatisticsOptions", &stats_, &stats_type_info);
488
0
}
489
490
0
StatisticsImpl::~StatisticsImpl() = default;
491
492
0
uint64_t StatisticsImpl::getTickerCount(uint32_t tickerType) const {
493
0
  MutexLock lock(&aggregate_lock_);
494
0
  return getTickerCountLocked(tickerType);
495
0
}
496
497
0
uint64_t StatisticsImpl::getTickerCountLocked(uint32_t tickerType) const {
498
0
  assert(tickerType < TICKER_ENUM_MAX);
499
0
  uint64_t res = 0;
500
0
  for (size_t core_idx = 0; core_idx < per_core_stats_.Size(); ++core_idx) {
501
0
    res += per_core_stats_.AccessAtCore(core_idx)->tickers_[tickerType];
502
0
  }
503
0
  return res;
504
0
}
505
506
void StatisticsImpl::histogramData(uint32_t histogramType,
507
0
                                   HistogramData* const data) const {
508
0
  MutexLock lock(&aggregate_lock_);
509
0
  getHistogramImplLocked(histogramType)->Data(data);
510
0
}
511
512
std::unique_ptr<HistogramImpl> StatisticsImpl::getHistogramImplLocked(
513
0
    uint32_t histogramType) const {
514
0
  assert(histogramType < HISTOGRAM_ENUM_MAX);
515
0
  std::unique_ptr<HistogramImpl> res_hist(new HistogramImpl());
516
0
  for (size_t core_idx = 0; core_idx < per_core_stats_.Size(); ++core_idx) {
517
0
    res_hist->Merge(
518
0
        per_core_stats_.AccessAtCore(core_idx)->histograms_[histogramType]);
519
0
  }
520
0
  return res_hist;
521
0
}
522
523
0
std::string StatisticsImpl::getHistogramString(uint32_t histogramType) const {
524
0
  MutexLock lock(&aggregate_lock_);
525
0
  return getHistogramImplLocked(histogramType)->ToString();
526
0
}
527
528
0
void StatisticsImpl::setTickerCount(uint32_t tickerType, uint64_t count) {
529
0
  {
530
0
    MutexLock lock(&aggregate_lock_);
531
0
    setTickerCountLocked(tickerType, count);
532
0
  }
533
0
  if (stats_ && tickerType < TICKER_ENUM_MAX) {
534
0
    stats_->setTickerCount(tickerType, count);
535
0
  }
536
0
}
537
538
0
void StatisticsImpl::setTickerCountLocked(uint32_t tickerType, uint64_t count) {
539
0
  assert(tickerType < TICKER_ENUM_MAX);
540
0
  for (size_t core_idx = 0; core_idx < per_core_stats_.Size(); ++core_idx) {
541
0
    if (core_idx == 0) {
542
0
      per_core_stats_.AccessAtCore(core_idx)->tickers_[tickerType] = count;
543
0
    } else {
544
0
      per_core_stats_.AccessAtCore(core_idx)->tickers_[tickerType] = 0;
545
0
    }
546
0
  }
547
0
}
548
549
0
uint64_t StatisticsImpl::getAndResetTickerCount(uint32_t tickerType) {
550
0
  uint64_t sum = 0;
551
0
  {
552
0
    MutexLock lock(&aggregate_lock_);
553
0
    assert(tickerType < TICKER_ENUM_MAX);
554
0
    for (size_t core_idx = 0; core_idx < per_core_stats_.Size(); ++core_idx) {
555
0
      sum +=
556
0
          per_core_stats_.AccessAtCore(core_idx)->tickers_[tickerType].exchange(
557
0
              0, std::memory_order_relaxed);
558
0
    }
559
0
  }
560
0
  if (stats_ && tickerType < TICKER_ENUM_MAX) {
561
0
    stats_->setTickerCount(tickerType, 0);
562
0
  }
563
0
  return sum;
564
0
}
565
566
0
void StatisticsImpl::recordTick(uint32_t tickerType, uint64_t count) {
567
0
  if (get_stats_level() <= StatsLevel::kExceptTickers) {
568
0
    return;
569
0
  }
570
0
  if (tickerType < TICKER_ENUM_MAX) {
571
0
    per_core_stats_.Access()->tickers_[tickerType].fetch_add(
572
0
        count, std::memory_order_relaxed);
573
0
    if (stats_) {
574
0
      stats_->recordTick(tickerType, count);
575
0
    }
576
0
  } else {
577
0
    assert(false);
578
0
  }
579
0
}
580
581
0
void StatisticsImpl::recordInHistogram(uint32_t histogramType, uint64_t value) {
582
0
  assert(histogramType < HISTOGRAM_ENUM_MAX);
583
0
  if (get_stats_level() <= StatsLevel::kExceptHistogramOrTimers) {
584
0
    return;
585
0
  }
586
0
  per_core_stats_.Access()->histograms_[histogramType].Add(value);
587
0
  if (stats_ && histogramType < HISTOGRAM_ENUM_MAX) {
588
0
    stats_->recordInHistogram(histogramType, value);
589
0
  }
590
0
}
591
592
0
Status StatisticsImpl::Reset() {
593
0
  MutexLock lock(&aggregate_lock_);
594
0
  for (uint32_t i = 0; i < TICKER_ENUM_MAX; ++i) {
595
0
    setTickerCountLocked(i, 0);
596
0
  }
597
0
  for (uint32_t i = 0; i < HISTOGRAM_ENUM_MAX; ++i) {
598
0
    for (size_t core_idx = 0; core_idx < per_core_stats_.Size(); ++core_idx) {
599
0
      per_core_stats_.AccessAtCore(core_idx)->histograms_[i].Clear();
600
0
    }
601
0
  }
602
0
  return Status::OK();
603
0
}
604
605
namespace {
606
607
// a buffer size used for temp string buffers
608
const int kTmpStrBufferSize = 200;
609
610
}  // namespace
611
612
0
std::string StatisticsImpl::ToString() const {
613
0
  MutexLock lock(&aggregate_lock_);
614
0
  std::string res;
615
0
  res.reserve(20000);
616
0
  for (const auto& t : TickersNameMap) {
617
0
    assert(t.first < TICKER_ENUM_MAX);
618
0
    char buffer[kTmpStrBufferSize];
619
0
    snprintf(buffer, kTmpStrBufferSize, "%s COUNT : %" PRIu64 "\n",
620
0
             t.second.c_str(), getTickerCountLocked(t.first));
621
0
    res.append(buffer);
622
0
  }
623
0
  for (const auto& h : HistogramsNameMap) {
624
0
    assert(h.first < HISTOGRAM_ENUM_MAX);
625
0
    char buffer[kTmpStrBufferSize];
626
0
    HistogramData hData;
627
0
    getHistogramImplLocked(h.first)->Data(&hData);
628
    // don't handle failures - buffer should always be big enough and arguments
629
    // should be provided correctly
630
0
    int ret =
631
0
        snprintf(buffer, kTmpStrBufferSize,
632
0
                 "%s P50 : %f P95 : %f P99 : %f P100 : %f COUNT : %" PRIu64
633
0
                 " SUM : %" PRIu64 "\n",
634
0
                 h.second.c_str(), hData.median, hData.percentile95,
635
0
                 hData.percentile99, hData.max, hData.count, hData.sum);
636
0
    if (ret < 0 || ret >= kTmpStrBufferSize) {
637
0
      assert(false);
638
0
      continue;
639
0
    }
640
0
    res.append(buffer);
641
0
  }
642
0
  res.shrink_to_fit();
643
0
  return res;
644
0
}
645
646
bool StatisticsImpl::getTickerMap(
647
0
    std::map<std::string, uint64_t>* stats_map) const {
648
0
  assert(stats_map);
649
0
  if (!stats_map) {
650
0
    return false;
651
0
  }
652
0
  stats_map->clear();
653
0
  MutexLock lock(&aggregate_lock_);
654
0
  for (const auto& t : TickersNameMap) {
655
0
    assert(t.first < TICKER_ENUM_MAX);
656
0
    (*stats_map)[t.second.c_str()] = getTickerCountLocked(t.first);
657
0
  }
658
0
  return true;
659
0
}
660
661
0
bool StatisticsImpl::HistEnabledForType(uint32_t type) const {
662
0
  return type < HISTOGRAM_ENUM_MAX;
663
0
}
664
665
}  // namespace ROCKSDB_NAMESPACE