Skip to content

Commit 8812117

Browse files
committed
lint fixes
1 parent ed9ca71 commit 8812117

File tree

4 files changed

+53
-10
lines changed

4 files changed

+53
-10
lines changed

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

+10
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
from opentelemetry.instrumentation.sqlalchemy.engine import (
6161
EngineTracer,
6262
_get_tracer,
63+
_wrap_create_async_engine,
6364
_wrap_create_engine,
6465
)
6566
from opentelemetry.instrumentation.sqlalchemy.package import _instruments
@@ -88,6 +89,13 @@ def _instrument(self, **kwargs):
8889
"""
8990
_w("sqlalchemy", "create_engine", _wrap_create_engine)
9091
_w("sqlalchemy.engine", "create_engine", _wrap_create_engine)
92+
if sqlalchemy.__version__.startswith("1.4"):
93+
_w(
94+
"sqlalchemy.ext.asyncio",
95+
"create_async_engine",
96+
_wrap_create_async_engine,
97+
)
98+
9199
if kwargs.get("engine") is not None:
92100
return EngineTracer(
93101
_get_tracer(
@@ -100,3 +108,5 @@ def _instrument(self, **kwargs):
100108
def _uninstrument(self, **kwargs):
101109
unwrap(sqlalchemy, "create_engine")
102110
unwrap(sqlalchemy.engine, "create_engine")
111+
if sqlalchemy.__version__.startswith("1.4"):
112+
unwrap(sqlalchemy.ext.asyncio, "create_async_engine")

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

+18-5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ def _get_tracer(engine, tracer_provider=None):
4242
)
4343

4444

45+
# pylint: disable=unused-argument
46+
def _wrap_create_async_engine(func, module, args, kwargs):
47+
"""Trace the SQLAlchemy engine, creating an `EngineTracer`
48+
object that will listen to SQLAlchemy events.
49+
"""
50+
engine = func(*args, **kwargs)
51+
EngineTracer(_get_tracer(engine), engine.sync_engine)
52+
return engine
53+
54+
4555
# pylint: disable=unused-argument
4656
def _wrap_create_engine(func, module, args, kwargs):
4757
"""Trace the SQLAlchemy engine, creating an `EngineTracer`
@@ -78,7 +88,9 @@ def _operation_name(self, db_name, statement):
7888
return " ".join(parts)
7989

8090
# pylint: disable=unused-argument
81-
def _before_cur_exec(self, conn, cursor, statement, params, context, executemany):
91+
def _before_cur_exec(
92+
self, conn, cursor, statement, params, context, executemany
93+
):
8294
attrs, found = _get_attributes_from_url(conn.engine.url)
8395
if not found:
8496
attrs = _get_attributes_from_cursor(self.vendor, cursor, attrs)
@@ -98,15 +110,17 @@ def _before_cur_exec(self, conn, cursor, statement, params, context, executemany
98110
context._span = span
99111

100112
# pylint: disable=unused-argument
101-
def _after_cur_exec(self, conn, cursor, statement, params, context, executemany):
102-
span = getattr(context, '_span', None)
113+
def _after_cur_exec(
114+
self, conn, cursor, statement, params, context, executemany
115+
):
116+
span = getattr(context, "_span", None)
103117
if span is None:
104118
return
105119

106120
span.end()
107121

108122
def _handle_error(self, context):
109-
span = getattr(context.execution_context, '_span', None)
123+
span = getattr(context.execution_context, "_span", None)
110124
if span is None:
111125
return
112126

@@ -122,7 +136,6 @@ def _handle_error(self, context):
122136
span.end()
123137

124138

125-
126139
def _get_attributes_from_url(url):
127140
"""Set connection tags from the url. return true if successful."""
128141
attrs = {}

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

+22-4
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,16 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14+
import asyncio
1415
from typing import Coroutine
1516
from unittest import mock
1617

17-
from sqlalchemy import create_engine
1818
import sqlalchemy
19+
from sqlalchemy import create_engine
20+
1921
from opentelemetry import trace
2022
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
2123
from opentelemetry.test.test_base import TestBase
22-
import asyncio
2324

2425

2526
def _call_async(coro: Coroutine):
@@ -48,9 +49,9 @@ def test_trace_integration(self):
4849
def test_async_trace_integration(self):
4950
if sqlalchemy.__version__.startswith("1.3"):
5051
return
51-
from sqlalchemy.ext.asyncio import (
52+
from sqlalchemy.ext.asyncio import ( # pylint: disable-all
5253
create_async_engine,
53-
) # pylint: disable-all
54+
)
5455

5556
engine = create_async_engine("sqlite+aiosqlite:///:memory:")
5657
SQLAlchemyInstrumentor().instrument(
@@ -95,3 +96,20 @@ def test_create_engine_wrapper(self):
9596
self.assertEqual(len(spans), 1)
9697
self.assertEqual(spans[0].name, "SELECT :memory:")
9798
self.assertEqual(spans[0].kind, trace.SpanKind.CLIENT)
99+
100+
def test_create_async_engine_wrapper(self):
101+
SQLAlchemyInstrumentor().instrument()
102+
if sqlalchemy.__version__.startswith("1.3"):
103+
return
104+
from sqlalchemy.ext.asyncio import ( # pylint: disable-all
105+
create_async_engine,
106+
)
107+
108+
engine = create_async_engine("sqlite+aiosqlite:///:memory:")
109+
cnx = _call_async(engine.connect())
110+
_call_async(cnx.execute(sqlalchemy.text("SELECT 1 + 1;"))).fetchall()
111+
_call_async(cnx.close())
112+
spans = self.memory_exporter.get_finished_spans()
113+
self.assertEqual(len(spans), 1)
114+
self.assertEqual(spans[0].name, "SELECT :memory:")
115+
self.assertEqual(spans[0].kind, trace.SpanKind.CLIENT)

tests/opentelemetry-docker-tests/tests/sqlalchemy_tests/mixins.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -243,4 +243,6 @@ def insert_players(session):
243243
close_all_sessions()
244244

245245
spans = self.memory_exporter.get_finished_spans()
246-
self.assertEqual(len(spans), 5 if self.VENDOR not in ["postgresql"] else 3)
246+
self.assertEqual(
247+
len(spans), 5 if self.VENDOR not in ["postgresql"] else 3
248+
)

0 commit comments

Comments
 (0)