feat(config): wire container resource detector via lazy contrib import by MikeGoldsmith · Pull Request #5004 · open-telemetry/opentelemetry-python

added 11 commits

March 13, 2026 13:04
Implements create_resource() and create_propagator()/configure_propagator()
for the declarative file configuration. Resource creation does not read
OTEL_RESOURCE_ATTRIBUTES or run any detectors (matches Java/JS SDK behavior).
Propagator configuration always calls set_global_textmap to override Python's
default tracecontext+baggage, setting a noop CompositePropagator when no
propagator is configured.

Assisted-by: Claude Sonnet 4.6
Assisted-by: Claude Sonnet 4.6
- _resource.py: refactor _coerce_attribute_value to dispatch table to
  avoid too-many-return-statements; fix short variable names k/v ->
  attr_key/attr_val; fix return type of _sdk_default_attributes to
  dict[str, str] to satisfy pyright
- _propagator.py: rename short variable names e -> exc, p -> propagator
- test_resource.py: move imports to top level; split TestCreateResource
  (25 methods) into three focused classes to satisfy too-many-public-methods
- test_propagator.py: add pylint disable for protected-access

Assisted-by: Claude Sonnet 4.6
- replace _sdk_default_attributes() with _DEFAULT_RESOURCE from resources module
- move _coerce_bool into dispatch tables for both scalar and array bool types,
  fixing a bug where bool_array with string values like "false" would coerce
  incorrectly via plain bool() (non-empty string -> True)
- add test for bool_array with string values to cover the bug

Assisted-by: Claude Sonnet 4.6
… into mike/config-resource-propagator
…erge

- collapse _SCALAR_COERCIONS and _ARRAY_COERCIONS into a single _COERCIONS
  dict using an _array() factory, reducing _coerce_attribute_value to two lines
- process attributes_list before attributes so explicit attributes naturally
  overwrite list entries without needing an explicit guard

Assisted-by: Claude Sonnet 4.6
Assisted-by: Claude Sonnet 4.6
Adds _run_detectors() stub and _filter_attributes() to create_resource(),
providing the shared scaffolding for detector PRs to build on. Detectors
are opt-in: nothing runs unless explicitly listed under
detection_development.detectors in the config. The include/exclude
attribute filter mirrors other SDK behaviour.

Assisted-by: Claude Sonnet 4.6
Merges service.name=unknown_service into base before running detectors,
so detectors (e.g. service) can override it. Previously it was added to
config_attrs and merged last, which would have silently overridden any
detector-provided service.name.

Assisted-by: Claude Sonnet 4.6

MikeGoldsmith added a commit to MikeGoldsmith/opentelemetry-python that referenced this pull request

Mar 20, 2026
)

Assisted-by: Claude Sonnet 4.6
Assisted-by: Claude Sonnet 4.6
When `resource.detection_development.detectors[].container` is set in
the config file, attempt to use `ContainerResourceDetector` from the
`opentelemetry-resource-detector-containerid` contrib package. Unlike
the process, host, and service detectors which are implemented in the
core SDK, container detection is not available in core. Rather than
adding a hard dependency on the contrib package, we use a lazy import:
if the package is installed it is used transparently; if absent a
warning is logged with an actionable install instruction.

This mirrors the approach taken by other SDKs: JS explicitly skips
container detection when no implementation is available, and PHP also
defers container detection to a contrib package.

See: open-telemetry/opentelemetry-configuration#570

Assisted-by: Claude Sonnet 4.6
)

Assisted-by: Claude Sonnet 4.6