mirror of https://github.com/hyperledger/besu
RocksDB Statistics in Metrics (#1169)
Expose all the RocksDB statistics as metrics Signed-off-by: Adrian Sutton <adrian.sutton@consensys.net>pull/2/head
parent
a46073e833
commit
4fc45282d5
@ -0,0 +1,210 @@ |
||||
/* |
||||
* Copyright 2019 ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
*/ |
||||
package tech.pegasys.pantheon.services.kvstore; |
||||
|
||||
import static tech.pegasys.pantheon.metrics.MetricCategory.KVSTORE_ROCKSDB_STATS; |
||||
|
||||
import tech.pegasys.pantheon.metrics.prometheus.PrometheusMetricsSystem; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
|
||||
import io.prometheus.client.Collector; |
||||
import org.rocksdb.HistogramData; |
||||
import org.rocksdb.HistogramType; |
||||
import org.rocksdb.Statistics; |
||||
import org.rocksdb.TickerType; |
||||
|
||||
class RocksDBStats { |
||||
|
||||
static final List<String> LABELS = Collections.singletonList("quantile"); |
||||
static final List<String> LABEL_50 = Collections.singletonList("0.5"); |
||||
static final List<String> LABEL_95 = Collections.singletonList("0.95"); |
||||
static final List<String> LABEL_99 = Collections.singletonList("0.99"); |
||||
|
||||
// Tickers - RocksDB equivalent of counters
|
||||
static final TickerType[] TICKERS = { |
||||
TickerType.BLOCK_CACHE_ADD, |
||||
TickerType.BLOCK_CACHE_HIT, |
||||
TickerType.BLOCK_CACHE_ADD_FAILURES, |
||||
TickerType.BLOCK_CACHE_INDEX_MISS, |
||||
TickerType.BLOCK_CACHE_INDEX_HIT, |
||||
TickerType.BLOCK_CACHE_INDEX_ADD, |
||||
TickerType.BLOCK_CACHE_INDEX_BYTES_INSERT, |
||||
TickerType.BLOCK_CACHE_INDEX_BYTES_EVICT, |
||||
TickerType.BLOCK_CACHE_FILTER_MISS, |
||||
TickerType.BLOCK_CACHE_FILTER_HIT, |
||||
TickerType.BLOCK_CACHE_FILTER_ADD, |
||||
TickerType.BLOCK_CACHE_FILTER_BYTES_INSERT, |
||||
TickerType.BLOCK_CACHE_FILTER_BYTES_EVICT, |
||||
TickerType.BLOCK_CACHE_DATA_MISS, |
||||
TickerType.BLOCK_CACHE_DATA_HIT, |
||||
TickerType.BLOCK_CACHE_DATA_ADD, |
||||
TickerType.BLOCK_CACHE_DATA_BYTES_INSERT, |
||||
TickerType.BLOCK_CACHE_BYTES_READ, |
||||
TickerType.BLOCK_CACHE_BYTES_WRITE, |
||||
TickerType.BLOOM_FILTER_USEFUL, |
||||
TickerType.PERSISTENT_CACHE_HIT, |
||||
TickerType.PERSISTENT_CACHE_MISS, |
||||
TickerType.SIM_BLOCK_CACHE_HIT, |
||||
TickerType.SIM_BLOCK_CACHE_MISS, |
||||
TickerType.MEMTABLE_HIT, |
||||
TickerType.MEMTABLE_MISS, |
||||
TickerType.GET_HIT_L0, |
||||
TickerType.GET_HIT_L1, |
||||
TickerType.GET_HIT_L2_AND_UP, |
||||
TickerType.COMPACTION_KEY_DROP_NEWER_ENTRY, |
||||
TickerType.COMPACTION_KEY_DROP_OBSOLETE, |
||||
TickerType.COMPACTION_KEY_DROP_RANGE_DEL, |
||||
TickerType.COMPACTION_KEY_DROP_USER, |
||||
TickerType.COMPACTION_RANGE_DEL_DROP_OBSOLETE, |
||||
TickerType.NUMBER_KEYS_WRITTEN, |
||||
TickerType.NUMBER_KEYS_READ, |
||||
TickerType.NUMBER_KEYS_UPDATED, |
||||
TickerType.BYTES_WRITTEN, |
||||
TickerType.BYTES_READ, |
||||
TickerType.NUMBER_DB_SEEK, |
||||
TickerType.NUMBER_DB_NEXT, |
||||
TickerType.NUMBER_DB_PREV, |
||||
TickerType.NUMBER_DB_SEEK_FOUND, |
||||
TickerType.NUMBER_DB_NEXT_FOUND, |
||||
TickerType.NUMBER_DB_PREV_FOUND, |
||||
TickerType.ITER_BYTES_READ, |
||||
TickerType.NO_FILE_CLOSES, |
||||
TickerType.NO_FILE_OPENS, |
||||
TickerType.NO_FILE_ERRORS, |
||||
// TickerType.STALL_L0_SLOWDOWN_MICROS,
|
||||
// TickerType.STALL_MEMTABLE_COMPACTION_MICROS,
|
||||
// TickerType.STALL_L0_NUM_FILES_MICROS,
|
||||
TickerType.STALL_MICROS, |
||||
TickerType.DB_MUTEX_WAIT_MICROS, |
||||
TickerType.RATE_LIMIT_DELAY_MILLIS, |
||||
TickerType.NO_ITERATORS, |
||||
TickerType.NUMBER_MULTIGET_BYTES_READ, |
||||
TickerType.NUMBER_MULTIGET_KEYS_READ, |
||||
TickerType.NUMBER_MULTIGET_CALLS, |
||||
TickerType.NUMBER_FILTERED_DELETES, |
||||
TickerType.NUMBER_MERGE_FAILURES, |
||||
TickerType.BLOOM_FILTER_PREFIX_CHECKED, |
||||
TickerType.BLOOM_FILTER_PREFIX_USEFUL, |
||||
TickerType.NUMBER_OF_RESEEKS_IN_ITERATION, |
||||
TickerType.GET_UPDATES_SINCE_CALLS, |
||||
TickerType.BLOCK_CACHE_COMPRESSED_MISS, |
||||
TickerType.BLOCK_CACHE_COMPRESSED_HIT, |
||||
TickerType.BLOCK_CACHE_COMPRESSED_ADD, |
||||
TickerType.BLOCK_CACHE_COMPRESSED_ADD_FAILURES, |
||||
TickerType.WAL_FILE_SYNCED, |
||||
TickerType.WAL_FILE_BYTES, |
||||
TickerType.WRITE_DONE_BY_SELF, |
||||
TickerType.WRITE_DONE_BY_OTHER, |
||||
TickerType.WRITE_TIMEDOUT, |
||||
TickerType.WRITE_WITH_WAL, |
||||
TickerType.COMPACT_READ_BYTES, |
||||
TickerType.COMPACT_WRITE_BYTES, |
||||
TickerType.FLUSH_WRITE_BYTES, |
||||
TickerType.NUMBER_DIRECT_LOAD_TABLE_PROPERTIES, |
||||
TickerType.NUMBER_SUPERVERSION_ACQUIRES, |
||||
TickerType.NUMBER_SUPERVERSION_RELEASES, |
||||
TickerType.NUMBER_SUPERVERSION_CLEANUPS, |
||||
TickerType.NUMBER_BLOCK_COMPRESSED, |
||||
TickerType.NUMBER_BLOCK_DECOMPRESSED, |
||||
TickerType.NUMBER_BLOCK_NOT_COMPRESSED, |
||||
TickerType.MERGE_OPERATION_TOTAL_TIME, |
||||
TickerType.FILTER_OPERATION_TOTAL_TIME, |
||||
TickerType.ROW_CACHE_HIT, |
||||
TickerType.ROW_CACHE_MISS, |
||||
TickerType.READ_AMP_ESTIMATE_USEFUL_BYTES, |
||||
TickerType.READ_AMP_TOTAL_READ_BYTES, |
||||
TickerType.NUMBER_RATE_LIMITER_DRAINS, |
||||
TickerType.NUMBER_ITER_SKIP, |
||||
TickerType.NUMBER_MULTIGET_KEYS_FOUND, |
||||
}; |
||||
|
||||
// Histograms - treated as prometheus summaries
|
||||
static final HistogramType[] HISTOGRAMS = { |
||||
HistogramType.DB_GET, |
||||
HistogramType.DB_WRITE, |
||||
HistogramType.COMPACTION_TIME, |
||||
HistogramType.SUBCOMPACTION_SETUP_TIME, |
||||
HistogramType.TABLE_SYNC_MICROS, |
||||
HistogramType.COMPACTION_OUTFILE_SYNC_MICROS, |
||||
HistogramType.WAL_FILE_SYNC_MICROS, |
||||
HistogramType.MANIFEST_FILE_SYNC_MICROS, |
||||
HistogramType.TABLE_OPEN_IO_MICROS, |
||||
HistogramType.DB_MULTIGET, |
||||
HistogramType.READ_BLOCK_COMPACTION_MICROS, |
||||
HistogramType.READ_BLOCK_GET_MICROS, |
||||
HistogramType.WRITE_RAW_BLOCK_MICROS, |
||||
HistogramType.STALL_L0_SLOWDOWN_COUNT, |
||||
HistogramType.STALL_MEMTABLE_COMPACTION_COUNT, |
||||
HistogramType.STALL_L0_NUM_FILES_COUNT, |
||||
HistogramType.HARD_RATE_LIMIT_DELAY_COUNT, |
||||
HistogramType.SOFT_RATE_LIMIT_DELAY_COUNT, |
||||
HistogramType.NUM_FILES_IN_SINGLE_COMPACTION, |
||||
HistogramType.DB_SEEK, |
||||
HistogramType.WRITE_STALL, |
||||
HistogramType.SST_READ_MICROS, |
||||
HistogramType.NUM_SUBCOMPACTIONS_SCHEDULED, |
||||
HistogramType.BYTES_PER_READ, |
||||
HistogramType.BYTES_PER_WRITE, |
||||
HistogramType.BYTES_PER_MULTIGET, |
||||
HistogramType.BYTES_COMPRESSED, |
||||
HistogramType.BYTES_DECOMPRESSED, |
||||
HistogramType.COMPRESSION_TIMES_NANOS, |
||||
HistogramType.DECOMPRESSION_TIMES_NANOS, |
||||
HistogramType.READ_NUM_MERGE_OPERANDS, |
||||
}; |
||||
|
||||
static void registerRocksDBMetrics( |
||||
final Statistics stats, final PrometheusMetricsSystem metricsSystem) { |
||||
|
||||
for (final TickerType ticker : TICKERS) { |
||||
final String promCounterName = ticker.name().toLowerCase(); |
||||
metricsSystem.createLongGauge( |
||||
KVSTORE_ROCKSDB_STATS, |
||||
promCounterName, |
||||
"RocksDB reported statistics for " + ticker.name(), |
||||
() -> stats.getTickerCount(ticker)); |
||||
} |
||||
|
||||
for (final HistogramType histogram : HISTOGRAMS) { |
||||
metricsSystem.addCollector(KVSTORE_ROCKSDB_STATS, histogramToCollector(stats, histogram)); |
||||
} |
||||
} |
||||
|
||||
private static Collector histogramToCollector( |
||||
final Statistics stats, final HistogramType histogram) { |
||||
return new Collector() { |
||||
final String metricName = |
||||
PrometheusMetricsSystem.convertToPrometheusName( |
||||
KVSTORE_ROCKSDB_STATS, histogram.name().toLowerCase()); |
||||
|
||||
@Override |
||||
public List<MetricFamilySamples> collect() { |
||||
final HistogramData data = stats.getHistogramData(histogram); |
||||
return Collections.singletonList( |
||||
new MetricFamilySamples( |
||||
metricName, |
||||
Type.SUMMARY, |
||||
"RocksDB histogram for " + metricName, |
||||
Arrays.asList( |
||||
new MetricFamilySamples.Sample(metricName, LABELS, LABEL_50, data.getMedian()), |
||||
new MetricFamilySamples.Sample( |
||||
metricName, LABELS, LABEL_95, data.getPercentile95()), |
||||
new MetricFamilySamples.Sample( |
||||
metricName, LABELS, LABEL_99, data.getPercentile99())))); |
||||
} |
||||
}; |
||||
} |
||||
} |
Loading…
Reference in new issue