feat(config): wire top-level attribute_limits into per-signal providers - #5365
feat(config): wire top-level attribute_limits into per-signal providers#5365ocelotl wants to merge 5 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
This PR extends the OpenTelemetry SDK declarative configuration path to support top-level attribute_limits as a global fallback for traces and logs, and adds programmatic log_record_limits support to LoggerProvider so log attribute limits can be configured consistently with SpanLimits.
Changes:
- Thread
config.attribute_limitsthroughconfigure_sdk()intocreate_tracer_provider()/create_logger_provider()as a fallback when per-signal limits are absent. - Implement log-record limits creation in declarative config and pass the resulting
log_record_limitsintoLoggerProvider, propagating toLoggerandReadWriteLogRecord. - Update/expand configuration tests and add a changelog entry.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_sdk.py | Plumbs top-level attribute_limits into per-signal configurators. |
| opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py | Adds global fallback handling for span attribute limits in declarative config. |
| opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py | Adds log-record limits handling and wires limits into LoggerProvider construction. |
| opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/init.py | Threads log_record_limits from provider → logger → emitted log records. |
| opentelemetry-sdk/tests/_configuration/test_sdk.py | Updates expectations for updated configurator call signatures. |
| opentelemetry-sdk/tests/_configuration/test_tracer_provider.py | Adds tests covering global fallback semantics for traces. |
| opentelemetry-sdk/tests/_configuration/test_logger_provider.py | Updates tests to validate log-record limits are applied (not just warned/ignored). |
| opentelemetry-sdk/src/opentelemetry/sdk/trace/export/init.py | Minor formatting-only change to console exporter default formatter. |
| .changelog/5365.added | Documents the new config wiring and LoggerProvider limits support. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
This needs a rebase after declarative config move |
9f37481 to
5a0a1d0
Compare
rads-1996
left a comment
There was a problem hiding this comment.
Need to rebase but otherwise LGTM.
5a0a1d0 to
a1c69ca
Compare
aabmass
left a comment
There was a problem hiding this comment.
Wasn't super clear to me, is there any behavior change for users who are not using declarative config?
| default values and from user provided arguments. | ||
|
|
||
| All limit arguments must be either a non-negative integer or ``None``. | ||
| All limit arguments must be either a non-negative integer, ``None`` or ``LogRecordLimits.UNSET``. |
There was a problem hiding this comment.
Is it part of the spec, and specifically the -1 value? I'm wondering if it's valid to set -1 in the declarative config yaml.
It's also different from the _ENV_VALUE_UNSET constant
There was a problem hiding this comment.
-1 never appears in the YAML. The config schema constrains these fields to minimum: 0 or null, so null/omitted means "no limit" and the config layer turns that into the internal -1. It's an in-process sentinel, not a user value. Schema refs:
https://github.com/open-telemetry/opentelemetry-configuration/blob/52c265e8a59fbf25348be7dfd2cb5c432801358d/schema/opentelemetry_configuration.yaml#L69-L81
https://github.com/open-telemetry/opentelemetry-configuration/blob/52c265e8a59fbf25348be7dfd2cb5c432801358d/schema/logger_provider.yaml#L108-L127
It's also not new. I'm mirroring the existing SpanLimits.UNSET = -1 and its _from_env_if_absent guard:
It differs from _ENV_VALUE_UNSET = "" because that guards the raw env-var string, while -1 guards the parsed int arg. Both already coexist in SpanLimits:
a1c69ca to
8c0e64e
Compare
Nope, no behavior change
This PR just threads an explicit log_record_limits through LoggerProvider -> Logger -> _from_api_log_record. Both The only observable difference: the OTEL_* env-based limits are now read once at LoggerProvider construction instead of once per log record. Same values in practice, and arguably more |
7b70474 to
f0ef10d
Compare
Pull request dashboard statusWaiting on reviewers · refreshed 2026-08-22 22:16 UTC Review the latest changes. Status above doesn't look right?
|
This comment has been minimized.
This comment has been minimized.
done |
done |
Parses config.attribute_limits in configure_sdk() and passes it as a global fallback to create_tracer_provider() and create_logger_provider(). Per-signal limits (tracer_provider.limits / logger_provider.limits) always take precedence; absent fields fall back to the global value, then to OTel spec defaults. For logs, adds log_record_limits to the LoggerProvider constructor, threads it through Logger, and applies it when constructing each ReadWriteLogRecord — mirroring how SpanLimits flows through TracerProvider.
…dk.py Co-authored-by: Aaron Abbott <aaronabbott@google.com>
f0ef10d to
252abd5
Compare
|
/dashboard route:reviewers |
|
@ocelotl, this pull request was routed to reviewers. |
Closes #5357
Summary
config.attribute_limitsinconfigure_sdk()and passes it as a global fallback tocreate_tracer_provider()andcreate_logger_provider()tracer_provider.limits/logger_provider.limits) always take precedence; absent fields fall back to the global value, then to OTel spec defaultslog_record_limitsparameter toLoggerProvider, threads it throughLoggerdown to eachReadWriteLogRecord— mirroring howSpanLimitsflows throughTracerProviderTest plan
tests/_configuration/test_sdk.py— global limits passed to per-signal factoriestests/_configuration/test_tracer_provider.py— per-signal override, global fallback, spec defaultstests/_configuration/test_logger_provider.py— same coverage for logs; verifies limits are applied (not just warned about)tests/logs/— no regressions in existing log SDK tests