diff --git a/.ci/.matrix_framework.yml b/.ci/.matrix_framework.yml index 8c73d0810..7e962cfae 100644 --- a/.ci/.matrix_framework.yml +++ b/.ci/.matrix_framework.yml @@ -25,6 +25,7 @@ FRAMEWORK: #- aioredis-2 # not supported yet - psycopg-newest - psycopg2-newest + - psycopg_pool-newest - pymssql-newest - pyodbc-newest - memcached-newest diff --git a/.ci/.matrix_framework_full.yml b/.ci/.matrix_framework_full.yml index 4adb9b25e..6d019a86b 100644 --- a/.ci/.matrix_framework_full.yml +++ b/.ci/.matrix_framework_full.yml @@ -53,6 +53,7 @@ FRAMEWORK: - redis-newest - psycopg-newest - psycopg2-newest + - psycopg_pool-newest - pymssql-newest - memcached-newest - pylibmc-1.4 diff --git a/elasticapm/instrumentation/packages/psycopg.py b/elasticapm/instrumentation/packages/psycopg.py index 3a0409c96..5c4a304f1 100644 --- a/elasticapm/instrumentation/packages/psycopg.py +++ b/elasticapm/instrumentation/packages/psycopg.py @@ -79,7 +79,7 @@ def __enter__(self): class PsycopgInstrumentation(DbApi2Instrumentation): name = "psycopg" - instrument_list = [("psycopg", "connect")] + instrument_list = [("psycopg", "connect"), ("psycopg", "Connection.connect")] def call(self, module, method, wrapped, instance, args, kwargs): signature = "psycopg.connect" diff --git a/tests/instrumentation/psycopg_pool_tests.py b/tests/instrumentation/psycopg_pool_tests.py new file mode 100644 index 000000000..9d4397768 --- /dev/null +++ b/tests/instrumentation/psycopg_pool_tests.py @@ -0,0 +1,63 @@ +# BSD 3-Clause License +# +# Copyright (c) 2019, Elasticsearch BV +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import os + +import pytest + +pytestmark = [pytest.mark.psycopg_pool, pytest.mark.integrationtest] + +pytest.importorskip("psycopg") +pool_mod = pytest.importorskip("psycopg_pool") + + +def test_pool_generates_spans(instrument, elasticapm_client): + with pool_mod.ConnectionPool( + os.environ.get( + "PSYCOPG_TEST_DSN", + "postgresql://postgres:postgres@127.0.0.1:5432/postgres", + ), + min_size=1, + max_size=2, + open=True, + ) as pool: + pool.wait() + + elasticapm_client.begin_transaction("request") + try: + with pool.connection() as connection: + with connection.cursor() as cursor: + cursor.execute("SELECT 1") + cursor.fetchone() + finally: + elasticapm_client.end_transaction("200") + + spans = elasticapm_client.events["span"] + assert any(span.get("context", {}).get("db", {}).get("type") == "sql" for span in spans) diff --git a/tests/requirements/reqs-psycopg_pool-newest.txt b/tests/requirements/reqs-psycopg_pool-newest.txt new file mode 100644 index 000000000..408c051c2 --- /dev/null +++ b/tests/requirements/reqs-psycopg_pool-newest.txt @@ -0,0 +1,2 @@ +psycopg[binary,pool] +-r reqs-base.txt diff --git a/tests/scripts/envs/psycopg_pool.sh b/tests/scripts/envs/psycopg_pool.sh new file mode 100644 index 000000000..f93d94d72 --- /dev/null +++ b/tests/scripts/envs/psycopg_pool.sh @@ -0,0 +1 @@ +export PYTEST_MARKER="-m psycopg_pool"