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 4 commits into
Conversation
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.
| *, | ||
| meter_provider: MeterProvider | None = None, | ||
| _logger_configurator: _LoggerConfiguratorT | None = None, | ||
| log_record_limits: LogRecordLimits | None = None, |
There was a problem hiding this comment.
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, |
| max_attributes=( | ||
| attribute_count_limit | ||
| if attribute_count_limit is not None | ||
| else _DEFAULT_OTEL_LOG_ATTRIBUTE_COUNT_LIMIT |
There was a problem hiding this comment.
Won't this be handled already by the LogRecordLimits constructor?
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.
| else _DEFAULT_OTEL_LINK_ATTRIBUTE_COUNT_LIMIT | ||
| ), | ||
| max_attribute_length=config.attribute_value_length_limit, | ||
| max_attribute_length=attribute_value_length_limit, |
| 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, | ||
| ) |
| 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) |
| 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) | ||
|
|
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