From 77d2c7cf3d19ca27bd2cb3dfa2feebf5fe300f0f Mon Sep 17 00:00:00 2001 From: Ganesh Vernekar Date: Sat, 8 Sep 2018 23:58:36 +0530 Subject: [PATCH] Added metric for symbol table size Signed-off-by: Ganesh Vernekar --- block.go | 31 ++++++++++++++++++++++++++----- db.go | 15 +++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/block.go b/block.go index 1a45fb9717..342a8d0205 100644 --- a/block.go +++ b/block.go @@ -15,6 +15,7 @@ package tsdb import ( + "encoding/binary" "encoding/json" "io/ioutil" "os" @@ -248,6 +249,10 @@ type Block struct { dir string meta BlockMeta + // Symbol Table Size in bytes. + // We maintain this variable to avoid recalculation everytime. + symbolTableSize uint64 + chunkr ChunkReader indexr IndexReader tombstones TombstoneReader @@ -275,12 +280,23 @@ func OpenBlock(dir string, pool chunkenc.Pool) (*Block, error) { return nil, err } + // Calculating symbol table size. + tmp := make([]byte, 8) + symTblSize := uint64(0) + for _, v := range ir.SymbolTable() { + // Size of varint length of the symbol. + symTblSize += uint64(binary.PutUvarint(tmp, uint64(len(v)))) + // Size of the symbol. + symTblSize += uint64(len(v)) + } + pb := &Block{ - dir: dir, - meta: *meta, - chunkr: cr, - indexr: ir, - tombstones: tr, + dir: dir, + meta: *meta, + chunkr: cr, + indexr: ir, + tombstones: tr, + symbolTableSize: symTblSize, } return pb, nil } @@ -350,6 +366,11 @@ func (pb *Block) Tombstones() (TombstoneReader, error) { return blockTombstoneReader{TombstoneReader: pb.tombstones, b: pb}, nil } +// GetSymbolTableSize returns the Symbol Table Size in the index of this block. +func (pb *Block) GetSymbolTableSize() uint64 { + return pb.symbolTableSize +} + func (pb *Block) setCompactionFailed() error { pb.meta.Compaction.Failed = true return writeMetaFile(pb.dir, &pb.meta) diff --git a/db.go b/db.go index e6a0a74b4b..2171a0cf31 100644 --- a/db.go +++ b/db.go @@ -119,6 +119,7 @@ type DB struct { type dbMetrics struct { loadedBlocks prometheus.GaugeFunc + symbolTableSize prometheus.GaugeFunc reloads prometheus.Counter reloadsFailed prometheus.Counter compactionsTriggered prometheus.Counter @@ -138,6 +139,19 @@ func newDBMetrics(db *DB, r prometheus.Registerer) *dbMetrics { defer db.mtx.RUnlock() return float64(len(db.blocks)) }) + m.symbolTableSize = prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + Name: "prometheus_tsdb_symbol_table_size", + Help: "Size of symbol table on disk (in bytes)", + }, func() float64 { + db.mtx.RLock() + blocks := db.blocks[:] + db.mtx.RUnlock() + symTblSize := float64(0) + for _, b := range blocks { + symTblSize += float64(b.GetSymbolTableSize()) + } + return symTblSize + }) m.reloads = prometheus.NewCounter(prometheus.CounterOpts{ Name: "prometheus_tsdb_reloads_total", Help: "Number of times the database reloaded block data from disk.", @@ -166,6 +180,7 @@ func newDBMetrics(db *DB, r prometheus.Registerer) *dbMetrics { if r != nil { r.MustRegister( m.loadedBlocks, + m.symbolTableSize, m.reloads, m.reloadsFailed, m.cutoffs,