Skip to content

Commit 045a159

Browse files
ext/pymysql: Implement instrument_connection, uninstrument_connection
1 parent 1bbce2d commit 045a159

File tree

3 files changed

+83
-10
lines changed

3 files changed

+83
-10
lines changed

ext/opentelemetry-ext-docker-tests/tests/pymysql/test_pymysql_functional.py

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def setUpClass(cls):
4848
def tearDownClass(cls):
4949
if cls._connection:
5050
cls._connection.close()
51+
PyMySQLInstrumentor().uninstrument()
5152

5253
def validate_spans(self):
5354
spans = self.memory_exporter.get_finished_spans()

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

+45-10
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,22 @@
4848
import pymysql
4949

5050
from opentelemetry.auto_instrumentation.instrumentor import BaseInstrumentor
51-
from opentelemetry.ext.dbapi import unwrap_connect, wrap_connect
51+
from opentelemetry.ext import dbapi
5252
from opentelemetry.ext.pymysql.version import __version__
5353
from opentelemetry.trace import TracerProvider, get_tracer
5454

5555

5656
class PyMySQLInstrumentor(BaseInstrumentor):
57+
_CONNECTION_ATTRIBUTES = {
58+
"database": "db",
59+
"port": "port",
60+
"host": "host",
61+
"user": "user",
62+
}
63+
64+
_DATABASE_COMPONENT = "mysql"
65+
_DATABASE_TYPE = "sql"
66+
5767
def _instrument(self, **kwargs):
5868
"""Integrate with the PyMySQL library.
5969
https://github.com/PyMySQL/PyMySQL/
@@ -62,15 +72,40 @@ def _instrument(self, **kwargs):
6272

6373
tracer = get_tracer(__name__, __version__, tracer_provider)
6474

65-
connection_attributes = {
66-
"database": "db",
67-
"port": "port",
68-
"host": "host",
69-
"user": "user",
70-
}
71-
wrap_connect(
72-
tracer, pymysql, "connect", "mysql", "sql", connection_attributes
75+
dbapi.wrap_connect(
76+
tracer,
77+
pymysql,
78+
"connect",
79+
self._DATABASE_COMPONENT,
80+
self._DATABASE_TYPE,
81+
self._CONNECTION_ATTRIBUTES,
7382
)
7483

7584
def _uninstrument(self, **kwargs):
76-
unwrap_connect(pymysql, "connect")
85+
""""Disable PyMySQL instrumentation"""
86+
dbapi.unwrap_connect(pymysql, "connect")
87+
88+
# pylint:disable=no-self-use
89+
def instrument_connection(self, connection):
90+
"""Enable instrumentation in a PyMySQL connection.
91+
92+
Args:
93+
connection: The connection to instrument.
94+
"""
95+
tracer = get_tracer(__name__, __version__)
96+
97+
return dbapi.instrument_connection(
98+
tracer,
99+
connection,
100+
self._DATABASE_COMPONENT,
101+
self._DATABASE_TYPE,
102+
self._CONNECTION_ATTRIBUTES,
103+
)
104+
105+
def uninstrument_connection(self, connection):
106+
"""Disable instrumentation in a PyMySQL connection.
107+
108+
Args:
109+
connection: The connection to uninstrument.
110+
"""
111+
return dbapi.uninstrument_connection(connection)

ext/opentelemetry-ext-pymysql/tests/test_pymysql_integration.py

+37
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,40 @@ def test_custom_tracer_provider(self, mock_connect):
7575
span = spans_list[0]
7676

7777
self.assertIs(span.resource, resource)
78+
79+
@mock.patch("pymysql.connect")
80+
# pylint: disable=unused-argument
81+
def test_instrument_connection(self, mock_connect):
82+
cnx = pymysql.connect(database="test")
83+
query = "SELECT * FROM test"
84+
cursor = cnx.cursor()
85+
cursor.execute(query)
86+
87+
spans_list = self.memory_exporter.get_finished_spans()
88+
self.assertEqual(len(spans_list), 0)
89+
90+
cnx = PyMySQLInstrumentor().instrument_connection(cnx)
91+
cursor = cnx.cursor()
92+
cursor.execute(query)
93+
94+
spans_list = self.memory_exporter.get_finished_spans()
95+
self.assertEqual(len(spans_list), 1)
96+
97+
@mock.patch("pymysql.connect")
98+
# pylint: disable=unused-argument
99+
def test_uninstrument_connection(self, mock_connect):
100+
PyMySQLInstrumentor().instrument()
101+
cnx = pymysql.connect(database="test")
102+
query = "SELECT * FROM test"
103+
cursor = cnx.cursor()
104+
cursor.execute(query)
105+
106+
spans_list = self.memory_exporter.get_finished_spans()
107+
self.assertEqual(len(spans_list), 1)
108+
109+
cnx = PyMySQLInstrumentor().uninstrument_connection(cnx)
110+
cursor = cnx.cursor()
111+
cursor.execute(query)
112+
113+
spans_list = self.memory_exporter.get_finished_spans()
114+
self.assertEqual(len(spans_list), 1)

0 commit comments

Comments
 (0)