mirror of
https://github.com/foomo/keel.git
synced 2025-10-16 12:35:34 +00:00
98 lines
2.8 KiB
Go
98 lines
2.8 KiB
Go
package telemetry
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
otelprometheus "go.opentelemetry.io/otel/exporters/prometheus"
|
|
"go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
|
|
"go.opentelemetry.io/otel/metric"
|
|
otelglobal "go.opentelemetry.io/otel/metric/global"
|
|
"go.opentelemetry.io/otel/metric/nonrecording"
|
|
"go.opentelemetry.io/otel/sdk/metric/aggregator/histogram"
|
|
otelcontroller "go.opentelemetry.io/otel/sdk/metric/controller/basic"
|
|
otelaggregation "go.opentelemetry.io/otel/sdk/metric/export/aggregation"
|
|
otelprocessor "go.opentelemetry.io/otel/sdk/metric/processor/basic"
|
|
otelselector "go.opentelemetry.io/otel/sdk/metric/selector/simple"
|
|
otelresource "go.opentelemetry.io/otel/sdk/resource"
|
|
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
|
|
|
|
"github.com/foomo/keel/env"
|
|
)
|
|
|
|
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 otelglobal.Meter("")
|
|
}
|
|
|
|
func NewNoopMeterProvider() (metric.MeterProvider, error) {
|
|
controller := nonrecording.NewNoopMeterProvider()
|
|
otelglobal.SetMeterProvider(controller)
|
|
return controller, nil
|
|
}
|
|
|
|
func NewStdOutMeterProvider(ctx context.Context, opts ...stdoutmetric.Option) (metric.MeterProvider, error) {
|
|
if env.GetBool("OTEL_EXPORTER_STDOUT_PRETTY_PRINT", true) {
|
|
opts = append(opts, stdoutmetric.WithPrettyPrint())
|
|
}
|
|
|
|
exporter, err := stdoutmetric.New(opts...)
|
|
if err != nil {
|
|
log.Fatalf("creating stdoutmetric exporter: %v", err)
|
|
}
|
|
|
|
resource := otelresource.NewSchemaless(
|
|
semconv.ServiceNameKey.String(env.Get("OTEL_SERVICE_NAME", ServiceName)),
|
|
)
|
|
|
|
controller := otelcontroller.New(
|
|
otelprocessor.NewFactory(
|
|
otelselector.NewWithInexpensiveDistribution(),
|
|
exporter,
|
|
),
|
|
otelcontroller.WithExporter(exporter),
|
|
otelcontroller.WithResource(resource),
|
|
)
|
|
|
|
if err = controller.Start(ctx); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
otelglobal.SetMeterProvider(controller)
|
|
return controller, nil
|
|
}
|
|
|
|
func NewPrometheusMeterProvider() (metric.MeterProvider, error) {
|
|
config := otelprometheus.Config{
|
|
Registerer: prometheus.DefaultRegisterer,
|
|
Gatherer: prometheus.DefaultGatherer,
|
|
}
|
|
|
|
resource := otelresource.NewSchemaless(
|
|
semconv.ServiceNameKey.String(env.Get("OTEL_SERVICE_NAME", ServiceName)),
|
|
)
|
|
|
|
controller := otelcontroller.New(
|
|
otelprocessor.NewFactory(
|
|
otelselector.NewWithHistogramDistribution(
|
|
histogram.WithExplicitBoundaries(DefaultHistogramBuckets)),
|
|
otelaggregation.CumulativeTemporalitySelector(),
|
|
otelprocessor.WithMemory(true),
|
|
),
|
|
otelcontroller.WithResource(resource),
|
|
)
|
|
|
|
_, err := otelprometheus.New(config, controller)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
otelglobal.SetMeterProvider(controller)
|
|
return controller, nil
|
|
}
|