Anatomy of a Resource
| Term | What it means |
|---|---|
| Describes | Answers the question “who is sending this telemetry?” |
| Entity | Service name, environment, host, pod, container — anything that identifies the producer. |
| Immutable | Does not change during the process lifetime. The same Resource is attached to every span, metric, and log. |
| Metadata | Key-value pairs. |
Configuring a Resource
Resource.create(...) rather than the class constructor Resource(attributes=...). create() merges your attributes with the defaults from the built-in resource detectors.
Phoenix–Specific Project Routing
Phoenix resolves the project for an incoming OTLP request in this order of precedence:| Source | Status | Notes |
|---|---|---|
x-project-name HTTP header | Highest precedence | Set per request to override the resource attribute. Useful when one application sends to multiple projects without re-creating a Tracer Provider. Pass via register(headers={"x-project-name": "..."}) or set on the OTLP exporter directly. |
openinference.project.name resource attribute | Canonical | The name of the project in Phoenix. Defined by the OpenInference resource semconv — exposed as ResourceAttributes.PROJECT_NAME in the openinference.semconv.resource Python package, and as SEMRESATTRS_PROJECT_NAME in @arizeai/openinference-semantic-conventions for JS/TS. |
| Server default project | Fallback | If neither of the above is set, spans land in the default project. |
openinference.project.name on the Resource and forget about it.
Environment Variables
The OpenTelemetry SDK can auto-detect Resource attributes from the environment, so you can avoid hardcoding them:| Environment variable | Purpose |
|---|---|
OTEL_SERVICE_NAME | Sets service.name. |
OTEL_RESOURCE_ATTRIBUTES | Comma-separated key=value pairs. Sets arbitrary resource attributes. |
OTEL_EXPERIMENTAL_RESOURCE_DETECTORS | Comma-separated list of built-in detectors to enable or disable. |
Resource.create(...) takes precedence.
The SDK also runs built-in resource detectors by default — they automatically fill in host, OS, process, and other infrastructure attributes. Disable them with OTEL_EXPERIMENTAL_RESOURCE_DETECTORS="" if you don’t want them.
For the full list, see the OpenTelemetry SDK environment variables reference.
Common Pitfalls
A few more things that trip people up:- Not following semantic conventions — using your own attribute names instead of
service.name,deployment.environment.name, etc. means other tools (and Phoenix) can’t interpret them. Stick with the resource semconv whenever there’s a standard key. - Using the class constructor
Resource(attributes=...)instead ofResource.create(...)— bypasses built-in detectors, so you lose the auto-populated host/process attributes. - Forgetting to set a project name — without
openinference.project.nameon the Resource or anx-project-namerequest header, spans land in the default project and are hard to organize.

