1
1
"""Module to configure OpenTelemetry agent to work with SolarWinds backend"""
2
2
3
+ import logging
4
+ from os import environ
5
+ from pkg_resources import iter_entry_points
6
+
3
7
from opentelemetry import trace
4
- from opentelemetry .baggage . propagation import W3CBaggagePropagator
8
+ from opentelemetry .environment_variables import OTEL_PROPAGATORS , OTEL_TRACES_EXPORTER
5
9
from opentelemetry .instrumentation .distro import BaseDistro
6
10
from opentelemetry .instrumentation .propagators import set_global_response_propagator
7
11
from opentelemetry .propagate import set_global_textmap
8
12
from opentelemetry .propagators .composite import CompositePropagator
9
13
from opentelemetry .sdk .trace import TracerProvider
10
14
from opentelemetry .sdk .trace .export import BatchSpanProcessor
11
- from opentelemetry .trace .propagation .tracecontext import (
12
- TraceContextTextMapPropagator ,
13
- )
14
15
15
- from opentelemetry_distro_solarwinds .exporter import SolarWindsSpanExporter
16
- from opentelemetry_distro_solarwinds .propagator import SolarWindsPropagator
17
16
from opentelemetry_distro_solarwinds .response_propagator import SolarWindsTraceResponsePropagator
18
17
from opentelemetry_distro_solarwinds .sampler import ParentBasedSwSampler
19
18
19
+ logger = logging .getLogger (__name__ )
20
20
21
21
class SolarWindsDistro (BaseDistro ):
22
- """SolarWinds custom distro for OpenTelemetry agents.
22
+ """SolarWinds custom distro for OpenTelemetry agents."""
23
+
24
+ _DEFAULT_OTEL_EXPORTER = "solarwinds_exporter"
25
+ _DEFAULT_OTEL_PROPAGATORS = [
26
+ "tracecontext" ,
27
+ "baggage" ,
28
+ "solarwinds_propagator" ,
29
+ ]
23
30
24
- With this custom distro, the following functionality is introduced:
25
- - no functionality added at this time
26
- """
27
31
def _configure (self , ** kwargs ):
28
- # Automatically make use of custom SolarWinds sampler
32
+ # Automatically use custom SolarWinds sampler
29
33
trace .set_tracer_provider (
30
34
TracerProvider (sampler = ParentBasedSwSampler ()))
31
- # Automatically configure the SolarWinds Span exporter
32
- span_exporter = BatchSpanProcessor (SolarWindsSpanExporter ())
33
- trace .get_tracer_provider ().add_span_processor (span_exporter )
34
- # Configure a CompositePropagator including SolarWinds
35
- set_global_textmap (
36
- CompositePropagator ([
37
- TraceContextTextMapPropagator (),
38
- W3CBaggagePropagator (),
39
- SolarWindsPropagator ()
40
- ])
35
+
36
+ # Customize Exporter else default to SolarWindsSpanExporter
37
+ environ_exporter = environ .get (
38
+ OTEL_TRACES_EXPORTER ,
39
+ self ._DEFAULT_OTEL_EXPORTER
41
40
)
41
+ try :
42
+ exporter = next (
43
+ iter_entry_points (
44
+ "opentelemetry_traces_exporter" ,
45
+ environ_exporter
46
+ )).load ()()
47
+ except :
48
+ logger .exception (
49
+ "Failed to load configured exporter `%s`" , environ_exporter
50
+ )
51
+ raise
52
+
53
+ span_exporter = BatchSpanProcessor (exporter )
54
+ trace .get_tracer_provider ().add_span_processor (span_exporter )
55
+
56
+ # Configure context propagators to always include
57
+ # tracecontext,baggage,solarwinds -- first and in that order
58
+ # -- plus any others specified by env var
59
+ environ_propagators = environ .get (
60
+ OTEL_PROPAGATORS ,
61
+ "," .join (self ._DEFAULT_OTEL_PROPAGATORS )
62
+ ).split ("," )
63
+ if environ_propagators != self ._DEFAULT_OTEL_PROPAGATORS :
64
+ for default in self ._DEFAULT_OTEL_PROPAGATORS :
65
+ while default in environ_propagators :
66
+ environ_propagators .remove (default )
67
+ environ_propagators = self ._DEFAULT_OTEL_PROPAGATORS + environ_propagators
68
+ environ [OTEL_PROPAGATORS ] = "," .join (environ_propagators )
69
+
70
+ # Init and set CompositePropagator globally, like OTel API
71
+ propagators = []
72
+ for propagator in environ_propagators :
73
+ try :
74
+ propagators .append (
75
+ next (
76
+ iter_entry_points ("opentelemetry_propagator" , propagator )
77
+ ).load ()()
78
+ )
79
+ except Exception :
80
+ logger .exception (
81
+ "Failed to load configured propagator `%s`" , propagator
82
+ )
83
+ raise
84
+ set_global_textmap (CompositePropagator (propagators ))
85
+
42
86
# Set global HTTP response propagator
43
87
set_global_response_propagator (SolarWindsTraceResponsePropagator ())
0 commit comments