|
| 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