Skip to content

Commit 972e2ab

Browse files
toumorokoshic24t
andauthored
Adding trace.get_tracer (#430)
It's fairly common to need to retrieve tracers, and as such adding the additional tracer_source() call to every retrieval of a tracer can add to a lot of extra boilerplate at minimal semantic value. It would be uncommon for one to use multiple tracer_source objects, as typically one would want all tracers to be created and behave in a similar way (e.g. passed to the same span processor). Co-Authored-By: Chris Kleinknecht <[email protected]>
1 parent 5a0dae9 commit 972e2ab

File tree

15 files changed

+75
-14
lines changed

15 files changed

+75
-14
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ trace.set_preferred_tracer_source_implementation(lambda T: TracerSource())
5959
trace.tracer_source().add_span_processor(
6060
SimpleExportSpanProcessor(ConsoleSpanExporter())
6161
)
62-
tracer = trace.tracer_source().get_tracer(__name__)
62+
tracer = trace.get_tracer(__name__)
6363
with tracer.start_as_current_span('foo'):
6464
with tracer.start_as_current_span('bar'):
6565
with tracer.start_as_current_span('baz'):

examples/basic_tracer/tracer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
# We tell OpenTelemetry who it is that is creating spans. In this case, we have
4242
# no real name (no setup.py), so we make one up. If we had a version, we would
4343
# also specify it here.
44-
tracer = trace.tracer_source().get_tracer(__name__)
44+
tracer = trace.get_tracer(__name__)
4545

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

examples/http/server.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
# The preferred tracer implementation must be set, as the opentelemetry-api
4343
# defines the interface with a no-op implementation.
4444
trace.set_preferred_tracer_source_implementation(lambda T: TracerSource())
45-
tracer = trace.tracer_source().get_tracer(__name__)
45+
tracer = trace.get_tracer(__name__)
4646

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

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def hello():
6767
version = pkg_resources.get_distribution(
6868
"opentelemetry-example-app"
6969
).version
70-
tracer = trace.tracer_source().get_tracer(__name__, version)
70+
tracer = trace.get_tracer(__name__, version)
7171
with tracer.start_as_current_span("example-request"):
7272
requests.get("http://www.example.com")
7373
return "hello"

examples/opentracing/main.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
redis_cache = RedisCache(opentracing_tracer)
2929

3030
# Appication code uses an OpenTelemetry Tracer as usual.
31-
tracer = trace.tracer_source().get_tracer(__name__)
31+
tracer = trace.get_tracer(__name__)
3232

3333

3434
@redis_cache

ext/opentelemetry-ext-dbapi/README.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Usage
1515
from opentelemetry.ext.dbapi import trace_integration
1616
1717
trace.set_preferred_tracer_source_implementation(lambda T: TracerSource())
18-
tracer = trace.tracer_source().get_tracer(__name__)
18+
tracer = trace.get_tracer(__name__)
1919
# Ex: mysql.connector
2020
trace_integration(tracer_source(), mysql.connector, "connect", "mysql")
2121

ext/opentelemetry-ext-flask/src/opentelemetry/ext/flask/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def _before_flask_request():
6161
otel_wsgi.get_header_from_environ, environ
6262
)
6363

64-
tracer = trace.tracer_source().get_tracer(__name__, __version__)
64+
tracer = trace.get_tracer(__name__, __version__)
6565

6666
attributes = otel_wsgi.collect_request_attributes(environ)
6767
if flask_request.url_rule:

