Skip to content

Commit 68e909b

Browse files
ocelotlmauriciovasquezbernalc24t
authored
Add a configuration manager (open-telemetry#466)
Fixes open-telemetry#123 This basically removes loader.py (uses entry points instead) and all the calls for set_preferred_implementation* in order to cleanly separate user code from configuration. It introduces a configuration manager that can have configuration set by a configuration file or environment variables that override the former configuration method. Co-authored-by: Mauricio Vásquez <mauricio@kinvolk.io> Co-authored-by: Chris Kleinknecht <libc@google.com>
1 parent 3654a86 commit 68e909b

File tree

36 files changed

+343
-541
lines changed

36 files changed

+343
-541
lines changed

docs/api/api.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,3 @@ OpenTelemetry Python API
99
context
1010
metrics
1111
trace
12-
util.loader

docs/api/util.loader.rst

Lines changed: 0 additions & 4 deletions
This file was deleted.

docs/examples/basic_tracer/tracer.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,16 @@
4545
print("Using ConsoleSpanExporter")
4646
exporter = ConsoleSpanExporter()
4747

48-
# The preferred tracer implementation must be set, as the opentelemetry-api
49-
# defines the interface with a no-op implementation.
50-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
51-
48+
trace.set_tracer_provider(TracerProvider())
5249
# We tell OpenTelemetry who it is that is creating spans. In this case, we have
5350
# no real name (no setup.py), so we make one up. If we had a version, we would
5451
# also specify it here.
5552
tracer = trace.get_tracer(__name__)
5653

5754
# SpanExporter receives the spans and send them to the target location.
5855
span_processor = BatchExportSpanProcessor(exporter)
56+
trace.get_tracer_provider().add_span_processor(span_processor)
5957

60-
trace.tracer_provider().add_span_processor(span_processor)
6158
with tracer.start_as_current_span("foo"):
6259
with tracer.start_as_current_span("bar"):
6360
with tracer.start_as_current_span("baz"):

docs/examples/http/server.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,17 @@
3939
else:
4040
exporter = ConsoleSpanExporter()
4141

42-
# The preferred tracer implementation must be set, as the opentelemetry-api
43-
# defines the interface with a no-op implementation.
44-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
4542
tracer = trace.get_tracer(__name__)
4643

4744
# SpanExporter receives the spans and send them to the target location.
4845
span_processor = BatchExportSpanProcessor(exporter)
49-
trace.tracer_provider().add_span_processor(span_processor)
46+
trace.set_tracer_provider(TracerProvider())
47+
trace.get_tracer_provider().add_span_processor(span_processor)
5048

5149
# Integrations are the glue that binds the OpenTelemetry API and the
5250
# frameworks and libraries that are used together, automatically creating
5351
# Spans and propagating context as appropriate.
54-
http_requests.enable(trace.tracer_provider())
52+
http_requests.enable(trace.get_tracer_provider())
5553
app = flask.Flask(__name__)
5654
app.wsgi_app = OpenTelemetryMiddleware(app.wsgi_app)
5755

docs/examples/http/tracer_client.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@
3737
else:
3838
exporter = ConsoleSpanExporter()
3939

40-
# The preferred tracer implementation must be set, as the opentelemetry-api
41-
# defines the interface with a no-op implementation.
42-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
43-
tracer_provider = trace.tracer_provider()
40+
trace.set_tracer_provider(TracerProvider())
41+
tracer_provider = trace.get_tracer_provider()
4442

4543
# SpanExporter receives the spans and send them to the target location.
4644
span_processor = BatchExportSpanProcessor(exporter)

docs/examples/metrics/observer_example.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@
1919
import psutil
2020

2121
from opentelemetry import metrics
22-
from opentelemetry.sdk.metrics import LabelSet, MeterProvider
22+
from opentelemetry.sdk.metrics import LabelSet
2323
from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter
2424
from opentelemetry.sdk.metrics.export.batcher import UngroupedBatcher
2525
from opentelemetry.sdk.metrics.export.controller import PushController
2626

2727
# Configure a stateful batcher
2828
batcher = UngroupedBatcher(stateful=True)
2929

30-
metrics.set_preferred_meter_provider_implementation(lambda _: MeterProvider())
3130
meter = metrics.get_meter(__name__)
3231

3332
# Exporter to export metrics to the console

docs/examples/metrics/prometheus.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,13 @@
2121

2222
from opentelemetry import metrics
2323
from opentelemetry.ext.prometheus import PrometheusMetricsExporter
24-
from opentelemetry.sdk.metrics import Counter, MeterProvider
24+
from opentelemetry.sdk.metrics import Counter
2525
from opentelemetry.sdk.metrics.export.controller import PushController
2626

2727
# Start Prometheus client
2828
start_http_server(port=8000, addr="localhost")
2929

3030
# Meter is responsible for creating and recording metrics
31-
metrics.set_preferred_meter_provider_implementation(lambda _: MeterProvider())
3231
meter = metrics.get_meter(__name__)
3332
# exporter to export metrics to Prometheus
3433
prefix = "MyAppPrefix"

docs/examples/metrics/record.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,10 @@
1919
import time
2020

2121
from opentelemetry import metrics
22-
from opentelemetry.sdk.metrics import Counter, MeterProvider
22+
from opentelemetry.sdk.metrics import Counter
2323
from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter
2424
from opentelemetry.sdk.metrics.export.controller import PushController
2525

26-
# The preferred tracer implementation must be set, as the opentelemetry-api
27-
# defines the interface with a no-op implementation.
28-
metrics.set_preferred_meter_provider_implementation(lambda _: MeterProvider())
2926
# Meter is responsible for creating and recording metrics
3027
meter = metrics.get_meter(__name__)
3128
# exporter to export metrics to the console

docs/examples/metrics/simple_example.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import time
2424

2525
from opentelemetry import metrics
26-
from opentelemetry.sdk.metrics import Counter, Measure, MeterProvider
26+
from opentelemetry.sdk.metrics import Counter, Measure
2727
from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter
2828
from opentelemetry.sdk.metrics.export.controller import PushController
2929

@@ -44,7 +44,6 @@ def usage(argv):
4444
sys.exit(1)
4545

4646
# Meter is responsible for creating and recording metrics
47-
metrics.set_preferred_meter_provider_implementation(lambda _: MeterProvider())
4847

4948
# Meter's namespace corresponds to the string passed as the first argument Pass
5049
# in True/False to indicate whether the batcher is stateful. True indicates the

docs/examples/opentelemetry-example-app/src/opentelemetry_example_app/flask_example.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import opentelemetry.ext.http_requests
2424
from opentelemetry import trace
2525
from opentelemetry.ext.flask import instrument_app
26-
from opentelemetry.sdk.trace import TracerProvider
2726

2827

2928
def configure_opentelemetry(flask_app: flask.Flask):
@@ -42,20 +41,14 @@ def configure_opentelemetry(flask_app: flask.Flask):
4241
"""
4342
# Start by configuring all objects required to ensure
4443
# a complete end to end workflow.
45-
# The preferred implementation of these objects must be set,
46-
# as the opentelemetry-api defines the interface with a no-op
47-
# implementation.
48-
trace.set_preferred_tracer_provider_implementation(
49-
lambda _: TracerProvider()
50-
)
5144

5245
# Next, we need to configure how the values that are used by
5346
# traces and metrics are propagated (such as what specific headers
5447
# carry this value).
5548
# Integrations are the glue that binds the OpenTelemetry API
5649
# and the frameworks and libraries that are used together, automatically
5750
# creating Spans and propagating context as appropriate.
58-
opentelemetry.ext.http_requests.enable(trace.tracer_provider())
51+
opentelemetry.ext.http_requests.enable(trace.get_tracer_provider())
5952
instrument_app(flask_app)
6053

6154

docs/examples/opentracing/main.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@
33
from opentelemetry import trace
44
from opentelemetry.ext import opentracing_shim
55
from opentelemetry.ext.jaeger import JaegerSpanExporter
6-
from opentelemetry.sdk.trace import TracerProvider
76
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
87
from rediscache import RedisCache
98

10-
# Configure the tracer using the default implementation
11-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
12-
tracer_provider = trace.tracer_provider()
9+
tracer_provider = trace.get_tracer_provider()
1310

1411
# Configure the tracer to export traces to Jaeger
1512
jaeger_exporter = JaegerSpanExporter(

examples/metrics/collector.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@
2121
from opentelemetry.ext.otcollector.metrics_exporter import (
2222
CollectorMetricsExporter,
2323
)
24-
from opentelemetry.sdk.metrics import Counter, MeterProvider
24+
from opentelemetry.sdk.metrics import Counter
2525
from opentelemetry.sdk.metrics.export.controller import PushController
2626

2727
# Meter is responsible for creating and recording metrics
28-
metrics.set_preferred_meter_provider_implementation(lambda _: MeterProvider())
2928
meter = metrics.get_meter(__name__)
3029
# exporter to export metrics to OT Collector
3130
exporter = CollectorMetricsExporter(

ext/opentelemetry-ext-dbapi/README.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ Usage
1515
from opentelemetry.trace import tracer_provider
1616
from opentelemetry.ext.dbapi import trace_integration
1717
18-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
1918
tracer = trace.get_tracer(__name__)
2019
# Ex: mysql.connector
2120
trace_integration(tracer_provider(), mysql.connector, "connect", "mysql", "sql")

ext/opentelemetry-ext-jaeger/README.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@ gRPC is still not supported by this implementation.
3232
3333
from opentelemetry import trace
3434
from opentelemetry.ext import jaeger
35-
from opentelemetry.sdk.trace import TracerProvider
3635
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
3736
38-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
3937
tracer = trace.get_tracer(__name__)
4038
4139
# create a JaegerSpanExporter

ext/opentelemetry-ext-jaeger/examples/jaeger_exporter_example.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
from opentelemetry import trace
44
from opentelemetry.ext import jaeger
5-
from opentelemetry.sdk.trace import TracerProvider
65
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
76

8-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
97
tracer = trace.get_tracer(__name__)
108

119
# create a JaegerSpanExporter
@@ -26,7 +24,7 @@
2624
span_processor = BatchExportSpanProcessor(jaeger_exporter)
2725

2826
# add to the tracer factory
29-
trace.tracer_provider().add_span_processor(span_processor)
27+
trace.get_tracer_provider().add_span_processor(span_processor)
3028

3129
# create some spans for testing
3230
with tracer.start_as_current_span("foo") as foo:

ext/opentelemetry-ext-opentracing-shim/src/opentelemetry/ext/opentracing_shim/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,8 @@
2929
import time
3030
3131
from opentelemetry import trace
32-
from opentelemetry.sdk.trace import TracerProvider
3332
from opentelemetry.ext.opentracing_shim import create_tracer
3433
35-
# Tell OpenTelemetry which Tracer implementation to use.
36-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
37-
3834
# Create an OpenTelemetry Tracer.
3935
otel_tracer = trace.get_tracer(__name__)
4036

ext/opentelemetry-ext-opentracing-shim/tests/test_shim.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,11 @@ class TestShim(TestCase):
4343

4444
def setUp(self):
4545
"""Create an OpenTelemetry tracer and a shim before every test case."""
46-
47-
self.shim = opentracingshim.create_tracer(trace.tracer_provider())
46+
trace.set_tracer_provider(TracerProvider())
47+
self.shim = opentracingshim.create_tracer(trace.get_tracer_provider())
4848

4949
@classmethod
5050
def setUpClass(cls):
51-
"""Set preferred tracer implementation only once rather than before
52-
every test method.
53-
"""
54-
55-
trace.set_preferred_tracer_provider_implementation(
56-
lambda T: TracerProvider()
57-
)
58-
5951
# Save current propagator to be restored on teardown.
6052
cls._previous_propagator = propagators.get_global_httptextformat()
6153

ext/opentelemetry-ext-otcollector/tests/test_otcollector_metrics_exporter.py

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,11 @@ class TestCollectorMetricsExporter(unittest.TestCase):
3434
@classmethod
3535
def setUpClass(cls):
3636
# pylint: disable=protected-access
37-
cls._meter_defaults = (
38-
metrics._METER_PROVIDER,
39-
metrics._METER_PROVIDER_FACTORY,
40-
)
41-
metrics.set_preferred_meter_provider_implementation(
42-
lambda _: MeterProvider()
43-
)
37+
metrics.set_meter_provider(MeterProvider())
4438
cls._meter = metrics.get_meter(__name__)
4539
kvp = {"environment": "staging"}
4640
cls._test_label_set = cls._meter.get_label_set(kvp)
4741

48-
@classmethod
49-
def tearDownClass(cls):
50-
# pylint: disable=protected-access
51-
(
52-
metrics._METER_PROVIDER,
53-
metrics._METER_PROVIDER_FACTORY,
54-
) = cls._meter_defaults
55-
5642
def test_constructor(self):
5743
mock_get_node = mock.Mock()
5844
patch = mock.patch(

ext/opentelemetry-ext-prometheus/README.rst

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,14 @@ The **OpenTelemetry Prometheus Exporter** allows to export `OpenTelemetry`_ metr
2929
3030
from opentelemetry import metrics
3131
from opentelemetry.ext.prometheus import PrometheusMetricsExporter
32-
from opentelemetry.sdk.metrics import Counter, Meter
32+
from opentelemetry.sdk.metrics import Counter
3333
from opentelemetry.sdk.metrics.export.controller import PushController
3434
from prometheus_client import start_http_server
3535
3636
# Start Prometheus client
3737
start_http_server(port=8000, addr="localhost")
3838
3939
# Meter is responsible for creating and recording metrics
40-
metrics.set_preferred_meter_implementation(lambda _: Meter())
4140
meter = metrics.meter()
4241
# exporter to export metrics to Prometheus
4342
prefix = "MyAppPrefix"

ext/opentelemetry-ext-prometheus/tests/test_prometheus_exporter.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@
2121
CustomCollector,
2222
PrometheusMetricsExporter,
2323
)
24+
from opentelemetry.metrics import get_meter_provider, set_meter_provider
2425
from opentelemetry.sdk import metrics
2526
from opentelemetry.sdk.metrics.export import MetricRecord, MetricsExportResult
2627
from opentelemetry.sdk.metrics.export.aggregate import CounterAggregator
2728

2829

2930
class TestPrometheusMetricExporter(unittest.TestCase):
3031
def setUp(self):
31-
self._meter = metrics.MeterProvider().get_meter(__name__)
32+
set_meter_provider(metrics.MeterProvider())
33+
self._meter = get_meter_provider().get_meter(__name__)
3234
self._test_metric = self._meter.create_metric(
3335
"testname",
3436
"testdesc",
@@ -74,7 +76,7 @@ def test_export(self):
7476
self.assertIs(result, MetricsExportResult.SUCCESS)
7577

7678
def test_counter_to_prometheus(self):
77-
meter = metrics.MeterProvider().get_meter(__name__)
79+
meter = get_meter_provider().get_meter(__name__)
7880
metric = meter.create_metric(
7981
"test@name",
8082
"testdesc",
@@ -110,8 +112,7 @@ def test_counter_to_prometheus(self):
110112
# TODO: Add unit test once Measure Aggregators are available
111113

112114
def test_invalid_metric(self):
113-
114-
meter = metrics.MeterProvider().get_meter(__name__)
115+
meter = get_meter_provider().get_meter(__name__)
115116
metric = meter.create_metric(
116117
"tesname", "testdesc", "unit", int, TestMetric
117118
)

ext/opentelemetry-ext-psycopg2/README.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@ Usage
1313
1414
import psycopg2
1515
from opentelemetry import trace
16-
from opentelemetry.sdk.trace import TracerProvider
1716
from opentelemetry.trace.ext.psycopg2 import trace_integration
1817
19-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
2018
tracer = trace.get_tracer(__name__)
2119
trace_integration(tracer)
2220
cnx = psycopg2.connect(database='Database')

ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@ class WsgiTestBase(unittest.TestCase):
1616
@classmethod
1717
def setUpClass(cls):
1818
global _MEMORY_EXPORTER # pylint:disable=global-statement
19-
trace_api.set_preferred_tracer_provider_implementation(
20-
lambda T: TracerProvider()
21-
)
22-
tracer_provider = trace_api.tracer_provider()
19+
trace_api.set_tracer_provider(TracerProvider())
20+
tracer_provider = trace_api.get_tracer_provider()
2321
_MEMORY_EXPORTER = InMemorySpanExporter()
2422
span_processor = export.SimpleExportSpanProcessor(_MEMORY_EXPORTER)
2523
tracer_provider.add_span_processor(span_processor)

ext/opentelemetry-ext-zipkin/README.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,8 @@ This exporter always send traces to the configured Zipkin collector using HTTP.
3030
3131
from opentelemetry import trace
3232
from opentelemetry.ext import zipkin
33-
from opentelemetry.sdk.trace import TracerProvider
3433
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
3534
36-
trace.set_preferred_tracer_provider_implementation(lambda T: TracerProvider())
3735
tracer = trace.get_tracer(__name__)
3836
3937
# create a ZipkinSpanExporter

0 commit comments

Comments
 (0)