vxcontrol/pentagi · error
failed to create metric exporter: %w
Error message
failed to create metric exporter: %w
What it means
Returned during OpenTelemetry client setup (backend/pkg/observability/otelclient.go) when otlpmetricgrpc.New fails to build the OTLP metric exporter over the shared gRPC connection. The gRPC connection is closed before returning. Usually means a bad OTLP endpoint/config or gRPC connection problem.
Source
Thrown at backend/pkg/observability/otelclient.go:127
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithDefaultCallOptions(grpc.WaitForReady(true)),
)
if err != nil {
return nil, fmt.Errorf("failed to create telemetry connection: %w", err)
}
// Build all three exporters before creating any provider. Exporter creation
// is the only remaining error path, and at that point no batch/reader
// goroutine has started yet, so closing the connection is a complete teardown.
logExporter, err := otlploggrpc.New(ctx, otlploggrpc.WithGRPCConn(conn))
if err != nil {
_ = conn.Close()
return nil, fmt.Errorf("failed to create log exporter: %w", err)
}
metricExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithGRPCConn(conn))
if err != nil {
_ = conn.Close()
return nil, fmt.Errorf("failed to create metric exporter: %w", err)
}
spanExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn))
if err != nil {
_ = conn.Close()
return nil, fmt.Errorf("failed to create tracer exporter: %w", err)
}
logProvider := sdklog.NewLoggerProvider(
sdklog.WithProcessor(sdklog.NewBatchProcessor(
logExporter,
sdklog.WithExportInterval(DefaultLogInterval),
sdklog.WithExportTimeout(DefaultLogTimeout),
)),
sdklog.WithResource(newResource(resourceAttrs(cfg)...)),
)
meterProvider := sdkmetric.NewMeterProvider(
sdkmetric.WithReader(sdkmetric.NewPeriodicReader(View on GitHub (pinned to ea665308ba)
Solutions
- Run `go mod tidy` to pin consistent go.opentelemetry.io module versions
- Inspect the wrapped error for the real cause
- Verify any TLS/certificate options added to the exporter
- Rebuild after dependency updates
Defensive patterns
Strategy: fallback
Validate before calling
// verify otel metric module versions match: go list -m go.opentelemetry.io/otel go.opentelemetry.io/otel/sdk/metric
Try / catch
client, err := NewTelemetryClient(ctx, cfg)
if err != nil {
log.Warnf("metrics disabled due to init failure: %v", err)
client = nil
} Prevention
- Pin otel modules via go mod tidy in CI
- Add unit coverage for the exporter-construction path
- Avoid hand-rolled TLS options without validating certs
- Treat telemetry init failure as degrade, not crash
When it happens
Trigger: otlpmetricgrpc.New returning an error during setup — typically invalid exporter options, SDK incompatibility, or resource/credential configuration problems; the gRPC conn itself is already established (lazy) so this is not a connectivity failure.
Common situations: Mixed otel module versions in go.mod; custom build adding TLS options with bad certs; upstream API change after dependency upgrade.
Related errors
- failed to force flush meter: %w
- failed to create log exporter: %w
- failed to create tracer exporter: %w
- failed to force flush logger: %w
- failed to force flush tracer: %w
AI-assisted analysis of vxcontrol/pentagi@ea665308ba (2026-09-01).
Data as JSON: /api/errors/440f7fe47b9aa9de.
Report an issue: GitHub.