orchard/internal/opentelemetry/opentelemetry.go

57 lines
1.3 KiB
Go

package opentelemetry
import (
"context"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
"go.opentelemetry.io/otel/sdk/metric"
"os"
)
var (
DefaultMeter = otel.Meter("")
)
func Configure(ctx context.Context) error {
// Avoid logging errors when local OpenTelemetry Collector is not available, for example:
// "failed to upload metrics: [...]: dial tcp 127.0.0.1:4318: connect: connection refused"
otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
// do nothing
}))
// Work around https://github.com/open-telemetry/opentelemetry-go/issues/4834
if _, ok := os.LookupEnv("OTEL_EXPORTER_OTLP_ENDPOINT"); !ok {
if err := os.Setenv("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4318"); err != nil {
return err
}
}
if err := setupMeterProvider(ctx); err != nil {
return err
}
return nil
}
func setupMeterProvider(ctx context.Context) error {
httpExporter, err := otlpmetrichttp.New(ctx)
if err != nil {
return err
}
grpcExporter, err := otlpmetricgrpc.New(ctx)
if err != nil {
return err
}
meterProvider := metric.NewMeterProvider(
metric.WithReader(metric.NewPeriodicReader(httpExporter)),
metric.WithReader(metric.NewPeriodicReader(grpcExporter)),
)
otel.SetMeterProvider(meterProvider)
return nil
}