feat(config): add MeterProvider creation from declarative config#4987
Draft
MikeGoldsmith wants to merge 9 commits intoopen-telemetry:mainfrom
Draft
feat(config): add MeterProvider creation from declarative config#4987MikeGoldsmith wants to merge 9 commits intoopen-telemetry:mainfrom
MikeGoldsmith wants to merge 9 commits intoopen-telemetry:mainfrom
Conversation
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
Implements create_meter_provider() and configure_meter_provider() following the same patterns as _tracer_provider.py. - PeriodicExportingMetricReader with explicit interval/timeout defaults (60s/30s) to suppress env var reading - OTLP HTTP and gRPC metric exporters (lazy imports) - Console metric exporter - Temporality preference mapping (cumulative/delta/low_memory) with explicit dicts to suppress OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - Default histogram aggregation mapping with env var suppression - View creation with selector (instrument type/name/unit/meter info) and stream (name/description/aggregation/attribute_keys) - ExemplarFilter mapping; default = TraceBasedExemplarFilter (spec default) - configure_meter_provider(None) is a no-op per spec/Java/JS behavior - attribute_keys.excluded logs a warning (SDK View only supports inclusion) - Pull readers raise ConfigurationError (marked _development in spec) Assisted-by: Claude Sonnet 4.6
…etry#4987) Assisted-by: Claude Sonnet 4.6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Implements
create_meter_provider()andconfigure_meter_provider()for the declarative configuration pipeline, as part of the ongoing work tracked in the following issue:Note
This PR is based on #4979 (Resource & Propagator creation) which must be merged first. The extra commits at the base of this branch will be dropped once that PR lands.
What's included
_meter_provider.py: creates an SDKMeterProviderfrom declarative configPeriodicExportingMetricReaderwith interval/timeout configConfigurationErrorif not installedcumulative/delta/low_memory) with explicit per-instrument dictsexplicit_bucket_histogram/base2_exponential_bucket_histogram)Viewsupport: selector (instrument type/name/unit/meter info) and stream (name/description/aggregation/attribute_keys)boundaries,max_size,max_scale,record_min_max)ExemplarFiltermapping; default =TraceBasedExemplarFilterper OTel specconfigure_meter_provider(None)is a no-op per spec/Java/JS behaviorprometheus_development) raiseConfigurationError— aligned with Java's fail-fast behavior and the spec's SHOULD-throw guidanceEnv-var suppression
Python's
PeriodicExportingMetricReaderreadsOTEL_METRIC_EXPORT_INTERVAL/OTEL_METRIC_EXPORT_TIMEOUTwhen params areNone, and metric exporters readOTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCEwhenpreferred_temporality=None. To match the spec's "what you see is what you get" semantics, we always pass explicit values — defaulting to spec defaults (60s/30s, cumulative temporality,trace_basedexemplar filter).Type of change
How Has This Been Tested?
tests/_configuration/test_meter_provider.pyOTEL_METRIC_EXPORT_INTERVAL,OTEL_METRICS_EXEMPLAR_FILTER,OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE) are not read when config is usedDoes This PR Require a Contrib Repo Change?
Checklist:
Assisted-by: Claude Sonnet 4.6