Skip to content

fix(api): prevent recursive attribute value crashes - #5757

Open
codedbyadiiii wants to merge 4 commits into
open-telemetry:mainfrom
codedbyadiiii:fix-issue-5564
Open

codedbyadiiii wants to merge 4 commits into
open-telemetry:mainfrom
codedbyadiiii:fix-issue-5564

Conversation

@codedbyadiiii

Copy link
Copy Markdown
Contributor

Description

Attribute values containing self-referential or excessively nested sequences and mappings could raise RecursionError during attribute cleaning.

This change limits recursive attribute processing to 20 levels. Values exceeding the limit are replaced with None and a warning is logged, while valid sibling attributes are preserved.

The fix also applies to metric attributes and adds regression tests for API attributes, spans, and resources.

Fixes #5564

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature
  • Breaking change

How Has This Been Tested?

  • API attribute tests
  • SDK span and resource tests
  • Ruff check and formatting
  • Regression coverage for cyclic and deeply nested values

@codedbyadiiii
codedbyadiiii requested a review from a team as a code owner October 7, 2026 15:41
@opentelemetry-pr-dashboard

opentelemetry-pr-dashboard Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Pull request dashboard status

Waiting on maintainers · refreshed 2026-10-20 18:18 UTC

Merge when ready.

Status above doesn't look right?
  • Just replied or pushed? Anything around or after the refresh time above may not be picked up yet — give it a few minutes.
  • Anything look wrong? Report it with what you expected; it helps us improve the dashboard.

@chrikrah chrikrah left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codedbyadiiii approving at 6e7be84. This fixes #5564: a self-referential value and a 21-deep list now come out as None with a warning, and the sibling attribute survives. Seven of the new tests fail with the two source files from the base.

$ python -m pytest opentelemetry-api/tests/attributes opentelemetry-sdk/tests/test_attribute_nesting_depth.py opentelemetry-sdk/tests/{trace,metrics,resources} -q -o addopts=""    # Python 3.12
# head 6e7be84
1 failed, 717 passed, 1 skipped
# head tests, attributes/__init__.py and measurement.py from base f36c128
8 failed, 710 passed, 1 skipped
# the 1 on both trees is TestTracer::test_shutdown, the same TypeError in its subprocess step

non-blocking: the warning names no attribute. A span with two offending attributes logs the same line twice:

$ python depth_probe.py    # set_attribute("http.request.body.nested", 21-deep list), set_attributes({"cyclic.payload": cyc, "sibling": "kept"})
LOG opentelemetry.attributes: Attribute value exceeds the maximum nesting depth of 20. Replacing value with None.
LOG opentelemetry.attributes: Attribute value exceeds the maximum nesting depth of 20. Replacing value with None.
SDK attrs: {'http.request.body.nested': None, 'ok20': 'tuple', 'cyclic.payload': None, 'sibling': 'kept'} dropped: 0

_clean_attributes and __setitem__ both hold the key at that point.

@DylanRussell you approved #5565 for the same issue after suggesting the cap of 20. Could you review this one?

@opentelemetry-pr-dashboard

This comment has been minimized.

@codedbyadiiii

Copy link
Copy Markdown
Contributor Author

Thanks for the review. The recursion-depth cap, sibling-attribute preservation, metric coverage, and regression tests are included in the latest commits. The remaining failures are the known baseline TestTracer::test_shutdown subprocess issue and the expected source/base comparison noted above; the PR checks are passing. Please let me know if any further changes are required, or route this back to reviewers for final merge.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Approved PRs

Development

Successfully merging this pull request may close these issues.

Self-referential attribute value crashes the instrumented application with RecursionError

4 participants