Skip to content

Commit 5ac1b05

Browse files
feat: add sqldbmetrics
1 parent eb5de94 commit 5ac1b05

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

metrics/sqldbmetrics/sqldbmetrics.go

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package sqldbmetrics
2+
3+
import (
4+
"context"
5+
6+
"github.com/jackc/pgx/v5/pgxpool"
7+
"go.inout.gg/foundations/must"
8+
"go.opentelemetry.io/otel"
9+
"go.opentelemetry.io/otel/metric"
10+
)
11+
12+
type stats struct {
13+
meter metric.Meter
14+
acquireCount metric.Int64ObservableCounter
15+
acquireDuration metric.Int64Histogram
16+
acquiredConns metric.Int64ObservableCounter
17+
canceledAcquireCount metric.Int64ObservableCounter
18+
constructingConns metric.Int64ObservableCounter
19+
emptyAcquireCount metric.Int64ObservableCounter
20+
idleConns metric.Int64ObservableCounter
21+
maxConns metric.Int64ObservableCounter
22+
maxIdleDestroyCount metric.Int64ObservableCounter
23+
maxLifetimeDestroyCount metric.Int64ObservableCounter
24+
newConnsCount metric.Int64ObservableCounter
25+
totalConns metric.Int64ObservableCounter
26+
}
27+
28+
func newStats(meter metric.Meter) *stats {
29+
return &stats{
30+
meter: meter,
31+
acquireCount: must.Must(meter.Int64ObservableCounter("acquire_count", metric.WithDescription("Number of acquire operations"))),
32+
acquireDuration: must.Must(meter.Int64Histogram("acquire_duration", metric.WithDescription("Duration of acquire operations"))),
33+
acquiredConns: must.Must(meter.Int64ObservableCounter("acquired_conns", metric.WithDescription("Number of acquired connections"))),
34+
canceledAcquireCount: must.Must(meter.Int64ObservableCounter("canceled_acquire_count", metric.WithDescription("Number of canceled acquire operations"))),
35+
constructingConns: must.Must(meter.Int64ObservableCounter("constructing_conns", metric.WithDescription("Number of connections being constructed"))),
36+
emptyAcquireCount: must.Must(meter.Int64ObservableCounter("empty_acquire_count", metric.WithDescription("Number of empty acquire operations"))),
37+
idleConns: must.Must(meter.Int64ObservableCounter("idle_conns", metric.WithDescription("Number of idle connections"))),
38+
maxConns: must.Must(meter.Int64ObservableCounter("max_conns", metric.WithDescription("Maximum number of connections"))),
39+
maxIdleDestroyCount: must.Must(meter.Int64ObservableCounter("max_idle_destroy_count", metric.WithDescription("Number of connections destroyed due to max idle"))),
40+
maxLifetimeDestroyCount: must.Must(meter.Int64ObservableCounter("max_lifetime_destroy_count", metric.WithDescription("Number of connections destroyed due to max lifetime"))),
41+
newConnsCount: must.Must(meter.Int64ObservableCounter("new_conns_count", metric.WithDescription("Number of new connections"))),
42+
totalConns: must.Must(meter.Int64ObservableCounter("total_conns", metric.WithDescription("Total number of connections"))),
43+
}
44+
}
45+
46+
func (s *stats) register(p *pgxpool.Pool) error {
47+
_, err := s.meter.RegisterCallback(func(ctx context.Context, observer metric.Observer) error {
48+
stats := p.Stat()
49+
50+
// observer.ObserveInt64(s.acquireDuration, stats.AcquireDuration())
51+
observer.ObserveInt64(s.acquiredConns, int64(stats.AcquiredConns()))
52+
observer.ObserveInt64(s.canceledAcquireCount, stats.CanceledAcquireCount())
53+
observer.ObserveInt64(s.constructingConns, int64(stats.ConstructingConns()))
54+
observer.ObserveInt64(s.emptyAcquireCount, stats.EmptyAcquireCount())
55+
observer.ObserveInt64(s.idleConns, int64(stats.IdleConns()))
56+
observer.ObserveInt64(s.maxConns, int64(stats.MaxConns()))
57+
observer.ObserveInt64(s.maxIdleDestroyCount, stats.MaxIdleDestroyCount())
58+
observer.ObserveInt64(s.maxLifetimeDestroyCount, stats.MaxLifetimeDestroyCount())
59+
observer.ObserveInt64(s.newConnsCount, stats.AcquireCount())
60+
observer.ObserveInt64(s.newConnsCount, stats.NewConnsCount())
61+
observer.ObserveInt64(s.totalConns, int64(stats.TotalConns()))
62+
63+
return nil
64+
})
65+
66+
return err
67+
}
68+
69+
func MustRegister(p *pgxpool.Pool) {
70+
var (
71+
provider = otel.GetMeterProvider()
72+
meter = provider.Meter("foundations:sqldbmetrics")
73+
)
74+
75+
must.Must1(newStats(meter).register(p))
76+
}

0 commit comments

Comments
 (0)