{"record":{"id":"440f7fe47b9aa9de","repo":"vxcontrol/pentagi","slug":"failed-to-create-metric-exporter-w","errorCode":null,"errorMessage":"failed to create metric exporter: %w","messagePattern":"failed to create metric exporter: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/pkg/observability/otelclient.go","lineNumber":127,"sourceCode":"\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create telemetry connection: %w\", err)\n\t}\n\n\t// Build all three exporters before creating any provider. Exporter creation\n\t// is the only remaining error path, and at that point no batch/reader\n\t// goroutine has started yet, so closing the connection is a complete teardown.\n\tlogExporter, err := otlploggrpc.New(ctx, otlploggrpc.WithGRPCConn(conn))\n\tif err != nil {\n\t\t_ = conn.Close()\n\t\treturn nil, fmt.Errorf(\"failed to create log exporter: %w\", err)\n\t}\n\tmetricExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithGRPCConn(conn))\n\tif err != nil {\n\t\t_ = conn.Close()\n\t\treturn nil, fmt.Errorf(\"failed to create metric exporter: %w\", err)\n\t}\n\tspanExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn))\n\tif err != nil {\n\t\t_ = conn.Close()\n\t\treturn nil, fmt.Errorf(\"failed to create tracer exporter: %w\", err)\n\t}\n\n\tlogProvider := sdklog.NewLoggerProvider(\n\t\tsdklog.WithProcessor(sdklog.NewBatchProcessor(\n\t\t\tlogExporter,\n\t\t\tsdklog.WithExportInterval(DefaultLogInterval),\n\t\t\tsdklog.WithExportTimeout(DefaultLogTimeout),\n\t\t)),\n\t\tsdklog.WithResource(newResource(resourceAttrs(cfg)...)),\n\t)\n\n\tmeterProvider := sdkmetric.NewMeterProvider(\n\t\tsdkmetric.WithReader(sdkmetric.NewPeriodicReader(","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/vxcontrol/pentagi/blob/ea665308baaff015b226f308438a68d929d0f29b/backend/pkg/observability/otelclient.go#L109-L145","documentation":"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.","triggerScenarios":"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.","commonSituations":"Mixed otel module versions in go.mod; custom build adding TLS options with bad certs; upstream API change after dependency upgrade.","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"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// verify otel metric module versions match: go list -m go.opentelemetry.io/otel go.opentelemetry.io/otel/sdk/metric","typeGuard":null,"tryCatchPattern":"client, err := NewTelemetryClient(ctx, cfg)\nif err != nil {\n    log.Warnf(\"metrics disabled due to init failure: %v\", err)\n    client = nil\n}","preventionTips":["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"],"tags":["opentelemetry","exporter","metrics","grpc"],"backgroundTag":"exporter-init-failed","analyzedSha":"ea665308baaff015b226f308438a68d929d0f29b","analyzedAt":"2026-09-01T14:16:31.421Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}