Skip to content

Commit 0b6bbdd

Browse files
committed
fix: instrument psycopg_pool connections to restore Postgres spans
Signed-off-by: SaJH <[email protected]>
1 parent a42741f commit 0b6bbdd

File tree

4 files changed

+67
-1
lines changed

4 files changed

+67
-1
lines changed

elasticapm/instrumentation/packages/psycopg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def __enter__(self):
7979
class PsycopgInstrumentation(DbApi2Instrumentation):
8080
name = "psycopg"
8181

82-
instrument_list = [("psycopg", "connect")]
82+
instrument_list = [("psycopg", "connect"), ("psycopg", "Connection.connect")]
8383

8484
def call(self, module, method, wrapped, instance, args, kwargs):
8585
signature = "psycopg.connect"
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# BSD 3-Clause License
2+
#
3+
# Copyright (c) 2019, Elasticsearch BV
4+
# All rights reserved.
5+
#
6+
# Redistribution and use in source and binary forms, with or without
7+
# modification, are permitted provided that the following conditions are met:
8+
#
9+
# * Redistributions of source code must retain the above copyright notice, this
10+
# list of conditions and the following disclaimer.
11+
#
12+
# * Redistributions in binary form must reproduce the above copyright notice,
13+
# this list of conditions and the following disclaimer in the documentation
14+
# and/or other materials provided with the distribution.
15+
#
16+
# * Neither the name of the copyright holder nor the names of its
17+
# contributors may be used to endorse or promote products derived from
18+
# this software without specific prior written permission.
19+
#
20+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30+
31+
import os
32+
33+
import pytest
34+
35+
pytestmark = [pytest.mark.psycopg_pool, pytest.mark.integrationtest]
36+
37+
pytest.importorskip("psycopg")
38+
pool_mod = pytest.importorskip("psycopg_pool")
39+
40+
41+
def test_pool_generates_spans(instrument, elasticapm_client):
42+
with pool_mod.ConnectionPool(
43+
os.environ.get(
44+
"PSYCOPG_TEST_DSN",
45+
"postgresql://postgres:[email protected]:5432/postgres",
46+
),
47+
min_size=1,
48+
max_size=2,
49+
open=True,
50+
) as pool:
51+
pool.wait()
52+
53+
elasticapm_client.begin_transaction("request")
54+
try:
55+
with pool.connection() as connection:
56+
with connection.cursor() as cursor:
57+
cursor.execute("SELECT 1")
58+
cursor.fetchone()
59+
finally:
60+
elasticapm_client.end_transaction("200")
61+
62+
spans = elasticapm_client.events["span"]
63+
assert any(span.get("context", {}).get("db", {}).get("type") == "sql" for span in spans)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
psycopg[binary,pool]
2+
-r reqs-base.txt

tests/scripts/envs/psycopg-pool.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export PYTEST_MARKER="-m psycopg_pool"

0 commit comments

Comments
 (0)