Skip to content

Commit e91e617

Browse files
committed
Revert #1097
Several issues have arisen from this bugfix, reverting here until a better solution can be found. Fixes #1658
1 parent df32e8c commit e91e617

File tree

4 files changed

+45
-77
lines changed

4 files changed

+45
-77
lines changed

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

+15-22
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ def instrument_connection(
203203
Returns:
204204
An instrumented connection.
205205
"""
206-
if isinstance(connection, _TracedConnectionProxy):
206+
if isinstance(connection, wrapt.ObjectProxy):
207207
_logger.warning("Connection already instrumented")
208208
return connection
209209

@@ -230,8 +230,8 @@ def uninstrument_connection(connection):
230230
Returns:
231231
An uninstrumented connection.
232232
"""
233-
if isinstance(connection, _TracedConnectionProxy):
234-
return connection._connection
233+
if isinstance(connection, wrapt.ObjectProxy):
234+
return connection.__wrapped__
235235

236236
_logger.warning("Connection is not instrumented")
237237
return connection
@@ -320,22 +320,14 @@ def get_connection_attributes(self, connection):
320320
self.span_attributes[SpanAttributes.NET_PEER_PORT] = port
321321

322322

323-
class _TracedConnectionProxy:
324-
pass
325-
326-
327323
def get_traced_connection_proxy(
328324
connection, db_api_integration, *args, **kwargs
329325
):
330326
# pylint: disable=abstract-method
331-
class TracedConnectionProxy(type(connection), _TracedConnectionProxy):
332-
def __init__(self, connection):
333-
self._connection = connection
334-
335-
def __getattr__(self, name):
336-
return object.__getattribute__(
337-
object.__getattribute__(self, "_connection"), name
338-
)
327+
class TracedConnectionProxy(wrapt.ObjectProxy):
328+
# pylint: disable=unused-argument
329+
def __init__(self, connection, *args, **kwargs):
330+
wrapt.ObjectProxy.__init__(self, connection)
339331

340332
def __getattribute__(self, name):
341333
if object.__getattribute__(self, name):
@@ -347,16 +339,17 @@ def __getattribute__(self, name):
347339

348340
def cursor(self, *args, **kwargs):
349341
return get_traced_cursor_proxy(
350-
self._connection.cursor(*args, **kwargs), db_api_integration
342+
self.__wrapped__.cursor(*args, **kwargs), db_api_integration
351343
)
352344

353-
# For some reason this is necessary as trying to access the close
354-
# method of self._connection via __getattr__ leads to unexplained
355-
# errors.
356-
def close(self):
357-
self._connection.close()
345+
def __enter__(self):
346+
self.__wrapped__.__enter__()
347+
return self
348+
349+
def __exit__(self, *args, **kwargs):
350+
self.__wrapped__.__exit__(*args, **kwargs)
358351

359-
return TracedConnectionProxy(connection)
352+
return TracedConnectionProxy(connection, *args, **kwargs)
360353

361354

362355
class CursorTracer:

instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py

+9-17
Original file line numberDiff line numberDiff line change
@@ -310,14 +310,14 @@ def test_callproc(self):
310310

311311
@mock.patch("opentelemetry.instrumentation.dbapi")
312312
def test_wrap_connect(self, mock_dbapi):
313-
dbapi.wrap_connect(self.tracer, MockConnectionEmpty(), "connect", "-")
313+
dbapi.wrap_connect(self.tracer, mock_dbapi, "connect", "-")
314314
connection = mock_dbapi.connect()
315315
self.assertEqual(mock_dbapi.connect.call_count, 1)
316-
self.assertIsInstance(connection._connection, mock.Mock)
316+
self.assertIsInstance(connection.__wrapped__, mock.Mock)
317317

318318
@mock.patch("opentelemetry.instrumentation.dbapi")
319319
def test_unwrap_connect(self, mock_dbapi):
320-
dbapi.wrap_connect(self.tracer, MockConnectionEmpty(), "connect", "-")
320+
dbapi.wrap_connect(self.tracer, mock_dbapi, "connect", "-")
321321
connection = mock_dbapi.connect()
322322
self.assertEqual(mock_dbapi.connect.call_count, 1)
323323

@@ -327,21 +327,19 @@ def test_unwrap_connect(self, mock_dbapi):
327327
self.assertIsInstance(connection, mock.Mock)
328328

329329
def test_instrument_connection(self):
330-
connection = MockConnectionEmpty()
330+
connection = mock.Mock()
331331
# Avoid get_attributes failing because can't concatenate mock
332-
# pylint: disable=attribute-defined-outside-init
333332
connection.database = "-"
334333
connection2 = dbapi.instrument_connection(self.tracer, connection, "-")
335-
self.assertIs(connection2._connection, connection)
334+
self.assertIs(connection2.__wrapped__, connection)
336335

337336
def test_uninstrument_connection(self):
338-
connection = MockConnectionEmpty()
337+
connection = mock.Mock()
339338
# Set connection.database to avoid a failure because mock can't
340339
# be concatenated
341-
# pylint: disable=attribute-defined-outside-init
342340
connection.database = "-"
343341
connection2 = dbapi.instrument_connection(self.tracer, connection, "-")
344-
self.assertIs(connection2._connection, connection)
342+
self.assertIs(connection2.__wrapped__, connection)
345343

346344
connection3 = dbapi.uninstrument_connection(connection2)
347345
self.assertIs(connection3, connection)
@@ -357,12 +355,10 @@ def mock_connect(*args, **kwargs):
357355
server_host = kwargs.get("server_host")
358356
server_port = kwargs.get("server_port")
359357
user = kwargs.get("user")
360-
return MockConnectionWithAttributes(
361-
database, server_port, server_host, user
362-
)
358+
return MockConnection(database, server_port, server_host, user)
363359

364360

365-
class MockConnectionWithAttributes:
361+
class MockConnection:
366362
def __init__(self, database, server_port, server_host, user):
367363
self.database = database
368364
self.server_port = server_port
@@ -395,7 +391,3 @@ def executemany(self, query, params=None, throw_exception=False):
395391
def callproc(self, query, params=None, throw_exception=False):
396392
if throw_exception:
397393
raise Exception("Test Exception")
398-
399-
400-
class MockConnectionEmpty:
401-
pass

instrumentation/opentelemetry-instrumentation-mysql/tests/test_mysql_integration.py

+12-20
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from unittest.mock import Mock, patch
15+
from unittest import mock
1616

1717
import mysql.connector
1818

@@ -23,15 +23,6 @@
2323
from opentelemetry.test.test_base import TestBase
2424

2525

26-
def mock_connect(*args, **kwargs):
27-
class MockConnection:
28-
def cursor(self):
29-
# pylint: disable=no-self-use
30-
return Mock()
31-
32-
return MockConnection()
33-
34-
3526
def connect_and_execute_query():
3627
cnx = mysql.connector.connect(database="test")
3728
cursor = cnx.cursor()
@@ -47,9 +38,9 @@ def tearDown(self):
4738
with self.disable_logging():
4839
MySQLInstrumentor().uninstrument()
4940

50-
@patch("mysql.connector.connect", new=mock_connect)
41+
@mock.patch("mysql.connector.connect")
5142
# pylint: disable=unused-argument
52-
def test_instrumentor(self):
43+
def test_instrumentor(self, mock_connect):
5344
MySQLInstrumentor().instrument()
5445

5546
connect_and_execute_query()
@@ -71,8 +62,9 @@ def test_instrumentor(self):
7162
spans_list = self.memory_exporter.get_finished_spans()
7263
self.assertEqual(len(spans_list), 1)
7364

74-
@patch("mysql.connector.connect", new=mock_connect)
75-
def test_custom_tracer_provider(self):
65+
@mock.patch("mysql.connector.connect")
66+
# pylint: disable=unused-argument
67+
def test_custom_tracer_provider(self, mock_connect):
7668
resource = resources.Resource.create({})
7769
result = self.create_tracer_provider(resource=resource)
7870
tracer_provider, exporter = result
@@ -86,9 +78,9 @@ def test_custom_tracer_provider(self):
8678

8779
self.assertIs(span.resource, resource)
8880

89-
@patch("mysql.connector.connect", new=mock_connect)
81+
@mock.patch("mysql.connector.connect")
9082
# pylint: disable=unused-argument
91-
def test_instrument_connection(self):
83+
def test_instrument_connection(self, mock_connect):
9284
cnx, query = connect_and_execute_query()
9385

9486
spans_list = self.memory_exporter.get_finished_spans()
@@ -101,18 +93,18 @@ def test_instrument_connection(self):
10193
spans_list = self.memory_exporter.get_finished_spans()
10294
self.assertEqual(len(spans_list), 1)
10395

104-
@patch("mysql.connector.connect", new=mock_connect)
105-
def test_instrument_connection_no_op_tracer_provider(self):
96+
@mock.patch("mysql.connector.connect")
97+
def test_instrument_connection_no_op_tracer_provider(self, mock_connect):
10698
tracer_provider = trace_api.NoOpTracerProvider()
10799
MySQLInstrumentor().instrument(tracer_provider=tracer_provider)
108100
connect_and_execute_query()
109101

110102
spans_list = self.memory_exporter.get_finished_spans()
111103
self.assertEqual(len(spans_list), 0)
112104

113-
@patch("mysql.connector.connect", new=mock_connect)
105+
@mock.patch("mysql.connector.connect")
114106
# pylint: disable=unused-argument
115-
def test_uninstrument_connection(self):
107+
def test_uninstrument_connection(self, mock_connect):
116108
MySQLInstrumentor().instrument()
117109
cnx, query = connect_and_execute_query()
118110

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

+9-18
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from unittest.mock import Mock, patch
15+
from unittest import mock
1616

1717
import pymysql
1818

@@ -22,24 +22,15 @@
2222
from opentelemetry.test.test_base import TestBase
2323

2424

25-
def mock_connect(*args, **kwargs):
26-
class MockConnection:
27-
def cursor(self):
28-
# pylint: disable=no-self-use
29-
return Mock()
30-
31-
return MockConnection()
32-
33-
3425
class TestPyMysqlIntegration(TestBase):
3526
def tearDown(self):
3627
super().tearDown()
3728
with self.disable_logging():
3829
PyMySQLInstrumentor().uninstrument()
3930

40-
@patch("pymysql.connect", new=mock_connect)
31+
@mock.patch("pymysql.connect")
4132
# pylint: disable=unused-argument
42-
def test_instrumentor(self):
33+
def test_instrumentor(self, mock_connect):
4334
PyMySQLInstrumentor().instrument()
4435

4536
cnx = pymysql.connect(database="test")
@@ -67,9 +58,9 @@ def test_instrumentor(self):
6758
spans_list = self.memory_exporter.get_finished_spans()
6859
self.assertEqual(len(spans_list), 1)
6960

70-
@patch("pymysql.connect", new=mock_connect)
61+
@mock.patch("pymysql.connect")
7162
# pylint: disable=unused-argument
72-
def test_custom_tracer_provider(self):
63+
def test_custom_tracer_provider(self, mock_connect):
7364
resource = resources.Resource.create({})
7465
result = self.create_tracer_provider(resource=resource)
7566
tracer_provider, exporter = result
@@ -87,9 +78,9 @@ def test_custom_tracer_provider(self):
8778

8879
self.assertIs(span.resource, resource)
8980

90-
@patch("pymysql.connect", new=mock_connect)
81+
@mock.patch("pymysql.connect")
9182
# pylint: disable=unused-argument
92-
def test_instrument_connection(self):
83+
def test_instrument_connection(self, mock_connect):
9384
cnx = pymysql.connect(database="test")
9485
query = "SELECT * FROM test"
9586
cursor = cnx.cursor()
@@ -105,9 +96,9 @@ def test_instrument_connection(self):
10596
spans_list = self.memory_exporter.get_finished_spans()
10697
self.assertEqual(len(spans_list), 1)
10798

108-
@patch("pymysql.connect", new=mock_connect)
99+
@mock.patch("pymysql.connect")
109100
# pylint: disable=unused-argument
110-
def test_uninstrument_connection(self):
101+
def test_uninstrument_connection(self, mock_connect):
111102
PyMySQLInstrumentor().instrument()
112103
cnx = pymysql.connect(database="test")
113104
query = "SELECT * FROM test"

0 commit comments

Comments
 (0)