Add statistics

This commit is contained in:
Andrea Cavalli 2022-05-09 22:08:54 +02:00
parent e68a4e5121
commit cc69ec3063
1 changed files with 47 additions and 2 deletions

View File

@ -53,7 +53,6 @@ import org.apache.commons.lang3.time.StopWatch;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.rocksdb.BlockBasedTableConfig;
import org.rocksdb.BloomFilter;
import org.rocksdb.Cache;
@ -79,6 +78,9 @@ import org.rocksdb.PersistentCache;
import org.rocksdb.RocksDB;
import org.rocksdb.RocksDBException;
import org.rocksdb.Snapshot;
import org.rocksdb.Statistics;
import org.rocksdb.StatsLevel;
import org.rocksdb.TickerType;
import org.rocksdb.TransactionDB;
import org.rocksdb.TransactionDBOptions;
import org.rocksdb.TxnDBWritePolicy;
@ -118,6 +120,7 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
private final boolean enableColumnsBug;
private RocksDB db;
private Statistics statistics;
private Cache standardCache;
private Cache compressedCache;
private final Map<Column, ColumnFamilyHandle> handles;
@ -419,6 +422,13 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
}
}
var statsLevel = System.getProperty("it.cavallium.dbengine.stats.level");
if (statsLevel != null) {
this.statistics = registerStatistics(name, rocksdbOptions, meterRegistry, StatsLevel.valueOf(statsLevel));
} else {
this.statistics = null;
}
while (true) {
try {
// a factory method that returns a RocksDB instance
@ -828,7 +838,7 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
options.setCreateIfMissing(true);
options.setSkipStatsUpdateOnDbOpen(true);
options.setCreateMissingColumnFamilies(true);
options.setInfoLogLevel(InfoLogLevel.WARN_LEVEL);
options.setInfoLogLevel(InfoLogLevel.DEBUG_LEVEL);
options.setAvoidFlushDuringShutdown(false); // Flush all WALs during shutdown
options.setAvoidFlushDuringRecovery(true); // Flush all WALs during startup
options.setWalRecoveryMode(databaseOptions.absoluteConsistency()
@ -983,6 +993,37 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
return paths;
}
private Statistics registerStatistics(String dbName, DBOptions dbOptions, MeterRegistry meterRegistry,
StatsLevel statsLevel) {
Statistics stats = new Statistics();
stats.setStatsLevel(statsLevel);
dbOptions.setStatistics(stats);
for (TickerType tickerType : TickerType.values()) {
if (tickerType == TickerType.TICKER_ENUM_MAX) {
continue;
}
meterRegistry.gauge("rocksdb.statistics.value",
List.of(Tag.of("db.name", dbName), Tag.of("db.statistics.name", tickerType.name())),
stats,
statistics -> {
if (closed) {
return 0d;
}
var closeReadLock = closeLock.readLock();
try {
if (closed) {
return 0d;
}
return statistics.getTickerCount(tickerType);
} finally {
closeLock.unlockRead(closeReadLock);
}
}
);
}
return stats;
}
private Snapshot getSnapshotLambda(LLSnapshot snapshot) {
var closeReadSnapLock = closeLock.readLock();
try {
@ -1441,6 +1482,10 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
public Mono<Void> close() {
return Mono
.<Void>fromCallable(() -> {
if (statistics != null) {
statistics.close();
statistics = null;
}
try {
flushAndCloseDb(db, standardCache, compressedCache, new ArrayList<>(handles.values()));
deleteUnusedOldLogFiles();