Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 6 additions & 8 deletions options.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,20 +227,18 @@ func TraceLastInsertID() DriverOption {
})
}

// WithMinimumReadDBStatsInterval sets the minimum interval between calls to db.Stats(). Negative values are ignored.
func WithMinimumReadDBStatsInterval(interval time.Duration) StatsOption {
return statsOptionFunc(func(o *statsOptions) {
o.minimumReadDBStatsInterval = interval
})
// WithMinimumReadDBStatsInterval does nothing.
//
// Deprecated: does not have any effect since [database/sql.DB.Stats] calls are
// cheap.
func WithMinimumReadDBStatsInterval(_ time.Duration) StatsOption {
return statsOptionFunc(func(_ *statsOptions) {})
}

type statsOptions struct {
// meterProvider sets the metric.MeterProvider. If nil, the global Provider will be used.
meterProvider metric.MeterProvider

// minimumReadDBStatsInterval sets the minimum interval between calls to db.Stats(). Negative values are ignored.
minimumReadDBStatsInterval time.Duration

// defaultAttributes will be set to each metrics as default.
defaultAttributes []attribute.KeyValue
}
Expand Down
19 changes: 3 additions & 16 deletions stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,12 @@ import (
"context"
"database/sql"
"sync"
"time"

"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric"
)

// defaultMinimumReadDBStatsInterval is the default minimum interval between calls to db.Stats().
const defaultMinimumReadDBStatsInterval = time.Second

const (
dbSQLConnectionsOpen = "db.sql.connections.open"
dbSQLConnectionsIdle = "db.sql.connections.idle"
Expand All @@ -28,8 +24,7 @@ const (
// RecordStats records database statistics for provided sql.DB at the provided interval.
func RecordStats(db *sql.DB, opts ...StatsOption) error {
o := statsOptions{
meterProvider: otel.GetMeterProvider(),
minimumReadDBStatsInterval: defaultMinimumReadDBStatsInterval,
meterProvider: otel.GetMeterProvider(),
}

for _, opt := range opts {
Expand All @@ -38,14 +33,13 @@ func RecordStats(db *sql.DB, opts ...StatsOption) error {

meter := o.meterProvider.Meter(instrumentationName)

return recordStats(meter, db, o.minimumReadDBStatsInterval, o.defaultAttributes...)
return recordStats(meter, db, o.defaultAttributes...)
}

// nolint: funlen
func recordStats(
meter metric.Meter,
db *sql.DB,
minimumReadDBStatsInterval time.Duration,
attrs ...attribute.KeyValue,
) error {
var (
Expand All @@ -60,9 +54,6 @@ func recordStats(
idleTimeClosed metric.Int64ObservableCounter
lifetimeClosed metric.Int64ObservableCounter

dbStats sql.DBStats
lastDBStats time.Time

// lock prevents a race between batch observer and instrument registration.
lock sync.Mutex
)
Expand Down Expand Up @@ -130,11 +121,7 @@ func recordStats(
lock.Lock()
defer lock.Unlock()

now := time.Now()
if now.Sub(lastDBStats) >= minimumReadDBStatsInterval {
dbStats = db.Stats()
lastDBStats = now
}
dbStats := db.Stats()

obs.ObserveInt64(openConnections, int64(dbStats.OpenConnections), metric.WithAttributes(attrs...))
obs.ObserveInt64(idleConnections, int64(dbStats.Idle), metric.WithAttributes(attrs...))
Expand Down
2 changes: 0 additions & 2 deletions stats_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package otelsql_test

import (
"testing"
"time"

"github.com/stretchr/testify/require"
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
Expand All @@ -29,7 +28,6 @@ func TestRecordStats(t *testing.T) {

err = otelsql.RecordStats(db,
otelsql.WithMeterProvider(sc.MeterProvider()),
otelsql.WithMinimumReadDBStatsInterval(100*time.Millisecond),
otelsql.WithInstanceName("default"),
otelsql.WithSystem(semconv.DBSystemPostgreSQL),
)
Expand Down