apache/beam · error

worker_id read from context metadata is an empty string

Error message

worker_id read from context metadata is an empty string

What it means

Error returned by MultiplexW.workerFromMetadataCtx when the gRPC worker_id metadata key is present in the context but resolves to an empty string. The multiplexer routes requests per worker id, so an empty id cannot select a worker from the pool; typically the SDK harness sent malformed metadata.

Solutions

  1. Ensure the SDK harness sets a non-empty worker_id gRPC metadata value on every request
  2. Upgrade SDK/runner to versions that consistently propagate worker id metadata
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at sdks/go/pkg/beam/runners/prism/internal/worker/worker.go:813 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/2a0d5cfdd918db6c. Report an issue: GitHub.

Appendix: source

Thrown at sdks/go/pkg/beam/runners/prism/internal/worker/worker.go:813

	mw.mu.Lock()
	defer mw.mu.Unlock()
	w, err := mw.workerFromMetadataCtx(ctx)
	if err != nil {
		mw.logger.Error(err.Error())
		return nil
	}
	return w.MonitoringMetadata(ctx, unknownIDs)
}

func (mw *MultiplexW) workerFromMetadataCtx(ctx context.Context) (*W, error) {
	mw.mu.Lock()
	defer mw.mu.Unlock()
	id, err := grpcx.ReadWorkerID(ctx)
	if err != nil {
		return nil, err
	}
	if id == "" {
		return nil, fmt.Errorf("worker_id read from context metadata is an empty string")
	}
	w, ok := mw.pool[id]
	if !ok {
		return nil, fmt.Errorf("worker_id: '%s' read from context metadata but not registered in worker pool", id)
	}
	return w, nil
}

func (mw *MultiplexW) delete(w *W) {
	mw.mu.Lock()
	defer mw.mu.Unlock()
	delete(mw.pool, w.ID)
}

// WaitForCleanUp waits until all resources relevant to the job are cleaned up.
func (mw *MultiplexW) WaitForCleanUp(id string) {
	mw.mu.Lock()
	wg := mw.wg[id]

View on GitHub (pinned to 12126d8942)