Skip to content

Commit

Permalink
fix instrumentation of connection when pool.acquire was called multip…
Browse files Browse the repository at this point in the history
…le times (#381)
  • Loading branch information
sartx authored Apr 2, 2021
1 parent c9bca4e commit 12da395
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 3 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#350](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/350))
- `opentelemetry-exporter-datadog` Fix warning when DatadogFormat encounters a request with
no DD_ORIGIN headers ([#368](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/368)).
- `opentelemetry-instrumentation-aiopg` Fix multiple nested spans when
`aiopg.pool` is used
([#336](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/381)).
- Updated instrumentations to use `opentelemetry.trace.use_span` instead of `Tracer.use_span()`
([#364](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/364))
- `opentelemetry-propagator-ot-trace` Do not throw an exception when headers are not present
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,11 @@ def acquire(self):
async def _acquire(self):
# pylint: disable=protected-access
connection = await self.__wrapped__._acquire()
return get_traced_connection_proxy(
connection, db_api_integration, *args, **kwargs
)
if not isinstance(connection, AsyncProxyObject):
connection = get_traced_connection_proxy(
connection, db_api_integration, *args, **kwargs
)
return connection

return TracedPoolProxy(pool, *args, **kwargs)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ def setUpClass(cls):
cls._cursor = None
cls._tracer = cls.tracer_provider.get_tracer(__name__)
AiopgInstrumentor().instrument(tracer_provider=cls.tracer_provider)
cls._dsn = (
f"dbname='{POSTGRES_DB_NAME}' user='{POSTGRES_USER}' password='{POSTGRES_PASSWORD}'"
f" host='{POSTGRES_HOST}' port='{POSTGRES_PORT}'"
)
cls._pool = async_call(
aiopg.create_pool(
dbname=POSTGRES_DB_NAME,
Expand Down Expand Up @@ -185,3 +189,19 @@ def test_callproc(self):
):
async_call(self._cursor.callproc("test", ()))
self.validate_spans("test")

def test_instrumented_pool_with_multiple_acquires(self, *_, **__):
async def double_acquire():
pool = await aiopg.create_pool(dsn=self._dsn)
async with pool.acquire() as conn:
async with conn.cursor() as cursor:
query = "SELECT 1"
await cursor.execute(query)
async with pool.acquire() as conn:
async with conn.cursor() as cursor:
query = "SELECT 1"
await cursor.execute(query)

async_call(double_acquire())
spans = self.memory_exporter.get_finished_spans()
self.assertEqual(len(spans), 2)

0 comments on commit 12da395

Please sign in to comment.