Loading

EDOT Collector doesn’t propagate client metadata

Stack Serverless Observability

By default, the Collector only propagates transport-level metadata. If you want the EDOT Collector to propagate metadata like project_id, tenant, or environment, you need a specific SDK instrumentation.

In the context of the EDOT, client metadata refers to gRPC metadata or HTTP headers that accompany telemetry data sent by clients (usually SDKs) to the Collector.

For example:

  • Authorization headers
  • Trace propagation headers
  • user-agent strings sent by HTTP clients or EDOT SDKs

This is transport-level metadata, and not application-level context.

In this context, client metadata does not include:

  • Custom attributes like project_id, tenant, or environment
  • Application business logic fields
  • Resource attributes

Expected labels do not appear in Elastic APM or metric data.

Your collector configuration file, for example otel-config.yaml, looks similar to this:

receivers:
  otlp:
    protocols:
      http:
        endpoint: "0.0.0.0:4318"

processors:
  resource:
    attributes:
      - key: project.id
        from_context: client_metadata
        action: insert

This will not work, as the Collector doesn't automatically extract such values from headers.

If you want to propagate customer IDs or project names into spans or metrics, you must instrument this in your code using one of the SDKs.

Use span.set_attribute in your application code, where OpenTelemetry spans are created. For example:

from opentelemetry import trace

tracer = trace.get_tracer(__name__)

with tracer.start_as_current_span("handle_request") as span:
    span.set_attribute("project.id", get_project_id_from_context())