keel/telemetry/meter.go
2024-04-16 09:38:28 +02:00

80 lines
2.1 KiB
Go

package telemetry
import (
"context"
"encoding/json"
"os"
"github.com/foomo/keel/env"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/prometheus"
"go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
otelresource "go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
)
var (
// DefaultHistogramBuckets units are selected for metrics in "seconds" unit
DefaultHistogramBuckets = []float64{.001, .005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10, 25, 60, 120, 300, 600}
)
func Meter() metric.Meter {
return otel.Meter("")
}
func NewNoopMeterProvider() (metric.MeterProvider, error) {
provider := noop.NewMeterProvider()
otel.SetMeterProvider(provider)
return provider, nil
}
func NewStdOutMeterProvider(ctx context.Context, opts ...stdoutmetric.Option) (metric.MeterProvider, error) {
if env.GetBool("OTEL_EXPORTER_STDOUT_PRETTY_PRINT", true) {
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
opts = append(opts, stdoutmetric.WithEncoder(enc))
}
if !env.GetBool("OTEL_EXPORTER_STDOUT_TIMESTAMP", true) {
opts = append(opts, stdoutmetric.WithoutTimestamps())
}
exporter, err := stdoutmetric.New(opts...)
if err != nil {
return nil, err
}
resource := otelresource.NewSchemaless(
semconv.ServiceNameKey.String(env.Get("OTEL_SERVICE_NAME", ServiceName)),
)
provider := sdkmetric.NewMeterProvider(
sdkmetric.WithReader(sdkmetric.NewPeriodicReader(exporter)),
sdkmetric.WithResource(resource),
)
otel.SetMeterProvider(provider)
return provider, nil
}
func NewPrometheusMeterProvider() (metric.MeterProvider, error) {
exporter, err := prometheus.New()
if err != nil {
return nil, err
}
resource := otelresource.NewSchemaless(
semconv.ServiceNameKey.String(env.Get("OTEL_SERVICE_NAME", ServiceName)),
)
provider := sdkmetric.NewMeterProvider(
sdkmetric.WithReader(exporter),
sdkmetric.WithResource(resource),
)
otel.SetMeterProvider(provider)
return provider, nil
}