@@ -62,14 +62,18 @@ type Database struct {
6262 fn string // filename for reporting
6363 db * leveldb.DB // LevelDB instance
6464
65- compTimeMeter metrics.Meter // Meter for measuring the total time spent in database compaction
66- compReadMeter metrics.Meter // Meter for measuring the data read during compaction
67- compWriteMeter metrics.Meter // Meter for measuring the data written during compaction
68- writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction
69- writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction
70- diskSizeGauge metrics.Gauge // Gauge for tracking the size of all the levels in the database
71- diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read
72- diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written
65+ compTimeMeter metrics.Meter // Meter for measuring the total time spent in database compaction
66+ compReadMeter metrics.Meter // Meter for measuring the data read during compaction
67+ compWriteMeter metrics.Meter // Meter for measuring the data written during compaction
68+ writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction
69+ writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction
70+ diskSizeGauge metrics.Gauge // Gauge for tracking the size of all the levels in the database
71+ diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read
72+ diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written
73+ memCompGauge metrics.Gauge // Gauge for tracking the number of memory compaction
74+ level0CompGauge metrics.Gauge // Gauge for tracking the number of table compaction in level0
75+ nonlevel0CompGauge metrics.Gauge // Gauge for tracking the number of table compaction in non0 level
76+ seekCompGauge metrics.Gauge // Gauge for tracking the number of table compaction caused by read opt
7377
7478 quitLock sync.Mutex // Mutex protecting the quit channel access
7579 quitChan chan chan error // Quit channel to stop the metrics collection before closing the database
@@ -96,6 +100,7 @@ func New(file string, cache int, handles int, namespace string) (*Database, erro
96100 BlockCacheCapacity : cache / 2 * opt .MiB ,
97101 WriteBuffer : cache / 4 * opt .MiB , // Two of these are used internally
98102 Filter : filter .NewBloomFilter (10 ),
103+ DisableSeeksCompaction : true ,
99104 })
100105 if _ , corrupted := err .(* errors.ErrCorrupted ); corrupted {
101106 db , err = leveldb .RecoverFile (file , nil )
@@ -118,6 +123,10 @@ func New(file string, cache int, handles int, namespace string) (*Database, erro
118123 ldb .diskWriteMeter = metrics .NewRegisteredMeter (namespace + "disk/write" , nil )
119124 ldb .writeDelayMeter = metrics .NewRegisteredMeter (namespace + "compact/writedelay/duration" , nil )
120125 ldb .writeDelayNMeter = metrics .NewRegisteredMeter (namespace + "compact/writedelay/counter" , nil )
126+ ldb .memCompGauge = metrics .NewRegisteredGauge (namespace + "compact/memory" , nil )
127+ ldb .level0CompGauge = metrics .NewRegisteredGauge (namespace + "compact/level0" , nil )
128+ ldb .nonlevel0CompGauge = metrics .NewRegisteredGauge (namespace + "compact/nonlevel0" , nil )
129+ ldb .seekCompGauge = metrics .NewRegisteredGauge (namespace + "compact/seek" , nil )
121130
122131 // Start up the metrics gathering and return
123132 go ldb .meter (metricsGatheringInterval )
@@ -375,6 +384,29 @@ func (db *Database) meter(refresh time.Duration) {
375384 }
376385 iostats [0 ], iostats [1 ] = nRead , nWrite
377386
387+ compCount , err := db .db .GetProperty ("leveldb.compcount" )
388+ if err != nil {
389+ db .log .Error ("Failed to read database iostats" , "err" , err )
390+ merr = err
391+ continue
392+ }
393+
394+ var (
395+ memComp uint32
396+ level0Comp uint32
397+ nonLevel0Comp uint32
398+ seekComp uint32
399+ )
400+ if n , err := fmt .Sscanf (compCount , "MemComp:%d Level0Comp:%d NonLevel0Comp:%d SeekComp:%d" , & memComp , & level0Comp , & nonLevel0Comp , & seekComp ); n != 4 || err != nil {
401+ db .log .Error ("Compaction count statistic not found" )
402+ merr = err
403+ continue
404+ }
405+ db .memCompGauge .Update (int64 (memComp ))
406+ db .level0CompGauge .Update (int64 (level0Comp ))
407+ db .nonlevel0CompGauge .Update (int64 (nonLevel0Comp ))
408+ db .seekCompGauge .Update (int64 (seekComp ))
409+
378410 // Sleep a bit, then repeat the stats collection
379411 select {
380412 case errc = <- db .quitChan :
0 commit comments