github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/lib/telemetry/dbmetrics/metrics.go (about) 1 // Package dbmetrics - Content managed by Project Forge, see [projectforge.md] for details. 2 package dbmetrics 3 4 import ( 5 "sync" 6 "time" 7 8 "github.com/pkg/errors" 9 "github.com/prometheus/client_golang/prometheus" 10 11 "github.com/kyleu/dbaudit/app/lib/telemetry" 12 "github.com/kyleu/dbaudit/app/util" 13 ) 14 15 var ( 16 stmtCnt *prometheus.CounterVec 17 stmtDur *prometheus.HistogramVec 18 stmtMu sync.Mutex 19 20 SkipDBMetrics = util.GetEnvBool("db_metrics_disabled", false) 21 ) 22 23 type Metrics struct { 24 Key string 25 } 26 27 func NewMetrics(key string, db StatsGetter, logger util.Logger) (*Metrics, error) { 28 if stmtCnt == nil { 29 stmtMu.Lock() 30 if stmtCnt == nil { 31 metricsKey := "database" 32 err := registerDatabaseMetrics(metricsKey, logger) 33 if err != nil { 34 return nil, err 35 } 36 err = prometheus.Register(newStatsCollector(metricsKey, db)) 37 if err != nil { 38 return nil, errors.Wrap(err, "unable to register stats collector") 39 } 40 } 41 stmtMu.Unlock() 42 } 43 44 return &Metrics{Key: key}, nil 45 } 46 47 func (m *Metrics) IncStmt(sql string, method string) { 48 if !SkipDBMetrics { 49 stmtCnt.WithLabelValues(m.Key, sql, method).Inc() 50 } 51 } 52 53 func (m *Metrics) CompleteStmt(q string, op string, started time.Time) { 54 if !SkipDBMetrics { 55 elapsed := float64(time.Since(started)) / float64(time.Second) 56 stmtDur.WithLabelValues(m.Key, q, op).Observe(elapsed) 57 } 58 } 59 60 func (m *Metrics) Close() error { 61 return nil 62 } 63 64 func registerDatabaseMetrics(subsystem string, logger util.Logger) error { 65 if !SkipDBMetrics { 66 stmtCntHelp := "The total number of SQL statements processed." 67 stmtCnt = telemetry.MetricsCounter(subsystem, "statements_total", stmtCntHelp, logger, "database", "sql", "method") 68 stmtDurHelp := "The SQL statement duration in seconds." 69 stmtDur = telemetry.MetricsHistogram(subsystem, "statement_duration_seconds", stmtDurHelp, logger, "database", "sql", "method") 70 } 71 return nil 72 }