diff --git a/CHANGELOG.md b/CHANGELOG.md index 896497a21c..aa1a2ed4f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#1245](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1245)) - Add metric exporter for Prometheus Remote Write ([#1359](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1359)) +- `opentelemetry-instrumentation-pymysql` Add tests for commit() and rollback(). + ([#1424](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1424)) ### Fixed @@ -54,6 +56,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#1333](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1333)) - Use resp.text instead of resp.body for Falcon 3 to avoid a deprecation warning. ([#1412](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1412)) +- `opentelemetry-instrumentation-pymysql` Fix dbapi connection instrument wrapper has no _sock member. + ([#1424](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1424)) +- `opentelemetry-instrumentation-dbapi` Fix the check for the connection already being instrumented in instrument_connection(). + ([#1424](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1424)) ## Version 1.13.0/0.34b0 (2022-09-26) diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py index 0645d4c5f6..eaebc43894 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py @@ -79,6 +79,9 @@ def trace_integration( tracer_provider: The :class:`opentelemetry.trace.TracerProvider` to use. If omitted the current configured one is used. capture_parameters: Configure if db.statement.parameters should be captured. + enable_commenter: Flag to enable/disable sqlcommenter. + db_api_integration_factory: The `DatabaseApiIntegration` to use. If none is passed the + default one is used. """ wrap_connect( __name__, @@ -121,6 +124,8 @@ def wrap_connect( use. If omitted the current configured one is used. capture_parameters: Configure if db.statement.parameters should be captured. enable_commenter: Flag to enable/disable sqlcommenter. + db_api_integration_factory: The `DatabaseApiIntegration` to use. If none is passed the + default one is used. commenter_options: Configurations for tags to be appended at the sql query. """ @@ -197,7 +202,7 @@ def instrument_connection( Returns: An instrumented connection. """ - if isinstance(connection, wrapt.ObjectProxy): + if isinstance(connection, _TracedConnectionProxy): _logger.warning("Connection already instrumented") return connection @@ -331,6 +336,14 @@ def __getattr__(self, name): object.__getattribute__(self, "_connection"), name ) + def __getattribute__(self, name): + if object.__getattribute__(self, name): + return object.__getattribute__(self, name) + else: + return object.__getattribute__( + object.__getattribute__(self, "_connection"), name + ) + def cursor(self, *args, **kwargs): return get_traced_cursor_proxy( self._connection.cursor(*args, **kwargs), db_api_integration diff --git a/tests/opentelemetry-docker-tests/tests/pymysql/test_pymysql_functional.py b/tests/opentelemetry-docker-tests/tests/pymysql/test_pymysql_functional.py index 83f7abf281..599c2843a1 100644 --- a/tests/opentelemetry-docker-tests/tests/pymysql/test_pymysql_functional.py +++ b/tests/opentelemetry-docker-tests/tests/pymysql/test_pymysql_functional.py @@ -109,3 +109,19 @@ def test_callproc(self): ): self._cursor.callproc("test", ()) self.validate_spans("test") + + def test_commit(self): + stmt = "INSERT INTO test (id) VALUES (%s)" + with self._tracer.start_as_current_span("rootSpan"): + data = (("4",), ("5",), ("6",)) + self._cursor.executemany(stmt, data) + self._connection.commit() + self.validate_spans("INSERT") + + def test_rollback(self): + stmt = "INSERT INTO test (id) VALUES (%s)" + with self._tracer.start_as_current_span("rootSpan"): + data = (("7",), ("8",), ("9",)) + self._cursor.executemany(stmt, data) + self._connection.rollback() + self.validate_spans("INSERT") diff --git a/tox.ini b/tox.ini index d1a7da6f8e..9521e1b9ca 100644 --- a/tox.ini +++ b/tox.ini @@ -515,6 +515,7 @@ commands = python scripts/eachdist.py lint --check-only [testenv:docker-tests] +basepython: python3.9 deps = pip >= 20.3.3 pytest