Skip to content

Commit f9171c8

Browse files
committedApr 19, 2022
Exporter and Propagator(s) are env var configurable
1 parent 7077e6a commit f9171c8

File tree

1 file changed

+65
-21
lines changed

1 file changed

+65
-21
lines changed
 
+65-21
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,87 @@
11
"""Module to configure OpenTelemetry agent to work with SolarWinds backend"""
22

3+
import logging
4+
from os import environ
5+
from pkg_resources import iter_entry_points
6+
37
from opentelemetry import trace
4-
from opentelemetry.baggage.propagation import W3CBaggagePropagator
8+
from opentelemetry.environment_variables import OTEL_PROPAGATORS, OTEL_TRACES_EXPORTER
59
from opentelemetry.instrumentation.distro import BaseDistro
610
from opentelemetry.instrumentation.propagators import set_global_response_propagator
711
from opentelemetry.propagate import set_global_textmap
812
from opentelemetry.propagators.composite import CompositePropagator
913
from opentelemetry.sdk.trace import TracerProvider
1014
from opentelemetry.sdk.trace.export import BatchSpanProcessor
11-
from opentelemetry.trace.propagation.tracecontext import (
12-
TraceContextTextMapPropagator,
13-
)
1415

15-
from opentelemetry_distro_solarwinds.exporter import SolarWindsSpanExporter
16-
from opentelemetry_distro_solarwinds.propagator import SolarWindsPropagator
1716
from opentelemetry_distro_solarwinds.response_propagator import SolarWindsTraceResponsePropagator
1817
from opentelemetry_distro_solarwinds.sampler import ParentBasedSwSampler
1918

19+
logger = logging.getLogger(__name__)
2020

2121
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+
]
2330

24-
With this custom distro, the following functionality is introduced:
25-
- no functionality added at this time
26-
"""
2731
def _configure(self, **kwargs):
28-
# Automatically make use of custom SolarWinds sampler
32+
# Automatically use custom SolarWinds sampler
2933
trace.set_tracer_provider(
3034
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
4140
)
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+
4286
# Set global HTTP response propagator
4387
set_global_response_propagator(SolarWindsTraceResponsePropagator())

0 commit comments

Comments
 (0)
Please sign in to comment.