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  }