core/metrics/standard.go
package metrics
import (
"context"
"go.opentelemetry.io/otel/metric"
"time"
)
// standardMetrics records metrics across any service using the metrics handler.
type standardMetrics struct {
metrics Handler
meter metric.Meter
uptimeGauge metric.Float64ObservableGauge
startTime time.Time
}
const processUptimeSecondsMetric = "process_uptime_seconds"
func newStandardMetrics(ctx context.Context, handler Handler) {
str := standardMetrics{
metrics: handler,
meter: handler.Meter("standard_metrics"),
startTime: time.Now(),
}
var err error
if str.uptimeGauge, err = str.meter.Float64ObservableGauge(processUptimeSecondsMetric, metric.WithDescription("The uptime of the process in seconds"), metric.WithUnit("seconds")); err != nil {
handler.ExperimentalLogger().Errorf(ctx, "failed to create %s gauge: %v", processUptimeSecondsMetric, err)
}
// Register callback
if _, err = str.meter.RegisterCallback(str.uptimeCallback, str.uptimeGauge); err != nil {
handler.ExperimentalLogger().Warnf(ctx, "failed to register callback: %v", err)
}
}
func (str *standardMetrics) uptimeCallback(_ context.Context, observer metric.Observer) error {
uptimeDuration := time.Since(str.startTime).Seconds()
observer.ObserveFloat64(str.uptimeGauge, uptimeDuration)
return nil
}