vxcontrol/pentagi · error
failed to create log exporter: %w
Error message
failed to create log exporter: %w
What it means
Construction of the OTLP gRPC log exporter (otlploggrpc.New) failed during NewTelemetryClient. Exporter creation is the only error path after the connection is made, and on failure the shared conn is closed for a complete teardown before returning this wrapped error.
Source
Thrown at backend/pkg/observability/otelclient.go:122
// set-but-unreachable collector can't stall main(), and the connection is
// established (and re-established) lazily in the background — a collector that
// comes up after the app does connects on its own, without a restart.
conn, err := grpc.NewClient(
cfg.TelemetryEndpoint,
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),
)),View on GitHub (pinned to ea665308ba)
Solutions
- Run `go mod tidy` / `go mod download` to align otel module versions
- Check the wrapped error text for the true cause
- If adding TLS, verify certificate files exist and are valid
- Rebuild the binary after dependency changes
Example fix
// before
logExporter, err := otlploggrpc.New(ctx, otlploggrpc.WithGRPCConn(conn))
if err != nil { return nil, err }
// after
logExporter, err := otlploggrpc.New(ctx, otlploggrpc.WithGRPCConn(conn))
if err != nil {
_ = conn.Close() // already done upstream
return nil, fmt.Errorf("failed to create log exporter: %w", err)
} Defensive patterns
Strategy: fallback
Validate before calling
// ensure go.mod has a single coherent set of go.opentelemetry.io/otel* versions // run: go mod tidy && go build ./...
Try / catch
client, err := NewTelemetryClient(ctx, cfg)
if err != nil {
log.Warnf("telemetry disabled due to init failure: %v", err)
client = nil // app continues without telemetry
} Prevention
- Keep otel SDK/exporter module versions aligned (go mod tidy)
- Rebuild after dependency upgrades
- Run the otelclient tests (TestNewTelemetryClient_*) in CI
- Fail soft: telemetry should not take the app down
When it happens
Trigger: otlploggrpc.New returning an error: usually invalid TLS/credentials options or internal SDK setup failure; with the insecure pre-wired conn this is rare and typically indicates an SDK/version incompatibility.
Common situations: Version mismatch between otel SDK and otlploggrpc packages (go.mod drift); corrupted dependency install; future option changes like switching to TLS credentials with a bad cert.
Related errors
- failed to create metric exporter: %w
- failed to create tracer exporter: %w
- failed to force flush logger: %w
- failed to force flush meter: %w
- failed to force flush tracer: %w
AI-assisted analysis of vxcontrol/pentagi@ea665308ba (2026-09-01).
Data as JSON: /api/errors/a8bbb72516adeec4.
Report an issue: GitHub.