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

  1. Align CLI and engine versions exactly
  2. Enable ExtraDebug logging to capture the failing payload and confirm the cause
  3. Retry the session; transient corruption is logged as a consume warning
  4. 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

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.