dagger/dagger · warning
unmarshal spans: %w
Error message
unmarshal spans: %w
What it means
The logs telemetry consumer unmarshals each SSE event as a protojson ExportLogsServiceRequest. Despite the message text saying 'unmarshal spans', this is the LOGS stream (/v1/logs); it fires when the engine's log payload fails protojson decoding.
Source
Thrown at engine/client/client.go:1005
}
func (c *Client) exportLogs(ctx context.Context, httpClient *httpClient) error {
// NB: we never actually want to interrupt this, since it's relied upon for
// seeing what's going on, even during shutdown
ctx = context.WithoutCancel(ctx)
exp := &otlpConsumer{
path: "/v1/logs",
traceID: trace.SpanContextFromContext(ctx).TraceID(),
clientID: c.ID,
httpClient: httpClient,
eg: c.telemetry,
}
return exp.Consume(ctx, func(data []byte) error {
var req collogspb.ExportLogsServiceRequest
if err := protojson.Unmarshal(data, &req); err != nil {
return fmt.Errorf("unmarshal spans: %w", err)
}
if err := telemetry.ReexportLogsFromPB(ctx, c.EngineLogs, &req); err != nil {
return fmt.Errorf("re-export logs: %w", err)
}
return nil
})
}
func (c *Client) exportMetrics(ctx context.Context, httpClient *httpClient) error {
// NB: we never actually want to interrupt this, since it's relied upon for
// seeing what's going on, even during shutdown
ctx = context.WithoutCancel(ctx)
exp := &otlpConsumer{
path: "/v1/metrics",
traceID: trace.SpanContextFromContext(ctx).TraceID(),
clientID: c.ID,
httpClient: httpClient,View on GitHub (pinned to 82ba2681db)
Solutions
- Align CLI and engine versions exactly
- Enable ExtraDebug logging to capture the failing payload and confirm the cause
- Retry the session; transient corruption is logged as a consume warning
- Check dagger issue tracker for OTLP logs decode bugs in your version pair
Defensive patterns
Strategy: fallback
Validate before calling
cliV, _ := daggerVersion(); engV, _ := engineVersion()
if cliV != engV { return fmt.Errorf("version skew: cli=%s engine=%s", cliV, engV) } Try / catch
if err := client.Close(); err != nil {
if strings.Contains(err.Error(), "unmarshal spans:") {
slog.Warn("dropped undecodable log payload (usually version skew)", "err", err)
return nil
}
return err
} Prevention
- Upgrade CLI and engine in lockstep
- Treat single consume warnings as non-fatal; investigate only if persistent
- Capture ExtraDebug payloads when reproducing for bug reports
When it happens
Trigger: Engine emits log records on /v1/logs whose protojson does not decode into ExportLogsServiceRequest — engine/CLI protobuf schema mismatch, corrupted or truncated event data.
Common situations: Version skew after upgrading CLI or engine; payload corruption from a dying engine connection; encountering an unexpected field from a newer engine.
Related errors
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/203a1940f4793ca2.
Report an issue: GitHub.