From 4234bf3468b2ba88b77db29a8fc0279b8b0f9d2e Mon Sep 17 00:00:00 2001 From: hemma Date: Mon, 13 Jun 2022 21:18:32 +0200 Subject: [PATCH 1/8] Override __new__ to instrument multiple engines --- .../instrumentation/sqlalchemy/__init__.py | 3 +++ .../tests/test_sqlalchemy.py | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py index 6aa60383f0..17d77116b2 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py @@ -73,6 +73,9 @@ class SQLAlchemyInstrumentor(BaseInstrumentor): See `BaseInstrumentor` """ + def __new__(cls, *args, **kwargs): + return object.__new__(cls, *args, **kwargs) + def instrumentation_dependencies(self) -> Collection[str]: return _instruments diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py index bf60e6e6aa..8e986899e0 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py @@ -50,6 +50,28 @@ def test_trace_integration(self): self.assertEqual(spans[0].name, "SELECT :memory:") self.assertEqual(spans[0].kind, trace.SpanKind.CLIENT) + def test_instrument_two_engines(self): + engine_1 = create_engine("sqlite:///:memory:") + engine_2 = create_engine("sqlite:///:memory:") + + SQLAlchemyInstrumentor().instrument( + engine=engine_1, + tracer_provider=self.tracer_provider, + ) + cnx_1 = engine_1.connect() + cnx_1.execute("SELECT 1 + 1;").fetchall() + + SQLAlchemyInstrumentor().instrument( + engine=engine_2, + tracer_provider=self.tracer_provider, + ) + cnx_2 = engine_2.connect() + cnx_2.execute("SELECT 1 + 1;").fetchall() + + spans = self.memory_exporter.get_finished_spans() + + self.assertEqual(len(spans), 2) + @pytest.mark.skipif( not sqlalchemy.__version__.startswith("1.4"), reason="only run async tests for 1.4", From 75fb63b0e10ab260d6dab9688c6043efeeb0c703 Mon Sep 17 00:00:00 2001 From: hemma Date: Tue, 14 Jun 2022 21:43:33 +0200 Subject: [PATCH 2/8] add possibility to instrument mutiple engines --- .../instrumentation/sqlalchemy/__init__.py | 10 +++++++--- .../tests/test_sqlalchemy.py | 8 ++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py index 17d77116b2..e7d5c31d14 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py @@ -73,9 +73,6 @@ class SQLAlchemyInstrumentor(BaseInstrumentor): See `BaseInstrumentor` """ - def __new__(cls, *args, **kwargs): - return object.__new__(cls, *args, **kwargs) - def instrumentation_dependencies(self) -> Collection[str]: return _instruments @@ -86,6 +83,7 @@ def _instrument(self, **kwargs): Args: **kwargs: Optional arguments ``engine``: a SQLAlchemy engine instance + ``engines``: a list of SQLAlchemy engine instances ``tracer_provider``: a TracerProvider, defaults to global Returns: @@ -111,6 +109,12 @@ def _instrument(self, **kwargs): kwargs.get("engine"), kwargs.get("enable_commenter", False), ) + if kwargs.get("engines") is not None and isinstance(kwargs.get("engines"), list): + return [EngineTracer( + _get_tracer(tracer_provider), + engine, + kwargs.get("enable_commenter", False),) for engine in kwargs.get("engines")] + return None def _uninstrument(self, **kwargs): diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py index 8e986899e0..3b3c6d735b 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py @@ -55,16 +55,12 @@ def test_instrument_two_engines(self): engine_2 = create_engine("sqlite:///:memory:") SQLAlchemyInstrumentor().instrument( - engine=engine_1, + engines=[engine_1, engine_2], tracer_provider=self.tracer_provider, ) + cnx_1 = engine_1.connect() cnx_1.execute("SELECT 1 + 1;").fetchall() - - SQLAlchemyInstrumentor().instrument( - engine=engine_2, - tracer_provider=self.tracer_provider, - ) cnx_2 = engine_2.connect() cnx_2.execute("SELECT 1 + 1;").fetchall() From e495bdfa1c70cd2de2a1267b863d23af509c4e40 Mon Sep 17 00:00:00 2001 From: hemma Date: Tue, 14 Jun 2022 21:43:44 +0200 Subject: [PATCH 3/8] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9c9b9e9c6..4f04ae8227 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- `opentelemetry-instrumentation-sqlalchemy` add support to instrument multiple engines + ([#1130](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1130)) - `opentelemetry-instrumentation-logging` add log hook support ([#1117](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1117)) - `opentelemetry-instrumentation-remoulade` Initial release From 7c52d79a607f7fe81cf63797e92e7bd5249445f8 Mon Sep 17 00:00:00 2001 From: hemma Date: Tue, 14 Jun 2022 21:45:54 +0200 Subject: [PATCH 4/8] update return type in doc --- .../src/opentelemetry/instrumentation/sqlalchemy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py index e7d5c31d14..80f0875fd1 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py @@ -87,7 +87,7 @@ def _instrument(self, **kwargs): ``tracer_provider``: a TracerProvider, defaults to global Returns: - An instrumented engine if passed in as an argument, None otherwise. + An instrumented engine if passed in as an argument or list of instrumented engines, None otherwise. """ tracer_provider = kwargs.get("tracer_provider") _w("sqlalchemy", "create_engine", _wrap_create_engine(tracer_provider)) From f6065ed81d957b8159eea20902b31fc78a948d90 Mon Sep 17 00:00:00 2001 From: hemma Date: Tue, 14 Jun 2022 21:48:36 +0200 Subject: [PATCH 5/8] fix CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f04ae8227..707e72b579 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `opentelemetry-instrumentation-sqlalchemy` add support to instrument multiple engines - ([#1130](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1130)) + ([#1132](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1132)) - `opentelemetry-instrumentation-logging` add log hook support ([#1117](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1117)) - `opentelemetry-instrumentation-remoulade` Initial release From 2b1db3bd8cea2228b2f094cfd8b54760927b24fc Mon Sep 17 00:00:00 2001 From: hemma Date: Tue, 14 Jun 2022 22:33:20 +0200 Subject: [PATCH 6/8] format --- .../instrumentation/sqlalchemy/__init__.py | 16 +++++++++++----- .../tests/test_sqlalchemy.py | 1 - 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py index 80f0875fd1..6bd2c9be60 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py @@ -109,11 +109,17 @@ def _instrument(self, **kwargs): kwargs.get("engine"), kwargs.get("enable_commenter", False), ) - if kwargs.get("engines") is not None and isinstance(kwargs.get("engines"), list): - return [EngineTracer( - _get_tracer(tracer_provider), - engine, - kwargs.get("enable_commenter", False),) for engine in kwargs.get("engines")] + if kwargs.get("engines") is not None and isinstance( + kwargs.get("engines"), list + ): + return [ + EngineTracer( + _get_tracer(tracer_provider), + engine, + kwargs.get("enable_commenter", False), + ) + for engine in kwargs.get("engines") + ] return None diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py index 3b3c6d735b..56ddae9123 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py @@ -55,7 +55,6 @@ def test_instrument_two_engines(self): engine_2 = create_engine("sqlite:///:memory:") SQLAlchemyInstrumentor().instrument( - engines=[engine_1, engine_2], tracer_provider=self.tracer_provider, ) From b48e4cd79d8e005427aacc8fa322d0326010a239 Mon Sep 17 00:00:00 2001 From: hemma Date: Tue, 14 Jun 2022 22:34:32 +0200 Subject: [PATCH 7/8] fix test --- .../tests/test_sqlalchemy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py index 56ddae9123..3b3c6d735b 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py @@ -55,6 +55,7 @@ def test_instrument_two_engines(self): engine_2 = create_engine("sqlite:///:memory:") SQLAlchemyInstrumentor().instrument( + engines=[engine_1, engine_2], tracer_provider=self.tracer_provider, ) From 2b99251043876becb0d20e306c298835d52049e6 Mon Sep 17 00:00:00 2001 From: hemma Date: Wed, 15 Jun 2022 14:56:21 +0200 Subject: [PATCH 8/8] Check if engines isinstance Sequence --- .../src/opentelemetry/instrumentation/sqlalchemy/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py index 6bd2c9be60..0e1d7b266a 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py @@ -51,6 +51,7 @@ API --- """ +from collections.abc import Sequence from typing import Collection import sqlalchemy @@ -110,7 +111,7 @@ def _instrument(self, **kwargs): kwargs.get("enable_commenter", False), ) if kwargs.get("engines") is not None and isinstance( - kwargs.get("engines"), list + kwargs.get("engines"), Sequence ): return [ EngineTracer(