ext/opentelemetry-ext-jaeger/README.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ gRPC is still not supported by this implementation.
3636
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
3737
3838
trace.set_preferred_tracer_source_implementation(lambda T: TracerSource())
39-
tracer = trace.tracer_source().get_tracer(__name__)
39+
tracer = trace.get_tracer(__name__)
4040
4141
# create a JaegerSpanExporter
4242
jaeger_exporter = jaeger.JaegerSpanExporter(

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
77

88
trace.set_preferred_tracer_source_implementation(lambda T: TracerSource())
9-
tracer = trace.tracer_source().get_tracer(__name__)
9+
tracer = trace.get_tracer(__name__)
1010

1111
# create a JaegerSpanExporter
1212
jaeger_exporter = jaeger.JaegerSpanExporter(

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
trace.set_preferred_tracer_source_implementation(lambda T: TracerSource())
3737
3838
# Create an OpenTelemetry Tracer.
39-
otel_tracer = trace.tracer_source().get_tracer(__name__)
39+
otel_tracer = trace.get_tracer(__name__)
4040
4141
# Create an OpenTracing shim.
4242
shim = create_tracer(otel_tracer)

ext/opentelemetry-ext-psycopg2/README.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Usage
1616
from opentelemetry.trace.ext.psycopg2 import trace_integration
1717
1818
trace.set_preferred_tracer_source_implementation(lambda T: TracerSource())
19-
tracer = trace.tracer_source().get_tracer(__name__)
19+
tracer = trace.get_tracer(__name__)
2020
trace_integration(tracer)
2121
cnx = psycopg2.connect(database='Database')
2222
cursor = cnx.cursor()

ext/opentelemetry-ext-wsgi/src/opentelemetry/ext/wsgi/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ class OpenTelemetryMiddleware:
162162

163163
def __init__(self, wsgi):
164164
self.wsgi = wsgi
165-
self.tracer = trace.tracer_source().get_tracer(__name__, __version__)
165+
self.tracer = trace.get_tracer(__name__, __version__)
166166

167167
@staticmethod
168168
def _create_start_response(span, start_response):

ext/opentelemetry-ext-zipkin/README.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ This exporter always send traces to the configured Zipkin collector using HTTP.
3434
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
3535
3636
trace.set_preferred_tracer_source_implementation(lambda T: TracerSource())
37-
tracer = trace.tracer_source().get_tracer(__name__)
37+
tracer = trace.get_tracer(__name__)
3838
3939
# create a ZipkinSpanExporter
4040
zipkin_exporter = zipkin.ZipkinSpanExporter(

opentelemetry-api/src/opentelemetry/trace/__init__.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
3737
from opentelemetry import trace
3838
39-
tracer = trace.tracer_source().get_tracer(__name__)
39+
tracer = trace.get_tracer(__name__)
4040
4141
# Create a new root span, set it as the current span in context
4242
with tracer.start_as_current_span("parent"):
@@ -68,13 +68,16 @@
6868

6969
import abc
7070
import enum
71+
import logging
7172
import types as python_types
7273
import typing
7374
from contextlib import contextmanager
7475

7576
from opentelemetry.trace.status import Status
7677
from opentelemetry.util import loader, types
7778

79+
logger = logging.getLogger(__name__)
80+
7881
# TODO: quarantine
7982
ParentSpan = typing.Optional[typing.Union["Span", "SpanContext"]]
8083

@@ -647,6 +650,19 @@ def use_span(
647650
_TRACER_SOURCE_FACTORY = None # type: typing.Optional[ImplementationFactory]
648651

649652

653+
def get_tracer(
654+
instrumenting_module_name: str, instrumenting_library_version: str = ""
655+
) -> "Tracer":
656+
"""Returns a `Tracer` for use by the given instrumentation library.
657+
658+
This function is a convenience wrapper for
659+
opentelemetry.trace.tracer_source().get_tracer
660+
"""
661+
return tracer_source().get_tracer(
662+
instrumenting_module_name, instrumenting_library_version
663+
)
664+
665+
650666
def tracer_source() -> TracerSource:
651667
"""Gets the current global :class:`~.TracerSource` object.
652668
@@ -663,6 +679,10 @@ def tracer_source() -> TracerSource:
663679
except TypeError:
664680
# if we raised an exception trying to instantiate an
665681
# abstract class, default to no-op tracer impl
682+
logger.warning(
683+
"Unable to instantiate TracerSource from tracer source factory.",
684+
exc_info=True,
685+
)
666686
_TRACER_SOURCE = DefaultTracerSource()
667687
del _TRACER_SOURCE_FACTORY
668688

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import importlib
2+
import unittest
3+
4+
from opentelemetry import trace
5+
6+
7+
class TestGlobals(unittest.TestCase):
8+
def setUp(self):
9+
importlib.reload(trace)
10+
11+
# this class has to be declared after the importlib
12+
# reload, or else it will inherit from an old
13+
# TracerSource, rather than the new TraceSource ABC.
14+
# created from reload.
15+
16+
static_tracer = trace.DefaultTracer()
17+
18+
class DummyTracerSource(trace.TracerSource):
19+
"""TraceSource used for testing"""
20+
21+
def get_tracer(
22+
self,
23+
instrumenting_module_name: str,
24+
instrumenting_library_version: str = "",
25+
) -> trace.Tracer:
26+
# pylint:disable=no-self-use,unused-argument
27+
return static_tracer
28+
29+
trace.set_preferred_tracer_source_implementation(
30+
lambda _: DummyTracerSource()
31+
)
32+
33+
@staticmethod
34+
def tearDown() -> None:
35+
importlib.reload(trace)
36+
37+
def test_get_tracer(self):
38+
"""trace.get_tracer should proxy to the global tracer source."""
39+
from_global_api = trace.get_tracer("foo")
40+
from_tracer_api = trace.tracer_source().get_tracer("foo")
41+
self.assertIs(from_global_api, from_tracer_api)

0 commit comments

Comments
 (0)