Skip to content

Commit 09df35c

Browse files
ocelotlalrexlzchentoumorokoshi
authored
Update instrumentors to use span processors (open-telemetry#852)
Fixes open-telemetry#832. By having tracer creation occur on demand, late tracer provider configuration will be honored. This resolves issues with instrumentation occurring before tracer providers are set by the application developer, which would result in the no-op tracer used for the lifetime of the instrumentation. Co-authored-by: alrex <aboten@lightstep.com> Co-authored-by: Leighton Chen <lechen@microsoft.com> Co-authored-by: Yusuke Tsutsumi <yusuke@tsutsumi.io>
1 parent 34698ff commit 09df35c

File tree

7 files changed

+55
-44
lines changed
  • ext
    • opentelemetry-ext-dbapi/src/opentelemetry/ext/dbapi
    • opentelemetry-ext-mysql/src/opentelemetry/ext/mysql
    • opentelemetry-ext-psycopg2/src/opentelemetry/ext/psycopg2
    • opentelemetry-ext-pymysql/src/opentelemetry/ext/pymysql
    • opentelemetry-ext-requests/src/opentelemetry/ext/requests
    • opentelemetry-ext-sqlite3/src/opentelemetry/ext/sqlite3
  • opentelemetry-api/src/opentelemetry/util

7 files changed

+55
-44
lines changed

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

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848

4949
from opentelemetry.ext.dbapi.version import __version__
5050
from opentelemetry.instrumentation.utils import unwrap
51-
from opentelemetry.trace import SpanKind, Tracer, TracerProvider, get_tracer
51+
from opentelemetry.trace import SpanKind, TracerProvider, get_tracer
5252
from opentelemetry.trace.status import Status, StatusCanonicalCode
5353

5454
logger = logging.getLogger(__name__)
@@ -76,24 +76,27 @@ def trace_integration(
7676
tracer_provider: The :class:`opentelemetry.trace.TracerProvider` to
7777
use. If ommited the current configured one is used.
7878
"""
79-
tracer = get_tracer(__name__, __version__, tracer_provider)
8079
wrap_connect(
81-
tracer,
80+
__name__,
8281
connect_module,
8382
connect_method_name,
8483
database_component,
8584
database_type,
8685
connection_attributes,
86+
version=__version__,
87+
tracer_provider=tracer_provider,
8788
)
8889

8990

9091
def wrap_connect(
91-
tracer: Tracer,
92+
name: str,
9293
connect_module: typing.Callable[..., typing.Any],
9394
connect_method_name: str,
9495
database_component: str,
9596
database_type: str = "",
9697
connection_attributes: typing.Dict = None,
98+
version: str = "",
99+
tracer_provider: typing.Optional[TracerProvider] = None,
97100
):
98101
"""Integrate with DB API library.
99102
https://www.python.org/dev/peps/pep-0249/
@@ -117,10 +120,12 @@ def wrap_connect_(
117120
kwargs: typing.Dict[typing.Any, typing.Any],
118121
):
119122
db_integration = DatabaseApiIntegration(
120-
tracer,
123+
name,
121124
database_component,
122125
database_type=database_type,
123126
connection_attributes=connection_attributes,
127+
version=version,
128+
tracer_provider=tracer_provider,
124129
)
125130
return db_integration.wrapped_connection(wrapped, args, kwargs)
126131

@@ -146,11 +151,13 @@ def unwrap_connect(
146151

147152

148153
def instrument_connection(
149-
tracer,
154+
name: str,
150155
connection,
151156
database_component: str,
152157
database_type: str = "",
153158
connection_attributes: typing.Dict = None,
159+
version: str = "",
160+
tracer_provider: typing.Optional[TracerProvider] = None,
154161
):
155162
"""Enable instrumentation in a database connection.
156163
@@ -167,10 +174,12 @@ def instrument_connection(
167174
An instrumented connection.
168175
"""
169176
db_integration = DatabaseApiIntegration(
170-
tracer,
177+
name,
171178
database_component,
172179
database_type,
173180
connection_attributes=connection_attributes,
181+
version=version,
182+
tracer_provider=tracer_provider,
174183
)
175184
db_integration.get_connection_attributes(connection)
176185
return get_traced_connection_proxy(connection, db_integration)
@@ -195,10 +204,12 @@ def uninstrument_connection(connection):
195204
class DatabaseApiIntegration:
196205
def __init__(
197206
self,
198-
tracer: Tracer,
207+
name: str,
199208
database_component: str,
200209
database_type: str = "sql",
201210
connection_attributes=None,
211+
version: str = "",
212+
tracer_provider: typing.Optional[TracerProvider] = None,
202213
):
203214
self.connection_attributes = connection_attributes
204215
if self.connection_attributes is None:
@@ -208,14 +219,23 @@ def __init__(
208219
"host": "host",
209220
"user": "user",
210221
}
211-
self.tracer = tracer
222+
self._name = name
223+
self._version = version
224+
self._tracer_provider = tracer_provider
212225
self.database_component = database_component
213226
self.database_type = database_type
214227
self.connection_props = {}
215228
self.span_attributes = {}
216229
self.name = ""
217230
self.database = ""
218231

232+
def get_tracer(self):
233+
return get_tracer(
234+
self._name,
235+
instrumenting_library_version=self._version,
236+
tracer_provider=self._tracer_provider,
237+
)
238+
219239
def wrapped_connection(
220240
self,
221241
connect_method: typing.Callable[..., typing.Any],
@@ -288,7 +308,7 @@ def traced_execution(
288308
):
289309

290310
statement = args[0] if args else ""
291-
with self._db_api_integration.tracer.start_as_current_span(
311+
with self._db_api_integration.get_tracer().start_as_current_span(
292312
self._db_api_integration.name, kind=SpanKind.CLIENT
293313
) as span:
294314
span.set_attribute(
@@ -322,6 +342,7 @@ def traced_execution(
322342

323343
def get_traced_cursor_proxy(cursor, db_api_integration, *args, **kwargs):
324344
_traced_cursor = TracedCursor(db_api_integration)
345+
325346
# pylint: disable=abstract-method
326347
class TracedCursorProxy(wrapt.ObjectProxy):
327348

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,12 @@
4242
---
4343
"""
4444

45-
import typing
46-
4745
import mysql.connector
4846

4947
from opentelemetry.ext import dbapi
5048
from opentelemetry.ext.mysql.version import __version__
5149
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
52-
from opentelemetry.trace import TracerProvider, get_tracer
50+
from opentelemetry.trace import get_tracer
5351

5452

5553
class MySQLInstrumentor(BaseInstrumentor):
@@ -69,15 +67,15 @@ def _instrument(self, **kwargs):
6967
"""
7068
tracer_provider = kwargs.get("tracer_provider")
7169

72-
tracer = get_tracer(__name__, __version__, tracer_provider)
73-
7470
dbapi.wrap_connect(
75-
tracer,
71+
__name__,
7672
mysql.connector,
7773
"connect",
7874
self._DATABASE_COMPONENT,
7975
self._DATABASE_TYPE,
8076
self._CONNECTION_ATTRIBUTES,
77+
version=__version__,
78+
tracer_provider=tracer_provider,
8179
)
8280

8381
def _uninstrument(self, **kwargs):

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,12 @@
4242
---
4343
"""
4444

45-
import typing
46-
4745
import psycopg2
48-
import wrapt
4946

5047
from opentelemetry.ext import dbapi
5148
from opentelemetry.ext.psycopg2.version import __version__
5249
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
53-
from opentelemetry.trace import TracerProvider, get_tracer
50+
from opentelemetry.trace import get_tracer
5451

5552

5653
class Psycopg2Instrumentor(BaseInstrumentor):
@@ -71,15 +68,15 @@ def _instrument(self, **kwargs):
7168

7269
tracer_provider = kwargs.get("tracer_provider")
7370

74-
tracer = get_tracer(__name__, __version__, tracer_provider)
75-
7671
dbapi.wrap_connect(
77-
tracer,
72+
__name__,
7873
psycopg2,
7974
"connect",
8075
self._DATABASE_COMPONENT,
8176
self._DATABASE_TYPE,
8277
self._CONNECTION_ATTRIBUTES,
78+
version=__version__,
79+
tracer_provider=tracer_provider,
8380
)
8481

8582
def _uninstrument(self, **kwargs):

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,11 @@
4343
---
4444
"""
4545

46-
import typing
47-
4846
import pymysql
4947

5048
from opentelemetry.ext import dbapi
5149
from opentelemetry.ext.pymysql.version import __version__
5250
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
53-
from opentelemetry.trace import TracerProvider, get_tracer
5451

5552

5653
class PyMySQLInstrumentor(BaseInstrumentor):
@@ -70,15 +67,15 @@ def _instrument(self, **kwargs):
7067
"""
7168
tracer_provider = kwargs.get("tracer_provider")
7269

73-
tracer = get_tracer(__name__, __version__, tracer_provider)
74-
7570
dbapi.wrap_connect(
76-
tracer,
71+
__name__,
7772
pymysql,
7873
"connect",
7974
self._DATABASE_COMPONENT,
8075
self._DATABASE_TYPE,
8176
self._CONNECTION_ATTRIBUTES,
77+
version=__version__,
78+
tracer_provider=tracer_provider,
8279
)
8380

8481
def _uninstrument(self, **kwargs):
@@ -95,14 +92,14 @@ def instrument_connection(self, connection):
9592
Returns:
9693
An instrumented connection.
9794
"""
98-
tracer = get_tracer(__name__, __version__)
9995

10096
return dbapi.instrument_connection(
101-
tracer,
97+
__name__,
10298
connection,
10399
self._DATABASE_COMPONENT,
104100
self._DATABASE_TYPE,
105101
self._CONNECTION_ATTRIBUTES,
102+
version=__version__,
106103
)
107104

108105
def uninstrument_connection(self, connection):

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
import requests
2525
import opentelemetry.ext.requests
2626
27-
# You can optionally pass a custom TracerProvider to RequestInstrumentor.instrument()
27+
# You can optionally pass a custom TracerProvider to
28+
RequestInstrumentor.instrument()
2829
opentelemetry.ext.requests.RequestsInstrumentor().instrument()
2930
response = requests.get(url="https://www.example.org/")
3031
@@ -49,7 +50,7 @@
4950
from requests.exceptions import InvalidSchema, InvalidURL, MissingSchema
5051
from requests.sessions import Session
5152

52-
from opentelemetry import context, propagators, trace
53+
from opentelemetry import context, propagators
5354
from opentelemetry.ext.requests.version import __version__
5455
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
5556
from opentelemetry.instrumentation.utils import http_status_to_canonical_code
@@ -72,8 +73,6 @@ def _instrument(tracer_provider=None, span_callback=None):
7273

7374
wrapped = Session.request
7475

75-
tracer = trace.get_tracer(__name__, __version__, tracer_provider)
76-
7776
@functools.wraps(wrapped)
7877
def instrumented_request(self, method, url, *args, **kwargs):
7978
if context.get_value("suppress_instrumentation"):
@@ -89,9 +88,9 @@ def instrumented_request(self, method, url, *args, **kwargs):
8988

9089
exception = None
9190

92-
with tracer.start_as_current_span(
93-
span_name, kind=SpanKind.CLIENT
94-
) as span:
91+
with get_tracer(
92+
__name__, __version__, tracer_provider
93+
).start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
9594
span.set_attribute("component", "http")
9695
span.set_attribute("http.method", method.upper())
9796
span.set_attribute("http.url", url)

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,11 @@
4343
"""
4444

4545
import sqlite3
46-
import typing
4746

4847
from opentelemetry.ext import dbapi
4948
from opentelemetry.ext.sqlite3.version import __version__
5049
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
51-
from opentelemetry.trace import TracerProvider, get_tracer
50+
from opentelemetry.trace import get_tracer
5251

5352

5453
class SQLite3Instrumentor(BaseInstrumentor):
@@ -64,15 +63,15 @@ def _instrument(self, **kwargs):
6463
"""
6564
tracer_provider = kwargs.get("tracer_provider")
6665

67-
tracer = get_tracer(__name__, __version__, tracer_provider)
68-
6966
dbapi.wrap_connect(
70-
tracer,
67+
__name__,
7168
sqlite3,
7269
"connect",
7370
self._DATABASE_COMPONENT,
7471
self._DATABASE_TYPE,
7572
self._CONNECTION_ATTRIBUTES,
73+
version=__version__,
74+
tracer_provider=tracer_provider,
7675
)
7776

7877
def _uninstrument(self, **kwargs):

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def _load_provider(provider: str) -> Provider:
4848
name=cast(
4949
str,
5050
Configuration().get(
51-
provider, "default_{}".format(provider),
51+
provider.upper(), "default_{}".format(provider),
5252
),
5353
),
5454
)

0 commit comments

Comments
 (0)