Skip to content

Commit e6df0b6

Browse files
authored
Merge branch 'main' into fix-tox-deps
2 parents 66d56ac + 116f98d commit e6df0b6

File tree

6 files changed

+664
-80
lines changed

6 files changed

+664
-80
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2323
([#2935](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2935))
2424
- `opentelemetry-instrumentation-dbapi` instrument_connection accepts optional connect_module
2525
([#3027](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3027))
26+
- `opentelemetry-instrumentation-mysqlclient` Add sqlcommenter support
27+
([#2941](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2941))
2628

2729
### Fixed
2830

@@ -37,6 +39,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3739
([#2971](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2971))
3840
- Drop `opentelemetry-instrumentation-test` package from default instrumentation list
3941
([#2969](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2969))
42+
- `opentelemetry-instrumentation-httpx`: remove private unused `_InstrumentedClient` and `_InstrumentedAsyncClient` classes
43+
([#3036](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3036))
4044

4145
## Version 1.28.0/0.49b0 (2024-11-05)
4246

@@ -52,6 +56,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5256
([#2635](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2635))
5357
- `opentelemetry-instrumentation` Add support for string based dotted module paths in unwrap
5458
([#2919](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2919))
59+
- `opentelemetry-instrumentation-pymysql` Add sqlcommenter support
60+
([#2942](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2942))
5561

5662
### Fixed
5763

instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -641,77 +641,6 @@ async def aclose(self) -> None:
641641
await self._transport.aclose()
642642

643643

644-
class _InstrumentedClient(httpx.Client):
645-
_tracer_provider = None
646-
_request_hook = None
647-
_response_hook = None
648-
649-
def __init__(self, *args, **kwargs):
650-
super().__init__(*args, **kwargs)
651-
652-
self._original_transport = self._transport
653-
self._original_mounts = self._mounts.copy()
654-
self._is_instrumented_by_opentelemetry = True
655-
656-
self._transport = SyncOpenTelemetryTransport(
657-
self._transport,
658-
tracer_provider=_InstrumentedClient._tracer_provider,
659-
request_hook=_InstrumentedClient._request_hook,
660-
response_hook=_InstrumentedClient._response_hook,
661-
)
662-
self._mounts.update(
663-
{
664-
url_pattern: (
665-
SyncOpenTelemetryTransport(
666-
transport,
667-
tracer_provider=_InstrumentedClient._tracer_provider,
668-
request_hook=_InstrumentedClient._request_hook,
669-
response_hook=_InstrumentedClient._response_hook,
670-
)
671-
if transport is not None
672-
else transport
673-
)
674-
for url_pattern, transport in self._original_mounts.items()
675-
}
676-
)
677-
678-
679-
class _InstrumentedAsyncClient(httpx.AsyncClient):
680-
_tracer_provider = None
681-
_request_hook = None
682-
_response_hook = None
683-
684-
def __init__(self, *args, **kwargs):
685-
super().__init__(*args, **kwargs)
686-
687-
self._original_transport = self._transport
688-
self._original_mounts = self._mounts.copy()
689-
self._is_instrumented_by_opentelemetry = True
690-
691-
self._transport = AsyncOpenTelemetryTransport(
692-
self._transport,
693-
tracer_provider=_InstrumentedAsyncClient._tracer_provider,
694-
request_hook=_InstrumentedAsyncClient._request_hook,
695-
response_hook=_InstrumentedAsyncClient._response_hook,
696-
)
697-
698-
self._mounts.update(
699-
{
700-
url_pattern: (
701-
AsyncOpenTelemetryTransport(
702-
transport,
703-
tracer_provider=_InstrumentedAsyncClient._tracer_provider,
704-
request_hook=_InstrumentedAsyncClient._request_hook,
705-
response_hook=_InstrumentedAsyncClient._response_hook,
706-
)
707-
if transport is not None
708-
else transport
709-
)
710-
for url_pattern, transport in self._original_mounts.items()
711-
}
712-
)
713-
714-
715644
class HTTPXClientInstrumentor(BaseInstrumentor):
716645
# pylint: disable=protected-access,attribute-defined-outside-init
717646
"""An instrumentor for httpx Client and AsyncClient

instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/__init__.py

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,72 @@
3636
cursor.close()
3737
cnx.close()
3838
39+
SQLCOMMENTER
40+
*****************************************
41+
You can optionally configure MySQLClient instrumentation to enable sqlcommenter which enriches
42+
the query with contextual information.
43+
44+
.. code:: python
45+
46+
import MySQLdb
47+
from opentelemetry.instrumentation.mysqlclient import MySQLClientInstrumentor
48+
49+
50+
MySQLClientInstrumentor().instrument(enable_commenter=True, commenter_options={})
51+
52+
cnx = MySQLdb.connect(database="MySQL_Database")
53+
cursor = cnx.cursor()
54+
cursor.execute("INSERT INTO test (testField) VALUES (123)"
55+
cnx.commit()
56+
cursor.close()
57+
cnx.close()
58+
59+
For example,
60+
::
61+
62+
Invoking cursor.execute("INSERT INTO test (testField) VALUES (123)") will lead to sql query "INSERT INTO test (testField) VALUES (123)" but when SQLCommenter is enabled
63+
the query will get appended with some configurable tags like "INSERT INTO test (testField) VALUES (123) /*tag=value*/;"
64+
65+
SQLCommenter Configurations
66+
***************************
67+
We can configure the tags to be appended to the sqlquery log by adding configuration inside commenter_options(default:{}) keyword
68+
69+
db_driver = True(Default) or False
70+
71+
For example,
72+
::
73+
Enabling this flag will add MySQLdb and its version, e.g. /*MySQLdb%%3A1.2.3*/
74+
75+
dbapi_threadsafety = True(Default) or False
76+
77+
For example,
78+
::
79+
Enabling this flag will add threadsafety /*dbapi_threadsafety=2*/
80+
81+
dbapi_level = True(Default) or False
82+
83+
For example,
84+
::
85+
Enabling this flag will add dbapi_level /*dbapi_level='2.0'*/
86+
87+
mysql_client_version = True(Default) or False
88+
89+
For example,
90+
::
91+
Enabling this flag will add mysql_client_version /*mysql_client_version='123'*/
92+
93+
driver_paramstyle = True(Default) or False
94+
95+
For example,
96+
::
97+
Enabling this flag will add driver_paramstyle /*driver_paramstyle='pyformat'*/
98+
99+
opentelemetry_values = True(Default) or False
100+
101+
For example,
102+
::
103+
Enabling this flag will add traceparent values /*traceparent='00-03afa25236b8cd948fa853d67038ac79-405ff022e8247c46-01'*/
104+
39105
API
40106
---
41107
"""
@@ -59,14 +125,16 @@
59125

60126

61127
class MySQLClientInstrumentor(BaseInstrumentor):
62-
def instrumentation_dependencies(self) -> Collection[str]:
128+
def instrumentation_dependencies(self) -> Collection[str]: # pylint: disable=no-self-use
63129
return _instruments
64130

65-
def _instrument(self, **kwargs):
131+
def _instrument(self, **kwargs): # pylint: disable=no-self-use
66132
"""Integrate with the mysqlclient library.
67133
https://github.com/PyMySQL/mysqlclient/
68134
"""
69135
tracer_provider = kwargs.get("tracer_provider")
136+
enable_sqlcommenter = kwargs.get("enable_commenter", False)
137+
commenter_options = kwargs.get("commenter_options", {})
70138

71139
dbapi.wrap_connect(
72140
__name__,
@@ -76,14 +144,21 @@ def _instrument(self, **kwargs):
76144
_CONNECTION_ATTRIBUTES,
77145
version=__version__,
78146
tracer_provider=tracer_provider,
147+
enable_commenter=enable_sqlcommenter,
148+
commenter_options=commenter_options,
79149
)
80150

81-
def _uninstrument(self, **kwargs):
151+
def _uninstrument(self, **kwargs): # pylint: disable=no-self-use
82152
""" "Disable mysqlclient instrumentation"""
83153
dbapi.unwrap_connect(MySQLdb, "connect")
84154

85155
@staticmethod
86-
def instrument_connection(connection, tracer_provider=None):
156+
def instrument_connection(
157+
connection,
158+
tracer_provider=None,
159+
enable_commenter=None,
160+
commenter_options=None,
161+
):
87162
"""Enable instrumentation in a mysqlclient connection.
88163
89164
Args:
@@ -102,6 +177,9 @@ def instrument_connection(connection, tracer_provider=None):
102177
_CONNECTION_ATTRIBUTES,
103178
version=__version__,
104179
tracer_provider=tracer_provider,
180+
enable_commenter=enable_commenter,
181+
commenter_options=commenter_options,
182+
connect_module=MySQLdb,
105183
)
106184

107185
@staticmethod

0 commit comments

Comments
 (0)