fix enable_commenter functionality (#1440)

This commit is contained in:
avzis
2022-12-06 16:52:38 +02:00
committed by GitHub
parent 99e0b42635
commit cfd017e5ec
4 changed files with 44 additions and 8 deletions

View File

@ -47,6 +47,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#1461](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1461)) ([#1461](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1461))
- Add grpc.aio instrumentation to package entry points - Add grpc.aio instrumentation to package entry points
([#1442](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1442)) ([#1442](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1442))
- Fix a bug in SQLAlchemy instrumentation - support disabling enable_commenter variable
([#1440](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1440))
## Version 1.14.0/0.35b0 (2022-11-03) ## Version 1.14.0/0.35b0 (2022-11-03)

View File

@ -136,11 +136,16 @@ class SQLAlchemyInstrumentor(BaseInstrumentor):
An instrumented engine if passed in as an argument or list of instrumented engines, None otherwise. An instrumented engine if passed in as an argument or list of instrumented engines, None otherwise.
""" """
tracer_provider = kwargs.get("tracer_provider") tracer_provider = kwargs.get("tracer_provider")
_w("sqlalchemy", "create_engine", _wrap_create_engine(tracer_provider)) enable_commenter = kwargs.get("enable_commenter", False)
_w(
"sqlalchemy",
"create_engine",
_wrap_create_engine(tracer_provider, enable_commenter),
)
_w( _w(
"sqlalchemy.engine", "sqlalchemy.engine",
"create_engine", "create_engine",
_wrap_create_engine(tracer_provider), _wrap_create_engine(tracer_provider, enable_commenter),
) )
_w( _w(
"sqlalchemy.engine.base", "sqlalchemy.engine.base",
@ -151,7 +156,7 @@ class SQLAlchemyInstrumentor(BaseInstrumentor):
_w( _w(
"sqlalchemy.ext.asyncio", "sqlalchemy.ext.asyncio",
"create_async_engine", "create_async_engine",
_wrap_create_async_engine(tracer_provider), _wrap_create_async_engine(tracer_provider, enable_commenter),
) )
if kwargs.get("engine") is not None: if kwargs.get("engine") is not None:
return EngineTracer( return EngineTracer(

View File

@ -49,27 +49,29 @@ def _get_tracer(tracer_provider=None):
) )
def _wrap_create_async_engine(tracer_provider=None): def _wrap_create_async_engine(tracer_provider=None, enable_commenter=False):
# pylint: disable=unused-argument # pylint: disable=unused-argument
def _wrap_create_async_engine_internal(func, module, args, kwargs): def _wrap_create_async_engine_internal(func, module, args, kwargs):
"""Trace the SQLAlchemy engine, creating an `EngineTracer` """Trace the SQLAlchemy engine, creating an `EngineTracer`
object that will listen to SQLAlchemy events. object that will listen to SQLAlchemy events.
""" """
engine = func(*args, **kwargs) engine = func(*args, **kwargs)
EngineTracer(_get_tracer(tracer_provider), engine.sync_engine) EngineTracer(
_get_tracer(tracer_provider), engine.sync_engine, enable_commenter
)
return engine return engine
return _wrap_create_async_engine_internal return _wrap_create_async_engine_internal
def _wrap_create_engine(tracer_provider=None): def _wrap_create_engine(tracer_provider=None, enable_commenter=False):
# pylint: disable=unused-argument # pylint: disable=unused-argument
def _wrap_create_engine_internal(func, module, args, kwargs): def _wrap_create_engine_internal(func, module, args, kwargs):
"""Trace the SQLAlchemy engine, creating an `EngineTracer` """Trace the SQLAlchemy engine, creating an `EngineTracer`
object that will listen to SQLAlchemy events. object that will listen to SQLAlchemy events.
""" """
engine = func(*args, **kwargs) engine = func(*args, **kwargs)
EngineTracer(_get_tracer(tracer_provider), engine) EngineTracer(_get_tracer(tracer_provider), engine, enable_commenter)
return engine return engine
return _wrap_create_engine_internal return _wrap_create_engine_internal
@ -94,7 +96,7 @@ def _wrap_connect(tracer_provider=None):
class EngineTracer: class EngineTracer:
def __init__( def __init__(
self, tracer, engine, enable_commenter=True, commenter_options=None self, tracer, engine, enable_commenter=False, commenter_options=None
): ):
self.tracer = tracer self.tracer = tracer
self.engine = engine self.engine = engine

View File

@ -77,3 +77,30 @@ class TestSqlalchemyInstrumentationWithSQLCommenter(TestBase):
self.caplog.records[-2].getMessage(), self.caplog.records[-2].getMessage(),
r"SELECT 1 /\*db_driver='(.*)',flask=1,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", r"SELECT 1 /\*db_driver='(.*)',flask=1,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;",
) )
def test_sqlcommenter_enabled_create_engine_after_instrumentation(self):
SQLAlchemyInstrumentor().instrument(
tracer_provider=self.tracer_provider,
enable_commenter=True,
)
from sqlalchemy import create_engine # pylint: disable-all
engine = create_engine("sqlite:///:memory:")
cnx = engine.connect()
cnx.execute("SELECT 1;").fetchall()
self.assertRegex(
self.caplog.records[-2].getMessage(),
r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;",
)
def test_sqlcommenter_disabled_create_engine_after_instrumentation(self):
SQLAlchemyInstrumentor().instrument(
tracer_provider=self.tracer_provider,
enable_commenter=False,
)
from sqlalchemy import create_engine # pylint: disable-all
engine = create_engine("sqlite:///:memory:")
cnx = engine.connect()
cnx.execute("SELECT 1;").fetchall()
self.assertEqual(self.caplog.records[-2].getMessage(), "SELECT 1;")