package telemetry import ( "context" "fmt" "time" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/trace" ) func NewTracerProvider(ctx context.Context, res *resource.Resource, isDev bool) (*trace.TracerProvider, error) { var exporter trace.SpanExporter var err error if isDev { exporter, err = stdouttrace.New() if err != nil { return nil, fmt.Errorf("failed to create stdout trace exporter: %w", err) } } else { exporter, err = otlptracegrpc.New(ctx) if err != nil { return nil, fmt.Errorf("failed to create OTLP trace exporter: %w", err) } } tp := trace.NewTracerProvider( trace.WithBatcher(exporter, trace.WithBatchTimeout(1*time.Second)), trace.WithResource(res), ) otel.SetTracerProvider(tp) return tp, nil } func NewMeterProvider(ctx context.Context, res *resource.Resource, isDev bool) (*metric.MeterProvider, error) { var exporter metric.Exporter var err error if isDev { exporter, err = stdoutmetric.New() if err != nil { return nil, fmt.Errorf("failed to create stdout metric exporter: %w", err) } } else { exporter, err = otlpmetricgrpc.New(ctx) if err != nil { return nil, fmt.Errorf("failed to create OTLP metric exporter: %w", err) } } mp := metric.NewMeterProvider( metric.WithReader(metric.NewPeriodicReader(exporter, metric.WithInterval(10*time.Second))), metric.WithResource(res), ) otel.SetMeterProvider(mp) return mp, nil }