3333)
3434from opentelemetry .metrics import UpDownCounter as APIUpDownCounter
3535from opentelemetry .metrics import _Gauge as APIGauge
36- from opentelemetry .sdk .environment_variables import OTEL_SDK_DISABLED
36+ from opentelemetry .sdk .environment_variables import (
37+ OTEL_SDK_DISABLED ,
38+ OTEL_METRICS_EXEMPLAR_FILTER ,
39+ )
3740from opentelemetry .sdk .metrics ._internal .exceptions import MetricsTimeoutError
3841from opentelemetry .sdk .metrics ._internal .exemplar import (
3942 ExemplarFilter ,
4043 TraceBasedExemplarFilter ,
44+ AlwaysOnExemplarFilter ,
45+ AlwaysOffExemplarFilter ,
4146)
4247from opentelemetry .sdk .metrics ._internal .instrument import (
4348 _Counter ,
@@ -394,11 +399,12 @@ def __init__(
394399 self ._atexit_handler = None
395400 if resource is None :
396401 resource = Resource .create ({})
402+ filter = environ .get (OTEL_METRICS_EXEMPLAR_FILTER , None )
397403 self ._sdk_config = SdkConfiguration (
398404 exemplar_filter = (
399- TraceBasedExemplarFilter ()
400- if exemplar_filter is None
401- else exemplar_filter
405+ exemplar_filter
406+ if exemplar_filter is not None
407+ else self . _get_exemplar_filter ( filter )
402408 ),
403409 resource = resource ,
404410 metric_readers = metric_readers ,
@@ -556,3 +562,14 @@ def get_meter(
556562 self ._measurement_consumer ,
557563 )
558564 return self ._meters [info ]
565+
566+ def _get_exemplar_filter (self , exemplar_filter : str ) -> ExemplarFilter :
567+ if not exemplar_filter or exemplar_filter == 'trace_based' :
568+ return TraceBasedExemplarFilter ()
569+ elif exemplar_filter == 'always_on' :
570+ return AlwaysOnExemplarFilter ()
571+ elif exemplar_filter == 'always_off' :
572+ return AlwaysOffExemplarFilter ()
573+ else :
574+ raise Exception ("Invalid exemplar filter." )
575+
0 commit comments