Skip to content

feat(config): wire top-level attribute_limits into per-signal providers#5365

Open
ocelotl wants to merge 4 commits into
open-telemetry:mainfrom
ocelotl:diego/config-attribute-limits
Open

feat(config): wire top-level attribute_limits into per-signal providers#5365
ocelotl wants to merge 4 commits into
open-telemetry:mainfrom
ocelotl:diego/config-attribute-limits

Conversation

@ocelotl

@ocelotl ocelotl commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Closes #5357

Summary

  • Reads 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
  • Adds log_record_limits parameter to LoggerProvider, threads it through Logger down to each ReadWriteLogRecord — mirroring how SpanLimits flows through TracerProvider

Test plan

  • tests/_configuration/test_sdk.py — global limits passed to per-signal factories
  • tests/_configuration/test_tracer_provider.py — per-signal override, global fallback, spec defaults
  • tests/_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

ocelotl added 4 commits June 26, 2026 15:14
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.
@ocelotl ocelotl marked this pull request as ready for review June 26, 2026 21:28
@ocelotl ocelotl requested a review from a team as a code owner June 26, 2026 21:28
*,
meter_provider: MeterProvider | None = None,
_logger_configurator: _LoggerConfiguratorT | None = None,
log_record_limits: LogRecordLimits | None = None,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Small nit, but I'd prefer moving public keyword arguments before private ones for readability.

*,
logger_metrics: LoggerMetricsT,
_logger_config: _LoggerConfig,
log_record_limits: LogRecordLimits | None = None,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Likewise here.

max_attributes=(
attribute_count_limit
if attribute_count_limit is not None
else _DEFAULT_OTEL_LOG_ATTRIBUTE_COUNT_LIMIT

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Won't this be handled already by the LogRecordLimits constructor?

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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_limits through configure_sdk() into create_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_limits into LoggerProvider, propagating to Logger and ReadWriteLogRecord.
  • 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.

else _DEFAULT_OTEL_LINK_ATTRIBUTE_COUNT_LIMIT
),
max_attribute_length=config.attribute_value_length_limit,
max_attribute_length=attribute_value_length_limit,
Comment on lines +262 to +269
return LogRecordLimits(
max_attributes=(
attribute_count_limit
if attribute_count_limit is not None
else _DEFAULT_OTEL_LOG_ATTRIBUTE_COUNT_LIMIT
),
max_attribute_length=attribute_value_length_limit,
)
Comment on lines +897 to +902
def test_global_limits_absent_uses_sdk_defaults(self):
provider = create_tracer_provider(
TracerProviderConfig(processors=[]),
)
self.assertEqual(provider._span_limits.max_span_attributes, 128)
self.assertIsNone(provider._span_limits.max_attribute_length)
Comment on lines +471 to +475
def test_default_limits(self):
provider = create_logger_provider(None)
self.assertEqual(provider._log_record_limits.max_attributes, 128)
self.assertIsNone(provider._log_record_limits.max_attribute_length)

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

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

Logging stability review: [minor] LogRecord attribute limits not configurable via LoggerProvider

3 participants