/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 |