From 948c284235e16ff01310b0cd42007f52c3e84ed4 Mon Sep 17 00:00:00 2001 From: Jingyi Hu Date: Thu, 5 Sep 2019 15:40:06 -0700 Subject: [PATCH] mvcc: add store revision metrics Add experimental metrics etcd_debugging_mvcc_current_revision and etcd_debugging_mvcc_compact_revision. --- mvcc/kvstore.go | 33 +++++++++++++++++++++++++-------- mvcc/metrics.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/mvcc/kvstore.go b/mvcc/kvstore.go index c68256685f8..aebea468138 100644 --- a/mvcc/kvstore.go +++ b/mvcc/kvstore.go @@ -249,14 +249,7 @@ func (s *store) Restore(b backend.Backend) error { } func (s *store) restore() error { - b := s.b - - reportDbTotalSizeInBytesMu.Lock() - reportDbTotalSizeInBytes = func() float64 { return float64(b.Size()) } - reportDbTotalSizeInBytesMu.Unlock() - reportDbTotalSizeInUseInBytesMu.Lock() - reportDbTotalSizeInUseInBytes = func() float64 { return float64(b.SizeInUse()) } - reportDbTotalSizeInUseInBytesMu.Unlock() + s.setupMetricsReporter() min, max := newRevBytes(), newRevBytes() revToBytes(revision{main: 1}, min) @@ -440,6 +433,30 @@ func (s *store) ConsistentIndex() uint64 { return binary.BigEndian.Uint64(vs[0]) } +func (s *store) setupMetricsReporter() { + b := s.b + reportDbTotalSizeInBytesMu.Lock() + reportDbTotalSizeInBytes = func() float64 { return float64(b.Size()) } + reportDbTotalSizeInBytesMu.Unlock() + reportDbTotalSizeInUseInBytesMu.Lock() + reportDbTotalSizeInUseInBytes = func() float64 { return float64(b.SizeInUse()) } + reportDbTotalSizeInUseInBytesMu.Unlock() + reportCurrentRevMu.Lock() + reportCurrentRev = func() float64 { + s.revMu.RLock() + defer s.revMu.RUnlock() + return float64(s.currentRev) + } + reportCurrentRevMu.Unlock() + reportCompactRevMu.Lock() + reportCompactRev = func() float64 { + s.revMu.RLock() + defer s.revMu.RUnlock() + return float64(s.compactMainRev) + } + reportCompactRevMu.Unlock() +} + // appendMarkTombstone appends tombstone mark to normal revision bytes. func appendMarkTombstone(b []byte) []byte { if len(b) != revBytesLen { diff --git a/mvcc/metrics.go b/mvcc/metrics.go index 90bf9ecae46..bcc7fe91f71 100644 --- a/mvcc/metrics.go +++ b/mvcc/metrics.go @@ -186,6 +186,38 @@ var ( // highest bucket start of 0.01 sec * 2^14 == 163.84 sec Buckets: prometheus.ExponentialBuckets(.01, 2, 15), }) + + currentRev = prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + Namespace: "etcd_debugging", + Subsystem: "mvcc", + Name: "current_revision", + Help: "The current revision of store.", + }, + func() float64 { + reportCurrentRevMu.RLock() + defer reportCurrentRevMu.RUnlock() + return reportCurrentRev() + }, + ) + // overridden by mvcc initialization + reportCurrentRevMu sync.RWMutex + reportCurrentRev = func() float64 { return 0 } + + compactRev = prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + Namespace: "etcd_debugging", + Subsystem: "mvcc", + Name: "compact_revision", + Help: "The revision of the last compaction in store.", + }, + func() float64 { + reportCompactRevMu.RLock() + defer reportCompactRevMu.RUnlock() + return reportCompactRev() + }, + ) + // overridden by mvcc initialization + reportCompactRevMu sync.RWMutex + reportCompactRev = func() float64 { return 0 } ) func init() { @@ -206,6 +238,8 @@ func init() { prometheus.MustRegister(dbTotalSize) prometheus.MustRegister(dbTotalSizeInUse) prometheus.MustRegister(hashDurations) + prometheus.MustRegister(currentRev) + prometheus.MustRegister(compactRev) } // ReportEventReceived reports that an event is received.