Files
orchard/internal/opentelemetry/opentelemetry.go
T
Nikolay EdigaryevandFedor Korotkov ff0497b1d8 Produce OpenTelemetry metrics (#185)
* .golangci.yml: remove mentions of deprecated linters

* Fix "staticcheck" linter error by using grpc.NewClient

* Configure OpenTelemetry

Metrics only for now.

* Produce OpenTelemetry metrics

* Update DeploymentGuide.md

Co-authored-by: Fedor Korotkov <fedor.korotkov@gmail.com>

* Update DeploymentGuide.md

Co-authored-by: Fedor Korotkov <fedor.korotkov@gmail.com>

* Introduce "org.cirruslabs.orchard.controller.worker_status"

---------

Co-authored-by: Fedor Korotkov <fedor.korotkov@gmail.com>
2024-06-24 18:19:51 +04:00

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
}