Skip to content

Commit f03bef2

Browse files
hemmaocelotl
andauthored
Add support to instrument multiple sqlalchemy engines (#1132)
* Override __new__ to instrument multiple engines * add possibility to instrument mutiple engines * update changelog * update return type in doc * fix CHANGELOG * format * fix test * Check if engines isinstance Sequence Co-authored-by: Diego Hurtado <[email protected]>
1 parent 4ba6214 commit f03bef2

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

CHANGELOG.md

+2
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

2424

2525
### Added
26+
- `opentelemetry-instrumentation-sqlalchemy` add support to instrument multiple engines
27+
([#1132](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1132))
2628
- `opentelemetry-instrumentation-logging` add log hook support
2729
([#1117](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1117))
2830
- `opentelemetry-instrumentation-remoulade` Initial release

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

+15-1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
API
5252
---
5353
"""
54+
from collections.abc import Sequence
5455
from typing import Collection
5556

5657
import sqlalchemy
@@ -83,10 +84,11 @@ def _instrument(self, **kwargs):
8384
Args:
8485
**kwargs: Optional arguments
8586
``engine``: a SQLAlchemy engine instance
87+
``engines``: a list of SQLAlchemy engine instances
8688
``tracer_provider``: a TracerProvider, defaults to global
8789
8890
Returns:
89-
An instrumented engine if passed in as an argument, None otherwise.
91+
An instrumented engine if passed in as an argument or list of instrumented engines, None otherwise.
9092
"""
9193
tracer_provider = kwargs.get("tracer_provider")
9294
_w("sqlalchemy", "create_engine", _wrap_create_engine(tracer_provider))
@@ -108,6 +110,18 @@ def _instrument(self, **kwargs):
108110
kwargs.get("engine"),
109111
kwargs.get("enable_commenter", False),
110112
)
113+
if kwargs.get("engines") is not None and isinstance(
114+
kwargs.get("engines"), Sequence
115+
):
116+
return [
117+
EngineTracer(
118+
_get_tracer(tracer_provider),
119+
engine,
120+
kwargs.get("enable_commenter", False),
121+
)
122+
for engine in kwargs.get("engines")
123+
]
124+
111125
return None
112126

113127
def _uninstrument(self, **kwargs):

instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py

+18
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,24 @@ def test_trace_integration(self):
5050
self.assertEqual(spans[0].name, "SELECT :memory:")
5151
self.assertEqual(spans[0].kind, trace.SpanKind.CLIENT)
5252

53+
def test_instrument_two_engines(self):
54+
engine_1 = create_engine("sqlite:///:memory:")
55+
engine_2 = create_engine("sqlite:///:memory:")
56+
57+
SQLAlchemyInstrumentor().instrument(
58+
engines=[engine_1, engine_2],
59+
tracer_provider=self.tracer_provider,
60+
)
61+
62+
cnx_1 = engine_1.connect()
63+
cnx_1.execute("SELECT 1 + 1;").fetchall()
64+
cnx_2 = engine_2.connect()
65+
cnx_2.execute("SELECT 1 + 1;").fetchall()
66+
67+
spans = self.memory_exporter.get_finished_spans()
68+
69+
self.assertEqual(len(spans), 2)
70+
5371
@pytest.mark.skipif(
5472
not sqlalchemy.__version__.startswith("1.4"),
5573
reason="only run async tests for 1.4",

0 commit comments

Comments
 (0)