@@ -62,14 +62,18 @@ type Database struct {
62
62
fn string // filename for reporting
63
63
db * leveldb.DB // LevelDB instance
64
64
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
73
77
74
78
quitLock sync.Mutex // Mutex protecting the quit channel access
75
79
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
96
100
BlockCacheCapacity : cache / 2 * opt .MiB ,
97
101
WriteBuffer : cache / 4 * opt .MiB , // Two of these are used internally
98
102
Filter : filter .NewBloomFilter (10 ),
103
+ DisableSeeksCompaction : true ,
99
104
})
100
105
if _ , corrupted := err .(* errors.ErrCorrupted ); corrupted {
101
106
db , err = leveldb .RecoverFile (file , nil )
@@ -118,6 +123,10 @@ func New(file string, cache int, handles int, namespace string) (*Database, erro
118
123
ldb .diskWriteMeter = metrics .NewRegisteredMeter (namespace + "disk/write" , nil )
119
124
ldb .writeDelayMeter = metrics .NewRegisteredMeter (namespace + "compact/writedelay/duration" , nil )
120
125
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 )
121
130
122
131
// Start up the metrics gathering and return
123
132
go ldb .meter (metricsGatheringInterval )
@@ -375,6 +384,29 @@ func (db *Database) meter(refresh time.Duration) {
375
384
}
376
385
iostats [0 ], iostats [1 ] = nRead , nWrite
377
386
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
+
378
410
// Sleep a bit, then repeat the stats collection
379
411
select {
380
412
case errc = <- db .quitChan :
0 commit comments