Skip to content
This repository was archived by the owner on Jan 20, 2026. It is now read-only.

Commit cc4d74f

Browse files
committed
Add metrics for seidb
1 parent 0b0a66e commit cc4d74f

5 files changed

Lines changed: 52 additions & 55 deletions

File tree

common/metrics/metrics.go

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package metrics
22

33
import (
4-
"fmt"
54
"go.opentelemetry.io/otel"
6-
"go.opentelemetry.io/otel/exporters/prometheus"
75
"go.opentelemetry.io/otel/metric"
8-
sdk "go.opentelemetry.io/otel/sdk/metric"
96
)
107

118
var (
@@ -16,8 +13,8 @@ var (
1613
SnapshotCreationLatency metric.Float64Histogram
1714
CommitLatency metric.Int64Histogram
1815
ApplyChangesetLatency metric.Int64Histogram
19-
MemNodeTotalSize metric.Float64Gauge
20-
MemNodeCount metric.Float64Gauge
16+
MemNodeTotalSize metric.Int64Gauge
17+
NumOfMemNode metric.Int64Gauge
2118
}{
2219
RestartLatency: must(meter.Float64Histogram(
2320
"restart_latency",
@@ -36,18 +33,18 @@ var (
3633
)),
3734
ApplyChangesetLatency: must(meter.Int64Histogram(
3835
"apply_changeset_latency",
39-
metric.WithDescription("Time taken to commit"),
36+
metric.WithDescription("Time taken to apply changesets"),
4037
metric.WithUnit("ms"),
4138
)),
42-
MemNodeTotalSize: must(meter.Float64Gauge(
39+
MemNodeTotalSize: must(meter.Int64Gauge(
4340
"mem_node_total_size",
44-
metric.WithDescription("Time taken to restart the memiavl database"),
45-
metric.WithUnit("s"),
41+
metric.WithDescription("Total size of memnodes"),
42+
metric.WithUnit("By"),
4643
)),
47-
MemNodeCount: must(meter.Float64Gauge(
44+
NumOfMemNode: must(meter.Int64Gauge(
4845
"mem_node_count",
49-
metric.WithDescription("Time taken to restart the memiavl database"),
50-
metric.WithUnit("s"),
46+
metric.WithDescription("Total number of mem nodes"),
47+
metric.WithUnit("{count}"),
5148
)),
5249
}
5350
)
@@ -59,12 +56,3 @@ func must[V any](v V, err error) V {
5956
}
6057
return v
6158
}
62-
63-
func SetupMetricsProvider() error {
64-
metricsExporter, err := prometheus.New(prometheus.WithNamespace("seidb"))
65-
if err != nil {
66-
return fmt.Errorf("failed to create Prometheus exporter: %w", err)
67-
}
68-
otel.SetMeterProvider(sdk.NewMeterProvider(sdk.WithReader(metricsExporter)))
69-
return nil
70-
}

sc/memiavl/db.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,9 +396,12 @@ func (db *DB) checkBackgroundSnapshotRewrite() error {
396396
if err := db.reloadMultiTree(result.mtree); err != nil {
397397
return fmt.Errorf("switch multitree failed: %w", err)
398398
}
399+
// reset memnode counter
400+
TotalMemNodeSize.Store(0)
401+
TotalNumOfMemNode.Store(0)
399402
db.logger.Info("switched to new memiavl snapshot", "version", db.MultiTree.Version())
400-
401403
db.pruneSnapshots()
404+
402405
default:
403406
}
404407

@@ -462,7 +465,11 @@ func (db *DB) Commit() (int64, error) {
462465
defer db.mtx.Unlock()
463466
startTime := time.Now()
464467
defer func() {
468+
465469
metrics.SeiDBMetrics.CommitLatency.Record(context.Background(), time.Since(startTime).Milliseconds())
470+
metrics.SeiDBMetrics.MemNodeTotalSize.Record(context.Background(), TotalMemNodeSize.Load())
471+
metrics.SeiDBMetrics.NumOfMemNode.Record(context.Background(), TotalNumOfMemNode.Load())
472+
466473
}()
467474
if db.readOnly {
468475
return 0, errReadOnly
@@ -605,7 +612,10 @@ func (db *DB) rewriteSnapshotBackground() error {
605612
cloned := db.copy(0)
606613
go func() {
607614
defer close(ch)
608-
615+
startTime := time.Now()
616+
defer func() {
617+
metrics.SeiDBMetrics.SnapshotCreationLatency.Record(context.Background(), time.Since(startTime).Seconds())
618+
}()
609619
cloned.logger.Info("start rewriting snapshot", "version", cloned.Version())
610620
if err := cloned.RewriteSnapshot(ctx); err != nil {
611621
ch <- snapshotResult{err: err}

sc/memiavl/mem_node.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import (
44
"bytes"
55
"encoding/binary"
66
"io"
7+
"sync/atomic"
78
)
89

910
type MemNode struct {
1011
height uint8
11-
size int64
1212
version uint32
13+
size int64
1314
key []byte
1415
value []byte
1516
left Node
@@ -18,8 +19,33 @@ type MemNode struct {
1819
}
1920

2021
var _ Node = (*MemNode)(nil)
22+
var (
23+
TotalMemNodeSize = atomic.Int64{}
24+
TotalNumOfMemNode = atomic.Int64{}
25+
)
26+
27+
func newBranchNode(
28+
height uint8,
29+
size int64,
30+
version uint32,
31+
key []byte,
32+
left Node,
33+
right Node) *MemNode {
34+
TotalNumOfMemNode.Add(1)
35+
TotalMemNodeSize.Add(int64(120 + len(key)))
36+
return &MemNode{
37+
height: height,
38+
size: size,
39+
version: version,
40+
key: key,
41+
left: left,
42+
right: right,
43+
}
44+
}
2145

2246
func newLeafNode(key, value []byte, version uint32) *MemNode {
47+
TotalNumOfMemNode.Add(1)
48+
TotalMemNodeSize.Add(int64(120 + len(key) + len(value)))
2349
return &MemNode{
2450
key: key, value: value, version: version, size: 1,
2551
}

sc/memiavl/node.go

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,9 @@ func setRecursive(node Node, key, value []byte, version, cowVersion uint32) (*Me
4343
if node.IsLeaf() {
4444
switch bytes.Compare(key, nodeKey) {
4545
case -1:
46-
return &MemNode{
47-
height: 1,
48-
size: 2,
49-
version: version,
50-
key: nodeKey,
51-
left: newLeafNode(key, value, version),
52-
right: node,
53-
}, false
46+
return newBranchNode(1, 2, version, nodeKey, newLeafNode(key, value, version), node), false
5447
case 1:
55-
return &MemNode{
56-
height: 1,
57-
size: 2,
58-
version: version,
59-
key: key,
60-
left: node,
61-
right: newLeafNode(key, value, version),
62-
}, false
48+
return newBranchNode(1, 2, version, key, node, newLeafNode(key, value, version)), false
6349
default:
6450
newNode := node.Mutate(version, cowVersion)
6551
newNode.value = value

sc/memiavl/persisted_node.go

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -147,23 +147,10 @@ func (node PersistedNode) Hash() []byte {
147147
func (node PersistedNode) Mutate(version, _ uint32) *MemNode {
148148
if node.isLeaf {
149149
key, value := node.snapshot.LeafKeyValue(node.index)
150-
return &MemNode{
151-
height: 0,
152-
size: 1,
153-
version: version,
154-
key: key,
155-
value: value,
156-
}
150+
return newLeafNode(key, value, version)
157151
}
158152
data := node.branchNode()
159-
return &MemNode{
160-
height: data.Height(),
161-
size: int64(data.Size()),
162-
version: version,
163-
key: node.Key(),
164-
left: node.Left(),
165-
right: node.Right(),
166-
}
153+
return newBranchNode(data.Height(), int64(data.Size()), version, node.Key(), node.Left(), node.Right())
167154
}
168155

169156
func (node PersistedNode) Get(key []byte) ([]byte, uint32) {

0 commit comments

Comments
 (0)