33
33
)
34
34
from opentelemetry .metrics import UpDownCounter as APIUpDownCounter
35
35
from 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
+ )
37
40
from opentelemetry .sdk .metrics ._internal .exceptions import MetricsTimeoutError
38
41
from opentelemetry .sdk .metrics ._internal .exemplar import (
39
42
ExemplarFilter ,
40
43
TraceBasedExemplarFilter ,
44
+ AlwaysOnExemplarFilter ,
45
+ AlwaysOffExemplarFilter ,
41
46
)
42
47
from opentelemetry .sdk .metrics ._internal .instrument import (
43
48
_Counter ,
@@ -394,11 +399,12 @@ def __init__(
394
399
self ._atexit_handler = None
395
400
if resource is None :
396
401
resource = Resource .create ({})
402
+ filter = environ .get (OTEL_METRICS_EXEMPLAR_FILTER , None )
397
403
self ._sdk_config = SdkConfiguration (
398
404
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 )
402
408
),
403
409
resource = resource ,
404
410
metric_readers = metric_readers ,
@@ -556,3 +562,14 @@ def get_meter(
556
562
self ._measurement_consumer ,
557
563
)
558
564
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