country-geo-locations/internal/exporter/metrics.go
Tom Neuber be886b5cc8
All checks were successful
ci/woodpecker/push/lint Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/push/deploy Pipeline was successful
fix(exporter): correct bucket calculation time.Duration default
2025-01-10 15:42:28 +01:00

112 lines
2.9 KiB
Go

package exporter
import (
"log"
"github.com/prometheus/client_golang/prometheus"
)
const (
namespace string = "country_geo_locations"
cacheSubsystem string = "cache"
dbSubsystem string = "db"
metricNameCacheTTL string = "ttl"
metricNameCurrentlyCached string = "currently_cached"
metricNameDatabaseTimestamp string = "timestamp"
metricNameDatabaseReady string = "ready"
metricNameRequestsTotal string = "requests_total"
metricNameRequestLatency string = "request_latency"
)
type Metrics struct {
exporter *Exporter
metricCacheTTL prometheus.Gauge
metricCurrentlyCached prometheus.Gauge
metricDatabaseTimestamp *prometheus.GaugeVec
metricDatabaseReady prometheus.Gauge
metricRequestsTotal prometheus.Counter
metricRequestLatency prometheus.Histogram
}
func NewMetrics(e *Exporter) *Metrics {
return &Metrics{
exporter: e,
metricCacheTTL: prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: cacheSubsystem,
Name: metricNameCacheTTL,
Help: "Duration for cached requests",
},
),
metricCurrentlyCached: prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: cacheSubsystem,
Name: metricNameCurrentlyCached,
Help: "Number of cached entries",
},
),
metricDatabaseTimestamp: prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: dbSubsystem,
Name: metricNameDatabaseTimestamp,
Help: "Timestamp of the CSV file",
},
[]string{metricNameDatabaseTimestamp},
),
metricDatabaseReady: prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: dbSubsystem,
Name: metricNameDatabaseReady,
Help: "Ready status of the database",
},
),
metricRequestsTotal: prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: namespace,
Name: metricNameRequestsTotal,
Help: "Counter for total requests",
},
),
metricRequestLatency: prometheus.NewHistogram(
prometheus.HistogramOpts{
Namespace: namespace,
Name: metricNameRequestLatency,
Help: "Latency statistics for requests",
Buckets: prometheus.ExponentialBuckets(0.000001, 1.5, 40),
},
),
}
}
func (m *Metrics) collectCacheTTLMetric() {
m.metricCacheTTL.Set(m.exporter.config.CacheTTL.Seconds())
}
func (m *Metrics) collectCurrentlyCachedMetric() {
m.metricCurrentlyCached.Set(float64(m.exporter.cache.Count()))
}
func (m *Metrics) collectDatabaseTimestampMetric() {
timestamp, err := m.exporter.database.Timestamp()
if err != nil {
log.Printf("failed to read file timestamp: %v", err)
return
}
m.metricDatabaseTimestamp.WithLabelValues(timestamp.String()).Set(float64(timestamp.Unix()))
}
func (m *Metrics) collectDatabaseReadyMetric() {
var dbReady float64
if m.exporter.database.IsReady() {
dbReady = 1
}
m.metricDatabaseReady.Set(dbReady)
}