psycopg2-binary support (#3186)

* psycopg2-binary support

* changelog

* Update CHANGELOG.md

* Update pyproject.toml

* fix

* lint

* added test config

* Update bootstrap_gen.py

* update tox

* Update tox.ini

* regenerate workflows

* workflows

---------

Co-authored-by: Emídio Neto <9735060+emdneto@users.noreply.github.com>
Co-authored-by: Riccardo Magliocchetti <riccardo.magliocchetti@gmail.com>
This commit is contained in:
Josh Owen
2025-01-21 15:41:56 -05:00
committed by GitHub
parent 37f85bf8cc
commit 3f50c08580
11 changed files with 296 additions and 111 deletions

View File

@ -1075,6 +1075,28 @@ jobs:
- name: Run tests
run: tox -e py38-test-instrumentation-psycopg2 -- -ra
py38-test-instrumentation-psycopg2-binary:
name: instrumentation-psycopg2-binary
runs-on: ubuntu-latest
steps:
- name: Checkout contrib repo @ SHA - ${{ env.CONTRIB_REPO_SHA }}
uses: actions/checkout@v4
with:
repository: open-telemetry/opentelemetry-python-contrib
ref: ${{ env.CONTRIB_REPO_SHA }}
- name: Set up Python 3.8
uses: actions/setup-python@v5
with:
python-version: "3.8"
architecture: "x64"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py38-test-instrumentation-psycopg2-binary -- -ra
py38-test-instrumentation-psycopg:
name: instrumentation-psycopg
runs-on: ubuntu-latest

View File

@ -1222,6 +1222,114 @@ jobs:
- name: Run tests
run: tox -e py313-test-instrumentation-psycopg2 -- -ra
py38-test-instrumentation-psycopg2-binary_ubuntu-latest:
name: instrumentation-psycopg2-binary 3.8 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.8
uses: actions/setup-python@v5
with:
python-version: "3.8"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py38-test-instrumentation-psycopg2-binary -- -ra
py39-test-instrumentation-psycopg2-binary_ubuntu-latest:
name: instrumentation-psycopg2-binary 3.9 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.9
uses: actions/setup-python@v5
with:
python-version: "3.9"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py39-test-instrumentation-psycopg2-binary -- -ra
py310-test-instrumentation-psycopg2-binary_ubuntu-latest:
name: instrumentation-psycopg2-binary 3.10 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.10
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py310-test-instrumentation-psycopg2-binary -- -ra
py311-test-instrumentation-psycopg2-binary_ubuntu-latest:
name: instrumentation-psycopg2-binary 3.11 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py311-test-instrumentation-psycopg2-binary -- -ra
py312-test-instrumentation-psycopg2-binary_ubuntu-latest:
name: instrumentation-psycopg2-binary 3.12 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py312-test-instrumentation-psycopg2-binary -- -ra
py313-test-instrumentation-psycopg2-binary_ubuntu-latest:
name: instrumentation-psycopg2-binary 3.13 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.13
uses: actions/setup-python@v5
with:
python-version: "3.13"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py313-test-instrumentation-psycopg2-binary -- -ra
py38-test-instrumentation-psycopg_ubuntu-latest:
name: instrumentation-psycopg 3.8 Ubuntu
runs-on: ubuntu-latest
@ -4407,111 +4515,3 @@ jobs:
- name: Run tests
run: tox -e py38-test-util-http -- -ra
py39-test-util-http_ubuntu-latest:
name: util-http 3.9 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.9
uses: actions/setup-python@v5
with:
python-version: "3.9"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py39-test-util-http -- -ra
py310-test-util-http_ubuntu-latest:
name: util-http 3.10 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.10
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py310-test-util-http -- -ra
py311-test-util-http_ubuntu-latest:
name: util-http 3.11 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py311-test-util-http -- -ra
py312-test-util-http_ubuntu-latest:
name: util-http 3.12 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py312-test-util-http -- -ra
py313-test-util-http_ubuntu-latest:
name: util-http 3.13 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.13
uses: actions/setup-python@v5
with:
python-version: "3.13"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py313-test-util-http -- -ra
pypy3-test-util-http_ubuntu-latest:
name: util-http pypy-3.8 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python pypy-3.8
uses: actions/setup-python@v5
with:
python-version: "pypy-3.8"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e pypy3-test-util-http -- -ra

View File

@ -16,6 +16,114 @@ env:
jobs:
py39-test-util-http_ubuntu-latest:
name: util-http 3.9 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.9
uses: actions/setup-python@v5
with:
python-version: "3.9"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py39-test-util-http -- -ra
py310-test-util-http_ubuntu-latest:
name: util-http 3.10 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.10
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py310-test-util-http -- -ra
py311-test-util-http_ubuntu-latest:
name: util-http 3.11 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py311-test-util-http -- -ra
py312-test-util-http_ubuntu-latest:
name: util-http 3.12 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py312-test-util-http -- -ra
py313-test-util-http_ubuntu-latest:
name: util-http 3.13 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python 3.13
uses: actions/setup-python@v5
with:
python-version: "3.13"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e py313-test-util-http -- -ra
pypy3-test-util-http_ubuntu-latest:
name: util-http pypy-3.8 Ubuntu
runs-on: ubuntu-latest
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
- name: Set up Python pypy-3.8
uses: actions/setup-python@v5
with:
python-version: "pypy-3.8"
- name: Install tox
run: pip install tox-uv
- name: Run tests
run: tox -e pypy3-test-util-http -- -ra
py38-test-propagator-aws-xray-0_ubuntu-latest:
name: propagator-aws-xray-0 3.8 Ubuntu
runs-on: ubuntu-latest

View File

@ -39,6 +39,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#3129](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3129))
- `opentelemetry-util-http` Add `py.typed` file to enable PEP 561
([#3127](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3127))
- `opentelemetry-instrumentation-psycopg2` Add support for psycopg2-binary
([#3186](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3186))
- `opentelemetry-opentelemetry-botocore` Add basic support for GenAI attributes for AWS Bedrock Converse API
([#3161](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3161))

View File

@ -32,7 +32,7 @@
| [opentelemetry-instrumentation-mysqlclient](./opentelemetry-instrumentation-mysqlclient) | mysqlclient < 3 | No | experimental
| [opentelemetry-instrumentation-pika](./opentelemetry-instrumentation-pika) | pika >= 0.12.0 | No | experimental
| [opentelemetry-instrumentation-psycopg](./opentelemetry-instrumentation-psycopg) | psycopg >= 3.1.0 | No | experimental
| [opentelemetry-instrumentation-psycopg2](./opentelemetry-instrumentation-psycopg2) | psycopg2 >= 2.7.3.1 | No | experimental
| [opentelemetry-instrumentation-psycopg2](./opentelemetry-instrumentation-psycopg2) | psycopg2 >= 2.7.3.1,psycopg2-binary >= 2.7.3.1 | No | experimental
| [opentelemetry-instrumentation-pymemcache](./opentelemetry-instrumentation-pymemcache) | pymemcache >= 1.3.5, < 5 | No | experimental
| [opentelemetry-instrumentation-pymongo](./opentelemetry-instrumentation-pymongo) | pymongo >= 3.1, < 5.0 | No | experimental
| [opentelemetry-instrumentation-pymysql](./opentelemetry-instrumentation-pymysql) | PyMySQL < 2 | No | experimental

View File

@ -34,6 +34,7 @@ dependencies = [
[project.optional-dependencies]
instruments = [
"psycopg2 >= 2.7.3.1",
"psycopg2-binary >= 2.7.3.1",
]
[project.entry-points.opentelemetry_instrumentor]

View File

@ -139,6 +139,7 @@ API
import logging
import typing
from importlib.metadata import PackageNotFoundError, distribution
from typing import Collection
import psycopg2
@ -149,7 +150,11 @@ from psycopg2.sql import Composed # pylint: disable=no-name-in-module
from opentelemetry.instrumentation import dbapi
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.psycopg2.package import _instruments
from opentelemetry.instrumentation.psycopg2.package import (
_instruments,
_instruments_psycopg2,
_instruments_psycopg2_binary,
)
from opentelemetry.instrumentation.psycopg2.version import __version__
_logger = logging.getLogger(__name__)
@ -167,6 +172,21 @@ class Psycopg2Instrumentor(BaseInstrumentor):
_DATABASE_SYSTEM = "postgresql"
def instrumentation_dependencies(self) -> Collection[str]:
# Determine which package of psycopg2 is installed
# Right now there are two packages, psycopg2 and psycopg2-binary
# The latter is a binary wheel package that does not require a compiler
try:
distribution("psycopg2")
return (_instruments_psycopg2,)
except PackageNotFoundError:
pass
try:
distribution("psycopg2-binary")
return (_instruments_psycopg2_binary,)
except PackageNotFoundError:
pass
return _instruments
def _instrument(self, **kwargs):

View File

@ -13,4 +13,10 @@
# limitations under the License.
_instruments = ("psycopg2 >= 2.7.3.1",)
_instruments_psycopg2 = "psycopg2 >= 2.7.3.1"
_instruments_psycopg2_binary = "psycopg2-binary >= 2.7.3.1"
_instruments = (
_instruments_psycopg2,
_instruments_psycopg2_binary,
)

View File

@ -0,0 +1,15 @@
asgiref==3.8.1
Deprecated==1.2.14
iniconfig==2.0.0
packaging==24.0
pluggy==1.5.0
psycopg2-binary==2.9.10
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
-e instrumentation/opentelemetry-instrumentation-dbapi
-e instrumentation/opentelemetry-instrumentation-psycopg2

View File

@ -144,6 +144,10 @@ libraries = [
"library": "psycopg2 >= 2.7.3.1",
"instrumentation": "opentelemetry-instrumentation-psycopg2==0.51b0.dev",
},
{
"library": "psycopg2-binary >= 2.7.3.1",
"instrumentation": "opentelemetry-instrumentation-psycopg2==0.51b0.dev",
},
{
"library": "pymemcache >= 1.3.5, < 5",
"instrumentation": "opentelemetry-instrumentation-pymemcache==0.51b0.dev",

View File

@ -212,6 +212,7 @@ envlist =
; opentelemetry-instrumentation-psycopg2
py3{8,9,10,11,12,13}-test-instrumentation-psycopg2
py3{8,9,10,11,12,13}-test-instrumentation-psycopg2-binary
; ext-psycopg2 intentionally excluded from pypy3
lint-instrumentation-psycopg2
@ -574,6 +575,9 @@ deps =
psycopg2: {[testenv]test_deps}
psycopg2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt
psycopg2-binary: {[testenv]test_deps}
psycopg2-binary: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements-binary.txt
pymysql: {[testenv]test_deps}
pymysql: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymysql/test-requirements.txt
@ -813,6 +817,9 @@ commands =
test-instrumentation-psycopg2: pytest {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2/tests {posargs}
lint-instrumentation-psycopg2: sh -c "cd instrumentation && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-psycopg2"
; Test only for psycopg2-binary instrumentation as the only difference between psycopg2 and psycopg2-binary is the install method
test-instrumentation-psycopg2-binary: pytest {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2/tests {posargs}
test-instrumentation-pymemcache: pytest {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/tests {posargs}
lint-instrumentation-pymemcache: sh -c "cd instrumentation && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-pymemcache"