diff --git a/.github/workflows/core_contrib_test_0.yml b/.github/workflows/core_contrib_test_0.yml index 67bda629ff..6c0616e0a6 100644 --- a/.github/workflows/core_contrib_test_0.yml +++ b/.github/workflows/core_contrib_test_0.yml @@ -63,6 +63,50 @@ jobs: - name: Run tests run: tox -e py38-test-instrumentation-openai-v2-1 -- -ra + py38-test-instrumentation-vertexai-0: + name: instrumentation-vertexai-0 + 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-vertexai-0 -- -ra + + py38-test-instrumentation-vertexai-1: + name: instrumentation-vertexai-1 + 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-vertexai-1 -- -ra + py38-test-resource-detector-container: name: resource-detector-container runs-on: ubuntu-latest @@ -613,6 +657,28 @@ jobs: - name: Run tests run: tox -e py38-test-instrumentation-falcon-2 -- -ra + py38-test-instrumentation-falcon-3: + name: instrumentation-falcon-3 + 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-falcon-3 -- -ra + py38-test-instrumentation-fastapi: name: instrumentation-fastapi runs-on: ubuntu-latest diff --git a/.github/workflows/generate_workflows_lib/pyproject.toml b/.github/workflows/generate_workflows_lib/pyproject.toml index 314d079686..8fa1524442 100644 --- a/.github/workflows/generate_workflows_lib/pyproject.toml +++ b/.github/workflows/generate_workflows_lib/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Typing :: Typed", ] dependencies = ["Jinja2", "tox"] diff --git a/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/__init__.py b/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/__init__.py index e60e8e8f81..1ad36c1b10 100644 --- a/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/__init__.py +++ b/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/__init__.py @@ -53,6 +53,7 @@ def get_test_job_datas(tox_envs: list, operating_systems: list) -> list: "py310": "3.10", "py311": "3.11", "py312": "3.12", + "py313": "3.13", } test_job_datas = [] diff --git a/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/lint.yml.j2 b/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/lint.yml.j2 index 6959261bba..225387e352 100644 --- a/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/lint.yml.j2 +++ b/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/lint.yml.j2 @@ -24,10 +24,10 @@ jobs: - name: Checkout repo @ SHA - ${% raw %}{{ github.sha }}{% endraw %} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox diff --git a/.github/workflows/lint_0.yml b/.github/workflows/lint_0.yml index 9d77ef5e27..e36a6a2ad2 100644 --- a/.github/workflows/lint_0.yml +++ b/.github/workflows/lint_0.yml @@ -23,10 +23,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -34,6 +34,24 @@ jobs: - name: Run tests run: tox -e lint-instrumentation-openai-v2 + lint-instrumentation-vertexai: + name: instrumentation-vertexai + 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 + + - name: Run tests + run: tox -e lint-instrumentation-vertexai + lint-resource-detector-container: name: resource-detector-container runs-on: ubuntu-latest @@ -41,10 +59,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -59,10 +77,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -77,10 +95,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -95,10 +113,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -113,10 +131,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -131,10 +149,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -149,10 +167,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -167,10 +185,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -185,10 +203,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -203,10 +221,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -221,10 +239,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -239,10 +257,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -257,10 +275,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -275,10 +293,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -293,10 +311,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -311,10 +329,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -329,10 +347,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -347,10 +365,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -365,10 +383,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -383,10 +401,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -401,10 +419,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -419,10 +437,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -437,10 +455,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -455,10 +473,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -473,10 +491,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -491,10 +509,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -509,10 +527,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -527,10 +545,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -545,10 +563,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -563,10 +581,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -581,10 +599,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -599,10 +617,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -617,10 +635,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -635,10 +653,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -653,10 +671,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -671,10 +689,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -689,10 +707,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -707,10 +725,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -725,10 +743,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -743,10 +761,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -761,10 +779,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -779,10 +797,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -797,10 +815,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -815,10 +833,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -833,10 +851,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -851,10 +869,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -869,10 +887,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -887,10 +905,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -905,10 +923,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -923,10 +941,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -941,10 +959,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -959,10 +977,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -977,10 +995,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -995,10 +1013,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -1013,10 +1031,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -1031,10 +1049,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -1049,10 +1067,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -1067,10 +1085,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -1085,10 +1103,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox @@ -1103,10 +1121,10 @@ jobs: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox diff --git a/.github/workflows/test_0.yml b/.github/workflows/test_0.yml index 47c9a19cf3..e651777907 100644 --- a/.github/workflows/test_0.yml +++ b/.github/workflows/test_0.yml @@ -196,6 +196,42 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-openai-v2-1 -- -ra + py313-test-instrumentation-openai-v2-0_ubuntu-latest: + name: instrumentation-openai-v2-0 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-openai-v2-0 -- -ra + + py313-test-instrumentation-openai-v2-1_ubuntu-latest: + name: instrumentation-openai-v2-1 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-openai-v2-1 -- -ra + pypy3-test-instrumentation-openai-v2-0_ubuntu-latest: name: instrumentation-openai-v2-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -232,6 +268,222 @@ jobs: - name: Run tests run: tox -e pypy3-test-instrumentation-openai-v2-1 -- -ra + py38-test-instrumentation-vertexai-0_ubuntu-latest: + name: instrumentation-vertexai-0 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-vertexai-0 -- -ra + + py38-test-instrumentation-vertexai-1_ubuntu-latest: + name: instrumentation-vertexai-1 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-vertexai-1 -- -ra + + py39-test-instrumentation-vertexai-0_ubuntu-latest: + name: instrumentation-vertexai-0 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-vertexai-0 -- -ra + + py39-test-instrumentation-vertexai-1_ubuntu-latest: + name: instrumentation-vertexai-1 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-vertexai-1 -- -ra + + py310-test-instrumentation-vertexai-0_ubuntu-latest: + name: instrumentation-vertexai-0 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-vertexai-0 -- -ra + + py310-test-instrumentation-vertexai-1_ubuntu-latest: + name: instrumentation-vertexai-1 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-vertexai-1 -- -ra + + py311-test-instrumentation-vertexai-0_ubuntu-latest: + name: instrumentation-vertexai-0 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-vertexai-0 -- -ra + + py311-test-instrumentation-vertexai-1_ubuntu-latest: + name: instrumentation-vertexai-1 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-vertexai-1 -- -ra + + py312-test-instrumentation-vertexai-0_ubuntu-latest: + name: instrumentation-vertexai-0 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-vertexai-0 -- -ra + + py312-test-instrumentation-vertexai-1_ubuntu-latest: + name: instrumentation-vertexai-1 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-vertexai-1 -- -ra + + py313-test-instrumentation-vertexai-0_ubuntu-latest: + name: instrumentation-vertexai-0 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-vertexai-0 -- -ra + + py313-test-instrumentation-vertexai-1_ubuntu-latest: + name: instrumentation-vertexai-1 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-vertexai-1 -- -ra + py38-test-resource-detector-container_ubuntu-latest: name: resource-detector-container 3.8 Ubuntu runs-on: ubuntu-latest @@ -322,6 +574,24 @@ jobs: - name: Run tests run: tox -e py312-test-resource-detector-container -- -ra + py313-test-resource-detector-container_ubuntu-latest: + name: resource-detector-container 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 + + - name: Run tests + run: tox -e py313-test-resource-detector-container -- -ra + pypy3-test-resource-detector-container_ubuntu-latest: name: resource-detector-container pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -520,6 +790,42 @@ jobs: - name: Run tests run: tox -e py312-test-resource-detector-azure-1 -- -ra + py313-test-resource-detector-azure-0_ubuntu-latest: + name: resource-detector-azure-0 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 + + - name: Run tests + run: tox -e py313-test-resource-detector-azure-0 -- -ra + + py313-test-resource-detector-azure-1_ubuntu-latest: + name: resource-detector-azure-1 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 + + - name: Run tests + run: tox -e py313-test-resource-detector-azure-1 -- -ra + pypy3-test-resource-detector-azure-0_ubuntu-latest: name: resource-detector-azure-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -736,50 +1042,86 @@ jobs: - name: Run tests run: tox -e py312-test-sdk-extension-aws-1 -- -ra - pypy3-test-sdk-extension-aws-0_ubuntu-latest: - name: sdk-extension-aws-0 pypy-3.8 Ubuntu + py313-test-sdk-extension-aws-0_ubuntu-latest: + name: sdk-extension-aws-0 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-sdk-extension-aws-0 -- -ra + run: tox -e py313-test-sdk-extension-aws-0 -- -ra - pypy3-test-sdk-extension-aws-1_ubuntu-latest: - name: sdk-extension-aws-1 pypy-3.8 Ubuntu + py313-test-sdk-extension-aws-1_ubuntu-latest: + name: sdk-extension-aws-1 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-sdk-extension-aws-1 -- -ra + run: tox -e py313-test-sdk-extension-aws-1 -- -ra - py38-test-distro_ubuntu-latest: - name: distro 3.8 Ubuntu + pypy3-test-sdk-extension-aws-0_ubuntu-latest: + name: sdk-extension-aws-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - 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 + + - name: Run tests + run: tox -e pypy3-test-sdk-extension-aws-0 -- -ra + + pypy3-test-sdk-extension-aws-1_ubuntu-latest: + name: sdk-extension-aws-1 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 + + - name: Run tests + run: tox -e pypy3-test-sdk-extension-aws-1 -- -ra + + py38-test-distro_ubuntu-latest: + name: distro 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" @@ -862,6 +1204,24 @@ jobs: - name: Run tests run: tox -e py312-test-distro -- -ra + py313-test-distro_ubuntu-latest: + name: distro 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 + + - name: Run tests + run: tox -e py313-test-distro -- -ra + pypy3-test-distro_ubuntu-latest: name: distro pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -970,6 +1330,24 @@ jobs: - name: Run tests run: tox -e py312-test-opentelemetry-instrumentation -- -ra + py313-test-opentelemetry-instrumentation_ubuntu-latest: + name: opentelemetry-instrumentation 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 + + - name: Run tests + run: tox -e py313-test-opentelemetry-instrumentation -- -ra + pypy3-test-opentelemetry-instrumentation_ubuntu-latest: name: opentelemetry-instrumentation pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -1078,6 +1456,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-aiohttp-client -- -ra + py313-test-instrumentation-aiohttp-client_ubuntu-latest: + name: instrumentation-aiohttp-client 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aiohttp-client -- -ra + pypy3-test-instrumentation-aiohttp-client_ubuntu-latest: name: instrumentation-aiohttp-client pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -1186,6 +1582,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-aiohttp-server -- -ra + py313-test-instrumentation-aiohttp-server_ubuntu-latest: + name: instrumentation-aiohttp-server 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aiohttp-server -- -ra + pypy3-test-instrumentation-aiohttp-server_ubuntu-latest: name: instrumentation-aiohttp-server pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -1294,6 +1708,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-aiopg -- -ra + py313-test-instrumentation-aiopg_ubuntu-latest: + name: instrumentation-aiopg 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aiopg -- -ra + py38-test-instrumentation-aws-lambda_ubuntu-latest: name: instrumentation-aws-lambda 3.8 Ubuntu runs-on: ubuntu-latest @@ -1384,6 +1816,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-aws-lambda -- -ra + py313-test-instrumentation-aws-lambda_ubuntu-latest: + name: instrumentation-aws-lambda 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aws-lambda -- -ra + pypy3-test-instrumentation-aws-lambda_ubuntu-latest: name: instrumentation-aws-lambda pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -1492,6 +1942,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-botocore -- -ra + py313-test-instrumentation-botocore_ubuntu-latest: + name: instrumentation-botocore 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-botocore -- -ra + py38-test-instrumentation-boto3sqs_ubuntu-latest: name: instrumentation-boto3sqs 3.8 Ubuntu runs-on: ubuntu-latest @@ -1582,6 +2050,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-boto3sqs -- -ra + py313-test-instrumentation-boto3sqs_ubuntu-latest: + name: instrumentation-boto3sqs 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-boto3sqs -- -ra + pypy3-test-instrumentation-boto3sqs_ubuntu-latest: name: instrumentation-boto3sqs pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -1816,6 +2302,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-django-3 -- -ra + py313-test-instrumentation-django-3_ubuntu-latest: + name: instrumentation-django-3 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-django-3 -- -ra + pypy3-test-instrumentation-django-0_ubuntu-latest: name: instrumentation-django-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -1942,6 +2446,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-dbapi -- -ra + py313-test-instrumentation-dbapi_ubuntu-latest: + name: instrumentation-dbapi 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-dbapi -- -ra + pypy3-test-instrumentation-dbapi_ubuntu-latest: name: instrumentation-dbapi pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -2122,6 +2644,24 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-click -- -ra + py313-test-instrumentation-click_ubuntu-latest: + name: instrumentation-click 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-click -- -ra + pypy3-test-instrumentation-click_ubuntu-latest: name: instrumentation-click pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -2410,6 +2950,60 @@ jobs: - name: Run tests run: tox -e py312-test-instrumentation-elasticsearch-2 -- -ra + py313-test-instrumentation-elasticsearch-0_ubuntu-latest: + name: instrumentation-elasticsearch-0 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-elasticsearch-0 -- -ra + + py313-test-instrumentation-elasticsearch-1_ubuntu-latest: + name: instrumentation-elasticsearch-1 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-elasticsearch-1 -- -ra + + py313-test-instrumentation-elasticsearch-2_ubuntu-latest: + name: instrumentation-elasticsearch-2 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-elasticsearch-2 -- -ra + pypy3-test-instrumentation-elasticsearch-0_ubuntu-latest: name: instrumentation-elasticsearch-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest @@ -2518,6 +3112,24 @@ jobs: - name: Run tests run: tox -e py38-test-instrumentation-falcon-2 -- -ra + py38-test-instrumentation-falcon-3_ubuntu-latest: + name: instrumentation-falcon-3 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-falcon-3 -- -ra + py39-test-instrumentation-falcon-0_ubuntu-latest: name: instrumentation-falcon-0 3.9 Ubuntu runs-on: ubuntu-latest @@ -2572,6 +3184,24 @@ jobs: - name: Run tests run: tox -e py39-test-instrumentation-falcon-2 -- -ra + py39-test-instrumentation-falcon-3_ubuntu-latest: + name: instrumentation-falcon-3 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-falcon-3 -- -ra + py310-test-instrumentation-falcon-1_ubuntu-latest: name: instrumentation-falcon-1 3.10 Ubuntu runs-on: ubuntu-latest @@ -2608,584 +3238,26 @@ jobs: - name: Run tests run: tox -e py310-test-instrumentation-falcon-2 -- -ra - py311-test-instrumentation-falcon-1_ubuntu-latest: - name: instrumentation-falcon-1 3.11 Ubuntu + py310-test-instrumentation-falcon-3_ubuntu-latest: + name: instrumentation-falcon-3 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-falcon-1 -- -ra + run: tox -e py310-test-instrumentation-falcon-3 -- -ra - py311-test-instrumentation-falcon-2_ubuntu-latest: - name: instrumentation-falcon-2 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 - - - name: Run tests - run: tox -e py311-test-instrumentation-falcon-2 -- -ra - - py312-test-instrumentation-falcon-1_ubuntu-latest: - name: instrumentation-falcon-1 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 - - - name: Run tests - run: tox -e py312-test-instrumentation-falcon-1 -- -ra - - py312-test-instrumentation-falcon-2_ubuntu-latest: - name: instrumentation-falcon-2 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 - - - name: Run tests - run: tox -e py312-test-instrumentation-falcon-2 -- -ra - - pypy3-test-instrumentation-falcon-0_ubuntu-latest: - name: instrumentation-falcon-0 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 - - - name: Run tests - run: tox -e pypy3-test-instrumentation-falcon-0 -- -ra - - pypy3-test-instrumentation-falcon-1_ubuntu-latest: - name: instrumentation-falcon-1 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 - - - name: Run tests - run: tox -e pypy3-test-instrumentation-falcon-1 -- -ra - - pypy3-test-instrumentation-falcon-2_ubuntu-latest: - name: instrumentation-falcon-2 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 - - - name: Run tests - run: tox -e pypy3-test-instrumentation-falcon-2 -- -ra - - py38-test-instrumentation-fastapi_ubuntu-latest: - name: instrumentation-fastapi 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 - - - name: Run tests - run: tox -e py38-test-instrumentation-fastapi -- -ra - - py39-test-instrumentation-fastapi_ubuntu-latest: - name: instrumentation-fastapi 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 - - - name: Run tests - run: tox -e py39-test-instrumentation-fastapi -- -ra - - py310-test-instrumentation-fastapi_ubuntu-latest: - name: instrumentation-fastapi 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 - - - name: Run tests - run: tox -e py310-test-instrumentation-fastapi -- -ra - - py311-test-instrumentation-fastapi_ubuntu-latest: - name: instrumentation-fastapi 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 - - - name: Run tests - run: tox -e py311-test-instrumentation-fastapi -- -ra - - py312-test-instrumentation-fastapi_ubuntu-latest: - name: instrumentation-fastapi 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 - - - name: Run tests - run: tox -e py312-test-instrumentation-fastapi -- -ra - - pypy3-test-instrumentation-fastapi_ubuntu-latest: - name: instrumentation-fastapi 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 - - - name: Run tests - run: tox -e pypy3-test-instrumentation-fastapi -- -ra - - py38-test-instrumentation-flask-0_ubuntu-latest: - name: instrumentation-flask-0 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 - - - name: Run tests - run: tox -e py38-test-instrumentation-flask-0 -- -ra - - py38-test-instrumentation-flask-1_ubuntu-latest: - name: instrumentation-flask-1 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 - - - name: Run tests - run: tox -e py38-test-instrumentation-flask-1 -- -ra - - py39-test-instrumentation-flask-0_ubuntu-latest: - name: instrumentation-flask-0 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 - - - name: Run tests - run: tox -e py39-test-instrumentation-flask-0 -- -ra - - py39-test-instrumentation-flask-1_ubuntu-latest: - name: instrumentation-flask-1 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 - - - name: Run tests - run: tox -e py39-test-instrumentation-flask-1 -- -ra - - py310-test-instrumentation-flask-0_ubuntu-latest: - name: instrumentation-flask-0 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 - - - name: Run tests - run: tox -e py310-test-instrumentation-flask-0 -- -ra - - py310-test-instrumentation-flask-1_ubuntu-latest: - name: instrumentation-flask-1 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 - - - name: Run tests - run: tox -e py310-test-instrumentation-flask-1 -- -ra - - py311-test-instrumentation-flask-0_ubuntu-latest: - name: instrumentation-flask-0 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 - - - name: Run tests - run: tox -e py311-test-instrumentation-flask-0 -- -ra - - py311-test-instrumentation-flask-1_ubuntu-latest: - name: instrumentation-flask-1 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 - - - name: Run tests - run: tox -e py311-test-instrumentation-flask-1 -- -ra - - py312-test-instrumentation-flask-0_ubuntu-latest: - name: instrumentation-flask-0 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 - - - name: Run tests - run: tox -e py312-test-instrumentation-flask-0 -- -ra - - py312-test-instrumentation-flask-1_ubuntu-latest: - name: instrumentation-flask-1 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 - - - name: Run tests - run: tox -e py312-test-instrumentation-flask-1 -- -ra - - py38-test-instrumentation-flask-2_ubuntu-latest: - name: instrumentation-flask-2 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 - - - name: Run tests - run: tox -e py38-test-instrumentation-flask-2 -- -ra - - py39-test-instrumentation-flask-2_ubuntu-latest: - name: instrumentation-flask-2 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 - - - name: Run tests - run: tox -e py39-test-instrumentation-flask-2 -- -ra - - py310-test-instrumentation-flask-2_ubuntu-latest: - name: instrumentation-flask-2 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 - - - name: Run tests - run: tox -e py310-test-instrumentation-flask-2 -- -ra - - py311-test-instrumentation-flask-2_ubuntu-latest: - name: instrumentation-flask-2 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 - - - name: Run tests - run: tox -e py311-test-instrumentation-flask-2 -- -ra - - py312-test-instrumentation-flask-2_ubuntu-latest: - name: instrumentation-flask-2 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 - - - name: Run tests - run: tox -e py312-test-instrumentation-flask-2 -- -ra - - pypy3-test-instrumentation-flask-0_ubuntu-latest: - name: instrumentation-flask-0 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 - - - name: Run tests - run: tox -e pypy3-test-instrumentation-flask-0 -- -ra - - pypy3-test-instrumentation-flask-1_ubuntu-latest: - name: instrumentation-flask-1 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 - - - name: Run tests - run: tox -e pypy3-test-instrumentation-flask-1 -- -ra - - py38-test-instrumentation-urllib_ubuntu-latest: - name: instrumentation-urllib 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 - - - name: Run tests - run: tox -e py38-test-instrumentation-urllib -- -ra - - py39-test-instrumentation-urllib_ubuntu-latest: - name: instrumentation-urllib 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 - - - name: Run tests - run: tox -e py39-test-instrumentation-urllib -- -ra - - py310-test-instrumentation-urllib_ubuntu-latest: - name: instrumentation-urllib 3.10 Ubuntu + py310-test-instrumentation-falcon-4_ubuntu-latest: + name: instrumentation-falcon-4 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3200,10 +3272,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-urllib -- -ra + run: tox -e py310-test-instrumentation-falcon-4 -- -ra - py311-test-instrumentation-urllib_ubuntu-latest: - name: instrumentation-urllib 3.11 Ubuntu + py311-test-instrumentation-falcon-1_ubuntu-latest: + name: instrumentation-falcon-1 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3218,226 +3290,208 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-urllib -- -ra - - py312-test-instrumentation-urllib_ubuntu-latest: - name: instrumentation-urllib 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 - - - name: Run tests - run: tox -e py312-test-instrumentation-urllib -- -ra + run: tox -e py311-test-instrumentation-falcon-1 -- -ra - pypy3-test-instrumentation-urllib_ubuntu-latest: - name: instrumentation-urllib pypy-3.8 Ubuntu + py311-test-instrumentation-falcon-2_ubuntu-latest: + name: instrumentation-falcon-2 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-urllib -- -ra + run: tox -e py311-test-instrumentation-falcon-2 -- -ra - py38-test-instrumentation-urllib3-0_ubuntu-latest: - name: instrumentation-urllib3-0 3.8 Ubuntu + py311-test-instrumentation-falcon-3_ubuntu-latest: + name: instrumentation-falcon-3 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-urllib3-0 -- -ra + run: tox -e py311-test-instrumentation-falcon-3 -- -ra - py38-test-instrumentation-urllib3-1_ubuntu-latest: - name: instrumentation-urllib3-1 3.8 Ubuntu + py311-test-instrumentation-falcon-4_ubuntu-latest: + name: instrumentation-falcon-4 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-urllib3-1 -- -ra + run: tox -e py311-test-instrumentation-falcon-4 -- -ra - py39-test-instrumentation-urllib3-0_ubuntu-latest: - name: instrumentation-urllib3-0 3.9 Ubuntu + py312-test-instrumentation-falcon-1_ubuntu-latest: + name: instrumentation-falcon-1 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-urllib3-0 -- -ra + run: tox -e py312-test-instrumentation-falcon-1 -- -ra - py39-test-instrumentation-urllib3-1_ubuntu-latest: - name: instrumentation-urllib3-1 3.9 Ubuntu + py312-test-instrumentation-falcon-2_ubuntu-latest: + name: instrumentation-falcon-2 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-urllib3-1 -- -ra + run: tox -e py312-test-instrumentation-falcon-2 -- -ra - py310-test-instrumentation-urllib3-0_ubuntu-latest: - name: instrumentation-urllib3-0 3.10 Ubuntu + py312-test-instrumentation-falcon-3_ubuntu-latest: + name: instrumentation-falcon-3 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-urllib3-0 -- -ra + run: tox -e py312-test-instrumentation-falcon-3 -- -ra - py310-test-instrumentation-urllib3-1_ubuntu-latest: - name: instrumentation-urllib3-1 3.10 Ubuntu + py312-test-instrumentation-falcon-4_ubuntu-latest: + name: instrumentation-falcon-4 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-urllib3-1 -- -ra + run: tox -e py312-test-instrumentation-falcon-4 -- -ra - py311-test-instrumentation-urllib3-0_ubuntu-latest: - name: instrumentation-urllib3-0 3.11 Ubuntu + py313-test-instrumentation-falcon-4_ubuntu-latest: + name: instrumentation-falcon-4 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-urllib3-0 -- -ra + run: tox -e py313-test-instrumentation-falcon-4 -- -ra - py311-test-instrumentation-urllib3-1_ubuntu-latest: - name: instrumentation-urllib3-1 3.11 Ubuntu + pypy3-test-instrumentation-falcon-0_ubuntu-latest: + name: instrumentation-falcon-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-urllib3-1 -- -ra + run: tox -e pypy3-test-instrumentation-falcon-0 -- -ra - py312-test-instrumentation-urllib3-0_ubuntu-latest: - name: instrumentation-urllib3-0 3.12 Ubuntu + pypy3-test-instrumentation-falcon-1_ubuntu-latest: + name: instrumentation-falcon-1 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-urllib3-0 -- -ra + run: tox -e pypy3-test-instrumentation-falcon-1 -- -ra - py312-test-instrumentation-urllib3-1_ubuntu-latest: - name: instrumentation-urllib3-1 3.12 Ubuntu + pypy3-test-instrumentation-falcon-2_ubuntu-latest: + name: instrumentation-falcon-2 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-urllib3-1 -- -ra + run: tox -e pypy3-test-instrumentation-falcon-2 -- -ra - pypy3-test-instrumentation-urllib3-0_ubuntu-latest: - name: instrumentation-urllib3-0 pypy-3.8 Ubuntu + pypy3-test-instrumentation-falcon-3_ubuntu-latest: + name: instrumentation-falcon-3 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3452,10 +3506,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-urllib3-0 -- -ra + run: tox -e pypy3-test-instrumentation-falcon-3 -- -ra - pypy3-test-instrumentation-urllib3-1_ubuntu-latest: - name: instrumentation-urllib3-1 pypy-3.8 Ubuntu + pypy3-test-instrumentation-falcon-4_ubuntu-latest: + name: instrumentation-falcon-4 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3470,10 +3524,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-urllib3-1 -- -ra + run: tox -e pypy3-test-instrumentation-falcon-4 -- -ra - py38-test-instrumentation-requests_ubuntu-latest: - name: instrumentation-requests 3.8 Ubuntu + py38-test-instrumentation-fastapi_ubuntu-latest: + name: instrumentation-fastapi 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3488,10 +3542,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-requests -- -ra + run: tox -e py38-test-instrumentation-fastapi -- -ra - py39-test-instrumentation-requests_ubuntu-latest: - name: instrumentation-requests 3.9 Ubuntu + py39-test-instrumentation-fastapi_ubuntu-latest: + name: instrumentation-fastapi 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3506,10 +3560,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-requests -- -ra + run: tox -e py39-test-instrumentation-fastapi -- -ra - py310-test-instrumentation-requests_ubuntu-latest: - name: instrumentation-requests 3.10 Ubuntu + py310-test-instrumentation-fastapi_ubuntu-latest: + name: instrumentation-fastapi 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3524,10 +3578,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-requests -- -ra + run: tox -e py310-test-instrumentation-fastapi -- -ra - py311-test-instrumentation-requests_ubuntu-latest: - name: instrumentation-requests 3.11 Ubuntu + py311-test-instrumentation-fastapi_ubuntu-latest: + name: instrumentation-fastapi 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3542,10 +3596,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-requests -- -ra + run: tox -e py311-test-instrumentation-fastapi -- -ra - py312-test-instrumentation-requests_ubuntu-latest: - name: instrumentation-requests 3.12 Ubuntu + py312-test-instrumentation-fastapi_ubuntu-latest: + name: instrumentation-fastapi 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3560,118 +3614,82 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-requests -- -ra - - py38-test-instrumentation-starlette_ubuntu-latest: - name: instrumentation-starlette 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 - - - name: Run tests - run: tox -e py38-test-instrumentation-starlette -- -ra - - py39-test-instrumentation-starlette_ubuntu-latest: - name: instrumentation-starlette 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 - - - name: Run tests - run: tox -e py39-test-instrumentation-starlette -- -ra + run: tox -e py312-test-instrumentation-fastapi -- -ra - py310-test-instrumentation-starlette_ubuntu-latest: - name: instrumentation-starlette 3.10 Ubuntu + py313-test-instrumentation-fastapi_ubuntu-latest: + name: instrumentation-fastapi 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-starlette -- -ra + run: tox -e py313-test-instrumentation-fastapi -- -ra - py311-test-instrumentation-starlette_ubuntu-latest: - name: instrumentation-starlette 3.11 Ubuntu + pypy3-test-instrumentation-fastapi_ubuntu-latest: + name: instrumentation-fastapi pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-starlette -- -ra + run: tox -e pypy3-test-instrumentation-fastapi -- -ra - py312-test-instrumentation-starlette_ubuntu-latest: - name: instrumentation-starlette 3.12 Ubuntu + py38-test-instrumentation-flask-0_ubuntu-latest: + name: instrumentation-flask-0 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-starlette -- -ra + run: tox -e py38-test-instrumentation-flask-0 -- -ra - pypy3-test-instrumentation-starlette_ubuntu-latest: - name: instrumentation-starlette pypy-3.8 Ubuntu + py38-test-instrumentation-flask-1_ubuntu-latest: + name: instrumentation-flask-1 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 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-starlette -- -ra + run: tox -e py38-test-instrumentation-flask-1 -- -ra - py38-test-instrumentation-jinja2_ubuntu-latest: - name: instrumentation-jinja2 3.8 Ubuntu + py38-test-instrumentation-flask-2_ubuntu-latest: + name: instrumentation-flask-2 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3686,10 +3704,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-jinja2 -- -ra + run: tox -e py38-test-instrumentation-flask-2 -- -ra - py39-test-instrumentation-jinja2_ubuntu-latest: - name: instrumentation-jinja2 3.9 Ubuntu + py39-test-instrumentation-flask-0_ubuntu-latest: + name: instrumentation-flask-0 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3704,136 +3722,136 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-jinja2 -- -ra + run: tox -e py39-test-instrumentation-flask-0 -- -ra - py310-test-instrumentation-jinja2_ubuntu-latest: - name: instrumentation-jinja2 3.10 Ubuntu + py39-test-instrumentation-flask-1_ubuntu-latest: + name: instrumentation-flask-1 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-jinja2 -- -ra + run: tox -e py39-test-instrumentation-flask-1 -- -ra - py311-test-instrumentation-jinja2_ubuntu-latest: - name: instrumentation-jinja2 3.11 Ubuntu + py39-test-instrumentation-flask-2_ubuntu-latest: + name: instrumentation-flask-2 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-jinja2 -- -ra + run: tox -e py39-test-instrumentation-flask-2 -- -ra - py312-test-instrumentation-jinja2_ubuntu-latest: - name: instrumentation-jinja2 3.12 Ubuntu + py310-test-instrumentation-flask-0_ubuntu-latest: + name: instrumentation-flask-0 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-jinja2 -- -ra + run: tox -e py310-test-instrumentation-flask-0 -- -ra - pypy3-test-instrumentation-jinja2_ubuntu-latest: - name: instrumentation-jinja2 pypy-3.8 Ubuntu + py310-test-instrumentation-flask-1_ubuntu-latest: + name: instrumentation-flask-1 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-jinja2 -- -ra + run: tox -e py310-test-instrumentation-flask-1 -- -ra - py38-test-instrumentation-logging_ubuntu-latest: - name: instrumentation-logging 3.8 Ubuntu + py310-test-instrumentation-flask-2_ubuntu-latest: + name: instrumentation-flask-2 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-logging -- -ra + run: tox -e py310-test-instrumentation-flask-2 -- -ra - py39-test-instrumentation-logging_ubuntu-latest: - name: instrumentation-logging 3.9 Ubuntu + py311-test-instrumentation-flask-0_ubuntu-latest: + name: instrumentation-flask-0 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-logging -- -ra + run: tox -e py311-test-instrumentation-flask-0 -- -ra - py310-test-instrumentation-logging_ubuntu-latest: - name: instrumentation-logging 3.10 Ubuntu + py311-test-instrumentation-flask-1_ubuntu-latest: + name: instrumentation-flask-1 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-logging -- -ra + run: tox -e py311-test-instrumentation-flask-1 -- -ra - py311-test-instrumentation-logging_ubuntu-latest: - name: instrumentation-logging 3.11 Ubuntu + py311-test-instrumentation-flask-2_ubuntu-latest: + name: instrumentation-flask-2 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3848,10 +3866,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-logging -- -ra + run: tox -e py311-test-instrumentation-flask-2 -- -ra - py312-test-instrumentation-logging_ubuntu-latest: - name: instrumentation-logging 3.12 Ubuntu + py312-test-instrumentation-flask-0_ubuntu-latest: + name: instrumentation-flask-0 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3866,118 +3884,118 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-logging -- -ra + run: tox -e py312-test-instrumentation-flask-0 -- -ra - pypy3-test-instrumentation-logging_ubuntu-latest: - name: instrumentation-logging pypy-3.8 Ubuntu + py312-test-instrumentation-flask-1_ubuntu-latest: + name: instrumentation-flask-1 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-logging -- -ra + run: tox -e py312-test-instrumentation-flask-1 -- -ra - py38-test-exporter-richconsole_ubuntu-latest: - name: exporter-richconsole 3.8 Ubuntu + py312-test-instrumentation-flask-2_ubuntu-latest: + name: instrumentation-flask-2 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-exporter-richconsole -- -ra + run: tox -e py312-test-instrumentation-flask-2 -- -ra - py39-test-exporter-richconsole_ubuntu-latest: - name: exporter-richconsole 3.9 Ubuntu + py313-test-instrumentation-flask-0_ubuntu-latest: + name: instrumentation-flask-0 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-exporter-richconsole -- -ra + run: tox -e py313-test-instrumentation-flask-0 -- -ra - py310-test-exporter-richconsole_ubuntu-latest: - name: exporter-richconsole 3.10 Ubuntu + py313-test-instrumentation-flask-1_ubuntu-latest: + name: instrumentation-flask-1 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-exporter-richconsole -- -ra + run: tox -e py313-test-instrumentation-flask-1 -- -ra - py311-test-exporter-richconsole_ubuntu-latest: - name: exporter-richconsole 3.11 Ubuntu + py313-test-instrumentation-flask-2_ubuntu-latest: + name: instrumentation-flask-2 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-exporter-richconsole -- -ra + run: tox -e py313-test-instrumentation-flask-2 -- -ra - py312-test-exporter-richconsole_ubuntu-latest: - name: exporter-richconsole 3.12 Ubuntu + pypy3-test-instrumentation-flask-0_ubuntu-latest: + name: instrumentation-flask-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-exporter-richconsole -- -ra + run: tox -e pypy3-test-instrumentation-flask-0 -- -ra - pypy3-test-exporter-richconsole_ubuntu-latest: - name: exporter-richconsole pypy-3.8 Ubuntu + pypy3-test-instrumentation-flask-1_ubuntu-latest: + name: instrumentation-flask-1 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3992,10 +4010,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-exporter-richconsole -- -ra + run: tox -e pypy3-test-instrumentation-flask-1 -- -ra - py38-test-exporter-prometheus-remote-write_ubuntu-latest: - name: exporter-prometheus-remote-write 3.8 Ubuntu + py38-test-instrumentation-urllib_ubuntu-latest: + name: instrumentation-urllib 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4010,10 +4028,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-exporter-prometheus-remote-write -- -ra + run: tox -e py38-test-instrumentation-urllib -- -ra - py39-test-exporter-prometheus-remote-write_ubuntu-latest: - name: exporter-prometheus-remote-write 3.9 Ubuntu + py39-test-instrumentation-urllib_ubuntu-latest: + name: instrumentation-urllib 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4028,10 +4046,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-exporter-prometheus-remote-write -- -ra + run: tox -e py39-test-instrumentation-urllib -- -ra - py310-test-exporter-prometheus-remote-write_ubuntu-latest: - name: exporter-prometheus-remote-write 3.10 Ubuntu + py310-test-instrumentation-urllib_ubuntu-latest: + name: instrumentation-urllib 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4046,10 +4064,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-exporter-prometheus-remote-write -- -ra + run: tox -e py310-test-instrumentation-urllib -- -ra - py311-test-exporter-prometheus-remote-write_ubuntu-latest: - name: exporter-prometheus-remote-write 3.11 Ubuntu + py311-test-instrumentation-urllib_ubuntu-latest: + name: instrumentation-urllib 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4064,10 +4082,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-exporter-prometheus-remote-write -- -ra + run: tox -e py311-test-instrumentation-urllib -- -ra - py312-test-exporter-prometheus-remote-write_ubuntu-latest: - name: exporter-prometheus-remote-write 3.12 Ubuntu + py312-test-instrumentation-urllib_ubuntu-latest: + name: instrumentation-urllib 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4082,46 +4100,46 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-exporter-prometheus-remote-write -- -ra + run: tox -e py312-test-instrumentation-urllib -- -ra - pypy3-test-exporter-prometheus-remote-write_ubuntu-latest: - name: exporter-prometheus-remote-write pypy-3.8 Ubuntu + py313-test-instrumentation-urllib_ubuntu-latest: + name: instrumentation-urllib 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-exporter-prometheus-remote-write -- -ra + run: tox -e py313-test-instrumentation-urllib -- -ra - py38-test-instrumentation-mysql-0_ubuntu-latest: - name: instrumentation-mysql-0 3.8 Ubuntu + pypy3-test-instrumentation-urllib_ubuntu-latest: + name: instrumentation-urllib pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-mysql-0 -- -ra + run: tox -e pypy3-test-instrumentation-urllib -- -ra - py38-test-instrumentation-mysql-1_ubuntu-latest: - name: instrumentation-mysql-1 3.8 Ubuntu + py38-test-instrumentation-urllib3-0_ubuntu-latest: + name: instrumentation-urllib3-0 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4136,28 +4154,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-mysql-1 -- -ra + run: tox -e py38-test-instrumentation-urllib3-0 -- -ra - py39-test-instrumentation-mysql-0_ubuntu-latest: - name: instrumentation-mysql-0 3.9 Ubuntu + py38-test-instrumentation-urllib3-1_ubuntu-latest: + name: instrumentation-urllib3-1 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-mysql-0 -- -ra + run: tox -e py38-test-instrumentation-urllib3-1 -- -ra - py39-test-instrumentation-mysql-1_ubuntu-latest: - name: instrumentation-mysql-1 3.9 Ubuntu + py39-test-instrumentation-urllib3-0_ubuntu-latest: + name: instrumentation-urllib3-0 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4172,28 +4190,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-mysql-1 -- -ra + run: tox -e py39-test-instrumentation-urllib3-0 -- -ra - py310-test-instrumentation-mysql-0_ubuntu-latest: - name: instrumentation-mysql-0 3.10 Ubuntu + py39-test-instrumentation-urllib3-1_ubuntu-latest: + name: instrumentation-urllib3-1 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-mysql-0 -- -ra + run: tox -e py39-test-instrumentation-urllib3-1 -- -ra - py310-test-instrumentation-mysql-1_ubuntu-latest: - name: instrumentation-mysql-1 3.10 Ubuntu + py310-test-instrumentation-urllib3-0_ubuntu-latest: + name: instrumentation-urllib3-0 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4208,28 +4226,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-mysql-1 -- -ra + run: tox -e py310-test-instrumentation-urllib3-0 -- -ra - py311-test-instrumentation-mysql-0_ubuntu-latest: - name: instrumentation-mysql-0 3.11 Ubuntu + py310-test-instrumentation-urllib3-1_ubuntu-latest: + name: instrumentation-urllib3-1 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-mysql-0 -- -ra + run: tox -e py310-test-instrumentation-urllib3-1 -- -ra - py311-test-instrumentation-mysql-1_ubuntu-latest: - name: instrumentation-mysql-1 3.11 Ubuntu + py311-test-instrumentation-urllib3-0_ubuntu-latest: + name: instrumentation-urllib3-0 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4244,28 +4262,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-mysql-1 -- -ra + run: tox -e py311-test-instrumentation-urllib3-0 -- -ra - py312-test-instrumentation-mysql-0_ubuntu-latest: - name: instrumentation-mysql-0 3.12 Ubuntu + py311-test-instrumentation-urllib3-1_ubuntu-latest: + name: instrumentation-urllib3-1 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-mysql-0 -- -ra + run: tox -e py311-test-instrumentation-urllib3-1 -- -ra - py312-test-instrumentation-mysql-1_ubuntu-latest: - name: instrumentation-mysql-1 3.12 Ubuntu + py312-test-instrumentation-urllib3-0_ubuntu-latest: + name: instrumentation-urllib3-0 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4280,238 +4298,220 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-mysql-1 -- -ra - - pypy3-test-instrumentation-mysql-0_ubuntu-latest: - name: instrumentation-mysql-0 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 - - - name: Run tests - run: tox -e pypy3-test-instrumentation-mysql-0 -- -ra + run: tox -e py312-test-instrumentation-urllib3-0 -- -ra - pypy3-test-instrumentation-mysql-1_ubuntu-latest: - name: instrumentation-mysql-1 pypy-3.8 Ubuntu + py312-test-instrumentation-urllib3-1_ubuntu-latest: + name: instrumentation-urllib3-1 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-mysql-1 -- -ra + run: tox -e py312-test-instrumentation-urllib3-1 -- -ra - py38-test-instrumentation-mysqlclient_ubuntu-latest: - name: instrumentation-mysqlclient 3.8 Ubuntu + py313-test-instrumentation-urllib3-0_ubuntu-latest: + name: instrumentation-urllib3-0 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-mysqlclient -- -ra + run: tox -e py313-test-instrumentation-urllib3-0 -- -ra - py39-test-instrumentation-mysqlclient_ubuntu-latest: - name: instrumentation-mysqlclient 3.9 Ubuntu + py313-test-instrumentation-urllib3-1_ubuntu-latest: + name: instrumentation-urllib3-1 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-mysqlclient -- -ra + run: tox -e py313-test-instrumentation-urllib3-1 -- -ra - py310-test-instrumentation-mysqlclient_ubuntu-latest: - name: instrumentation-mysqlclient 3.10 Ubuntu + pypy3-test-instrumentation-urllib3-0_ubuntu-latest: + name: instrumentation-urllib3-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-mysqlclient -- -ra + run: tox -e pypy3-test-instrumentation-urllib3-0 -- -ra - py311-test-instrumentation-mysqlclient_ubuntu-latest: - name: instrumentation-mysqlclient 3.11 Ubuntu + pypy3-test-instrumentation-urllib3-1_ubuntu-latest: + name: instrumentation-urllib3-1 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-mysqlclient -- -ra + run: tox -e pypy3-test-instrumentation-urllib3-1 -- -ra - py312-test-instrumentation-mysqlclient_ubuntu-latest: - name: instrumentation-mysqlclient 3.12 Ubuntu + py38-test-instrumentation-requests_ubuntu-latest: + name: instrumentation-requests 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-mysqlclient -- -ra + run: tox -e py38-test-instrumentation-requests -- -ra - pypy3-test-instrumentation-mysqlclient_ubuntu-latest: - name: instrumentation-mysqlclient pypy-3.8 Ubuntu + py39-test-instrumentation-requests_ubuntu-latest: + name: instrumentation-requests 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-mysqlclient -- -ra + run: tox -e py39-test-instrumentation-requests -- -ra - py38-test-instrumentation-psycopg2_ubuntu-latest: - name: instrumentation-psycopg2 3.8 Ubuntu + py310-test-instrumentation-requests_ubuntu-latest: + name: instrumentation-requests 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-psycopg2 -- -ra + run: tox -e py310-test-instrumentation-requests -- -ra - py39-test-instrumentation-psycopg2_ubuntu-latest: - name: instrumentation-psycopg2 3.9 Ubuntu + py311-test-instrumentation-requests_ubuntu-latest: + name: instrumentation-requests 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-psycopg2 -- -ra + run: tox -e py311-test-instrumentation-requests -- -ra - py310-test-instrumentation-psycopg2_ubuntu-latest: - name: instrumentation-psycopg2 3.10 Ubuntu + py312-test-instrumentation-requests_ubuntu-latest: + name: instrumentation-requests 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-psycopg2 -- -ra + run: tox -e py312-test-instrumentation-requests -- -ra - py311-test-instrumentation-psycopg2_ubuntu-latest: - name: instrumentation-psycopg2 3.11 Ubuntu + py313-test-instrumentation-requests_ubuntu-latest: + name: instrumentation-requests 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-psycopg2 -- -ra + run: tox -e py313-test-instrumentation-requests -- -ra - py312-test-instrumentation-psycopg2_ubuntu-latest: - name: instrumentation-psycopg2 3.12 Ubuntu + py38-test-instrumentation-starlette_ubuntu-latest: + name: instrumentation-starlette 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-psycopg2 -- -ra + run: tox -e py38-test-instrumentation-starlette -- -ra diff --git a/.github/workflows/test_1.yml b/.github/workflows/test_1.yml index 9c5d48aea3..b26bb48e33 100644 --- a/.github/workflows/test_1.yml +++ b/.github/workflows/test_1.yml @@ -16,26 +16,8 @@ env: jobs: - py38-test-instrumentation-psycopg_ubuntu-latest: - name: instrumentation-psycopg 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 - - - name: Run tests - run: tox -e py38-test-instrumentation-psycopg -- -ra - - py39-test-instrumentation-psycopg_ubuntu-latest: - name: instrumentation-psycopg 3.9 Ubuntu + py39-test-instrumentation-starlette_ubuntu-latest: + name: instrumentation-starlette 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -50,10 +32,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-psycopg -- -ra + run: tox -e py39-test-instrumentation-starlette -- -ra - py310-test-instrumentation-psycopg_ubuntu-latest: - name: instrumentation-psycopg 3.10 Ubuntu + py310-test-instrumentation-starlette_ubuntu-latest: + name: instrumentation-starlette 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -68,10 +50,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-psycopg -- -ra + run: tox -e py310-test-instrumentation-starlette -- -ra - py311-test-instrumentation-psycopg_ubuntu-latest: - name: instrumentation-psycopg 3.11 Ubuntu + py311-test-instrumentation-starlette_ubuntu-latest: + name: instrumentation-starlette 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -86,10 +68,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-psycopg -- -ra + run: tox -e py311-test-instrumentation-starlette -- -ra - py312-test-instrumentation-psycopg_ubuntu-latest: - name: instrumentation-psycopg 3.12 Ubuntu + py312-test-instrumentation-starlette_ubuntu-latest: + name: instrumentation-starlette 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -104,46 +86,46 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-psycopg -- -ra + run: tox -e py312-test-instrumentation-starlette -- -ra - pypy3-test-instrumentation-psycopg_ubuntu-latest: - name: instrumentation-psycopg pypy-3.8 Ubuntu + py313-test-instrumentation-starlette_ubuntu-latest: + name: instrumentation-starlette 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-psycopg -- -ra + run: tox -e py313-test-instrumentation-starlette -- -ra - py38-test-instrumentation-pymemcache-0_ubuntu-latest: - name: instrumentation-pymemcache-0 3.8 Ubuntu + pypy3-test-instrumentation-starlette_ubuntu-latest: + name: instrumentation-starlette pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-pymemcache-0 -- -ra + run: tox -e pypy3-test-instrumentation-starlette -- -ra - py38-test-instrumentation-pymemcache-1_ubuntu-latest: - name: instrumentation-pymemcache-1 3.8 Ubuntu + py38-test-instrumentation-jinja2_ubuntu-latest: + name: instrumentation-jinja2 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -158,136 +140,136 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-pymemcache-1 -- -ra + run: tox -e py38-test-instrumentation-jinja2 -- -ra - py38-test-instrumentation-pymemcache-2_ubuntu-latest: - name: instrumentation-pymemcache-2 3.8 Ubuntu + py39-test-instrumentation-jinja2_ubuntu-latest: + name: instrumentation-jinja2 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-pymemcache-2 -- -ra + run: tox -e py39-test-instrumentation-jinja2 -- -ra - py38-test-instrumentation-pymemcache-3_ubuntu-latest: - name: instrumentation-pymemcache-3 3.8 Ubuntu + py310-test-instrumentation-jinja2_ubuntu-latest: + name: instrumentation-jinja2 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-pymemcache-3 -- -ra + run: tox -e py310-test-instrumentation-jinja2 -- -ra - py38-test-instrumentation-pymemcache-4_ubuntu-latest: - name: instrumentation-pymemcache-4 3.8 Ubuntu + py311-test-instrumentation-jinja2_ubuntu-latest: + name: instrumentation-jinja2 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-pymemcache-4 -- -ra + run: tox -e py311-test-instrumentation-jinja2 -- -ra - py39-test-instrumentation-pymemcache-0_ubuntu-latest: - name: instrumentation-pymemcache-0 3.9 Ubuntu + py312-test-instrumentation-jinja2_ubuntu-latest: + name: instrumentation-jinja2 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-pymemcache-0 -- -ra + run: tox -e py312-test-instrumentation-jinja2 -- -ra - py39-test-instrumentation-pymemcache-1_ubuntu-latest: - name: instrumentation-pymemcache-1 3.9 Ubuntu + py313-test-instrumentation-jinja2_ubuntu-latest: + name: instrumentation-jinja2 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-pymemcache-1 -- -ra + run: tox -e py313-test-instrumentation-jinja2 -- -ra - py39-test-instrumentation-pymemcache-2_ubuntu-latest: - name: instrumentation-pymemcache-2 3.9 Ubuntu + pypy3-test-instrumentation-jinja2_ubuntu-latest: + name: instrumentation-jinja2 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-pymemcache-2 -- -ra + run: tox -e pypy3-test-instrumentation-jinja2 -- -ra - py39-test-instrumentation-pymemcache-3_ubuntu-latest: - name: instrumentation-pymemcache-3 3.9 Ubuntu + py38-test-instrumentation-logging_ubuntu-latest: + name: instrumentation-logging 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-pymemcache-3 -- -ra + run: tox -e py38-test-instrumentation-logging -- -ra - py39-test-instrumentation-pymemcache-4_ubuntu-latest: - name: instrumentation-pymemcache-4 3.9 Ubuntu + py39-test-instrumentation-logging_ubuntu-latest: + name: instrumentation-logging 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -302,10 +284,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-pymemcache-4 -- -ra + run: tox -e py39-test-instrumentation-logging -- -ra - py310-test-instrumentation-pymemcache-0_ubuntu-latest: - name: instrumentation-pymemcache-0 3.10 Ubuntu + py310-test-instrumentation-logging_ubuntu-latest: + name: instrumentation-logging 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -320,136 +302,136 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-pymemcache-0 -- -ra + run: tox -e py310-test-instrumentation-logging -- -ra - py310-test-instrumentation-pymemcache-1_ubuntu-latest: - name: instrumentation-pymemcache-1 3.10 Ubuntu + py311-test-instrumentation-logging_ubuntu-latest: + name: instrumentation-logging 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-pymemcache-1 -- -ra + run: tox -e py311-test-instrumentation-logging -- -ra - py310-test-instrumentation-pymemcache-2_ubuntu-latest: - name: instrumentation-pymemcache-2 3.10 Ubuntu + py312-test-instrumentation-logging_ubuntu-latest: + name: instrumentation-logging 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-pymemcache-2 -- -ra + run: tox -e py312-test-instrumentation-logging -- -ra - py310-test-instrumentation-pymemcache-3_ubuntu-latest: - name: instrumentation-pymemcache-3 3.10 Ubuntu + py313-test-instrumentation-logging_ubuntu-latest: + name: instrumentation-logging 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-pymemcache-3 -- -ra + run: tox -e py313-test-instrumentation-logging -- -ra - py310-test-instrumentation-pymemcache-4_ubuntu-latest: - name: instrumentation-pymemcache-4 3.10 Ubuntu + pypy3-test-instrumentation-logging_ubuntu-latest: + name: instrumentation-logging pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-pymemcache-4 -- -ra + run: tox -e pypy3-test-instrumentation-logging -- -ra - py311-test-instrumentation-pymemcache-0_ubuntu-latest: - name: instrumentation-pymemcache-0 3.11 Ubuntu + py38-test-exporter-richconsole_ubuntu-latest: + name: exporter-richconsole 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-pymemcache-0 -- -ra + run: tox -e py38-test-exporter-richconsole -- -ra - py311-test-instrumentation-pymemcache-1_ubuntu-latest: - name: instrumentation-pymemcache-1 3.11 Ubuntu + py39-test-exporter-richconsole_ubuntu-latest: + name: exporter-richconsole 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-pymemcache-1 -- -ra + run: tox -e py39-test-exporter-richconsole -- -ra - py311-test-instrumentation-pymemcache-2_ubuntu-latest: - name: instrumentation-pymemcache-2 3.11 Ubuntu + py310-test-exporter-richconsole_ubuntu-latest: + name: exporter-richconsole 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-pymemcache-2 -- -ra + run: tox -e py310-test-exporter-richconsole -- -ra - py311-test-instrumentation-pymemcache-3_ubuntu-latest: - name: instrumentation-pymemcache-3 3.11 Ubuntu + py311-test-exporter-richconsole_ubuntu-latest: + name: exporter-richconsole 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -464,172 +446,172 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-pymemcache-3 -- -ra + run: tox -e py311-test-exporter-richconsole -- -ra - py311-test-instrumentation-pymemcache-4_ubuntu-latest: - name: instrumentation-pymemcache-4 3.11 Ubuntu + py312-test-exporter-richconsole_ubuntu-latest: + name: exporter-richconsole 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-pymemcache-4 -- -ra + run: tox -e py312-test-exporter-richconsole -- -ra - py312-test-instrumentation-pymemcache-0_ubuntu-latest: - name: instrumentation-pymemcache-0 3.12 Ubuntu + py313-test-exporter-richconsole_ubuntu-latest: + name: exporter-richconsole 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-pymemcache-0 -- -ra + run: tox -e py313-test-exporter-richconsole -- -ra - py312-test-instrumentation-pymemcache-1_ubuntu-latest: - name: instrumentation-pymemcache-1 3.12 Ubuntu + pypy3-test-exporter-richconsole_ubuntu-latest: + name: exporter-richconsole pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-pymemcache-1 -- -ra + run: tox -e pypy3-test-exporter-richconsole -- -ra - py312-test-instrumentation-pymemcache-2_ubuntu-latest: - name: instrumentation-pymemcache-2 3.12 Ubuntu + py38-test-exporter-prometheus-remote-write_ubuntu-latest: + name: exporter-prometheus-remote-write 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-pymemcache-2 -- -ra + run: tox -e py38-test-exporter-prometheus-remote-write -- -ra - py312-test-instrumentation-pymemcache-3_ubuntu-latest: - name: instrumentation-pymemcache-3 3.12 Ubuntu + py39-test-exporter-prometheus-remote-write_ubuntu-latest: + name: exporter-prometheus-remote-write 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-pymemcache-3 -- -ra + run: tox -e py39-test-exporter-prometheus-remote-write -- -ra - py312-test-instrumentation-pymemcache-4_ubuntu-latest: - name: instrumentation-pymemcache-4 3.12 Ubuntu + py310-test-exporter-prometheus-remote-write_ubuntu-latest: + name: exporter-prometheus-remote-write 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-pymemcache-4 -- -ra + run: tox -e py310-test-exporter-prometheus-remote-write -- -ra - pypy3-test-instrumentation-pymemcache-0_ubuntu-latest: - name: instrumentation-pymemcache-0 pypy-3.8 Ubuntu + py311-test-exporter-prometheus-remote-write_ubuntu-latest: + name: exporter-prometheus-remote-write 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-pymemcache-0 -- -ra + run: tox -e py311-test-exporter-prometheus-remote-write -- -ra - pypy3-test-instrumentation-pymemcache-1_ubuntu-latest: - name: instrumentation-pymemcache-1 pypy-3.8 Ubuntu + py312-test-exporter-prometheus-remote-write_ubuntu-latest: + name: exporter-prometheus-remote-write 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-pymemcache-1 -- -ra + run: tox -e py312-test-exporter-prometheus-remote-write -- -ra - pypy3-test-instrumentation-pymemcache-2_ubuntu-latest: - name: instrumentation-pymemcache-2 pypy-3.8 Ubuntu + py313-test-exporter-prometheus-remote-write_ubuntu-latest: + name: exporter-prometheus-remote-write 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-pymemcache-2 -- -ra + run: tox -e py313-test-exporter-prometheus-remote-write -- -ra - pypy3-test-instrumentation-pymemcache-3_ubuntu-latest: - name: instrumentation-pymemcache-3 pypy-3.8 Ubuntu + pypy3-test-exporter-prometheus-remote-write_ubuntu-latest: + name: exporter-prometheus-remote-write pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -644,28 +626,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-pymemcache-3 -- -ra + run: tox -e pypy3-test-exporter-prometheus-remote-write -- -ra - pypy3-test-instrumentation-pymemcache-4_ubuntu-latest: - name: instrumentation-pymemcache-4 pypy-3.8 Ubuntu + py38-test-instrumentation-mysql-0_ubuntu-latest: + name: instrumentation-mysql-0 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 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-pymemcache-4 -- -ra + run: tox -e py38-test-instrumentation-mysql-0 -- -ra - py38-test-instrumentation-pymongo_ubuntu-latest: - name: instrumentation-pymongo 3.8 Ubuntu + py38-test-instrumentation-mysql-1_ubuntu-latest: + name: instrumentation-mysql-1 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -680,10 +662,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-pymongo -- -ra + run: tox -e py38-test-instrumentation-mysql-1 -- -ra - py39-test-instrumentation-pymongo_ubuntu-latest: - name: instrumentation-pymongo 3.9 Ubuntu + py39-test-instrumentation-mysql-0_ubuntu-latest: + name: instrumentation-mysql-0 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -698,172 +680,172 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-pymongo -- -ra + run: tox -e py39-test-instrumentation-mysql-0 -- -ra - py310-test-instrumentation-pymongo_ubuntu-latest: - name: instrumentation-pymongo 3.10 Ubuntu + py39-test-instrumentation-mysql-1_ubuntu-latest: + name: instrumentation-mysql-1 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-pymongo -- -ra + run: tox -e py39-test-instrumentation-mysql-1 -- -ra - py311-test-instrumentation-pymongo_ubuntu-latest: - name: instrumentation-pymongo 3.11 Ubuntu + py310-test-instrumentation-mysql-0_ubuntu-latest: + name: instrumentation-mysql-0 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-pymongo -- -ra + run: tox -e py310-test-instrumentation-mysql-0 -- -ra - py312-test-instrumentation-pymongo_ubuntu-latest: - name: instrumentation-pymongo 3.12 Ubuntu + py310-test-instrumentation-mysql-1_ubuntu-latest: + name: instrumentation-mysql-1 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-pymongo -- -ra + run: tox -e py310-test-instrumentation-mysql-1 -- -ra - pypy3-test-instrumentation-pymongo_ubuntu-latest: - name: instrumentation-pymongo pypy-3.8 Ubuntu + py311-test-instrumentation-mysql-0_ubuntu-latest: + name: instrumentation-mysql-0 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-pymongo -- -ra + run: tox -e py311-test-instrumentation-mysql-0 -- -ra - py38-test-instrumentation-pymysql_ubuntu-latest: - name: instrumentation-pymysql 3.8 Ubuntu + py311-test-instrumentation-mysql-1_ubuntu-latest: + name: instrumentation-mysql-1 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-pymysql -- -ra + run: tox -e py311-test-instrumentation-mysql-1 -- -ra - py39-test-instrumentation-pymysql_ubuntu-latest: - name: instrumentation-pymysql 3.9 Ubuntu + py312-test-instrumentation-mysql-0_ubuntu-latest: + name: instrumentation-mysql-0 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-pymysql -- -ra + run: tox -e py312-test-instrumentation-mysql-0 -- -ra - py310-test-instrumentation-pymysql_ubuntu-latest: - name: instrumentation-pymysql 3.10 Ubuntu + py312-test-instrumentation-mysql-1_ubuntu-latest: + name: instrumentation-mysql-1 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-pymysql -- -ra + run: tox -e py312-test-instrumentation-mysql-1 -- -ra - py311-test-instrumentation-pymysql_ubuntu-latest: - name: instrumentation-pymysql 3.11 Ubuntu + py313-test-instrumentation-mysql-0_ubuntu-latest: + name: instrumentation-mysql-0 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-pymysql -- -ra + run: tox -e py313-test-instrumentation-mysql-0 -- -ra - py312-test-instrumentation-pymysql_ubuntu-latest: - name: instrumentation-pymysql 3.12 Ubuntu + py313-test-instrumentation-mysql-1_ubuntu-latest: + name: instrumentation-mysql-1 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-pymysql -- -ra + run: tox -e py313-test-instrumentation-mysql-1 -- -ra - pypy3-test-instrumentation-pymysql_ubuntu-latest: - name: instrumentation-pymysql pypy-3.8 Ubuntu + pypy3-test-instrumentation-mysql-0_ubuntu-latest: + name: instrumentation-mysql-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -878,10 +860,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-pymysql -- -ra + run: tox -e pypy3-test-instrumentation-mysql-0 -- -ra - py38-test-instrumentation-pyramid_ubuntu-latest: - name: instrumentation-pyramid 3.8 Ubuntu + pypy3-test-instrumentation-mysql-1_ubuntu-latest: + name: instrumentation-mysql-1 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-mysql-1 -- -ra + + py38-test-instrumentation-mysqlclient_ubuntu-latest: + name: instrumentation-mysqlclient 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -896,10 +896,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-pyramid -- -ra + run: tox -e py38-test-instrumentation-mysqlclient -- -ra - py39-test-instrumentation-pyramid_ubuntu-latest: - name: instrumentation-pyramid 3.9 Ubuntu + py39-test-instrumentation-mysqlclient_ubuntu-latest: + name: instrumentation-mysqlclient 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -914,10 +914,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-pyramid -- -ra + run: tox -e py39-test-instrumentation-mysqlclient -- -ra - py310-test-instrumentation-pyramid_ubuntu-latest: - name: instrumentation-pyramid 3.10 Ubuntu + py310-test-instrumentation-mysqlclient_ubuntu-latest: + name: instrumentation-mysqlclient 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -932,10 +932,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-pyramid -- -ra + run: tox -e py310-test-instrumentation-mysqlclient -- -ra - py311-test-instrumentation-pyramid_ubuntu-latest: - name: instrumentation-pyramid 3.11 Ubuntu + py311-test-instrumentation-mysqlclient_ubuntu-latest: + name: instrumentation-mysqlclient 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -950,10 +950,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-pyramid -- -ra + run: tox -e py311-test-instrumentation-mysqlclient -- -ra - py312-test-instrumentation-pyramid_ubuntu-latest: - name: instrumentation-pyramid 3.12 Ubuntu + py312-test-instrumentation-mysqlclient_ubuntu-latest: + name: instrumentation-mysqlclient 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -968,10 +968,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-pyramid -- -ra + run: tox -e py312-test-instrumentation-mysqlclient -- -ra - pypy3-test-instrumentation-pyramid_ubuntu-latest: - name: instrumentation-pyramid pypy-3.8 Ubuntu + py313-test-instrumentation-mysqlclient_ubuntu-latest: + name: instrumentation-mysqlclient 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-mysqlclient -- -ra + + pypy3-test-instrumentation-mysqlclient_ubuntu-latest: + name: instrumentation-mysqlclient pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -986,10 +1004,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-pyramid -- -ra + run: tox -e pypy3-test-instrumentation-mysqlclient -- -ra - py38-test-instrumentation-asgi_ubuntu-latest: - name: instrumentation-asgi 3.8 Ubuntu + py38-test-instrumentation-psycopg2_ubuntu-latest: + name: instrumentation-psycopg2 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1004,10 +1022,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-asgi -- -ra + run: tox -e py38-test-instrumentation-psycopg2 -- -ra - py39-test-instrumentation-asgi_ubuntu-latest: - name: instrumentation-asgi 3.9 Ubuntu + py39-test-instrumentation-psycopg2_ubuntu-latest: + name: instrumentation-psycopg2 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1022,10 +1040,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-asgi -- -ra + run: tox -e py39-test-instrumentation-psycopg2 -- -ra - py310-test-instrumentation-asgi_ubuntu-latest: - name: instrumentation-asgi 3.10 Ubuntu + py310-test-instrumentation-psycopg2_ubuntu-latest: + name: instrumentation-psycopg2 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1040,10 +1058,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-asgi -- -ra + run: tox -e py310-test-instrumentation-psycopg2 -- -ra - py311-test-instrumentation-asgi_ubuntu-latest: - name: instrumentation-asgi 3.11 Ubuntu + py311-test-instrumentation-psycopg2_ubuntu-latest: + name: instrumentation-psycopg2 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1058,10 +1076,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-asgi -- -ra + run: tox -e py311-test-instrumentation-psycopg2 -- -ra - py312-test-instrumentation-asgi_ubuntu-latest: - name: instrumentation-asgi 3.12 Ubuntu + py312-test-instrumentation-psycopg2_ubuntu-latest: + name: instrumentation-psycopg2 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1076,28 +1094,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-asgi -- -ra + run: tox -e py312-test-instrumentation-psycopg2 -- -ra - pypy3-test-instrumentation-asgi_ubuntu-latest: - name: instrumentation-asgi pypy-3.8 Ubuntu + py313-test-instrumentation-psycopg2_ubuntu-latest: + name: instrumentation-psycopg2 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-asgi -- -ra + run: tox -e py313-test-instrumentation-psycopg2 -- -ra - py38-test-instrumentation-asyncpg_ubuntu-latest: - name: instrumentation-asyncpg 3.8 Ubuntu + py38-test-instrumentation-psycopg_ubuntu-latest: + name: instrumentation-psycopg 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1112,10 +1130,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-asyncpg -- -ra + run: tox -e py38-test-instrumentation-psycopg -- -ra - py39-test-instrumentation-asyncpg_ubuntu-latest: - name: instrumentation-asyncpg 3.9 Ubuntu + py39-test-instrumentation-psycopg_ubuntu-latest: + name: instrumentation-psycopg 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1130,10 +1148,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-asyncpg -- -ra + run: tox -e py39-test-instrumentation-psycopg -- -ra - py310-test-instrumentation-asyncpg_ubuntu-latest: - name: instrumentation-asyncpg 3.10 Ubuntu + py310-test-instrumentation-psycopg_ubuntu-latest: + name: instrumentation-psycopg 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1148,10 +1166,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-asyncpg -- -ra + run: tox -e py310-test-instrumentation-psycopg -- -ra - py311-test-instrumentation-asyncpg_ubuntu-latest: - name: instrumentation-asyncpg 3.11 Ubuntu + py311-test-instrumentation-psycopg_ubuntu-latest: + name: instrumentation-psycopg 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1166,10 +1184,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-asyncpg -- -ra + run: tox -e py311-test-instrumentation-psycopg -- -ra - py312-test-instrumentation-asyncpg_ubuntu-latest: - name: instrumentation-asyncpg 3.12 Ubuntu + py312-test-instrumentation-psycopg_ubuntu-latest: + name: instrumentation-psycopg 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1184,118 +1202,118 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-asyncpg -- -ra + run: tox -e py312-test-instrumentation-psycopg -- -ra - py38-test-instrumentation-sqlite3_ubuntu-latest: - name: instrumentation-sqlite3 3.8 Ubuntu + py313-test-instrumentation-psycopg_ubuntu-latest: + name: instrumentation-psycopg 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-sqlite3 -- -ra + run: tox -e py313-test-instrumentation-psycopg -- -ra - py39-test-instrumentation-sqlite3_ubuntu-latest: - name: instrumentation-sqlite3 3.9 Ubuntu + pypy3-test-instrumentation-psycopg_ubuntu-latest: + name: instrumentation-psycopg pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-sqlite3 -- -ra + run: tox -e pypy3-test-instrumentation-psycopg -- -ra - py310-test-instrumentation-sqlite3_ubuntu-latest: - name: instrumentation-sqlite3 3.10 Ubuntu + py38-test-instrumentation-pymemcache-0_ubuntu-latest: + name: instrumentation-pymemcache-0 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-sqlite3 -- -ra + run: tox -e py38-test-instrumentation-pymemcache-0 -- -ra - py311-test-instrumentation-sqlite3_ubuntu-latest: - name: instrumentation-sqlite3 3.11 Ubuntu + py38-test-instrumentation-pymemcache-1_ubuntu-latest: + name: instrumentation-pymemcache-1 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-sqlite3 -- -ra + run: tox -e py38-test-instrumentation-pymemcache-1 -- -ra - py312-test-instrumentation-sqlite3_ubuntu-latest: - name: instrumentation-sqlite3 3.12 Ubuntu + py38-test-instrumentation-pymemcache-2_ubuntu-latest: + name: instrumentation-pymemcache-2 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-sqlite3 -- -ra + run: tox -e py38-test-instrumentation-pymemcache-2 -- -ra - pypy3-test-instrumentation-sqlite3_ubuntu-latest: - name: instrumentation-sqlite3 pypy-3.8 Ubuntu + py38-test-instrumentation-pymemcache-3_ubuntu-latest: + name: instrumentation-pymemcache-3 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 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-sqlite3 -- -ra + run: tox -e py38-test-instrumentation-pymemcache-3 -- -ra - py38-test-instrumentation-wsgi_ubuntu-latest: - name: instrumentation-wsgi 3.8 Ubuntu + py38-test-instrumentation-pymemcache-4_ubuntu-latest: + name: instrumentation-pymemcache-4 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1310,10 +1328,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-wsgi -- -ra + run: tox -e py38-test-instrumentation-pymemcache-4 -- -ra - py39-test-instrumentation-wsgi_ubuntu-latest: - name: instrumentation-wsgi 3.9 Ubuntu + py39-test-instrumentation-pymemcache-0_ubuntu-latest: + name: instrumentation-pymemcache-0 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1328,154 +1346,154 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-wsgi -- -ra + run: tox -e py39-test-instrumentation-pymemcache-0 -- -ra - py310-test-instrumentation-wsgi_ubuntu-latest: - name: instrumentation-wsgi 3.10 Ubuntu + py39-test-instrumentation-pymemcache-1_ubuntu-latest: + name: instrumentation-pymemcache-1 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-wsgi -- -ra + run: tox -e py39-test-instrumentation-pymemcache-1 -- -ra - py311-test-instrumentation-wsgi_ubuntu-latest: - name: instrumentation-wsgi 3.11 Ubuntu + py39-test-instrumentation-pymemcache-2_ubuntu-latest: + name: instrumentation-pymemcache-2 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-wsgi -- -ra + run: tox -e py39-test-instrumentation-pymemcache-2 -- -ra - py312-test-instrumentation-wsgi_ubuntu-latest: - name: instrumentation-wsgi 3.12 Ubuntu + py39-test-instrumentation-pymemcache-3_ubuntu-latest: + name: instrumentation-pymemcache-3 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-wsgi -- -ra + run: tox -e py39-test-instrumentation-pymemcache-3 -- -ra - pypy3-test-instrumentation-wsgi_ubuntu-latest: - name: instrumentation-wsgi pypy-3.8 Ubuntu + py39-test-instrumentation-pymemcache-4_ubuntu-latest: + name: instrumentation-pymemcache-4 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-wsgi -- -ra + run: tox -e py39-test-instrumentation-pymemcache-4 -- -ra - py38-test-instrumentation-grpc-0_ubuntu-latest: - name: instrumentation-grpc-0 3.8 Ubuntu + py310-test-instrumentation-pymemcache-0_ubuntu-latest: + name: instrumentation-pymemcache-0 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-grpc-0 -- -ra + run: tox -e py310-test-instrumentation-pymemcache-0 -- -ra - py38-test-instrumentation-grpc-1_ubuntu-latest: - name: instrumentation-grpc-1 3.8 Ubuntu + py310-test-instrumentation-pymemcache-1_ubuntu-latest: + name: instrumentation-pymemcache-1 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-grpc-1 -- -ra + run: tox -e py310-test-instrumentation-pymemcache-1 -- -ra - py39-test-instrumentation-grpc-0_ubuntu-latest: - name: instrumentation-grpc-0 3.9 Ubuntu + py310-test-instrumentation-pymemcache-2_ubuntu-latest: + name: instrumentation-pymemcache-2 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-grpc-0 -- -ra + run: tox -e py310-test-instrumentation-pymemcache-2 -- -ra - py39-test-instrumentation-grpc-1_ubuntu-latest: - name: instrumentation-grpc-1 3.9 Ubuntu + py310-test-instrumentation-pymemcache-3_ubuntu-latest: + name: instrumentation-pymemcache-3 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-grpc-1 -- -ra + run: tox -e py310-test-instrumentation-pymemcache-3 -- -ra - py310-test-instrumentation-grpc-0_ubuntu-latest: - name: instrumentation-grpc-0 3.10 Ubuntu + py310-test-instrumentation-pymemcache-4_ubuntu-latest: + name: instrumentation-pymemcache-4 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1490,28 +1508,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-grpc-0 -- -ra + run: tox -e py310-test-instrumentation-pymemcache-4 -- -ra - py310-test-instrumentation-grpc-1_ubuntu-latest: - name: instrumentation-grpc-1 3.10 Ubuntu + py311-test-instrumentation-pymemcache-0_ubuntu-latest: + name: instrumentation-pymemcache-0 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-grpc-1 -- -ra + run: tox -e py311-test-instrumentation-pymemcache-0 -- -ra - py311-test-instrumentation-grpc-0_ubuntu-latest: - name: instrumentation-grpc-0 3.11 Ubuntu + py311-test-instrumentation-pymemcache-1_ubuntu-latest: + name: instrumentation-pymemcache-1 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1526,10 +1544,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-grpc-0 -- -ra + run: tox -e py311-test-instrumentation-pymemcache-1 -- -ra - py311-test-instrumentation-grpc-1_ubuntu-latest: - name: instrumentation-grpc-1 3.11 Ubuntu + py311-test-instrumentation-pymemcache-2_ubuntu-latest: + name: instrumentation-pymemcache-2 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1544,10 +1562,46 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-grpc-1 -- -ra + run: tox -e py311-test-instrumentation-pymemcache-2 -- -ra - py312-test-instrumentation-grpc-0_ubuntu-latest: - name: instrumentation-grpc-0 3.12 Ubuntu + py311-test-instrumentation-pymemcache-3_ubuntu-latest: + name: instrumentation-pymemcache-3 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-pymemcache-3 -- -ra + + py311-test-instrumentation-pymemcache-4_ubuntu-latest: + name: instrumentation-pymemcache-4 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-pymemcache-4 -- -ra + + py312-test-instrumentation-pymemcache-0_ubuntu-latest: + name: instrumentation-pymemcache-0 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1562,10 +1616,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-grpc-0 -- -ra + run: tox -e py312-test-instrumentation-pymemcache-0 -- -ra - py312-test-instrumentation-grpc-1_ubuntu-latest: - name: instrumentation-grpc-1 3.12 Ubuntu + py312-test-instrumentation-pymemcache-1_ubuntu-latest: + name: instrumentation-pymemcache-1 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1580,190 +1634,190 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-grpc-1 -- -ra + run: tox -e py312-test-instrumentation-pymemcache-1 -- -ra - py38-test-instrumentation-sqlalchemy-1_ubuntu-latest: - name: instrumentation-sqlalchemy-1 3.8 Ubuntu + py312-test-instrumentation-pymemcache-2_ubuntu-latest: + name: instrumentation-pymemcache-2 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-sqlalchemy-1 -- -ra + run: tox -e py312-test-instrumentation-pymemcache-2 -- -ra - py38-test-instrumentation-sqlalchemy-2_ubuntu-latest: - name: instrumentation-sqlalchemy-2 3.8 Ubuntu + py312-test-instrumentation-pymemcache-3_ubuntu-latest: + name: instrumentation-pymemcache-3 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-sqlalchemy-2 -- -ra + run: tox -e py312-test-instrumentation-pymemcache-3 -- -ra - py39-test-instrumentation-sqlalchemy-1_ubuntu-latest: - name: instrumentation-sqlalchemy-1 3.9 Ubuntu + py312-test-instrumentation-pymemcache-4_ubuntu-latest: + name: instrumentation-pymemcache-4 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-sqlalchemy-1 -- -ra + run: tox -e py312-test-instrumentation-pymemcache-4 -- -ra - py39-test-instrumentation-sqlalchemy-2_ubuntu-latest: - name: instrumentation-sqlalchemy-2 3.9 Ubuntu + py313-test-instrumentation-pymemcache-0_ubuntu-latest: + name: instrumentation-pymemcache-0 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-sqlalchemy-2 -- -ra + run: tox -e py313-test-instrumentation-pymemcache-0 -- -ra - py310-test-instrumentation-sqlalchemy-1_ubuntu-latest: - name: instrumentation-sqlalchemy-1 3.10 Ubuntu + py313-test-instrumentation-pymemcache-1_ubuntu-latest: + name: instrumentation-pymemcache-1 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-sqlalchemy-1 -- -ra + run: tox -e py313-test-instrumentation-pymemcache-1 -- -ra - py310-test-instrumentation-sqlalchemy-2_ubuntu-latest: - name: instrumentation-sqlalchemy-2 3.10 Ubuntu + py313-test-instrumentation-pymemcache-2_ubuntu-latest: + name: instrumentation-pymemcache-2 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-sqlalchemy-2 -- -ra + run: tox -e py313-test-instrumentation-pymemcache-2 -- -ra - py311-test-instrumentation-sqlalchemy-1_ubuntu-latest: - name: instrumentation-sqlalchemy-1 3.11 Ubuntu + py313-test-instrumentation-pymemcache-3_ubuntu-latest: + name: instrumentation-pymemcache-3 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-sqlalchemy-1 -- -ra + run: tox -e py313-test-instrumentation-pymemcache-3 -- -ra - py311-test-instrumentation-sqlalchemy-2_ubuntu-latest: - name: instrumentation-sqlalchemy-2 3.11 Ubuntu + py313-test-instrumentation-pymemcache-4_ubuntu-latest: + name: instrumentation-pymemcache-4 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-sqlalchemy-2 -- -ra + run: tox -e py313-test-instrumentation-pymemcache-4 -- -ra - py312-test-instrumentation-sqlalchemy-1_ubuntu-latest: - name: instrumentation-sqlalchemy-1 3.12 Ubuntu + pypy3-test-instrumentation-pymemcache-0_ubuntu-latest: + name: instrumentation-pymemcache-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-sqlalchemy-1 -- -ra + run: tox -e pypy3-test-instrumentation-pymemcache-0 -- -ra - py312-test-instrumentation-sqlalchemy-2_ubuntu-latest: - name: instrumentation-sqlalchemy-2 3.12 Ubuntu + pypy3-test-instrumentation-pymemcache-1_ubuntu-latest: + name: instrumentation-pymemcache-1 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-sqlalchemy-2 -- -ra + run: tox -e pypy3-test-instrumentation-pymemcache-1 -- -ra - pypy3-test-instrumentation-sqlalchemy-0_ubuntu-latest: - name: instrumentation-sqlalchemy-0 pypy-3.8 Ubuntu + pypy3-test-instrumentation-pymemcache-2_ubuntu-latest: + name: instrumentation-pymemcache-2 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1778,10 +1832,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-sqlalchemy-0 -- -ra + run: tox -e pypy3-test-instrumentation-pymemcache-2 -- -ra - pypy3-test-instrumentation-sqlalchemy-1_ubuntu-latest: - name: instrumentation-sqlalchemy-1 pypy-3.8 Ubuntu + pypy3-test-instrumentation-pymemcache-3_ubuntu-latest: + name: instrumentation-pymemcache-3 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1796,10 +1850,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-sqlalchemy-1 -- -ra + run: tox -e pypy3-test-instrumentation-pymemcache-3 -- -ra - pypy3-test-instrumentation-sqlalchemy-2_ubuntu-latest: - name: instrumentation-sqlalchemy-2 pypy-3.8 Ubuntu + pypy3-test-instrumentation-pymemcache-4_ubuntu-latest: + name: instrumentation-pymemcache-4 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1814,10 +1868,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-sqlalchemy-2 -- -ra + run: tox -e pypy3-test-instrumentation-pymemcache-4 -- -ra - py38-test-instrumentation-redis_ubuntu-latest: - name: instrumentation-redis 3.8 Ubuntu + py38-test-instrumentation-pymongo_ubuntu-latest: + name: instrumentation-pymongo 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1832,10 +1886,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-redis -- -ra + run: tox -e py38-test-instrumentation-pymongo -- -ra - py39-test-instrumentation-redis_ubuntu-latest: - name: instrumentation-redis 3.9 Ubuntu + py39-test-instrumentation-pymongo_ubuntu-latest: + name: instrumentation-pymongo 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1850,10 +1904,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-redis -- -ra + run: tox -e py39-test-instrumentation-pymongo -- -ra - py310-test-instrumentation-redis_ubuntu-latest: - name: instrumentation-redis 3.10 Ubuntu + py310-test-instrumentation-pymongo_ubuntu-latest: + name: instrumentation-pymongo 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1868,10 +1922,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-redis -- -ra + run: tox -e py310-test-instrumentation-pymongo -- -ra - py311-test-instrumentation-redis_ubuntu-latest: - name: instrumentation-redis 3.11 Ubuntu + py311-test-instrumentation-pymongo_ubuntu-latest: + name: instrumentation-pymongo 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1886,10 +1940,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-redis -- -ra + run: tox -e py311-test-instrumentation-pymongo -- -ra - py312-test-instrumentation-redis_ubuntu-latest: - name: instrumentation-redis 3.12 Ubuntu + py312-test-instrumentation-pymongo_ubuntu-latest: + name: instrumentation-pymongo 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1904,10 +1958,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-redis -- -ra + run: tox -e py312-test-instrumentation-pymongo -- -ra - pypy3-test-instrumentation-redis_ubuntu-latest: - name: instrumentation-redis pypy-3.8 Ubuntu + py313-test-instrumentation-pymongo_ubuntu-latest: + name: instrumentation-pymongo 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-pymongo -- -ra + + pypy3-test-instrumentation-pymongo_ubuntu-latest: + name: instrumentation-pymongo pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1922,10 +1994,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-redis -- -ra + run: tox -e pypy3-test-instrumentation-pymongo -- -ra - py38-test-instrumentation-remoulade_ubuntu-latest: - name: instrumentation-remoulade 3.8 Ubuntu + py38-test-instrumentation-pymysql_ubuntu-latest: + name: instrumentation-pymysql 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1940,10 +2012,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-remoulade -- -ra + run: tox -e py38-test-instrumentation-pymysql -- -ra - py39-test-instrumentation-remoulade_ubuntu-latest: - name: instrumentation-remoulade 3.9 Ubuntu + py39-test-instrumentation-pymysql_ubuntu-latest: + name: instrumentation-pymysql 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1958,10 +2030,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-remoulade -- -ra + run: tox -e py39-test-instrumentation-pymysql -- -ra - py310-test-instrumentation-remoulade_ubuntu-latest: - name: instrumentation-remoulade 3.10 Ubuntu + py310-test-instrumentation-pymysql_ubuntu-latest: + name: instrumentation-pymysql 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1976,10 +2048,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-remoulade -- -ra + run: tox -e py310-test-instrumentation-pymysql -- -ra - py311-test-instrumentation-remoulade_ubuntu-latest: - name: instrumentation-remoulade 3.11 Ubuntu + py311-test-instrumentation-pymysql_ubuntu-latest: + name: instrumentation-pymysql 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -1994,10 +2066,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-remoulade -- -ra + run: tox -e py311-test-instrumentation-pymysql -- -ra - py312-test-instrumentation-remoulade_ubuntu-latest: - name: instrumentation-remoulade 3.12 Ubuntu + py312-test-instrumentation-pymysql_ubuntu-latest: + name: instrumentation-pymysql 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2012,100 +2084,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-remoulade -- -ra - - py38-test-instrumentation-celery_ubuntu-latest: - name: instrumentation-celery 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 - - - name: Run tests - run: tox -e py38-test-instrumentation-celery -- -ra - - py39-test-instrumentation-celery_ubuntu-latest: - name: instrumentation-celery 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 - - - name: Run tests - run: tox -e py39-test-instrumentation-celery -- -ra - - py310-test-instrumentation-celery_ubuntu-latest: - name: instrumentation-celery 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 - - - name: Run tests - run: tox -e py310-test-instrumentation-celery -- -ra - - py311-test-instrumentation-celery_ubuntu-latest: - name: instrumentation-celery 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 - - - name: Run tests - run: tox -e py311-test-instrumentation-celery -- -ra + run: tox -e py312-test-instrumentation-pymysql -- -ra - py312-test-instrumentation-celery_ubuntu-latest: - name: instrumentation-celery 3.12 Ubuntu + py313-test-instrumentation-pymysql_ubuntu-latest: + name: instrumentation-pymysql 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-celery -- -ra + run: tox -e py313-test-instrumentation-pymysql -- -ra - pypy3-test-instrumentation-celery_ubuntu-latest: - name: instrumentation-celery pypy-3.8 Ubuntu + pypy3-test-instrumentation-pymysql_ubuntu-latest: + name: instrumentation-pymysql pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2120,10 +2120,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-celery -- -ra + run: tox -e pypy3-test-instrumentation-pymysql -- -ra - py38-test-instrumentation-system-metrics_ubuntu-latest: - name: instrumentation-system-metrics 3.8 Ubuntu + py38-test-instrumentation-pyramid_ubuntu-latest: + name: instrumentation-pyramid 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2138,10 +2138,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-system-metrics -- -ra + run: tox -e py38-test-instrumentation-pyramid -- -ra - py39-test-instrumentation-system-metrics_ubuntu-latest: - name: instrumentation-system-metrics 3.9 Ubuntu + py39-test-instrumentation-pyramid_ubuntu-latest: + name: instrumentation-pyramid 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2156,10 +2156,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-system-metrics -- -ra + run: tox -e py39-test-instrumentation-pyramid -- -ra - py310-test-instrumentation-system-metrics_ubuntu-latest: - name: instrumentation-system-metrics 3.10 Ubuntu + py310-test-instrumentation-pyramid_ubuntu-latest: + name: instrumentation-pyramid 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2174,10 +2174,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-system-metrics -- -ra + run: tox -e py310-test-instrumentation-pyramid -- -ra - py311-test-instrumentation-system-metrics_ubuntu-latest: - name: instrumentation-system-metrics 3.11 Ubuntu + py311-test-instrumentation-pyramid_ubuntu-latest: + name: instrumentation-pyramid 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2192,10 +2192,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-system-metrics -- -ra + run: tox -e py311-test-instrumentation-pyramid -- -ra - py312-test-instrumentation-system-metrics_ubuntu-latest: - name: instrumentation-system-metrics 3.12 Ubuntu + py312-test-instrumentation-pyramid_ubuntu-latest: + name: instrumentation-pyramid 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2210,10 +2210,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-system-metrics -- -ra + run: tox -e py312-test-instrumentation-pyramid -- -ra - pypy3-test-instrumentation-system-metrics_ubuntu-latest: - name: instrumentation-system-metrics pypy-3.8 Ubuntu + pypy3-test-instrumentation-pyramid_ubuntu-latest: + name: instrumentation-pyramid pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2228,10 +2228,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-system-metrics -- -ra + run: tox -e pypy3-test-instrumentation-pyramid -- -ra - py38-test-instrumentation-threading_ubuntu-latest: - name: instrumentation-threading 3.8 Ubuntu + py38-test-instrumentation-asgi_ubuntu-latest: + name: instrumentation-asgi 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2246,10 +2246,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-threading -- -ra + run: tox -e py38-test-instrumentation-asgi -- -ra - py39-test-instrumentation-threading_ubuntu-latest: - name: instrumentation-threading 3.9 Ubuntu + py39-test-instrumentation-asgi_ubuntu-latest: + name: instrumentation-asgi 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2264,10 +2264,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-threading -- -ra + run: tox -e py39-test-instrumentation-asgi -- -ra - py310-test-instrumentation-threading_ubuntu-latest: - name: instrumentation-threading 3.10 Ubuntu + py310-test-instrumentation-asgi_ubuntu-latest: + name: instrumentation-asgi 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2282,10 +2282,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-threading -- -ra + run: tox -e py310-test-instrumentation-asgi -- -ra - py311-test-instrumentation-threading_ubuntu-latest: - name: instrumentation-threading 3.11 Ubuntu + py311-test-instrumentation-asgi_ubuntu-latest: + name: instrumentation-asgi 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2300,10 +2300,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-threading -- -ra + run: tox -e py311-test-instrumentation-asgi -- -ra - py312-test-instrumentation-threading_ubuntu-latest: - name: instrumentation-threading 3.12 Ubuntu + py312-test-instrumentation-asgi_ubuntu-latest: + name: instrumentation-asgi 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2318,10 +2318,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-threading -- -ra + run: tox -e py312-test-instrumentation-asgi -- -ra - pypy3-test-instrumentation-threading_ubuntu-latest: - name: instrumentation-threading pypy-3.8 Ubuntu + py313-test-instrumentation-asgi_ubuntu-latest: + name: instrumentation-asgi 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-asgi -- -ra + + pypy3-test-instrumentation-asgi_ubuntu-latest: + name: instrumentation-asgi pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2336,10 +2354,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-threading -- -ra + run: tox -e pypy3-test-instrumentation-asgi -- -ra - py38-test-instrumentation-tornado_ubuntu-latest: - name: instrumentation-tornado 3.8 Ubuntu + py38-test-instrumentation-asyncpg_ubuntu-latest: + name: instrumentation-asyncpg 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2354,10 +2372,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-tornado -- -ra + run: tox -e py38-test-instrumentation-asyncpg -- -ra - py39-test-instrumentation-tornado_ubuntu-latest: - name: instrumentation-tornado 3.9 Ubuntu + py39-test-instrumentation-asyncpg_ubuntu-latest: + name: instrumentation-asyncpg 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2372,10 +2390,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-tornado -- -ra + run: tox -e py39-test-instrumentation-asyncpg -- -ra - py310-test-instrumentation-tornado_ubuntu-latest: - name: instrumentation-tornado 3.10 Ubuntu + py310-test-instrumentation-asyncpg_ubuntu-latest: + name: instrumentation-asyncpg 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2390,10 +2408,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-tornado -- -ra + run: tox -e py310-test-instrumentation-asyncpg -- -ra - py311-test-instrumentation-tornado_ubuntu-latest: - name: instrumentation-tornado 3.11 Ubuntu + py311-test-instrumentation-asyncpg_ubuntu-latest: + name: instrumentation-asyncpg 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2408,10 +2426,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-tornado -- -ra + run: tox -e py311-test-instrumentation-asyncpg -- -ra - py312-test-instrumentation-tornado_ubuntu-latest: - name: instrumentation-tornado 3.12 Ubuntu + py312-test-instrumentation-asyncpg_ubuntu-latest: + name: instrumentation-asyncpg 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2426,28 +2444,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-tornado -- -ra + run: tox -e py312-test-instrumentation-asyncpg -- -ra - pypy3-test-instrumentation-tornado_ubuntu-latest: - name: instrumentation-tornado pypy-3.8 Ubuntu + py313-test-instrumentation-asyncpg_ubuntu-latest: + name: instrumentation-asyncpg 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-tornado -- -ra + run: tox -e py313-test-instrumentation-asyncpg -- -ra - py38-test-instrumentation-tortoiseorm_ubuntu-latest: - name: instrumentation-tortoiseorm 3.8 Ubuntu + py38-test-instrumentation-sqlite3_ubuntu-latest: + name: instrumentation-sqlite3 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2462,10 +2480,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-tortoiseorm -- -ra + run: tox -e py38-test-instrumentation-sqlite3 -- -ra - py39-test-instrumentation-tortoiseorm_ubuntu-latest: - name: instrumentation-tortoiseorm 3.9 Ubuntu + py39-test-instrumentation-sqlite3_ubuntu-latest: + name: instrumentation-sqlite3 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2480,10 +2498,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-tortoiseorm -- -ra + run: tox -e py39-test-instrumentation-sqlite3 -- -ra - py310-test-instrumentation-tortoiseorm_ubuntu-latest: - name: instrumentation-tortoiseorm 3.10 Ubuntu + py310-test-instrumentation-sqlite3_ubuntu-latest: + name: instrumentation-sqlite3 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2498,10 +2516,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-tortoiseorm -- -ra + run: tox -e py310-test-instrumentation-sqlite3 -- -ra - py311-test-instrumentation-tortoiseorm_ubuntu-latest: - name: instrumentation-tortoiseorm 3.11 Ubuntu + py311-test-instrumentation-sqlite3_ubuntu-latest: + name: instrumentation-sqlite3 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2516,10 +2534,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-tortoiseorm -- -ra + run: tox -e py311-test-instrumentation-sqlite3 -- -ra - py312-test-instrumentation-tortoiseorm_ubuntu-latest: - name: instrumentation-tortoiseorm 3.12 Ubuntu + py312-test-instrumentation-sqlite3_ubuntu-latest: + name: instrumentation-sqlite3 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2534,46 +2552,46 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-tortoiseorm -- -ra + run: tox -e py312-test-instrumentation-sqlite3 -- -ra - pypy3-test-instrumentation-tortoiseorm_ubuntu-latest: - name: instrumentation-tortoiseorm pypy-3.8 Ubuntu + py313-test-instrumentation-sqlite3_ubuntu-latest: + name: instrumentation-sqlite3 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-tortoiseorm -- -ra + run: tox -e py313-test-instrumentation-sqlite3 -- -ra - py38-test-instrumentation-httpx-0_ubuntu-latest: - name: instrumentation-httpx-0 3.8 Ubuntu + pypy3-test-instrumentation-sqlite3_ubuntu-latest: + name: instrumentation-sqlite3 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-httpx-0 -- -ra + run: tox -e pypy3-test-instrumentation-sqlite3 -- -ra - py38-test-instrumentation-httpx-1_ubuntu-latest: - name: instrumentation-httpx-1 3.8 Ubuntu + py38-test-instrumentation-wsgi_ubuntu-latest: + name: instrumentation-wsgi 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2588,28 +2606,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-httpx-1 -- -ra - - py39-test-instrumentation-httpx-0_ubuntu-latest: - name: instrumentation-httpx-0 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 - - - name: Run tests - run: tox -e py39-test-instrumentation-httpx-0 -- -ra + run: tox -e py38-test-instrumentation-wsgi -- -ra - py39-test-instrumentation-httpx-1_ubuntu-latest: - name: instrumentation-httpx-1 3.9 Ubuntu + py39-test-instrumentation-wsgi_ubuntu-latest: + name: instrumentation-wsgi 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2624,28 +2624,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-httpx-1 -- -ra - - py310-test-instrumentation-httpx-0_ubuntu-latest: - name: instrumentation-httpx-0 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 - - - name: Run tests - run: tox -e py310-test-instrumentation-httpx-0 -- -ra + run: tox -e py39-test-instrumentation-wsgi -- -ra - py310-test-instrumentation-httpx-1_ubuntu-latest: - name: instrumentation-httpx-1 3.10 Ubuntu + py310-test-instrumentation-wsgi_ubuntu-latest: + name: instrumentation-wsgi 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2660,28 +2642,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-httpx-1 -- -ra - - py311-test-instrumentation-httpx-0_ubuntu-latest: - name: instrumentation-httpx-0 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 - - - name: Run tests - run: tox -e py311-test-instrumentation-httpx-0 -- -ra + run: tox -e py310-test-instrumentation-wsgi -- -ra - py311-test-instrumentation-httpx-1_ubuntu-latest: - name: instrumentation-httpx-1 3.11 Ubuntu + py311-test-instrumentation-wsgi_ubuntu-latest: + name: instrumentation-wsgi 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2696,10 +2660,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-httpx-1 -- -ra + run: tox -e py311-test-instrumentation-wsgi -- -ra - py312-test-instrumentation-httpx-0_ubuntu-latest: - name: instrumentation-httpx-0 3.12 Ubuntu + py312-test-instrumentation-wsgi_ubuntu-latest: + name: instrumentation-wsgi 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2714,28 +2678,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-httpx-0 -- -ra + run: tox -e py312-test-instrumentation-wsgi -- -ra - py312-test-instrumentation-httpx-1_ubuntu-latest: - name: instrumentation-httpx-1 3.12 Ubuntu + py313-test-instrumentation-wsgi_ubuntu-latest: + name: instrumentation-wsgi 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-httpx-1 -- -ra + run: tox -e py313-test-instrumentation-wsgi -- -ra - pypy3-test-instrumentation-httpx-0_ubuntu-latest: - name: instrumentation-httpx-0 pypy-3.8 Ubuntu + pypy3-test-instrumentation-wsgi_ubuntu-latest: + name: instrumentation-wsgi pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2750,28 +2714,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-httpx-0 -- -ra + run: tox -e pypy3-test-instrumentation-wsgi -- -ra - pypy3-test-instrumentation-httpx-1_ubuntu-latest: - name: instrumentation-httpx-1 pypy-3.8 Ubuntu + py38-test-instrumentation-grpc-0_ubuntu-latest: + name: instrumentation-grpc-0 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 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-httpx-1 -- -ra + run: tox -e py38-test-instrumentation-grpc-0 -- -ra - py38-test-util-http_ubuntu-latest: - name: util-http 3.8 Ubuntu + py38-test-instrumentation-grpc-1_ubuntu-latest: + name: instrumentation-grpc-1 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2786,10 +2750,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-util-http -- -ra + run: tox -e py38-test-instrumentation-grpc-1 -- -ra - py39-test-util-http_ubuntu-latest: - name: util-http 3.9 Ubuntu + py39-test-instrumentation-grpc-0_ubuntu-latest: + name: instrumentation-grpc-0 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -2804,388 +2768,370 @@ jobs: run: pip install tox - 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 - - - name: Run tests - run: tox -e py310-test-util-http -- -ra + run: tox -e py39-test-instrumentation-grpc-0 -- -ra - py311-test-util-http_ubuntu-latest: - name: util-http 3.11 Ubuntu + py39-test-instrumentation-grpc-1_ubuntu-latest: + name: instrumentation-grpc-1 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-util-http -- -ra + run: tox -e py39-test-instrumentation-grpc-1 -- -ra - py312-test-util-http_ubuntu-latest: - name: util-http 3.12 Ubuntu + py310-test-instrumentation-grpc-0_ubuntu-latest: + name: instrumentation-grpc-0 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-util-http -- -ra + run: tox -e py310-test-instrumentation-grpc-0 -- -ra - pypy3-test-util-http_ubuntu-latest: - name: util-http pypy-3.8 Ubuntu + py310-test-instrumentation-grpc-1_ubuntu-latest: + name: instrumentation-grpc-1 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-util-http -- -ra + run: tox -e py310-test-instrumentation-grpc-1 -- -ra - py38-test-propagator-aws-xray-0_ubuntu-latest: - name: propagator-aws-xray-0 3.8 Ubuntu + py311-test-instrumentation-grpc-0_ubuntu-latest: + name: instrumentation-grpc-0 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-propagator-aws-xray-0 -- -ra + run: tox -e py311-test-instrumentation-grpc-0 -- -ra - py38-test-propagator-aws-xray-1_ubuntu-latest: - name: propagator-aws-xray-1 3.8 Ubuntu + py311-test-instrumentation-grpc-1_ubuntu-latest: + name: instrumentation-grpc-1 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-propagator-aws-xray-1 -- -ra + run: tox -e py311-test-instrumentation-grpc-1 -- -ra - py39-test-propagator-aws-xray-0_ubuntu-latest: - name: propagator-aws-xray-0 3.9 Ubuntu + py312-test-instrumentation-grpc-0_ubuntu-latest: + name: instrumentation-grpc-0 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-propagator-aws-xray-0 -- -ra + run: tox -e py312-test-instrumentation-grpc-0 -- -ra - py39-test-propagator-aws-xray-1_ubuntu-latest: - name: propagator-aws-xray-1 3.9 Ubuntu + py312-test-instrumentation-grpc-1_ubuntu-latest: + name: instrumentation-grpc-1 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-propagator-aws-xray-1 -- -ra + run: tox -e py312-test-instrumentation-grpc-1 -- -ra - py310-test-propagator-aws-xray-0_ubuntu-latest: - name: propagator-aws-xray-0 3.10 Ubuntu + py313-test-instrumentation-grpc-1_ubuntu-latest: + name: instrumentation-grpc-1 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-propagator-aws-xray-0 -- -ra + run: tox -e py313-test-instrumentation-grpc-1 -- -ra - py310-test-propagator-aws-xray-1_ubuntu-latest: - name: propagator-aws-xray-1 3.10 Ubuntu + py38-test-instrumentation-sqlalchemy-1_ubuntu-latest: + name: instrumentation-sqlalchemy-1 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-propagator-aws-xray-1 -- -ra + run: tox -e py38-test-instrumentation-sqlalchemy-1 -- -ra - py311-test-propagator-aws-xray-0_ubuntu-latest: - name: propagator-aws-xray-0 3.11 Ubuntu + py38-test-instrumentation-sqlalchemy-2_ubuntu-latest: + name: instrumentation-sqlalchemy-2 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-propagator-aws-xray-0 -- -ra + run: tox -e py38-test-instrumentation-sqlalchemy-2 -- -ra - py311-test-propagator-aws-xray-1_ubuntu-latest: - name: propagator-aws-xray-1 3.11 Ubuntu + py39-test-instrumentation-sqlalchemy-1_ubuntu-latest: + name: instrumentation-sqlalchemy-1 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-propagator-aws-xray-1 -- -ra + run: tox -e py39-test-instrumentation-sqlalchemy-1 -- -ra - py312-test-propagator-aws-xray-0_ubuntu-latest: - name: propagator-aws-xray-0 3.12 Ubuntu + py39-test-instrumentation-sqlalchemy-2_ubuntu-latest: + name: instrumentation-sqlalchemy-2 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-propagator-aws-xray-0 -- -ra + run: tox -e py39-test-instrumentation-sqlalchemy-2 -- -ra - py312-test-propagator-aws-xray-1_ubuntu-latest: - name: propagator-aws-xray-1 3.12 Ubuntu + py310-test-instrumentation-sqlalchemy-1_ubuntu-latest: + name: instrumentation-sqlalchemy-1 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-propagator-aws-xray-1 -- -ra + run: tox -e py310-test-instrumentation-sqlalchemy-1 -- -ra - pypy3-test-propagator-aws-xray-0_ubuntu-latest: - name: propagator-aws-xray-0 pypy-3.8 Ubuntu + py310-test-instrumentation-sqlalchemy-2_ubuntu-latest: + name: instrumentation-sqlalchemy-2 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-propagator-aws-xray-0 -- -ra + run: tox -e py310-test-instrumentation-sqlalchemy-2 -- -ra - pypy3-test-propagator-aws-xray-1_ubuntu-latest: - name: propagator-aws-xray-1 pypy-3.8 Ubuntu + py311-test-instrumentation-sqlalchemy-1_ubuntu-latest: + name: instrumentation-sqlalchemy-1 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-propagator-aws-xray-1 -- -ra + run: tox -e py311-test-instrumentation-sqlalchemy-1 -- -ra - py38-test-propagator-ot-trace_ubuntu-latest: - name: propagator-ot-trace 3.8 Ubuntu + py311-test-instrumentation-sqlalchemy-2_ubuntu-latest: + name: instrumentation-sqlalchemy-2 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-propagator-ot-trace -- -ra + run: tox -e py311-test-instrumentation-sqlalchemy-2 -- -ra - py39-test-propagator-ot-trace_ubuntu-latest: - name: propagator-ot-trace 3.9 Ubuntu + py312-test-instrumentation-sqlalchemy-1_ubuntu-latest: + name: instrumentation-sqlalchemy-1 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-propagator-ot-trace -- -ra + run: tox -e py312-test-instrumentation-sqlalchemy-1 -- -ra - py310-test-propagator-ot-trace_ubuntu-latest: - name: propagator-ot-trace 3.10 Ubuntu + py312-test-instrumentation-sqlalchemy-2_ubuntu-latest: + name: instrumentation-sqlalchemy-2 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-propagator-ot-trace -- -ra + run: tox -e py312-test-instrumentation-sqlalchemy-2 -- -ra - py311-test-propagator-ot-trace_ubuntu-latest: - name: propagator-ot-trace 3.11 Ubuntu + py313-test-instrumentation-sqlalchemy-1_ubuntu-latest: + name: instrumentation-sqlalchemy-1 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-propagator-ot-trace -- -ra + run: tox -e py313-test-instrumentation-sqlalchemy-1 -- -ra - py312-test-propagator-ot-trace_ubuntu-latest: - name: propagator-ot-trace 3.12 Ubuntu + py313-test-instrumentation-sqlalchemy-2_ubuntu-latest: + name: instrumentation-sqlalchemy-2 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-propagator-ot-trace -- -ra + run: tox -e py313-test-instrumentation-sqlalchemy-2 -- -ra - pypy3-test-propagator-ot-trace_ubuntu-latest: - name: propagator-ot-trace pypy-3.8 Ubuntu + pypy3-test-instrumentation-sqlalchemy-0_ubuntu-latest: + name: instrumentation-sqlalchemy-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3200,64 +3146,64 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-propagator-ot-trace -- -ra + run: tox -e pypy3-test-instrumentation-sqlalchemy-0 -- -ra - py38-test-instrumentation-sio-pika-0_ubuntu-latest: - name: instrumentation-sio-pika-0 3.8 Ubuntu + pypy3-test-instrumentation-sqlalchemy-1_ubuntu-latest: + name: instrumentation-sqlalchemy-1 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-sio-pika-0 -- -ra + run: tox -e pypy3-test-instrumentation-sqlalchemy-1 -- -ra - py38-test-instrumentation-sio-pika-1_ubuntu-latest: - name: instrumentation-sio-pika-1 3.8 Ubuntu + pypy3-test-instrumentation-sqlalchemy-2_ubuntu-latest: + name: instrumentation-sqlalchemy-2 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-sio-pika-1 -- -ra + run: tox -e pypy3-test-instrumentation-sqlalchemy-2 -- -ra - py39-test-instrumentation-sio-pika-0_ubuntu-latest: - name: instrumentation-sio-pika-0 3.9 Ubuntu + py38-test-instrumentation-redis_ubuntu-latest: + name: instrumentation-redis 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-sio-pika-0 -- -ra + run: tox -e py38-test-instrumentation-redis -- -ra - py39-test-instrumentation-sio-pika-1_ubuntu-latest: - name: instrumentation-sio-pika-1 3.9 Ubuntu + py39-test-instrumentation-redis_ubuntu-latest: + name: instrumentation-redis 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3272,10 +3218,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-sio-pika-1 -- -ra + run: tox -e py39-test-instrumentation-redis -- -ra - py310-test-instrumentation-sio-pika-0_ubuntu-latest: - name: instrumentation-sio-pika-0 3.10 Ubuntu + py310-test-instrumentation-redis_ubuntu-latest: + name: instrumentation-redis 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3290,190 +3236,190 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-sio-pika-0 -- -ra + run: tox -e py310-test-instrumentation-redis -- -ra - py310-test-instrumentation-sio-pika-1_ubuntu-latest: - name: instrumentation-sio-pika-1 3.10 Ubuntu + py311-test-instrumentation-redis_ubuntu-latest: + name: instrumentation-redis 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-sio-pika-1 -- -ra + run: tox -e py311-test-instrumentation-redis -- -ra - py311-test-instrumentation-sio-pika-0_ubuntu-latest: - name: instrumentation-sio-pika-0 3.11 Ubuntu + py312-test-instrumentation-redis_ubuntu-latest: + name: instrumentation-redis 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-sio-pika-0 -- -ra + run: tox -e py312-test-instrumentation-redis -- -ra - py311-test-instrumentation-sio-pika-1_ubuntu-latest: - name: instrumentation-sio-pika-1 3.11 Ubuntu + py313-test-instrumentation-redis_ubuntu-latest: + name: instrumentation-redis 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-sio-pika-1 -- -ra + run: tox -e py313-test-instrumentation-redis -- -ra - py312-test-instrumentation-sio-pika-0_ubuntu-latest: - name: instrumentation-sio-pika-0 3.12 Ubuntu + pypy3-test-instrumentation-redis_ubuntu-latest: + name: instrumentation-redis pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-sio-pika-0 -- -ra + run: tox -e pypy3-test-instrumentation-redis -- -ra - py312-test-instrumentation-sio-pika-1_ubuntu-latest: - name: instrumentation-sio-pika-1 3.12 Ubuntu + py38-test-instrumentation-remoulade_ubuntu-latest: + name: instrumentation-remoulade 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-sio-pika-1 -- -ra + run: tox -e py38-test-instrumentation-remoulade -- -ra - pypy3-test-instrumentation-sio-pika-0_ubuntu-latest: - name: instrumentation-sio-pika-0 pypy-3.8 Ubuntu + py39-test-instrumentation-remoulade_ubuntu-latest: + name: instrumentation-remoulade 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-sio-pika-0 -- -ra + run: tox -e py39-test-instrumentation-remoulade -- -ra - pypy3-test-instrumentation-sio-pika-1_ubuntu-latest: - name: instrumentation-sio-pika-1 pypy-3.8 Ubuntu + py310-test-instrumentation-remoulade_ubuntu-latest: + name: instrumentation-remoulade 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-sio-pika-1 -- -ra + run: tox -e py310-test-instrumentation-remoulade -- -ra - py38-test-instrumentation-aio-pika-0_ubuntu-latest: - name: instrumentation-aio-pika-0 3.8 Ubuntu + py311-test-instrumentation-remoulade_ubuntu-latest: + name: instrumentation-remoulade 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-aio-pika-0 -- -ra + run: tox -e py311-test-instrumentation-remoulade -- -ra - py38-test-instrumentation-aio-pika-1_ubuntu-latest: - name: instrumentation-aio-pika-1 3.8 Ubuntu + py312-test-instrumentation-remoulade_ubuntu-latest: + name: instrumentation-remoulade 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-aio-pika-1 -- -ra + run: tox -e py312-test-instrumentation-remoulade -- -ra - py38-test-instrumentation-aio-pika-2_ubuntu-latest: - name: instrumentation-aio-pika-2 3.8 Ubuntu + py313-test-instrumentation-remoulade_ubuntu-latest: + name: instrumentation-remoulade 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-aio-pika-2 -- -ra + run: tox -e py313-test-instrumentation-remoulade -- -ra - py38-test-instrumentation-aio-pika-3_ubuntu-latest: - name: instrumentation-aio-pika-3 3.8 Ubuntu + py38-test-instrumentation-celery_ubuntu-latest: + name: instrumentation-celery 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3488,10 +3434,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-aio-pika-3 -- -ra + run: tox -e py38-test-instrumentation-celery -- -ra - py39-test-instrumentation-aio-pika-0_ubuntu-latest: - name: instrumentation-aio-pika-0 3.9 Ubuntu + py39-test-instrumentation-celery_ubuntu-latest: + name: instrumentation-celery 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3506,154 +3452,154 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-aio-pika-0 -- -ra + run: tox -e py39-test-instrumentation-celery -- -ra - py39-test-instrumentation-aio-pika-1_ubuntu-latest: - name: instrumentation-aio-pika-1 3.9 Ubuntu + py310-test-instrumentation-celery_ubuntu-latest: + name: instrumentation-celery 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-aio-pika-1 -- -ra + run: tox -e py310-test-instrumentation-celery -- -ra - py39-test-instrumentation-aio-pika-2_ubuntu-latest: - name: instrumentation-aio-pika-2 3.9 Ubuntu + py311-test-instrumentation-celery_ubuntu-latest: + name: instrumentation-celery 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-aio-pika-2 -- -ra + run: tox -e py311-test-instrumentation-celery -- -ra - py39-test-instrumentation-aio-pika-3_ubuntu-latest: - name: instrumentation-aio-pika-3 3.9 Ubuntu + py312-test-instrumentation-celery_ubuntu-latest: + name: instrumentation-celery 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-aio-pika-3 -- -ra + run: tox -e py312-test-instrumentation-celery -- -ra - py310-test-instrumentation-aio-pika-0_ubuntu-latest: - name: instrumentation-aio-pika-0 3.10 Ubuntu + py313-test-instrumentation-celery_ubuntu-latest: + name: instrumentation-celery 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-aio-pika-0 -- -ra + run: tox -e py313-test-instrumentation-celery -- -ra - py310-test-instrumentation-aio-pika-1_ubuntu-latest: - name: instrumentation-aio-pika-1 3.10 Ubuntu + pypy3-test-instrumentation-celery_ubuntu-latest: + name: instrumentation-celery pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-aio-pika-1 -- -ra + run: tox -e pypy3-test-instrumentation-celery -- -ra - py310-test-instrumentation-aio-pika-2_ubuntu-latest: - name: instrumentation-aio-pika-2 3.10 Ubuntu + py38-test-instrumentation-system-metrics_ubuntu-latest: + name: instrumentation-system-metrics 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-aio-pika-2 -- -ra + run: tox -e py38-test-instrumentation-system-metrics -- -ra - py310-test-instrumentation-aio-pika-3_ubuntu-latest: - name: instrumentation-aio-pika-3 3.10 Ubuntu + py39-test-instrumentation-system-metrics_ubuntu-latest: + name: instrumentation-system-metrics 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-aio-pika-3 -- -ra + run: tox -e py39-test-instrumentation-system-metrics -- -ra - py311-test-instrumentation-aio-pika-0_ubuntu-latest: - name: instrumentation-aio-pika-0 3.11 Ubuntu + py310-test-instrumentation-system-metrics_ubuntu-latest: + name: instrumentation-system-metrics 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-aio-pika-0 -- -ra + run: tox -e py310-test-instrumentation-system-metrics -- -ra - py311-test-instrumentation-aio-pika-1_ubuntu-latest: - name: instrumentation-aio-pika-1 3.11 Ubuntu + py311-test-instrumentation-system-metrics_ubuntu-latest: + name: instrumentation-system-metrics 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3668,172 +3614,172 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-aio-pika-1 -- -ra + run: tox -e py311-test-instrumentation-system-metrics -- -ra - py311-test-instrumentation-aio-pika-2_ubuntu-latest: - name: instrumentation-aio-pika-2 3.11 Ubuntu + py312-test-instrumentation-system-metrics_ubuntu-latest: + name: instrumentation-system-metrics 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-aio-pika-2 -- -ra + run: tox -e py312-test-instrumentation-system-metrics -- -ra - py311-test-instrumentation-aio-pika-3_ubuntu-latest: - name: instrumentation-aio-pika-3 3.11 Ubuntu + py313-test-instrumentation-system-metrics_ubuntu-latest: + name: instrumentation-system-metrics 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-aio-pika-3 -- -ra + run: tox -e py313-test-instrumentation-system-metrics -- -ra - py312-test-instrumentation-aio-pika-0_ubuntu-latest: - name: instrumentation-aio-pika-0 3.12 Ubuntu + pypy3-test-instrumentation-system-metrics_ubuntu-latest: + name: instrumentation-system-metrics pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-aio-pika-0 -- -ra + run: tox -e pypy3-test-instrumentation-system-metrics -- -ra - py312-test-instrumentation-aio-pika-1_ubuntu-latest: - name: instrumentation-aio-pika-1 3.12 Ubuntu + py38-test-instrumentation-threading_ubuntu-latest: + name: instrumentation-threading 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-aio-pika-1 -- -ra + run: tox -e py38-test-instrumentation-threading -- -ra - py312-test-instrumentation-aio-pika-2_ubuntu-latest: - name: instrumentation-aio-pika-2 3.12 Ubuntu + py39-test-instrumentation-threading_ubuntu-latest: + name: instrumentation-threading 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-aio-pika-2 -- -ra + run: tox -e py39-test-instrumentation-threading -- -ra - py312-test-instrumentation-aio-pika-3_ubuntu-latest: - name: instrumentation-aio-pika-3 3.12 Ubuntu + py310-test-instrumentation-threading_ubuntu-latest: + name: instrumentation-threading 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-aio-pika-3 -- -ra + run: tox -e py310-test-instrumentation-threading -- -ra - pypy3-test-instrumentation-aio-pika-0_ubuntu-latest: - name: instrumentation-aio-pika-0 pypy-3.8 Ubuntu + py311-test-instrumentation-threading_ubuntu-latest: + name: instrumentation-threading 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-aio-pika-0 -- -ra + run: tox -e py311-test-instrumentation-threading -- -ra - pypy3-test-instrumentation-aio-pika-1_ubuntu-latest: - name: instrumentation-aio-pika-1 pypy-3.8 Ubuntu + py312-test-instrumentation-threading_ubuntu-latest: + name: instrumentation-threading 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-aio-pika-1 -- -ra + run: tox -e py312-test-instrumentation-threading -- -ra - pypy3-test-instrumentation-aio-pika-2_ubuntu-latest: - name: instrumentation-aio-pika-2 pypy-3.8 Ubuntu + py313-test-instrumentation-threading_ubuntu-latest: + name: instrumentation-threading 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-aio-pika-2 -- -ra + run: tox -e py313-test-instrumentation-threading -- -ra - pypy3-test-instrumentation-aio-pika-3_ubuntu-latest: - name: instrumentation-aio-pika-3 pypy-3.8 Ubuntu + pypy3-test-instrumentation-threading_ubuntu-latest: + name: instrumentation-threading pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3848,10 +3794,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-aio-pika-3 -- -ra + run: tox -e pypy3-test-instrumentation-threading -- -ra - py38-test-instrumentation-aiokafka_ubuntu-latest: - name: instrumentation-aiokafka 3.8 Ubuntu + py38-test-instrumentation-tornado_ubuntu-latest: + name: instrumentation-tornado 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3866,10 +3812,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-aiokafka -- -ra + run: tox -e py38-test-instrumentation-tornado -- -ra - py39-test-instrumentation-aiokafka_ubuntu-latest: - name: instrumentation-aiokafka 3.9 Ubuntu + py39-test-instrumentation-tornado_ubuntu-latest: + name: instrumentation-tornado 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3884,10 +3830,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-aiokafka -- -ra + run: tox -e py39-test-instrumentation-tornado -- -ra - py310-test-instrumentation-aiokafka_ubuntu-latest: - name: instrumentation-aiokafka 3.10 Ubuntu + py310-test-instrumentation-tornado_ubuntu-latest: + name: instrumentation-tornado 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3902,10 +3848,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-aiokafka -- -ra + run: tox -e py310-test-instrumentation-tornado -- -ra - py311-test-instrumentation-aiokafka_ubuntu-latest: - name: instrumentation-aiokafka 3.11 Ubuntu + py311-test-instrumentation-tornado_ubuntu-latest: + name: instrumentation-tornado 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3920,10 +3866,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-aiokafka -- -ra + run: tox -e py311-test-instrumentation-tornado -- -ra - py312-test-instrumentation-aiokafka_ubuntu-latest: - name: instrumentation-aiokafka 3.12 Ubuntu + py312-test-instrumentation-tornado_ubuntu-latest: + name: instrumentation-tornado 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -3938,262 +3884,262 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-aiokafka -- -ra + run: tox -e py312-test-instrumentation-tornado -- -ra - pypy3-test-instrumentation-aiokafka_ubuntu-latest: - name: instrumentation-aiokafka pypy-3.8 Ubuntu + py313-test-instrumentation-tornado_ubuntu-latest: + name: instrumentation-tornado 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-aiokafka -- -ra + run: tox -e py313-test-instrumentation-tornado -- -ra - py38-test-instrumentation-kafka-python_ubuntu-latest: - name: instrumentation-kafka-python 3.8 Ubuntu + pypy3-test-instrumentation-tornado_ubuntu-latest: + name: instrumentation-tornado pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-kafka-python -- -ra + run: tox -e pypy3-test-instrumentation-tornado -- -ra - py39-test-instrumentation-kafka-python_ubuntu-latest: - name: instrumentation-kafka-python 3.9 Ubuntu + py38-test-instrumentation-tortoiseorm_ubuntu-latest: + name: instrumentation-tortoiseorm 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-kafka-python -- -ra + run: tox -e py38-test-instrumentation-tortoiseorm -- -ra - py310-test-instrumentation-kafka-python_ubuntu-latest: - name: instrumentation-kafka-python 3.10 Ubuntu + py39-test-instrumentation-tortoiseorm_ubuntu-latest: + name: instrumentation-tortoiseorm 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-kafka-python -- -ra + run: tox -e py39-test-instrumentation-tortoiseorm -- -ra - py311-test-instrumentation-kafka-python_ubuntu-latest: - name: instrumentation-kafka-python 3.11 Ubuntu + py310-test-instrumentation-tortoiseorm_ubuntu-latest: + name: instrumentation-tortoiseorm 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-kafka-python -- -ra + run: tox -e py310-test-instrumentation-tortoiseorm -- -ra - py38-test-instrumentation-kafka-pythonng_ubuntu-latest: - name: instrumentation-kafka-pythonng 3.8 Ubuntu + py311-test-instrumentation-tortoiseorm_ubuntu-latest: + name: instrumentation-tortoiseorm 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-kafka-pythonng -- -ra + run: tox -e py311-test-instrumentation-tortoiseorm -- -ra - py39-test-instrumentation-kafka-pythonng_ubuntu-latest: - name: instrumentation-kafka-pythonng 3.9 Ubuntu + py312-test-instrumentation-tortoiseorm_ubuntu-latest: + name: instrumentation-tortoiseorm 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-kafka-pythonng -- -ra + run: tox -e py312-test-instrumentation-tortoiseorm -- -ra - py310-test-instrumentation-kafka-pythonng_ubuntu-latest: - name: instrumentation-kafka-pythonng 3.10 Ubuntu + py313-test-instrumentation-tortoiseorm_ubuntu-latest: + name: instrumentation-tortoiseorm 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-kafka-pythonng -- -ra + run: tox -e py313-test-instrumentation-tortoiseorm -- -ra - py311-test-instrumentation-kafka-pythonng_ubuntu-latest: - name: instrumentation-kafka-pythonng 3.11 Ubuntu + pypy3-test-instrumentation-tortoiseorm_ubuntu-latest: + name: instrumentation-tortoiseorm pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-kafka-pythonng -- -ra + run: tox -e pypy3-test-instrumentation-tortoiseorm -- -ra - py312-test-instrumentation-kafka-pythonng_ubuntu-latest: - name: instrumentation-kafka-pythonng 3.12 Ubuntu + py38-test-instrumentation-httpx-0_ubuntu-latest: + name: instrumentation-httpx-0 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-kafka-pythonng -- -ra + run: tox -e py38-test-instrumentation-httpx-0 -- -ra - pypy3-test-instrumentation-kafka-python_ubuntu-latest: - name: instrumentation-kafka-python pypy-3.8 Ubuntu + py38-test-instrumentation-httpx-1_ubuntu-latest: + name: instrumentation-httpx-1 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 + - name: Set up Python 3.8 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-kafka-python -- -ra + run: tox -e py38-test-instrumentation-httpx-1 -- -ra - pypy3-test-instrumentation-kafka-pythonng_ubuntu-latest: - name: instrumentation-kafka-pythonng pypy-3.8 Ubuntu + py39-test-instrumentation-httpx-0_ubuntu-latest: + name: instrumentation-httpx-0 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python pypy-3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "pypy-3.8" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-kafka-pythonng -- -ra + run: tox -e py39-test-instrumentation-httpx-0 -- -ra - py38-test-instrumentation-confluent-kafka_ubuntu-latest: - name: instrumentation-confluent-kafka 3.8 Ubuntu + py39-test-instrumentation-httpx-1_ubuntu-latest: + name: instrumentation-httpx-1 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.9" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-confluent-kafka -- -ra + run: tox -e py39-test-instrumentation-httpx-1 -- -ra - py39-test-instrumentation-confluent-kafka_ubuntu-latest: - name: instrumentation-confluent-kafka 3.9 Ubuntu + py310-test-instrumentation-httpx-0_ubuntu-latest: + name: instrumentation-httpx-0 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-confluent-kafka -- -ra + run: tox -e py310-test-instrumentation-httpx-0 -- -ra - py310-test-instrumentation-confluent-kafka_ubuntu-latest: - name: instrumentation-confluent-kafka 3.10 Ubuntu + py310-test-instrumentation-httpx-1_ubuntu-latest: + name: instrumentation-httpx-1 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4208,10 +4154,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-confluent-kafka -- -ra + run: tox -e py310-test-instrumentation-httpx-1 -- -ra - py311-test-instrumentation-confluent-kafka_ubuntu-latest: - name: instrumentation-confluent-kafka 3.11 Ubuntu + py311-test-instrumentation-httpx-0_ubuntu-latest: + name: instrumentation-httpx-0 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4226,118 +4172,118 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-confluent-kafka -- -ra + run: tox -e py311-test-instrumentation-httpx-0 -- -ra - py312-test-instrumentation-confluent-kafka_ubuntu-latest: - name: instrumentation-confluent-kafka 3.12 Ubuntu + py311-test-instrumentation-httpx-1_ubuntu-latest: + name: instrumentation-httpx-1 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python 3.11 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.11" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-confluent-kafka -- -ra + run: tox -e py311-test-instrumentation-httpx-1 -- -ra - py38-test-instrumentation-asyncio_ubuntu-latest: - name: instrumentation-asyncio 3.8 Ubuntu + py312-test-instrumentation-httpx-0_ubuntu-latest: + name: instrumentation-httpx-0 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-asyncio -- -ra + run: tox -e py312-test-instrumentation-httpx-0 -- -ra - py39-test-instrumentation-asyncio_ubuntu-latest: - name: instrumentation-asyncio 3.9 Ubuntu + py312-test-instrumentation-httpx-1_ubuntu-latest: + name: instrumentation-httpx-1 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.9 + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.12" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-asyncio -- -ra + run: tox -e py312-test-instrumentation-httpx-1 -- -ra - py310-test-instrumentation-asyncio_ubuntu-latest: - name: instrumentation-asyncio 3.10 Ubuntu + py313-test-instrumentation-httpx-1_ubuntu-latest: + name: instrumentation-httpx-1 3.13 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.13" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-asyncio -- -ra + run: tox -e py313-test-instrumentation-httpx-1 -- -ra - py311-test-instrumentation-asyncio_ubuntu-latest: - name: instrumentation-asyncio 3.11 Ubuntu + pypy3-test-instrumentation-httpx-0_ubuntu-latest: + name: instrumentation-httpx-0 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-asyncio -- -ra + run: tox -e pypy3-test-instrumentation-httpx-0 -- -ra - py312-test-instrumentation-asyncio_ubuntu-latest: - name: instrumentation-asyncio 3.12 Ubuntu + pypy3-test-instrumentation-httpx-1_ubuntu-latest: + name: instrumentation-httpx-1 pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.12 + - name: Set up Python pypy-3.8 uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "pypy-3.8" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-asyncio -- -ra + run: tox -e pypy3-test-instrumentation-httpx-1 -- -ra - py38-test-instrumentation-cassandra_ubuntu-latest: - name: instrumentation-cassandra 3.8 Ubuntu + py38-test-util-http_ubuntu-latest: + name: util-http 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4352,10 +4298,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-instrumentation-cassandra -- -ra + run: tox -e py38-test-util-http -- -ra - py39-test-instrumentation-cassandra_ubuntu-latest: - name: instrumentation-cassandra 3.9 Ubuntu + py39-test-util-http_ubuntu-latest: + name: util-http 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4370,10 +4316,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-instrumentation-cassandra -- -ra + run: tox -e py39-test-util-http -- -ra - py310-test-instrumentation-cassandra_ubuntu-latest: - name: instrumentation-cassandra 3.10 Ubuntu + py310-test-util-http_ubuntu-latest: + name: util-http 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4388,10 +4334,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-instrumentation-cassandra -- -ra + run: tox -e py310-test-util-http -- -ra - py311-test-instrumentation-cassandra_ubuntu-latest: - name: instrumentation-cassandra 3.11 Ubuntu + py311-test-util-http_ubuntu-latest: + name: util-http 3.11 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4406,10 +4352,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py311-test-instrumentation-cassandra -- -ra + run: tox -e py311-test-util-http -- -ra - py312-test-instrumentation-cassandra_ubuntu-latest: - name: instrumentation-cassandra 3.12 Ubuntu + py312-test-util-http_ubuntu-latest: + name: util-http 3.12 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4424,10 +4370,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py312-test-instrumentation-cassandra -- -ra + 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 + + - name: Run tests + run: tox -e py313-test-util-http -- -ra - pypy3-test-instrumentation-cassandra_ubuntu-latest: - name: instrumentation-cassandra pypy-3.8 Ubuntu + pypy3-test-util-http_ubuntu-latest: + name: util-http pypy-3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4442,10 +4406,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e pypy3-test-instrumentation-cassandra -- -ra + 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 + 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 + + - name: Run tests + run: tox -e py38-test-propagator-aws-xray-0 -- -ra - py38-test-processor-baggage_ubuntu-latest: - name: processor-baggage 3.8 Ubuntu + py38-test-propagator-aws-xray-1_ubuntu-latest: + name: propagator-aws-xray-1 3.8 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4460,10 +4442,28 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py38-test-processor-baggage -- -ra + run: tox -e py38-test-propagator-aws-xray-1 -- -ra + + py39-test-propagator-aws-xray-0_ubuntu-latest: + name: propagator-aws-xray-0 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 - py39-test-processor-baggage_ubuntu-latest: - name: processor-baggage 3.9 Ubuntu + - name: Run tests + run: tox -e py39-test-propagator-aws-xray-0 -- -ra + + py39-test-propagator-aws-xray-1_ubuntu-latest: + name: propagator-aws-xray-1 3.9 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4478,10 +4478,10 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py39-test-processor-baggage -- -ra + run: tox -e py39-test-propagator-aws-xray-1 -- -ra - py310-test-processor-baggage_ubuntu-latest: - name: processor-baggage 3.10 Ubuntu + py310-test-propagator-aws-xray-0_ubuntu-latest: + name: propagator-aws-xray-0 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} @@ -4496,22 +4496,22 @@ jobs: run: pip install tox - name: Run tests - run: tox -e py310-test-processor-baggage -- -ra + run: tox -e py310-test-propagator-aws-xray-0 -- -ra - py311-test-processor-baggage_ubuntu-latest: - name: processor-baggage 3.11 Ubuntu + py310-test-propagator-aws-xray-1_ubuntu-latest: + name: propagator-aws-xray-1 3.10 Ubuntu runs-on: ubuntu-latest steps: - name: Checkout repo @ SHA - ${{ github.sha }} uses: actions/checkout@v4 - - name: Set up Python 3.11 + - name: Set up Python 3.10 uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.10" - name: Install tox run: pip install tox - name: Run tests - run: tox -e py311-test-processor-baggage -- -ra + run: tox -e py310-test-propagator-aws-xray-1 -- -ra diff --git a/.github/workflows/test_2.yml b/.github/workflows/test_2.yml index c23866ffa8..ceac5ac9ed 100644 --- a/.github/workflows/test_2.yml +++ b/.github/workflows/test_2.yml @@ -16,6 +16,1788 @@ env: jobs: + py311-test-propagator-aws-xray-0_ubuntu-latest: + name: propagator-aws-xray-0 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 + + - name: Run tests + run: tox -e py311-test-propagator-aws-xray-0 -- -ra + + py311-test-propagator-aws-xray-1_ubuntu-latest: + name: propagator-aws-xray-1 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 + + - name: Run tests + run: tox -e py311-test-propagator-aws-xray-1 -- -ra + + py312-test-propagator-aws-xray-0_ubuntu-latest: + name: propagator-aws-xray-0 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 + + - name: Run tests + run: tox -e py312-test-propagator-aws-xray-0 -- -ra + + py312-test-propagator-aws-xray-1_ubuntu-latest: + name: propagator-aws-xray-1 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 + + - name: Run tests + run: tox -e py312-test-propagator-aws-xray-1 -- -ra + + py313-test-propagator-aws-xray-0_ubuntu-latest: + name: propagator-aws-xray-0 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 + + - name: Run tests + run: tox -e py313-test-propagator-aws-xray-0 -- -ra + + py313-test-propagator-aws-xray-1_ubuntu-latest: + name: propagator-aws-xray-1 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 + + - name: Run tests + run: tox -e py313-test-propagator-aws-xray-1 -- -ra + + pypy3-test-propagator-aws-xray-0_ubuntu-latest: + name: propagator-aws-xray-0 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 + + - name: Run tests + run: tox -e pypy3-test-propagator-aws-xray-0 -- -ra + + pypy3-test-propagator-aws-xray-1_ubuntu-latest: + name: propagator-aws-xray-1 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 + + - name: Run tests + run: tox -e pypy3-test-propagator-aws-xray-1 -- -ra + + py38-test-propagator-ot-trace_ubuntu-latest: + name: propagator-ot-trace 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 + + - name: Run tests + run: tox -e py38-test-propagator-ot-trace -- -ra + + py39-test-propagator-ot-trace_ubuntu-latest: + name: propagator-ot-trace 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 + + - name: Run tests + run: tox -e py39-test-propagator-ot-trace -- -ra + + py310-test-propagator-ot-trace_ubuntu-latest: + name: propagator-ot-trace 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 + + - name: Run tests + run: tox -e py310-test-propagator-ot-trace -- -ra + + py311-test-propagator-ot-trace_ubuntu-latest: + name: propagator-ot-trace 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 + + - name: Run tests + run: tox -e py311-test-propagator-ot-trace -- -ra + + py312-test-propagator-ot-trace_ubuntu-latest: + name: propagator-ot-trace 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 + + - name: Run tests + run: tox -e py312-test-propagator-ot-trace -- -ra + + py313-test-propagator-ot-trace_ubuntu-latest: + name: propagator-ot-trace 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 + + - name: Run tests + run: tox -e py313-test-propagator-ot-trace -- -ra + + pypy3-test-propagator-ot-trace_ubuntu-latest: + name: propagator-ot-trace 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 + + - name: Run tests + run: tox -e pypy3-test-propagator-ot-trace -- -ra + + py38-test-instrumentation-sio-pika-0_ubuntu-latest: + name: instrumentation-sio-pika-0 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-sio-pika-0 -- -ra + + py38-test-instrumentation-sio-pika-1_ubuntu-latest: + name: instrumentation-sio-pika-1 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-sio-pika-1 -- -ra + + py39-test-instrumentation-sio-pika-0_ubuntu-latest: + name: instrumentation-sio-pika-0 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-sio-pika-0 -- -ra + + py39-test-instrumentation-sio-pika-1_ubuntu-latest: + name: instrumentation-sio-pika-1 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-sio-pika-1 -- -ra + + py310-test-instrumentation-sio-pika-0_ubuntu-latest: + name: instrumentation-sio-pika-0 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-sio-pika-0 -- -ra + + py310-test-instrumentation-sio-pika-1_ubuntu-latest: + name: instrumentation-sio-pika-1 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-sio-pika-1 -- -ra + + py311-test-instrumentation-sio-pika-0_ubuntu-latest: + name: instrumentation-sio-pika-0 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-sio-pika-0 -- -ra + + py311-test-instrumentation-sio-pika-1_ubuntu-latest: + name: instrumentation-sio-pika-1 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-sio-pika-1 -- -ra + + py312-test-instrumentation-sio-pika-0_ubuntu-latest: + name: instrumentation-sio-pika-0 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-sio-pika-0 -- -ra + + py312-test-instrumentation-sio-pika-1_ubuntu-latest: + name: instrumentation-sio-pika-1 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-sio-pika-1 -- -ra + + py313-test-instrumentation-sio-pika-0_ubuntu-latest: + name: instrumentation-sio-pika-0 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-sio-pika-0 -- -ra + + py313-test-instrumentation-sio-pika-1_ubuntu-latest: + name: instrumentation-sio-pika-1 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-sio-pika-1 -- -ra + + pypy3-test-instrumentation-sio-pika-0_ubuntu-latest: + name: instrumentation-sio-pika-0 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-sio-pika-0 -- -ra + + pypy3-test-instrumentation-sio-pika-1_ubuntu-latest: + name: instrumentation-sio-pika-1 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-sio-pika-1 -- -ra + + py38-test-instrumentation-aio-pika-0_ubuntu-latest: + name: instrumentation-aio-pika-0 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-aio-pika-0 -- -ra + + py38-test-instrumentation-aio-pika-1_ubuntu-latest: + name: instrumentation-aio-pika-1 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-aio-pika-1 -- -ra + + py38-test-instrumentation-aio-pika-2_ubuntu-latest: + name: instrumentation-aio-pika-2 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-aio-pika-2 -- -ra + + py38-test-instrumentation-aio-pika-3_ubuntu-latest: + name: instrumentation-aio-pika-3 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-aio-pika-3 -- -ra + + py39-test-instrumentation-aio-pika-0_ubuntu-latest: + name: instrumentation-aio-pika-0 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-aio-pika-0 -- -ra + + py39-test-instrumentation-aio-pika-1_ubuntu-latest: + name: instrumentation-aio-pika-1 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-aio-pika-1 -- -ra + + py39-test-instrumentation-aio-pika-2_ubuntu-latest: + name: instrumentation-aio-pika-2 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-aio-pika-2 -- -ra + + py39-test-instrumentation-aio-pika-3_ubuntu-latest: + name: instrumentation-aio-pika-3 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-aio-pika-3 -- -ra + + py310-test-instrumentation-aio-pika-0_ubuntu-latest: + name: instrumentation-aio-pika-0 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-aio-pika-0 -- -ra + + py310-test-instrumentation-aio-pika-1_ubuntu-latest: + name: instrumentation-aio-pika-1 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-aio-pika-1 -- -ra + + py310-test-instrumentation-aio-pika-2_ubuntu-latest: + name: instrumentation-aio-pika-2 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-aio-pika-2 -- -ra + + py310-test-instrumentation-aio-pika-3_ubuntu-latest: + name: instrumentation-aio-pika-3 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-aio-pika-3 -- -ra + + py311-test-instrumentation-aio-pika-0_ubuntu-latest: + name: instrumentation-aio-pika-0 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-aio-pika-0 -- -ra + + py311-test-instrumentation-aio-pika-1_ubuntu-latest: + name: instrumentation-aio-pika-1 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-aio-pika-1 -- -ra + + py311-test-instrumentation-aio-pika-2_ubuntu-latest: + name: instrumentation-aio-pika-2 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-aio-pika-2 -- -ra + + py311-test-instrumentation-aio-pika-3_ubuntu-latest: + name: instrumentation-aio-pika-3 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-aio-pika-3 -- -ra + + py312-test-instrumentation-aio-pika-0_ubuntu-latest: + name: instrumentation-aio-pika-0 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-aio-pika-0 -- -ra + + py312-test-instrumentation-aio-pika-1_ubuntu-latest: + name: instrumentation-aio-pika-1 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-aio-pika-1 -- -ra + + py312-test-instrumentation-aio-pika-2_ubuntu-latest: + name: instrumentation-aio-pika-2 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-aio-pika-2 -- -ra + + py312-test-instrumentation-aio-pika-3_ubuntu-latest: + name: instrumentation-aio-pika-3 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-aio-pika-3 -- -ra + + py313-test-instrumentation-aio-pika-0_ubuntu-latest: + name: instrumentation-aio-pika-0 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aio-pika-0 -- -ra + + py313-test-instrumentation-aio-pika-1_ubuntu-latest: + name: instrumentation-aio-pika-1 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aio-pika-1 -- -ra + + py313-test-instrumentation-aio-pika-2_ubuntu-latest: + name: instrumentation-aio-pika-2 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aio-pika-2 -- -ra + + py313-test-instrumentation-aio-pika-3_ubuntu-latest: + name: instrumentation-aio-pika-3 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aio-pika-3 -- -ra + + pypy3-test-instrumentation-aio-pika-0_ubuntu-latest: + name: instrumentation-aio-pika-0 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-aio-pika-0 -- -ra + + pypy3-test-instrumentation-aio-pika-1_ubuntu-latest: + name: instrumentation-aio-pika-1 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-aio-pika-1 -- -ra + + pypy3-test-instrumentation-aio-pika-2_ubuntu-latest: + name: instrumentation-aio-pika-2 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-aio-pika-2 -- -ra + + pypy3-test-instrumentation-aio-pika-3_ubuntu-latest: + name: instrumentation-aio-pika-3 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-aio-pika-3 -- -ra + + py38-test-instrumentation-aiokafka_ubuntu-latest: + name: instrumentation-aiokafka 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-aiokafka -- -ra + + py39-test-instrumentation-aiokafka_ubuntu-latest: + name: instrumentation-aiokafka 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-aiokafka -- -ra + + py310-test-instrumentation-aiokafka_ubuntu-latest: + name: instrumentation-aiokafka 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-aiokafka -- -ra + + py311-test-instrumentation-aiokafka_ubuntu-latest: + name: instrumentation-aiokafka 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-aiokafka -- -ra + + py312-test-instrumentation-aiokafka_ubuntu-latest: + name: instrumentation-aiokafka 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-aiokafka -- -ra + + py313-test-instrumentation-aiokafka_ubuntu-latest: + name: instrumentation-aiokafka 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-aiokafka -- -ra + + pypy3-test-instrumentation-aiokafka_ubuntu-latest: + name: instrumentation-aiokafka 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-aiokafka -- -ra + + py38-test-instrumentation-kafka-python_ubuntu-latest: + name: instrumentation-kafka-python 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-kafka-python -- -ra + + py39-test-instrumentation-kafka-python_ubuntu-latest: + name: instrumentation-kafka-python 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-kafka-python -- -ra + + py310-test-instrumentation-kafka-python_ubuntu-latest: + name: instrumentation-kafka-python 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-kafka-python -- -ra + + py311-test-instrumentation-kafka-python_ubuntu-latest: + name: instrumentation-kafka-python 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-kafka-python -- -ra + + py38-test-instrumentation-kafka-pythonng_ubuntu-latest: + name: instrumentation-kafka-pythonng 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-kafka-pythonng -- -ra + + py39-test-instrumentation-kafka-pythonng_ubuntu-latest: + name: instrumentation-kafka-pythonng 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-kafka-pythonng -- -ra + + py310-test-instrumentation-kafka-pythonng_ubuntu-latest: + name: instrumentation-kafka-pythonng 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-kafka-pythonng -- -ra + + py311-test-instrumentation-kafka-pythonng_ubuntu-latest: + name: instrumentation-kafka-pythonng 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-kafka-pythonng -- -ra + + py312-test-instrumentation-kafka-pythonng_ubuntu-latest: + name: instrumentation-kafka-pythonng 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-kafka-pythonng -- -ra + + py313-test-instrumentation-kafka-pythonng_ubuntu-latest: + name: instrumentation-kafka-pythonng 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-kafka-pythonng -- -ra + + pypy3-test-instrumentation-kafka-python_ubuntu-latest: + name: instrumentation-kafka-python 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-kafka-python -- -ra + + pypy3-test-instrumentation-kafka-pythonng_ubuntu-latest: + name: instrumentation-kafka-pythonng 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-kafka-pythonng -- -ra + + py38-test-instrumentation-confluent-kafka_ubuntu-latest: + name: instrumentation-confluent-kafka 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-confluent-kafka -- -ra + + py39-test-instrumentation-confluent-kafka_ubuntu-latest: + name: instrumentation-confluent-kafka 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-confluent-kafka -- -ra + + py310-test-instrumentation-confluent-kafka_ubuntu-latest: + name: instrumentation-confluent-kafka 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-confluent-kafka -- -ra + + py311-test-instrumentation-confluent-kafka_ubuntu-latest: + name: instrumentation-confluent-kafka 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-confluent-kafka -- -ra + + py312-test-instrumentation-confluent-kafka_ubuntu-latest: + name: instrumentation-confluent-kafka 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-confluent-kafka -- -ra + + py313-test-instrumentation-confluent-kafka_ubuntu-latest: + name: instrumentation-confluent-kafka 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-confluent-kafka -- -ra + + py38-test-instrumentation-asyncio_ubuntu-latest: + name: instrumentation-asyncio 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-asyncio -- -ra + + py39-test-instrumentation-asyncio_ubuntu-latest: + name: instrumentation-asyncio 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-asyncio -- -ra + + py310-test-instrumentation-asyncio_ubuntu-latest: + name: instrumentation-asyncio 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-asyncio -- -ra + + py311-test-instrumentation-asyncio_ubuntu-latest: + name: instrumentation-asyncio 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-asyncio -- -ra + + py312-test-instrumentation-asyncio_ubuntu-latest: + name: instrumentation-asyncio 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-asyncio -- -ra + + py313-test-instrumentation-asyncio_ubuntu-latest: + name: instrumentation-asyncio 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-asyncio -- -ra + + py38-test-instrumentation-cassandra_ubuntu-latest: + name: instrumentation-cassandra 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 + + - name: Run tests + run: tox -e py38-test-instrumentation-cassandra -- -ra + + py39-test-instrumentation-cassandra_ubuntu-latest: + name: instrumentation-cassandra 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 + + - name: Run tests + run: tox -e py39-test-instrumentation-cassandra -- -ra + + py310-test-instrumentation-cassandra_ubuntu-latest: + name: instrumentation-cassandra 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 + + - name: Run tests + run: tox -e py310-test-instrumentation-cassandra -- -ra + + py311-test-instrumentation-cassandra_ubuntu-latest: + name: instrumentation-cassandra 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 + + - name: Run tests + run: tox -e py311-test-instrumentation-cassandra -- -ra + + py312-test-instrumentation-cassandra_ubuntu-latest: + name: instrumentation-cassandra 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 + + - name: Run tests + run: tox -e py312-test-instrumentation-cassandra -- -ra + + py313-test-instrumentation-cassandra_ubuntu-latest: + name: instrumentation-cassandra 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 + + - name: Run tests + run: tox -e py313-test-instrumentation-cassandra -- -ra + + pypy3-test-instrumentation-cassandra_ubuntu-latest: + name: instrumentation-cassandra 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 + + - name: Run tests + run: tox -e pypy3-test-instrumentation-cassandra -- -ra + + py38-test-processor-baggage_ubuntu-latest: + name: processor-baggage 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 + + - name: Run tests + run: tox -e py38-test-processor-baggage -- -ra + + py39-test-processor-baggage_ubuntu-latest: + name: processor-baggage 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 + + - name: Run tests + run: tox -e py39-test-processor-baggage -- -ra + + py310-test-processor-baggage_ubuntu-latest: + name: processor-baggage 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 + + - name: Run tests + run: tox -e py310-test-processor-baggage -- -ra + + py311-test-processor-baggage_ubuntu-latest: + name: processor-baggage 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 + + - name: Run tests + run: tox -e py311-test-processor-baggage -- -ra + py312-test-processor-baggage_ubuntu-latest: name: processor-baggage 3.12 Ubuntu runs-on: ubuntu-latest @@ -34,6 +1816,24 @@ jobs: - name: Run tests run: tox -e py312-test-processor-baggage -- -ra + py313-test-processor-baggage_ubuntu-latest: + name: processor-baggage 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 + + - name: Run tests + run: tox -e py313-test-processor-baggage -- -ra + pypy3-test-processor-baggage_ubuntu-latest: name: processor-baggage pypy-3.8 Ubuntu runs-on: ubuntu-latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b8d39ff0e..438f9c787e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- `opentelemetry-instrumentation-confluent-kafka` Add support for confluent-kafka <=2.7.0 + ([#3100](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3100)) +- Add support to database stability opt-in in `_semconv` utilities and add tests + ([#3111](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3111)) +- `opentelemetry-opentelemetry-pymongo` Add `py.typed` file to enable PEP 561 + ([#3136](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3136)) +- `opentelemetry-opentelemetry-requests` Add `py.typed` file to enable PEP 561 + ([#3135](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3135)) +- `opentelemetry-instrumentation-system-metrics` Add `py.typed` file to enable PEP 561 + ([#3132](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3132)) +- `opentelemetry-opentelemetry-sqlite3` Add `py.typed` file to enable PEP 561 + ([#3133](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3133)) +- `opentelemetry-instrumentation-falcon` add support version to v4 + ([#3086](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3086)) +- `opentelemetry-instrumentation-wsgi` always record span status code to have it available in metrics + ([#3148](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3148)) +- add support to Python 3.13 + ([#3134](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3134)) +- `opentelemetry-util-http` Add `py.typed` file to enable PEP 561 + ([#3127](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3127)) + +### Fixed + +- `opentelemetry-instrumentation-httpx` Fix `RequestInfo`/`ResponseInfo` type hints + ([#3105](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3105)) +- `opentelemetry-instrumentation-dbapi` Move `TracedCursorProxy` and `TracedConnectionProxy` to the module level + ([#3068](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3068)) +- `opentelemetry-instrumentation-click` Disable tracing of well-known server click commands + ([#3174](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3174)) +- `opentelemetry-instrumentation` Fix `get_dist_dependency_conflicts` if no distribution requires + ([#3168](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3168)) + +### Breaking changes + +- `opentelemetry-instrumentation-sqlalchemy` including sqlcomment in `db.statement` span attribute value is now opt-in + ([#3112](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3112)) + +### Breaking changes + +- `opentelemetry-instrumentation-dbapi` including sqlcomment in `db.statement` span attribute value is now opt-in + ([#3115](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3115)) + + ## Version 1.29.0/0.50b0 (2024-12-11) ### Added diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e90402edc2..8119304875 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -56,14 +56,14 @@ some aspects of development, including testing against multiple Python versions. To install `tox`, run: ```sh -$ pip install tox +pip install tox ``` You can run `tox` with the following arguments: * `tox` to run all existing tox commands, including unit tests for all packages under multiple Python versions -* `tox -e docs` to regenerate the API docs +* `tox -e docs` to regenerate all docs * `tox -e py312-test-instrumentation-aiopg` to e.g. run the aiopg instrumentation unit tests under a specific Python version * `tox -e spellcheck` to run a spellcheck on all the code @@ -74,13 +74,13 @@ You can run `tox` with the following arguments: `ruff check` and `ruff format` are executed when `tox -e ruff` is run. We strongly recommend you to configure [pre-commit](https://pre-commit.com/) locally to run `ruff` automatically before each commit by installing it as git hooks. You just need to [install pre-commit](https://pre-commit.com/#install) in your environment: ```console -$ pip install pre-commit -c dev-requirements.txt +pip install pre-commit -c dev-requirements.txt ``` and run this command inside the git repository: ```console -$ pre-commit install +pre-commit install ``` See @@ -89,7 +89,9 @@ for more detail on available tox commands. ### Troubleshooting -> Some packages may require additional system wide dependencies to be installed. For example, you may need to install `libpq-dev` to run the postgresql client libraries instrumentation tests. or `libsnappy-dev` to run the prometheus exporter tests. If you encounter a build error, please check the installation instructions for the package you are trying to run tests for. +Some packages may require additional system-wide dependencies to be installed. For example, you may need to install `libpq-dev` to run the postgresql client libraries instrumentation tests or `libsnappy-dev` to run the prometheus exporter tests. If you encounter a build error, please check the installation instructions for the package you are trying to run tests for. + +For `docs` building, you may need to install `mysql-client` and other required dependencies as necessary. Ensure the Python version used in your local setup matches the version used in the [CI](./.github/workflows/) to maintain compatibility when building the documentation. ### Benchmarks @@ -124,31 +126,45 @@ pull requests (PRs). To create a new PR, fork the project in GitHub and clone the upstream repo: ```sh -$ git clone https://github.com/open-telemetry/opentelemetry-python-contrib.git -$ cd opentelemetry-python-contrib +git clone https://github.com/open-telemetry/opentelemetry-python-contrib.git +cd opentelemetry-python-contrib ``` Add your fork as an origin: ```sh -$ git remote add fork https://github.com/YOUR_GITHUB_USERNAME/opentelemetry-python-contrib.git +git remote add fork https://github.com/YOUR_GITHUB_USERNAME/opentelemetry-python-contrib.git +``` + +make sure you have all supported versions of Python installed, install `tox` only for the first time: + +```sh +pip install tox ``` -Run tests: +Run tests in the root of the repository (this will run all tox environments and may take some time): ```sh -# make sure you have all supported versions of Python installed -$ pip install tox # only first time. -$ tox # execute in the root of the repository +tox ``` Check out a new branch, make modifications and push the branch to your fork: ```sh -$ git checkout -b feature -# edit files -$ git commit -$ git push fork feature +git checkout -b feature +``` + +After you edit the files, stage changes in the current directory: + +```sh +git add . +``` + +Then run the following to commit the changes: + +```sh +git commit +git push fork feature ``` Open a pull request against the main `opentelemetry-python-contrib` repo. @@ -278,6 +294,20 @@ Below is a checklist of things to be mindful of when implementing a new instrume - Testing - When adding a new instrumentation remember to update `tox.ini` adding appropriate rules in `envlist`, `command_pre` and `commands` sections +### Update supported instrumentation package versions + +- Navigate to the **instrumentation package directory:** + - Update **`pyproject.toml`** file by modifying _instruments_ entry in the `[project.optional-dependencies]` section with the new version constraint + - Update `_instruments` variable in instrumentation **`package.py`** file with the new version constraint +- At the **root of the project directory**, run `tox -e generate` to regenerate necessary files + +If you're adding support for a new version of the instrumentation package, follow these additional steps: + +- At the **instrumentation package directory:** Add new test-requirements.txt file with the respective package version required for testing +- At the **root of the project directory**: Add a new test environment entry for the package version in [tox.ini](./tox.ini) and run `tox -e generate-workflows` to regenerate new workflows accordingly. In the same [tox.ini](./tox.ini) file, search for `opentelemetry-instrumentation-{package}/test-requirements` and add a new line to point to the new test-requirements.txt you created in the previous step so tox can install the correct requirements. + +Example PRs: [#2976](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2976), [#2845](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2845) + ## Guideline for GenAI instrumentations Instrumentations that relate to [Generative AI](https://opentelemetry.io/docs/specs/semconv/gen-ai/) systems will be placed in the [instrumentation-genai](./instrumentation-genai) folder. This section covers contributions related to those instrumentations. Please note that the [guidelines for instrumentations](#guideline-for-instrumentations) and [expectations from contributors](#expectations-from-contributors) still apply. diff --git a/README.md b/README.md index 8582c472ba..2400e5d47a 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ The Python auto-instrumentation libraries for [OpenTelemetry](https://openteleme * [Installation](#installation) * [Releasing](#releasing) * [Releasing a package as `1.0` stable](#releasing-a-package-as-10-stable) +* [Semantic Convention status of instrumentations](#semantic-convention-status-of-instrumentations) * [Contributing](#contributing) * [Thanks to all the people who already contributed](#thanks-to-all-the-people-who-already-contributed) @@ -100,7 +101,7 @@ To release a package as `1.0` stable, the package: ## Semantic Convention status of instrumentations -In our efforts to maintain optimal user experience and prevent breaking changes for transitioning into stable semantic conventions, OpenTelemetry Python is adopting the [semantic convention migration plan](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/migration-guide.md) for several instrumentations. Currently this plan is only being adopted for HTTP-related instrumentations, but will eventually cover all types. Please refer to the `semconv status` column of the [instrumentation README](instrumentation/README.md) of the current status of instrumentations' semantic conventions. The possible values are `experimental`, `stable` and `migration` referring to [status](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.31.0/specification/document-status.md#lifecycle-status) of that particular semantic convention. `Migration` refers to an instrumentation that currently supports the migration plan. +In our efforts to maintain optimal user experience and prevent breaking changes for transitioning into stable semantic conventions, OpenTelemetry Python is adopting the semantic convention migration plan for several instrumentations. Currently this plan is only being adopted for [HTTP-related instrumentations](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/non-normative/http-migration.md), but will eventually cover all types. Please refer to the `semconv status` column of the [instrumentation README](instrumentation/README.md) of the current status of instrumentations' semantic conventions. The possible values are `experimental`, `stable` and `migration` referring to [status](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.31.0/specification/document-status.md#lifecycle-status) of that particular semantic convention. `Migration` refers to an instrumentation that currently supports the migration plan. ## Contributing diff --git a/RELEASING.md b/RELEASING.md index 490269e2e4..1b96120db0 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -21,6 +21,7 @@ > - opentelemetry-resource-detector-azure > - opentelemetry-sdk-extension-aws > - opentelemetry-instrumentation-openai-v2 +> > These libraries are also excluded from the general release. Package release preparation is handled by the [`[Package] Prepare release`](./.github/workflows/package-prepare-release.yml) workflow that allows @@ -28,6 +29,8 @@ to pick a specific package to release. It follows the same versioning strategy a Long-term package release branch follows `package-release/{package-name}/v{major}.{minor}.x` (or `package-release/{package-name}/v{major}.{minor}bx`) naming pattern. +The workflow will create two pull requests, one against the `main` and one against the `package-release/` branch; both should be merged in order to proceed with the release. + ## Preparing a new patch release * Backport pull request(s) to the release branch. @@ -54,6 +57,8 @@ to pick a specific package to release. The workflow can only be run against long-term release branch such as `package-release/{package-name}/v{major}.{minor}.x` or `package-release/{package-name}/v{major}.{minor}bx`. +The workflow will create a pull request that should be merged in order to proceed with the release. + ## Making the release * Run the [Release workflow](https://github.com/open-telemetry/opentelemetry-python-contrib/actions/workflows/release.yml). diff --git a/_template/pyproject.toml b/_template/pyproject.toml index b180d32ad8..0555456b7b 100644 --- a/_template/pyproject.toml +++ b/_template/pyproject.toml @@ -27,6 +27,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ REPLACE_ME = "opentelemetry.instrumentation." # url of the instrumentation e.g # Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-sqlalchemy" Homepage = "" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] # REPLACE ME: the path to the version file e.g diff --git a/dev-requirements.txt b/dev-requirements.txt index 70464ffdd7..2668677cc5 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -8,7 +8,6 @@ pytest==7.4.4 pytest-cov==4.1.0 readme-renderer==42.0 bleach==4.1.0 # transient dependency for readme-renderer -protobuf~=3.13 markupsafe>=2.0.1 codespell==2.1.0 requests==2.32.3 diff --git a/docs/nitpick-exceptions.ini b/docs/nitpick-exceptions.ini index 4b1b06f95b..b1fcdd5342 100644 --- a/docs/nitpick-exceptions.ini +++ b/docs/nitpick-exceptions.ini @@ -29,6 +29,8 @@ py-class= httpx.SyncByteStream httpx.AsyncByteStream httpx.Response + httpx.URL + httpx.Headers aiohttp.web_request.Request yarl.URL cimpl.Producer @@ -39,6 +41,7 @@ py-class= callable Consumer confluent_kafka.Message + ObjectProxy any= ; API @@ -66,6 +69,8 @@ any= py-obj= opentelemetry.propagators.textmap.CarrierT + opentelemetry.instrumentation.dbapi.ConnectionT + opentelemetry.instrumentation.dbapi.CursorT py-func= poll diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/pyproject.toml b/exporter/opentelemetry-exporter-prometheus-remote-write/pyproject.toml index 4218e13472..23801d1c04 100644 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/pyproject.toml +++ b/exporter/opentelemetry-exporter-prometheus-remote-write/pyproject.toml @@ -24,6 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "protobuf ~= 4.21", @@ -35,6 +36,7 @@ dependencies = [ [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/exporter/opentelemetry-exporter-prometheus-remote-write" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/exporter/prometheus_remote_write/version.py" diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt b/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt index 20d42eb4c6..5587dcdbb5 100644 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt +++ b/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt @@ -3,7 +3,7 @@ certifi==2024.7.4 charset-normalizer==3.3.2 # We can drop this after bumping baseline to pypy-39 cramjam==2.1.0; platform_python_implementation == "PyPy" -cramjam==2.8.1; platform_python_implementation != "PyPy" +cramjam==2.8.4; platform_python_implementation != "PyPy" Deprecated==1.2.14 idna==3.7 iniconfig==2.0.0 diff --git a/exporter/opentelemetry-exporter-richconsole/pyproject.toml b/exporter/opentelemetry-exporter-richconsole/pyproject.toml index 2d001c9f6e..d445a94761 100644 --- a/exporter/opentelemetry-exporter-richconsole/pyproject.toml +++ b/exporter/opentelemetry-exporter-richconsole/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -33,6 +34,7 @@ dependencies = [ [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/exporter/opentelemetry-exporter-richconsole" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/exporter/richconsole/version.py" diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/manual/requirements.txt b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/manual/requirements.txt index 436f63e1d5..75b6bee8f7 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/manual/requirements.txt +++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/manual/requirements.txt @@ -1,5 +1,5 @@ -openai~=1.54.4 +openai~=1.57.3 -opentelemetry-sdk~=1.28.2 -opentelemetry-exporter-otlp-proto-grpc~=1.28.2 +opentelemetry-sdk~=1.29.0 +opentelemetry-exporter-otlp-proto-grpc~=1.29.0 opentelemetry-instrumentation-openai-v2~=2.0b0 diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/zero-code/.env b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/zero-code/.env index 7dfa745e3b..8f2dd62b91 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/zero-code/.env +++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/zero-code/.env @@ -12,10 +12,11 @@ OPENAI_API_KEY=sk-YOUR_API_KEY OTEL_SERVICE_NAME=opentelemetry-python-openai -# Change to 'false' to disable logging +# Change to 'false' to disable collection of python logging logs OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true -# Change to 'console' if your OTLP endpoint doesn't support logs -# TODO: this should not be necessary once https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3042 is released -OTEL_LOGS_EXPORTER=otlp + +# Uncomment if your OTLP endpoint doesn't support logs +# OTEL_LOGS_EXPORTER=console + # Change to 'false' to hide prompt and completion content OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/zero-code/requirements.txt b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/zero-code/requirements.txt index 77ed112ebb..df462da758 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/zero-code/requirements.txt +++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/zero-code/requirements.txt @@ -1,6 +1,6 @@ -openai~=1.54.4 +openai~=1.57.3 -opentelemetry-sdk~=1.28.2 -opentelemetry-exporter-otlp-proto-grpc~=1.28.2 -opentelemetry-distro~=0.49b2 +opentelemetry-sdk~=1.29.0 +opentelemetry-exporter-otlp-proto-grpc~=1.29.0 +opentelemetry-distro~=0.50b0 opentelemetry-instrumentation-openai-v2~=2.0b0 diff --git a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/pyproject.toml b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/pyproject.toml index f37b6915e3..fdc0afc9c0 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-openai-v2/pyproject.toml +++ b/instrumentation-genai/opentelemetry-instrumentation-openai-v2/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.28", @@ -40,6 +41,7 @@ openai = "opentelemetry.instrumentation.openai_v2:OpenAIInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation-genai/opentelemetry-instrumentation-openai-v2" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/openai_v2/version.py" diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/CHANGELOG.md b/instrumentation-genai/opentelemetry-instrumentation-vertexai/CHANGELOG.md new file mode 100644 index 0000000000..4d786c7840 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Unreleased + +- Initial VertexAI instrumentation + ([#3123](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3123)) diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/LICENSE b/instrumentation-genai/opentelemetry-instrumentation-vertexai/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/README.rst b/instrumentation-genai/opentelemetry-instrumentation-vertexai/README.rst new file mode 100644 index 0000000000..ecb404cb70 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/README.rst @@ -0,0 +1,79 @@ +OpenTelemetry VertexAI Instrumentation +==================================== + +|pypi| + +.. |pypi| image:: https://badge.fury.io/py/opentelemetry-instrumentation-vertexai.svg + :target: https://pypi.org/project/opentelemetry-instrumentation-vertexai/ + +This library allows tracing LLM requests and logging of messages made by the +`VertexAI Python API library `_. + + +Installation +------------ + +If your application is already instrumented with OpenTelemetry, add this +package to your requirements. +:: + + pip install opentelemetry-instrumentation-vertexai + +If you don't have an VertexAI application, yet, try our `examples `_. + +Check out `zero-code example `_ for a quick start. + +Usage +----- + +This section describes how to set up VertexAI instrumentation if you're setting OpenTelemetry up manually. +Check out the `manual example `_ for more details. + +Instrumenting all clients +************************* + +When using the instrumentor, all clients will automatically trace VertexAI chat completion operations. +You can also optionally capture prompts and completions as log events. + +Make sure to configure OpenTelemetry tracing, logging, and events to capture all telemetry emitted by the instrumentation. + +.. code-block:: python + + from opentelemetry.instrumentation.vertexai import VertexAIInstrumentor + from vertexai.generative_models import GenerativeModel + + VertexAIInstrumentor().instrument() + + + vertexai.init() + model = GenerativeModel("gemini-1.5-flash-002") + response = model.generate_content("Write a short poem on OpenTelemetry.") + +Enabling message content +************************* + +Message content such as the contents of the prompt, completion, function arguments and return values +are not captured by default. To capture message content as log events, set the environment variable +`OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` to `true`. + +Uninstrument +************ + +To uninstrument clients, call the uninstrument method: + +.. code-block:: python + + from opentelemetry.instrumentation.vertexai import VertexAIInstrumentor + + VertexAIInstrumentor().instrument() + # ... + + # Uninstrument all clients + VertexAIInstrumentor().uninstrument() + +References +---------- +* `OpenTelemetry VertexAI Instrumentation `_ +* `OpenTelemetry Project `_ +* `OpenTelemetry Python Examples `_ + diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/.env b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/.env new file mode 100644 index 0000000000..9ca033983f --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/.env @@ -0,0 +1,8 @@ +# Uncomment and change to your OTLP endpoint +# OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 +# OTEL_EXPORTER_OTLP_PROTOCOL=grpc + +OTEL_SERVICE_NAME=opentelemetry-python-vertexai + +# Change to 'false' to hide prompt and completion content +OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/README.rst b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/README.rst new file mode 100644 index 0000000000..ab5e7d1c5c --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/README.rst @@ -0,0 +1,43 @@ +OpenTelemetry VertexAI Instrumentation Example +============================================ + +This is an example of how to instrument VertexAI calls when configuring OpenTelemetry SDK and Instrumentations manually. + +When `main.py `_ is run, it exports traces and logs to an OTLP +compatible endpoint. Traces include details such as the model used and the +duration of the chat request. Logs capture the chat request and the generated +response, providing a comprehensive view of the performance and behavior of +your VertexAI requests. + +Note: `.env <.env>`_ file configures additional environment variables: + +- `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true` configures +VertexAI instrumentation to capture prompt and completion contents on +events. + +Setup +----- + +An OTLP compatible endpoint should be listening for traces and logs on +http://localhost:4317. If not, update "OTEL_EXPORTER_OTLP_ENDPOINT" as well. + +Next, set up a virtual environment like this: + +:: + + python3 -m venv .venv + source .venv/bin/activate + pip install "python-dotenv[cli]" + pip install -r requirements.txt + +Run +--- + +Run the example like this: + +:: + + dotenv run -- python main.py + +You should see a poem generated by VertexAI while traces and logs export to your +configured observability tool. diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/main.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/main.py new file mode 100644 index 0000000000..5d329aad8b --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/main.py @@ -0,0 +1,47 @@ +# pylint: skip-file +import vertexai +from vertexai.generative_models import GenerativeModel + +# NOTE: OpenTelemetry Python Logs and Events APIs are in beta +from opentelemetry import _events, _logs, trace +from opentelemetry.exporter.otlp.proto.grpc._log_exporter import ( + OTLPLogExporter, +) +from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import ( + OTLPSpanExporter, +) +from opentelemetry.instrumentation.vertexai import VertexAIInstrumentor +from opentelemetry.sdk._events import EventLoggerProvider +from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk._logs.export import BatchLogRecordProcessor +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +# configure tracing +trace.set_tracer_provider(TracerProvider()) +trace.get_tracer_provider().add_span_processor( + BatchSpanProcessor(OTLPSpanExporter()) +) + +# configure logging and events +_logs.set_logger_provider(LoggerProvider()) +_logs.get_logger_provider().add_log_record_processor( + BatchLogRecordProcessor(OTLPLogExporter()) +) +_events.set_event_logger_provider(EventLoggerProvider()) + +# instrument VertexAI +VertexAIInstrumentor().instrument() + + +def main(): + vertexai.init() + model = GenerativeModel("gemini-1.5-flash-002") + chat_completion = model.generate_content( + "Write a short poem on OpenTelemetry." + ) + print(chat_completion.text) + + +if __name__ == "__main__": + main() diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/requirements.txt b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/requirements.txt new file mode 100644 index 0000000000..aa02037507 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/manual/requirements.txt @@ -0,0 +1,5 @@ +google-cloud-aiplatform>=1.64 + +opentelemetry-sdk~=1.29.0 +opentelemetry-exporter-otlp-proto-grpc~=1.29.0 +opentelemetry-instrumentation-vertexai~=2.0b0 diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/.env b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/.env new file mode 100644 index 0000000000..eefbd59500 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/.env @@ -0,0 +1,14 @@ +# Uncomment and change to your OTLP endpoint +# OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 +# OTEL_EXPORTER_OTLP_PROTOCOL=grpc + +OTEL_SERVICE_NAME=opentelemetry-python-vertexai + +# Change to 'false' to disable collection of python logging logs +OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true + +# Uncomment if your OTLP endpoint doesn't support logs +# OTEL_LOGS_EXPORTER=console + +# Change to 'false' to hide prompt and completion content +OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/README.rst b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/README.rst new file mode 100644 index 0000000000..6fe161f82f --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/README.rst @@ -0,0 +1,38 @@ +OpenTelemetry VertexAI Instrumentation Example +============================================ + +This is an example of how to instrument VertexAI calls with zero code changes, +using `opentelemetry-instrument`. + +When `main.py `_ is run, it exports traces and logs to an OTLP +compatible endpoint. Traces include details such as the model used and the +duration of the chat request. Logs capture the chat request and the generated +response, providing a comprehensive view of the performance and behavior of +your VertexAI requests. + +Setup +----- + +An OTLP compatible endpoint should be listening for traces and logs on http://localhost:4318. +If not, update "OTEL_EXPORTER_OTLP_ENDPOINT" as well. + +Next, set up a virtual environment like this: + +:: + + python3 -m venv .venv + source .venv/bin/activate + pip install "python-dotenv[cli]" + pip install -r requirements.txt + +Run +--- + +Run the example like this: + +:: + + dotenv run -- opentelemetry-instrument python main.py + +You should see a poem generated by VertexAI while traces and logs export to your +configured observability tool. diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/main.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/main.py new file mode 100644 index 0000000000..0f9086bb88 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/main.py @@ -0,0 +1,15 @@ +import vertexai +from vertexai.generative_models import GenerativeModel + + +def main(): + vertexai.init() + model = GenerativeModel("gemini-1.5-flash-002") + chat_completion = model.generate_content( + "Write a short poem on OpenTelemetry." + ) + print(chat_completion.text) + + +if __name__ == "__main__": + main() diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/requirements.txt b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/requirements.txt new file mode 100644 index 0000000000..a44caf9766 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/zero-code/requirements.txt @@ -0,0 +1,6 @@ +google-cloud-aiplatform>=1.64 + +opentelemetry-sdk~=1.28.2 +opentelemetry-exporter-otlp-proto-http~=1.28.2 +opentelemetry-distro~=0.49b2 +opentelemetry-instrumentation-vertexai~=2.0b0 diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/pyproject.toml b/instrumentation-genai/opentelemetry-instrumentation-vertexai/pyproject.toml new file mode 100644 index 0000000000..910ebc2328 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/pyproject.toml @@ -0,0 +1,50 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "opentelemetry-instrumentation-vertexai" +dynamic = ["version"] +description = "OpenTelemetry Official VertexAI instrumentation" +readme = "README.rst" +license = "Apache-2.0" +requires-python = ">=3.8" +authors = [ + { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, +] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +dependencies = [ + "opentelemetry-api ~= 1.28", + "opentelemetry-instrumentation ~= 0.49b0", + "opentelemetry-semantic-conventions ~= 0.49b0", +] + +[project.optional-dependencies] +instruments = ["google-cloud-aiplatform >= 1.64"] + +[project.entry-points.opentelemetry_instrumentor] +vertexai = "opentelemetry.instrumentation.vertexai:VertexAIInstrumentor" + +[project.urls] +Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation-genai/opentelemetry-instrumentation-vertexai" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" + +[tool.hatch.version] +path = "src/opentelemetry/instrumentation/vertexai/version.py" + +[tool.hatch.build.targets.sdist] +include = ["/src", "/tests"] + +[tool.hatch.build.targets.wheel] +packages = ["src/opentelemetry"] diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/__init__.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/__init__.py new file mode 100644 index 0000000000..b2011513a9 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/__init__.py @@ -0,0 +1,74 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +VertexAI client instrumentation supporting `google-cloud-aiplatform` SDK, it can be enabled by +using ``VertexAIInstrumentor``. + +.. _vertexai: https://pypi.org/project/google-cloud-aiplatform/ + +Usage +----- + +.. code:: python + + import vertexai + from vertexai.generative_models import GenerativeModel + from opentelemetry.instrumentation.vertexai import VertexAIInstrumentor + + VertexAIInstrumentor().instrument() + + vertexai.init() + model = GenerativeModel("gemini-1.5-flash-002") + chat_completion = model.generate_content( + "Write a short poem on OpenTelemetry." + ) + +API +--- +""" + +from typing import Collection + +from opentelemetry._events import get_event_logger +from opentelemetry.instrumentation.instrumentor import BaseInstrumentor +from opentelemetry.instrumentation.vertexai.package import _instruments +from opentelemetry.semconv.schemas import Schemas +from opentelemetry.trace import get_tracer + + +class VertexAIInstrumentor(BaseInstrumentor): + def instrumentation_dependencies(self) -> Collection[str]: + return _instruments + + def _instrument(self, **kwargs): + """Enable VertexAI instrumentation.""" + tracer_provider = kwargs.get("tracer_provider") + _tracer = get_tracer( + __name__, + "", + tracer_provider, + schema_url=Schemas.V1_28_0.value, + ) + event_logger_provider = kwargs.get("event_logger_provider") + _event_logger = get_event_logger( + __name__, + "", + schema_url=Schemas.V1_28_0.value, + event_logger_provider=event_logger_provider, + ) + # TODO: implemented in later PR + + def _uninstrument(self, **kwargs) -> None: + """TODO: implemented in later PR""" diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/package.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/package.py new file mode 100644 index 0000000000..c5f776ac5e --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/package.py @@ -0,0 +1,16 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +_instruments = ("google-cloud-aiplatform >= 1.64",) diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/patch.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/patch.py new file mode 100644 index 0000000000..b0a6f42841 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/patch.py @@ -0,0 +1,13 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/version.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/version.py new file mode 100644 index 0000000000..5b77207d9d --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/version.py @@ -0,0 +1,15 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +__version__ = "2.1b0.dev" diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-0.txt b/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-0.txt new file mode 100644 index 0000000000..3450e980ad --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-0.txt @@ -0,0 +1,57 @@ +annotated-types==0.7.0 +cachetools==5.5.0 +certifi==2024.8.30 +charset-normalizer==3.4.0 +Deprecated==1.2.14 +docstring_parser==0.16 +exceptiongroup==1.2.2 +google-api-core==2.23.0 +google-auth==2.36.0 +google-cloud-aiplatform==1.74.0 +google-cloud-bigquery==3.27.0 +google-cloud-core==2.4.1 +google-cloud-resource-manager==1.13.1 +google-cloud-storage==2.19.0 +google-crc32c==1.5.0 +google-resumable-media==2.7.2 +googleapis-common-protos==1.66.0 +grpc-google-iam-v1==0.13.1 +grpcio==1.68.1 +grpcio-status==1.68.1 +idna==3.10 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +multidict==6.1.0 +packaging==24.0 +pluggy==1.5.0 +propcache==0.2.0 +proto-plus==1.25.0 +protobuf==5.29.1 +pyasn1==0.6.1 +pyasn1_modules==0.4.1 +pydantic==2.8.2 +pydantic_core==2.20.1 +pytest==7.4.4 +pytest-asyncio==0.21.0 +pytest-vcr==1.0.2 +python-dateutil==2.9.0.post0 +PyYAML==6.0.2 +requests==2.32.3 +rsa==4.9 +shapely==2.0.6 +six==1.17.0 +tomli==2.2.1 +typing_extensions==4.12.2 +urllib3==1.26.20 +vcrpy==6.0.2 +wrapt==1.16.0 +yarl==1.15.2 +zipp==3.20.2 + +# when updating, also update in pyproject.toml +opentelemetry-api==1.28 +opentelemetry-sdk==1.28 +opentelemetry-semantic-conventions==0.49b0 +opentelemetry-instrumentation==0.49b0 + +-e instrumentation-genai/opentelemetry-instrumentation-vertexai[instruments] diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-1.txt b/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-1.txt new file mode 100644 index 0000000000..9980561fb5 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-1.txt @@ -0,0 +1,54 @@ +annotated-types==0.7.0 +asgiref==3.8.1 +cachetools==5.5.0 +certifi==2024.8.30 +charset-normalizer==3.4.0 +Deprecated==1.2.15 +docstring_parser==0.16 +exceptiongroup==1.2.2 +google-api-core==2.23.0 +google-auth==2.36.0 +google-cloud-aiplatform==1.74.0 +google-cloud-bigquery==3.27.0 +google-cloud-core==2.4.1 +google-cloud-resource-manager==1.13.1 +google-cloud-storage==2.19.0 +google-crc32c==1.5.0 +google-resumable-media==2.7.2 +googleapis-common-protos==1.66.0 +grpc-google-iam-v1==0.13.1 +grpcio==1.68.1 +grpcio-status==1.68.1 +idna==3.10 +importlib_metadata==8.5.0 +iniconfig==2.0.0 +multidict==6.1.0 +packaging==24.2 +pluggy==1.5.0 +propcache==0.2.0 +proto-plus==1.25.0 +protobuf==5.29.1 +pyasn1==0.6.1 +pyasn1_modules==0.4.1 +pydantic==2.10.3 +pydantic_core==2.27.1 +pytest==7.4.4 +pytest-asyncio==0.21.0 +pytest-vcr==1.0.2 +python-dateutil==2.9.0.post0 +PyYAML==6.0.2 +requests==2.32.3 +rsa==4.9 +shapely==2.0.6 +six==1.17.0 +tomli==2.2.1 +typing_extensions==4.12.2 +urllib3==1.26.20 +vcrpy==6.0.2 +wrapt==1.17.0 +yarl==1.15.2 +zipp==3.20.2 +# test with the latest version of opentelemetry-api, sdk, and semantic conventions + +-e opentelemetry-instrumentation +-e instrumentation-genai/opentelemetry-instrumentation-vertexai[instruments] diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/py.typed b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/__init__.py similarity index 100% rename from instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/py.typed rename to instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/__init__.py diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/conftest.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/conftest.py new file mode 100644 index 0000000000..8337188ece --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/conftest.py @@ -0,0 +1,136 @@ +"""Unit tests configuration module.""" + +import json + +import pytest +import yaml + +from opentelemetry.sdk._events import EventLoggerProvider +from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk._logs.export import ( + InMemoryLogExporter, + SimpleLogRecordProcessor, +) +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import SimpleSpanProcessor +from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( + InMemorySpanExporter, +) + + +@pytest.fixture(scope="function", name="span_exporter") +def fixture_span_exporter(): + exporter = InMemorySpanExporter() + yield exporter + + +@pytest.fixture(scope="function", name="log_exporter") +def fixture_log_exporter(): + exporter = InMemoryLogExporter() + yield exporter + + +@pytest.fixture(scope="function", name="tracer_provider") +def fixture_tracer_provider(span_exporter): + provider = TracerProvider() + provider.add_span_processor(SimpleSpanProcessor(span_exporter)) + return provider + + +@pytest.fixture(scope="function", name="event_logger_provider") +def fixture_event_logger_provider(log_exporter): + provider = LoggerProvider() + provider.add_log_record_processor(SimpleLogRecordProcessor(log_exporter)) + event_logger_provider = EventLoggerProvider(provider) + + return event_logger_provider + + +@pytest.fixture(scope="module") +def vcr_config(): + return { + "filter_headers": [ + ("cookie", "test_cookie"), + ("authorization", "Bearer test_vertexai_api_key"), + ("vertexai-organization", "test_vertexai_org_id"), + ("vertexai-project", "test_vertexai_project_id"), + ], + "decode_compressed_response": True, + "before_record_response": scrub_response_headers, + } + + +class LiteralBlockScalar(str): + """Formats the string as a literal block scalar, preserving whitespace and + without interpreting escape characters""" + + +def literal_block_scalar_presenter(dumper, data): + """Represents a scalar string as a literal block, via '|' syntax""" + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|") + + +yaml.add_representer(LiteralBlockScalar, literal_block_scalar_presenter) + + +def process_string_value(string_value): + """Pretty-prints JSON or returns long strings as a LiteralBlockScalar""" + try: + json_data = json.loads(string_value) + return LiteralBlockScalar(json.dumps(json_data, indent=2)) + except (ValueError, TypeError): + if len(string_value) > 80: + return LiteralBlockScalar(string_value) + return string_value + + +def convert_body_to_literal(data): + """Searches the data for body strings, attempting to pretty-print JSON""" + if isinstance(data, dict): + for key, value in data.items(): + # Handle response body case (e.g., response.body.string) + if key == "body" and isinstance(value, dict) and "string" in value: + value["string"] = process_string_value(value["string"]) + + # Handle request body case (e.g., request.body) + elif key == "body" and isinstance(value, str): + data[key] = process_string_value(value) + + else: + convert_body_to_literal(value) + + elif isinstance(data, list): + for idx, choice in enumerate(data): + data[idx] = convert_body_to_literal(choice) + + return data + + +class PrettyPrintJSONBody: + """This makes request and response body recordings more readable.""" + + @staticmethod + def serialize(cassette_dict): + cassette_dict = convert_body_to_literal(cassette_dict) + return yaml.dump( + cassette_dict, default_flow_style=False, allow_unicode=True + ) + + @staticmethod + def deserialize(cassette_string): + return yaml.load(cassette_string, Loader=yaml.Loader) + + +@pytest.fixture(scope="module", autouse=True) +def fixture_vcr(vcr): + vcr.register_serializer("yaml", PrettyPrintJSONBody) + return vcr + + +def scrub_response_headers(response): + """ + This scrubs sensitive response headers. Note they are case-sensitive! + """ + response["headers"]["vertexai-organization"] = "test_vertexai_org_id" + response["headers"]["Set-Cookie"] = "test_set_cookie" + return response diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_placeholder.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_placeholder.py new file mode 100644 index 0000000000..c910bfa0bf --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_placeholder.py @@ -0,0 +1,20 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# TODO: adapt tests from OpenLLMetry here along with tests from +# instrumentation-genai/opentelemetry-instrumentation-openai-v2/tests/test_chat_completions.py + + +def test_placeholder(): + assert True diff --git a/instrumentation/README.md b/instrumentation/README.md index bff37fde6c..d1b383d5a6 100644 --- a/instrumentation/README.md +++ b/instrumentation/README.md @@ -16,11 +16,11 @@ | [opentelemetry-instrumentation-cassandra](./opentelemetry-instrumentation-cassandra) | cassandra-driver ~= 3.25,scylla-driver ~= 3.25 | No | experimental | [opentelemetry-instrumentation-celery](./opentelemetry-instrumentation-celery) | celery >= 4.0, < 6.0 | No | experimental | [opentelemetry-instrumentation-click](./opentelemetry-instrumentation-click) | click >= 8.1.3, < 9.0.0 | No | experimental -| [opentelemetry-instrumentation-confluent-kafka](./opentelemetry-instrumentation-confluent-kafka) | confluent-kafka >= 1.8.2, <= 2.4.0 | No | experimental +| [opentelemetry-instrumentation-confluent-kafka](./opentelemetry-instrumentation-confluent-kafka) | confluent-kafka >= 1.8.2, <= 2.7.0 | No | experimental | [opentelemetry-instrumentation-dbapi](./opentelemetry-instrumentation-dbapi) | dbapi | No | experimental | [opentelemetry-instrumentation-django](./opentelemetry-instrumentation-django) | django >= 1.10 | Yes | experimental | [opentelemetry-instrumentation-elasticsearch](./opentelemetry-instrumentation-elasticsearch) | elasticsearch >= 6.0 | No | experimental -| [opentelemetry-instrumentation-falcon](./opentelemetry-instrumentation-falcon) | falcon >= 1.4.1, < 4.0.0 | Yes | experimental +| [opentelemetry-instrumentation-falcon](./opentelemetry-instrumentation-falcon) | falcon >= 1.4.1, < 5.0.0 | Yes | experimental | [opentelemetry-instrumentation-fastapi](./opentelemetry-instrumentation-fastapi) | fastapi ~= 0.58 | Yes | migration | [opentelemetry-instrumentation-flask](./opentelemetry-instrumentation-flask) | flask >= 1.0 | Yes | migration | [opentelemetry-instrumentation-grpc](./opentelemetry-instrumentation-grpc) | grpcio >= 1.42.0 | No | experimental diff --git a/instrumentation/opentelemetry-instrumentation-aio-pika/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aio-pika/pyproject.toml index de0f7e6a71..9b4e76d547 100644 --- a/instrumentation/opentelemetry-instrumentation-aio-pika/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-aio-pika/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.5", @@ -40,6 +41,7 @@ aio-pika = "opentelemetry.instrumentation.aio_pika:AioPikaInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-aio-pika" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/aio_pika/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-client/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aiohttp-client/pyproject.toml index 7fcb829bc6..879f10f43c 100644 --- a/instrumentation/opentelemetry-instrumentation-aiohttp-client/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-aiohttp-client/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -42,6 +43,7 @@ aiohttp-client = "opentelemetry.instrumentation.aiohttp_client:AioHttpClientInst [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-aiohttp-client" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/aiohttp_client/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/__init__.py b/instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/__init__.py index de60fa6379..c43522efe1 100644 --- a/instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/__init__.py @@ -92,13 +92,13 @@ def response_hook(span: Span, params: typing.Union[ from opentelemetry import trace from opentelemetry.instrumentation._semconv import ( _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, _report_new, _set_http_method, _set_http_url, _set_status, + _StabilityMode, ) from opentelemetry.instrumentation.aiohttp_client.package import _instruments from opentelemetry.instrumentation.aiohttp_client.version import __version__ @@ -142,7 +142,7 @@ def _set_http_status_code_attribute( span, status_code, metric_attributes=None, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ): status_code_str = str(status_code) try: @@ -169,7 +169,7 @@ def create_trace_config( request_hook: _RequestHookT = None, response_hook: _ResponseHookT = None, tracer_provider: TracerProvider = None, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ) -> aiohttp.TraceConfig: """Create an aiohttp-compatible trace configuration. @@ -326,7 +326,7 @@ def _instrument( trace_configs: typing.Optional[ typing.Sequence[aiohttp.TraceConfig] ] = None, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): """Enables tracing of all ClientSessions diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-client/tests/test_aiohttp_client_integration.py b/instrumentation/opentelemetry-instrumentation-aiohttp-client/tests/test_aiohttp_client_integration.py index 33b08fc0b6..62c837f88d 100644 --- a/instrumentation/opentelemetry-instrumentation-aiohttp-client/tests/test_aiohttp_client_integration.py +++ b/instrumentation/opentelemetry-instrumentation-aiohttp-client/tests/test_aiohttp_client_integration.py @@ -29,8 +29,8 @@ from opentelemetry.instrumentation import aiohttp_client from opentelemetry.instrumentation._semconv import ( OTEL_SEMCONV_STABILITY_OPT_IN, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, + _StabilityMode, ) from opentelemetry.instrumentation.aiohttp_client import ( AioHttpClientInstrumentor, @@ -150,7 +150,7 @@ def test_status_codes_new_semconv(self): path = "test-path?query=param#foobar" host, port = self._http_request( trace_config=aiohttp_client.create_trace_config( - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP + sem_conv_opt_in_mode=_StabilityMode.HTTP ), url=f"/{path}", status_code=status_code, @@ -173,7 +173,7 @@ def test_status_codes_both_semconv(self): path = "test-path?query=param#foobar" host, port = self._http_request( trace_config=aiohttp_client.create_trace_config( - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP_DUP + sem_conv_opt_in_mode=_StabilityMode.HTTP_DUP ), url=f"/{path}", status_code=status_code, @@ -213,7 +213,7 @@ def test_schema_url_new_semconv(self): with self.subTest(status_code=200): self._http_request( trace_config=aiohttp_client.create_trace_config( - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP + sem_conv_opt_in_mode=_StabilityMode.HTTP ), url="/test-path?query=param#foobar", status_code=200, @@ -230,7 +230,7 @@ def test_schema_url_both_semconv(self): with self.subTest(status_code=200): self._http_request( trace_config=aiohttp_client.create_trace_config( - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP_DUP + sem_conv_opt_in_mode=_StabilityMode.HTTP_DUP ), url="/test-path?query=param#foobar", status_code=200, @@ -398,7 +398,7 @@ async def request_handler(request): host, port = self._http_request( trace_config=aiohttp_client.create_trace_config( - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP + sem_conv_opt_in_mode=_StabilityMode.HTTP ), url="/test", request_handler=request_handler, @@ -426,7 +426,7 @@ async def request_handler(request): host, port = self._http_request( trace_config=aiohttp_client.create_trace_config( - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP_DUP + sem_conv_opt_in_mode=_StabilityMode.HTTP_DUP ), url="/test", request_handler=request_handler, @@ -546,7 +546,7 @@ async def do_request(url): def test_nonstandard_http_method_new_semconv(self): trace_configs = [ aiohttp_client.create_trace_config( - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP + sem_conv_opt_in_mode=_StabilityMode.HTTP ) ] app = HttpServerMock("nonstandard_method") diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-server/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aiohttp-server/pyproject.toml index 5e098e38b6..2d44aff1b2 100644 --- a/instrumentation/opentelemetry-instrumentation-aiohttp-server/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-aiohttp-server/pyproject.toml @@ -13,16 +13,17 @@ authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io"} ] classifiers = [ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -42,6 +43,7 @@ aiohttp-server = "opentelemetry.instrumentation.aiohttp_server:AioHttpServerInst [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-aiohttp-server" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/aiohttp_server/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aiokafka/pyproject.toml index a3fb3c15be..b6379d8068 100644 --- a/instrumentation/opentelemetry-instrumentation-aiokafka/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-aiokafka/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.27", @@ -38,6 +39,7 @@ aiokafka = "opentelemetry.instrumentation.aiokafka:AIOKafkaInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-aiokafka" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/aiokafka/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aiopg/pyproject.toml index 13659d6a73..c86a669396 100644 --- a/instrumentation/opentelemetry-instrumentation-aiopg/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-aiopg/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ aiopg = "opentelemetry.instrumentation.aiopg:AiopgInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-aiopg" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/aiopg/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/__init__.py b/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/__init__.py index 1d51d14d5b..3a28c0aab1 100644 --- a/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/__init__.py @@ -25,22 +25,39 @@ import aiopg from opentelemetry.instrumentation.aiopg import AiopgInstrumentor - + # Call instrument() to wrap all database connections AiopgInstrumentor().instrument() cnx = await aiopg.connect(database='Database') cursor = await cnx.cursor() + await cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") await cursor.execute("INSERT INTO test (testField) VALUES (123)") cursor.close() cnx.close() pool = await aiopg.create_pool(database='Database') + cnx = await pool.acquire() cursor = await cnx.cursor() + await cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") await cursor.execute("INSERT INTO test (testField) VALUES (123)") cursor.close() cnx.close() +.. code-block:: python + + import aiopg + from opentelemetry.instrumentation.aiopg import AiopgInstrumentor + + # Alternatively, use instrument_connection for an individual connection + cnx = await aiopg.connect(database='Database') + instrumented_cnx = AiopgInstrumentor().instrument_connection(cnx) + cursor = await instrumented_cnx.cursor() + await cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") + await cursor.execute("INSERT INTO test (testField) VALUES (123)") + cursor.close() + instrumented_cnx.close() + API --- """ diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt index 58669a50f9..a3d94d65ee 100644 --- a/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt +++ b/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt @@ -5,7 +5,7 @@ Deprecated==1.2.14 iniconfig==2.0.0 packaging==24.0 pluggy==1.5.0 -psycopg2-binary==2.9.9 +psycopg2-binary==2.9.10 py-cpuinfo==9.0.0 pytest==7.4.4 tomli==2.0.1 diff --git a/instrumentation/opentelemetry-instrumentation-asgi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-asgi/pyproject.toml index 69378faf78..e1788334c3 100644 --- a/instrumentation/opentelemetry-instrumentation-asgi/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-asgi/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "asgiref ~= 3.0", @@ -39,6 +40,7 @@ instruments = [ [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-asgi" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/asgi/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py b/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py index 725532bc15..b060095160 100644 --- a/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py @@ -205,7 +205,6 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A _filter_semconv_active_request_count_attr, _filter_semconv_duration_attrs, _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, _report_new, @@ -225,6 +224,7 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A _set_http_url, _set_http_user_agent, _set_status, + _StabilityMode, ) from opentelemetry.instrumentation.asgi.types import ( ClientRequestHook, @@ -324,7 +324,7 @@ def set(self, carrier: dict, key: str, value: str) -> None: # pylint: disable=n # pylint: disable=too-many-branches def collect_request_attributes( - scope, sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT + scope, sem_conv_opt_in_mode=_StabilityMode.DEFAULT ): """Collects HTTP request attributes from the ASGI scope and returns a dictionary to be used as span creation attributes.""" @@ -356,7 +356,7 @@ def collect_request_attributes( _set_http_url( result, remove_url_credentials(http_url), - _HTTPStabilityMode.DEFAULT, + _StabilityMode.DEFAULT, ) http_method = scope.get("method", "") if http_method: @@ -439,7 +439,7 @@ def set_status_code( span, status_code, metric_attributes=None, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ): """Adds HTTP response attributes to span using the status_code argument.""" status_code_str = str(status_code) @@ -755,12 +755,12 @@ async def __call__( ) duration_s = default_timer() - start duration_attrs_old = _parse_duration_attrs( - attributes, _HTTPStabilityMode.DEFAULT + attributes, _StabilityMode.DEFAULT ) if target: duration_attrs_old[SpanAttributes.HTTP_TARGET] = target duration_attrs_new = _parse_duration_attrs( - attributes, _HTTPStabilityMode.HTTP + attributes, _StabilityMode.HTTP ) if self.duration_histogram_old: self.duration_histogram_old.record( @@ -960,7 +960,7 @@ async def otel_send(message: dict[str, Any]): def _parse_duration_attrs( - req_attrs, sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT + req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT ): return _filter_semconv_duration_attrs( req_attrs, @@ -971,7 +971,7 @@ def _parse_duration_attrs( def _parse_active_request_count_attrs( - req_attrs, sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT + req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT ): return _filter_semconv_active_request_count_attr( req_attrs, diff --git a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py index a9d7897ea6..6fcccf84ec 100644 --- a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py +++ b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py @@ -24,12 +24,12 @@ from opentelemetry import trace as trace_api from opentelemetry.instrumentation._semconv import ( OTEL_SEMCONV_STABILITY_OPT_IN, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _server_active_requests_count_attrs_new, _server_active_requests_count_attrs_old, _server_duration_attrs_new, _server_duration_attrs_old, + _StabilityMode, ) from opentelemetry.instrumentation.propagators import ( TraceResponsePropagator, @@ -1652,7 +1652,7 @@ def test_request_attributes_new_semconv(self): attrs = otel_asgi.collect_request_attributes( self.scope, - _HTTPStabilityMode.HTTP, + _StabilityMode.HTTP, ) self.assertDictEqual( @@ -1677,7 +1677,7 @@ def test_request_attributes_both_semconv(self): attrs = otel_asgi.collect_request_attributes( self.scope, - _HTTPStabilityMode.HTTP_DUP, + _StabilityMode.HTTP_DUP, ) self.assertDictEqual( @@ -1715,7 +1715,7 @@ def test_query_string_new_semconv(self): self.scope["query_string"] = b"foo=bar" attrs = otel_asgi.collect_request_attributes( self.scope, - _HTTPStabilityMode.HTTP, + _StabilityMode.HTTP, ) self.assertEqual(attrs[URL_SCHEME], "http") self.assertEqual(attrs[CLIENT_ADDRESS], "127.0.0.1") @@ -1726,7 +1726,7 @@ def test_query_string_both_semconv(self): self.scope["query_string"] = b"foo=bar" attrs = otel_asgi.collect_request_attributes( self.scope, - _HTTPStabilityMode.HTTP_DUP, + _StabilityMode.HTTP_DUP, ) self.assertEqual( attrs[SpanAttributes.HTTP_URL], "http://127.0.0.1/?foo=bar" @@ -1762,7 +1762,7 @@ def test_response_attributes_new_semconv(self): self.span, 404, None, - _HTTPStabilityMode.HTTP, + _StabilityMode.HTTP, ) expected = (mock.call(HTTP_RESPONSE_STATUS_CODE, 404),) self.assertEqual(self.span.set_attribute.call_count, 1) @@ -1774,7 +1774,7 @@ def test_response_attributes_both_semconv(self): self.span, 404, None, - _HTTPStabilityMode.HTTP_DUP, + _StabilityMode.HTTP_DUP, ) expected = (mock.call(SpanAttributes.HTTP_STATUS_CODE, 404),) expected2 = (mock.call(HTTP_RESPONSE_STATUS_CODE, 404),) diff --git a/instrumentation/opentelemetry-instrumentation-asyncio/pyproject.toml b/instrumentation/opentelemetry-instrumentation-asyncio/pyproject.toml index b948a18067..7836b17f3f 100644 --- a/instrumentation/opentelemetry-instrumentation-asyncio/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-asyncio/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.14", @@ -39,6 +40,7 @@ asyncio = "opentelemetry.instrumentation.asyncio:AsyncioInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-asyncio" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/asyncio/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-asyncpg/pyproject.toml b/instrumentation/opentelemetry-instrumentation-asyncpg/pyproject.toml index e4542789b9..53caf26581 100644 --- a/instrumentation/opentelemetry-instrumentation-asyncpg/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-asyncpg/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ asyncpg = "opentelemetry.instrumentation.asyncpg:AsyncPGInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-asyncpg" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/asyncpg/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt index c1a45c5887..b2b4401d6b 100644 --- a/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt +++ b/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt @@ -1,6 +1,6 @@ asgiref==3.8.1 async-timeout==4.0.3 -asyncpg==0.29.0 +asyncpg==0.30.0 Deprecated==1.2.14 iniconfig==2.0.0 packaging==24.0 diff --git a/instrumentation/opentelemetry-instrumentation-asyncpg/tests/test_asyncpg_wrapper.py b/instrumentation/opentelemetry-instrumentation-asyncpg/tests/test_asyncpg_wrapper.py index 7c88b9c005..0fc44d6a23 100644 --- a/instrumentation/opentelemetry-instrumentation-asyncpg/tests/test_asyncpg_wrapper.py +++ b/instrumentation/opentelemetry-instrumentation-asyncpg/tests/test_asyncpg_wrapper.py @@ -5,6 +5,7 @@ from asyncpg import Connection, Record, cursor from wrapt import ObjectProxy +from opentelemetry import trace as trace_api from opentelemetry.instrumentation.asyncpg import AsyncPGInstrumentor from opentelemetry.test.test_base import TestBase @@ -105,3 +106,36 @@ async def exec_mock(*args, **kwargs): spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 2) self.assertEqual([span.status.is_ok for span in spans], [True, True]) + + def test_no_op_tracer_provider(self): + AsyncPGInstrumentor().uninstrument() + AsyncPGInstrumentor().instrument( + tracer_provider=trace_api.NoOpTracerProvider() + ) + + # Mock out all interaction with postgres + async def bind_mock(*args, **kwargs): + return [] + + async def exec_mock(*args, **kwargs): + return [], None, True + + conn = mock.Mock() + conn.is_closed = lambda: False + + conn._protocol = mock.Mock() + conn._protocol.bind = bind_mock + conn._protocol.execute = exec_mock + conn._protocol.bind_execute = exec_mock + conn._protocol.close_portal = bind_mock + + state = mock.Mock() + state.closed = False + + # init the cursor and fetch a single record + crs = cursor.Cursor(conn, "SELECT * FROM test", state, [], Record) + asyncio.run(crs._init(1)) + asyncio.run(crs.fetch(1)) + + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 0) diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aws-lambda/pyproject.toml index 4ddc85072f..6b4e5d9199 100644 --- a/instrumentation/opentelemetry-instrumentation-aws-lambda/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-instrumentation == 0.51b0.dev", @@ -38,6 +39,7 @@ aws-lambda = "opentelemetry.instrumentation.aws_lambda:AwsLambdaInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-aws-lambda" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/aws_lambda/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py index b31e6dea72..b1f61b9ce8 100644 --- a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py @@ -55,6 +55,7 @@ def lambda_handler(event, context): .. code:: python from opentelemetry.instrumentation.aws_lambda import AwsLambdaInstrumentor + from opentelemetry.propagate import get_global_textmap def custom_event_context_extractor(lambda_event): # If the `TraceContextTextMapPropagator` is the global propagator, we diff --git a/instrumentation/opentelemetry-instrumentation-boto/pyproject.toml b/instrumentation/opentelemetry-instrumentation-boto/pyproject.toml index c898e65dad..15c6616908 100644 --- a/instrumentation/opentelemetry-instrumentation-boto/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-boto/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -39,6 +40,7 @@ boto = "opentelemetry.instrumentation.boto:BotoInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-boto" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/boto/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-boto3sqs/pyproject.toml b/instrumentation/opentelemetry-instrumentation-boto3sqs/pyproject.toml index 4341f2fab6..235968f5cb 100644 --- a/instrumentation/opentelemetry-instrumentation-boto3sqs/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-boto3sqs/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ boto3 = "opentelemetry.instrumentation.boto3sqs:Boto3SQSInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-boto3sqs" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/boto3sqs/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-botocore/pyproject.toml b/instrumentation/opentelemetry-instrumentation-botocore/pyproject.toml index f0e666d443..fe59236d52 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-botocore/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ botocore = "opentelemetry.instrumentation.botocore:BotocoreInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-botocore" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/botocore/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-cassandra/pyproject.toml b/instrumentation/opentelemetry-instrumentation-cassandra/pyproject.toml index 79ba6ca83a..8e3a724acc 100644 --- a/instrumentation/opentelemetry-instrumentation-cassandra/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-cassandra/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -42,6 +43,7 @@ cassandra = "opentelemetry.instrumentation.cassandra:CassandraInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-cassandra" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/cassandra/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-cassandra/tests/test_cassandra_integration.py b/instrumentation/opentelemetry-instrumentation-cassandra/tests/test_cassandra_integration.py index 9a36bb9069..7f1e55238c 100644 --- a/instrumentation/opentelemetry-instrumentation-cassandra/tests/test_cassandra_integration.py +++ b/instrumentation/opentelemetry-instrumentation-cassandra/tests/test_cassandra_integration.py @@ -43,6 +43,10 @@ def tearDown(self): with self.disable_logging(): CassandraInstrumentor().uninstrument() + @property + def _mocked_session(self): + return cassandra.cluster.Session(cluster=mock.Mock(), hosts=[]) + def test_instrument_uninstrument(self): instrumentation = CassandraInstrumentor() instrumentation.instrument() @@ -67,7 +71,7 @@ def test_instrumentor( ): mock_create_response_future.return_value = mock.Mock() mock_session_init.return_value = None - mock_connect.return_value = cassandra.cluster.Session() + mock_connect.return_value = self._mocked_session CassandraInstrumentor().instrument() @@ -100,7 +104,7 @@ def test_custom_tracer_provider( ): mock_create_response_future.return_value = mock.Mock() mock_session_init.return_value = None - mock_connect.return_value = cassandra.cluster.Session() + mock_connect.return_value = self._mocked_session resource = resources.Resource.create({}) result = self.create_tracer_provider(resource=resource) @@ -124,7 +128,7 @@ def test_instrument_connection_no_op_tracer_provider( ): mock_create_response_future.return_value = mock.Mock() mock_session_init.return_value = None - mock_connect.return_value = cassandra.cluster.Session() + mock_connect.return_value = self._mocked_session tracer_provider = trace_api.NoOpTracerProvider() CassandraInstrumentor().instrument(tracer_provider=tracer_provider) diff --git a/instrumentation/opentelemetry-instrumentation-celery/pyproject.toml b/instrumentation/opentelemetry-instrumentation-celery/pyproject.toml index 0355940416..dea0d4fb46 100644 --- a/instrumentation/opentelemetry-instrumentation-celery/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-celery/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ celery = "opentelemetry.instrumentation.celery:CeleryInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-celery" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/celery/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/utils.py b/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/utils.py index 6af310df5a..d7ca77af8a 100644 --- a/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/utils.py +++ b/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/utils.py @@ -12,8 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + import logging -from typing import ContextManager, Optional, Tuple +from typing import TYPE_CHECKING, Optional, Tuple from celery import registry # pylint: disable=no-name-in-module from celery.app.task import Task @@ -21,6 +23,9 @@ from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace import Span +if TYPE_CHECKING: + from contextlib import AbstractContextManager + logger = logging.getLogger(__name__) # Celery Context key @@ -123,7 +128,7 @@ def attach_context( task: Optional[Task], task_id: str, span: Span, - activation: ContextManager[Span], + activation: AbstractContextManager[Span], token: Optional[object], is_publish: bool = False, ) -> None: @@ -171,7 +176,7 @@ def detach_context(task, task_id, is_publish=False) -> None: def retrieve_context( task, task_id, is_publish=False -) -> Optional[Tuple[Span, ContextManager[Span], Optional[object]]]: +) -> Optional[Tuple[Span, AbstractContextManager[Span], Optional[object]]]: """Helper to retrieve an active `Span`, `ContextManager` and context token stored in a `Task` instance """ diff --git a/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt index 5ef9e5750a..4d3afc74e4 100644 --- a/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt +++ b/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt @@ -1,6 +1,6 @@ amqp==5.2.0 asgiref==3.8.1 -billiard==4.2.0 +billiard==4.2.1 celery==5.3.6 click==8.1.7 click-didyoumean==0.3.0 diff --git a/instrumentation/opentelemetry-instrumentation-click/pyproject.toml b/instrumentation/opentelemetry-instrumentation-click/pyproject.toml index f78c8ff605..a6ec7e81a4 100644 --- a/instrumentation/opentelemetry-instrumentation-click/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-click/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ click = "opentelemetry.instrumentation.click:ClickInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-click" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/click/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-click/src/opentelemetry/instrumentation/click/__init__.py b/instrumentation/opentelemetry-instrumentation-click/src/opentelemetry/instrumentation/click/__init__.py index 8222bfdf5a..e820ca7d87 100644 --- a/instrumentation/opentelemetry-instrumentation-click/src/opentelemetry/instrumentation/click/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-click/src/opentelemetry/instrumentation/click/__init__.py @@ -13,7 +13,9 @@ # limitations under the License. """ -Instrument `click`_ CLI applications. +Instrument `click`_ CLI applications. The instrumentor will avoid instrumenting +well-known servers (e.g. *flask run* and *uvicorn*) to avoid unexpected effects +like every request having the same Trace ID. .. _click: https://pypi.org/project/click/ @@ -47,6 +49,12 @@ def hello(): import click from wrapt import wrap_function_wrapper +try: + from flask.cli import ScriptInfo as FlaskScriptInfo +except ImportError: + FlaskScriptInfo = None + + from opentelemetry import trace from opentelemetry.instrumentation.click.package import _instruments from opentelemetry.instrumentation.click.version import __version__ @@ -66,6 +74,20 @@ def hello(): _logger = getLogger(__name__) +def _skip_servers(ctx: click.Context): + # flask run + if ( + ctx.info_name == "run" + and FlaskScriptInfo + and isinstance(ctx.obj, FlaskScriptInfo) + ): + return True + # uvicorn + if ctx.info_name == "uvicorn": + return True + return False + + def _command_invoke_wrapper(wrapped, instance, args, kwargs, tracer): # Subclasses of Command include groups and CLI runners, but # we only want to instrument the actual commands which are @@ -74,6 +96,12 @@ def _command_invoke_wrapper(wrapped, instance, args, kwargs, tracer): return wrapped(*args, **kwargs) ctx = args[0] + + # we don't want to create a root span for long running processes like servers + # otherwise all requests would have the same trace id + if _skip_servers(ctx): + return wrapped(*args, **kwargs) + span_name = ctx.info_name span_attributes = { PROCESS_COMMAND_ARGS: sys.argv, diff --git a/instrumentation/opentelemetry-instrumentation-click/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-click/test-requirements.txt index 6e9162ccde..e07bd05bb7 100644 --- a/instrumentation/opentelemetry-instrumentation-click/test-requirements.txt +++ b/instrumentation/opentelemetry-instrumentation-click/test-requirements.txt @@ -1,7 +1,12 @@ asgiref==3.8.1 +blinker==1.7.0 click==8.1.7 Deprecated==1.2.14 +Flask==3.0.2 iniconfig==2.0.0 +itsdangerous==2.1.2 +Jinja2==3.1.4 +MarkupSafe==2.1.2 packaging==24.0 pluggy==1.5.0 py-cpuinfo==9.0.0 @@ -9,7 +14,11 @@ pytest==7.4.4 pytest-asyncio==0.23.5 tomli==2.0.1 typing_extensions==4.12.2 +Werkzeug==3.0.6 wrapt==1.16.0 zipp==3.19.2 -e opentelemetry-instrumentation -e instrumentation/opentelemetry-instrumentation-click +-e instrumentation/opentelemetry-instrumentation-flask +-e instrumentation/opentelemetry-instrumentation-wsgi +-e util/opentelemetry-util-http diff --git a/instrumentation/opentelemetry-instrumentation-click/tests/test_click.py b/instrumentation/opentelemetry-instrumentation-click/tests/test_click.py index 41d01a5bb4..1b07f6ab56 100644 --- a/instrumentation/opentelemetry-instrumentation-click/tests/test_click.py +++ b/instrumentation/opentelemetry-instrumentation-click/tests/test_click.py @@ -16,8 +16,14 @@ from unittest import mock import click +import pytest from click.testing import CliRunner +try: + from flask import cli as flask_cli +except ImportError: + flask_cli = None + from opentelemetry.instrumentation.click import ClickInstrumentor from opentelemetry.test.test_base import TestBase from opentelemetry.trace import SpanKind @@ -60,7 +66,7 @@ def command(): ) @mock.patch("sys.argv", ["flask", "command"]) - def test_flask_run_command_wrapping(self): + def test_flask_command_wrapping(self): @click.command() def command(): pass @@ -162,6 +168,27 @@ def command_raises(): }, ) + def test_uvicorn_cli_command_ignored(self): + @click.command("uvicorn") + def command_uvicorn(): + pass + + runner = CliRunner() + result = runner.invoke(command_uvicorn) + self.assertEqual(result.exit_code, 0) + + self.assertFalse(self.memory_exporter.get_finished_spans()) + + @pytest.mark.skipif(flask_cli is None, reason="requires flask") + def test_flask_run_command_ignored(self): + runner = CliRunner() + result = runner.invoke( + flask_cli.run_command, obj=flask_cli.ScriptInfo() + ) + self.assertEqual(result.exit_code, 2) + + self.assertFalse(self.memory_exporter.get_finished_spans()) + def test_uninstrument(self): ClickInstrumentor().uninstrument() diff --git a/instrumentation/opentelemetry-instrumentation-confluent-kafka/pyproject.toml b/instrumentation/opentelemetry-instrumentation-confluent-kafka/pyproject.toml index 74be18efca..2a1318c4e7 100644 --- a/instrumentation/opentelemetry-instrumentation-confluent-kafka/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-confluent-kafka/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-instrumentation == 0.51b0.dev", @@ -32,7 +33,7 @@ dependencies = [ [project.optional-dependencies] instruments = [ - "confluent-kafka >= 1.8.2, <= 2.4.0", + "confluent-kafka >= 1.8.2, <= 2.7.0", ] [project.entry-points.opentelemetry_instrumentor] @@ -40,6 +41,7 @@ confluent_kafka = "opentelemetry.instrumentation.confluent_kafka:ConfluentKafkaI [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-confluent-kafka" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/confluent_kafka/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/package.py b/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/package.py index 6ebddd30ac..7b5c10ba14 100644 --- a/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/package.py +++ b/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/package.py @@ -13,4 +13,4 @@ # limitations under the License. -_instruments = ("confluent-kafka >= 1.8.2, <= 2.4.0",) +_instruments = ("confluent-kafka >= 1.8.2, <= 2.7.0",) diff --git a/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt index 88b5bbe680..be0142a36b 100644 --- a/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt +++ b/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt @@ -1,5 +1,5 @@ asgiref==3.8.1 -confluent-kafka==2.4.0 +confluent-kafka==2.6.1 Deprecated==1.2.14 iniconfig==2.0.0 packaging==24.0 diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-dbapi/pyproject.toml index 363f8e1cea..abca1d40ab 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-dbapi/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -36,6 +37,7 @@ instruments = [] [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-dbapi" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/dbapi/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py index d8db967f47..27aafc7308 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py @@ -37,12 +37,15 @@ --- """ +from __future__ import annotations + import functools import logging import re -import typing +from typing import Any, Callable, Generic, TypeVar import wrapt +from wrapt import wrap_function_wrapper from opentelemetry import trace as trace_api from opentelemetry.instrumentation.dbapi.version import __version__ @@ -61,16 +64,20 @@ _logger = logging.getLogger(__name__) +ConnectionT = TypeVar("ConnectionT") +CursorT = TypeVar("CursorT") + def trace_integration( - connect_module: typing.Callable[..., typing.Any], + connect_module: Callable[..., Any], connect_method_name: str, database_system: str, - connection_attributes: typing.Dict = None, - tracer_provider: typing.Optional[TracerProvider] = None, + connection_attributes: dict[str, Any] | None = None, + tracer_provider: TracerProvider | None = None, capture_parameters: bool = False, enable_commenter: bool = False, - db_api_integration_factory=None, + db_api_integration_factory: type[DatabaseApiIntegration] | None = None, + enable_attribute_commenter: bool = False, ): """Integrate with DB API library. https://www.python.org/dev/peps/pep-0249/ @@ -88,6 +95,7 @@ def trace_integration( enable_commenter: Flag to enable/disable sqlcommenter. db_api_integration_factory: The `DatabaseApiIntegration` to use. If none is passed the default one is used. + enable_attribute_commenter: Flag to enable/disable sqlcomment inclusion in `db.statement` span attribute. Only available if enable_commenter=True. """ wrap_connect( __name__, @@ -100,21 +108,23 @@ def trace_integration( capture_parameters=capture_parameters, enable_commenter=enable_commenter, db_api_integration_factory=db_api_integration_factory, + enable_attribute_commenter=enable_attribute_commenter, ) def wrap_connect( name: str, - connect_module: typing.Callable[..., typing.Any], + connect_module: Callable[..., Any], connect_method_name: str, database_system: str, - connection_attributes: typing.Dict = None, + connection_attributes: dict[str, Any] | None = None, version: str = "", - tracer_provider: typing.Optional[TracerProvider] = None, + tracer_provider: TracerProvider | None = None, capture_parameters: bool = False, enable_commenter: bool = False, - db_api_integration_factory=None, - commenter_options: dict = None, + db_api_integration_factory: type[DatabaseApiIntegration] | None = None, + commenter_options: dict[str, Any] | None = None, + enable_attribute_commenter: bool = False, ): """Integrate with DB API library. https://www.python.org/dev/peps/pep-0249/ @@ -133,6 +143,7 @@ def wrap_connect( db_api_integration_factory: The `DatabaseApiIntegration` to use. If none is passed the default one is used. commenter_options: Configurations for tags to be appended at the sql query. + enable_attribute_commenter: Flag to enable/disable sqlcomment inclusion in `db.statement` span attribute. Only available if enable_commenter=True. """ db_api_integration_factory = ( @@ -141,10 +152,10 @@ def wrap_connect( # pylint: disable=unused-argument def wrap_connect_( - wrapped: typing.Callable[..., typing.Any], - instance: typing.Any, - args: typing.Tuple[typing.Any, typing.Any], - kwargs: typing.Dict[typing.Any, typing.Any], + wrapped: Callable[..., Any], + instance: Any, + args: tuple[Any, Any], + kwargs: dict[Any, Any], ): db_integration = db_api_integration_factory( name, @@ -156,11 +167,12 @@ def wrap_connect_( enable_commenter=enable_commenter, commenter_options=commenter_options, connect_module=connect_module, + enable_attribute_commenter=enable_attribute_commenter, ) return db_integration.wrapped_connection(wrapped, args, kwargs) try: - wrapt.wrap_function_wrapper( + wrap_function_wrapper( connect_module, connect_method_name, wrap_connect_ ) except Exception as ex: # pylint: disable=broad-except @@ -168,7 +180,7 @@ def wrap_connect_( def unwrap_connect( - connect_module: typing.Callable[..., typing.Any], connect_method_name: str + connect_module: Callable[..., Any], connect_method_name: str ): """Disable integration with DB API library. https://www.python.org/dev/peps/pep-0249/ @@ -182,16 +194,17 @@ def unwrap_connect( def instrument_connection( name: str, - connection, + connection: ConnectionT | TracedConnectionProxy[ConnectionT], database_system: str, - connection_attributes: typing.Dict = None, + connection_attributes: dict[str, Any] | None = None, version: str = "", - tracer_provider: typing.Optional[TracerProvider] = None, + tracer_provider: TracerProvider | None = None, capture_parameters: bool = False, enable_commenter: bool = False, - commenter_options: dict = None, - connect_module: typing.Callable[..., typing.Any] = None, -): + commenter_options: dict[str, Any] | None = None, + connect_module: Callable[..., Any] | None = None, + enable_attribute_commenter: bool = False, +) -> TracedConnectionProxy[ConnectionT]: """Enable instrumentation in a database connection. Args: @@ -206,6 +219,7 @@ def instrument_connection( enable_commenter: Flag to enable/disable sqlcommenter. commenter_options: Configurations for tags to be appended at the sql query. connect_module: Module name where connect method is available. + enable_attribute_commenter: Flag to enable/disable sqlcomment inclusion in `db.statement` span attribute. Only available if enable_commenter=True. Returns: An instrumented connection. @@ -224,12 +238,15 @@ def instrument_connection( enable_commenter=enable_commenter, commenter_options=commenter_options, connect_module=connect_module, + enable_attribute_commenter=enable_attribute_commenter, ) db_integration.get_connection_attributes(connection) return get_traced_connection_proxy(connection, db_integration) -def uninstrument_connection(connection): +def uninstrument_connection( + connection: ConnectionT | TracedConnectionProxy[ConnectionT], +) -> ConnectionT: """Disable instrumentation in a database connection. Args: @@ -250,22 +267,24 @@ def __init__( self, name: str, database_system: str, - connection_attributes=None, + connection_attributes: dict[str, Any] | None = None, version: str = "", - tracer_provider: typing.Optional[TracerProvider] = None, + tracer_provider: TracerProvider | None = None, capture_parameters: bool = False, enable_commenter: bool = False, - commenter_options: dict = None, - connect_module: typing.Callable[..., typing.Any] = None, + commenter_options: dict[str, Any] | None = None, + connect_module: Callable[..., Any] | None = None, + enable_attribute_commenter: bool = False, ): - self.connection_attributes = connection_attributes - if self.connection_attributes is None: + if connection_attributes is None: self.connection_attributes = { "database": "database", "port": "port", "host": "host", "user": "user", } + else: + self.connection_attributes = connection_attributes self._name = name self._version = version self._tracer = get_tracer( @@ -277,18 +296,16 @@ def __init__( self.capture_parameters = capture_parameters self.enable_commenter = enable_commenter self.commenter_options = commenter_options + self.enable_attribute_commenter = enable_attribute_commenter self.database_system = database_system - self.connection_props = {} - self.span_attributes = {} + self.connection_props: dict[str, Any] = {} + self.span_attributes: dict[str, Any] = {} self.name = "" self.database = "" self.connect_module = connect_module self.commenter_data = self.calculate_commenter_data() - def _get_db_version( - self, - db_driver, - ): + def _get_db_version(self, db_driver: str) -> str: if db_driver in _DB_DRIVER_ALIASES: return util_version(_DB_DRIVER_ALIASES[db_driver]) db_version = "" @@ -298,10 +315,8 @@ def _get_db_version( db_version = "unknown" return db_version - def calculate_commenter_data( - self, - ): - commenter_data = {} + def calculate_commenter_data(self) -> dict[str, Any]: + commenter_data: dict[str, Any] = {} if not self.enable_commenter: return commenter_data @@ -328,11 +343,7 @@ def calculate_commenter_data( libpq_version = self.connect_module.__libpq_version__ else: libpq_version = self.connect_module.pq.__build_version__ - commenter_data.update( - { - "libpq_version": libpq_version, - } - ) + commenter_data.update({"libpq_version": libpq_version}) elif self.database_system == "mysql": mysqlc_version = "" if db_driver == "MySQLdb": @@ -340,26 +351,22 @@ def calculate_commenter_data( elif db_driver == "pymysql": mysqlc_version = self.connect_module.get_client_info() - commenter_data.update( - { - "mysql_client_version": mysqlc_version, - } - ) + commenter_data.update({"mysql_client_version": mysqlc_version}) return commenter_data def wrapped_connection( self, - connect_method: typing.Callable[..., typing.Any], - args: typing.Tuple[typing.Any, typing.Any], - kwargs: typing.Dict[typing.Any, typing.Any], - ): + connect_method: Callable[..., ConnectionT], + args: tuple[Any, ...], + kwargs: dict[Any, Any], + ) -> TracedConnectionProxy[ConnectionT]: """Add object proxy to connection object.""" connection = connect_method(*args, **kwargs) self.get_connection_attributes(connection) return get_traced_connection_proxy(connection, self) - def get_connection_attributes(self, connection): + def get_connection_attributes(self, connection: object) -> None: # Populate span fields using connection for key, value in self.connection_attributes.items(): # Allow attributes nested in connection object @@ -393,39 +400,49 @@ def get_connection_attributes(self, connection): self.span_attributes[SpanAttributes.NET_PEER_PORT] = port -def get_traced_connection_proxy( - connection, db_api_integration, *args, **kwargs -): - # pylint: disable=abstract-method - class TracedConnectionProxy(wrapt.ObjectProxy): - # pylint: disable=unused-argument - def __init__(self, connection, *args, **kwargs): - wrapt.ObjectProxy.__init__(self, connection) - - def __getattribute__(self, name): - if object.__getattribute__(self, name): - return object.__getattribute__(self, name) - - return object.__getattribute__( - object.__getattribute__(self, "_connection"), name - ) +# pylint: disable=abstract-method +class TracedConnectionProxy(wrapt.ObjectProxy, Generic[ConnectionT]): + # pylint: disable=unused-argument + def __init__( + self, + connection: ConnectionT, + db_api_integration: DatabaseApiIntegration | None = None, + ): + wrapt.ObjectProxy.__init__(self, connection) + self._self_db_api_integration = db_api_integration - def cursor(self, *args, **kwargs): - return get_traced_cursor_proxy( - self.__wrapped__.cursor(*args, **kwargs), db_api_integration - ) + def __getattribute__(self, name: str): + if object.__getattribute__(self, name): + return object.__getattribute__(self, name) - def __enter__(self): - self.__wrapped__.__enter__() - return self + return object.__getattribute__( + object.__getattribute__(self, "_connection"), name + ) + + def cursor(self, *args: Any, **kwargs: Any): + return get_traced_cursor_proxy( + self.__wrapped__.cursor(*args, **kwargs), + self._self_db_api_integration, + ) - def __exit__(self, *args, **kwargs): - self.__wrapped__.__exit__(*args, **kwargs) + def __enter__(self): + self.__wrapped__.__enter__() + return self - return TracedConnectionProxy(connection, *args, **kwargs) + def __exit__(self, *args: Any, **kwargs: Any): + self.__wrapped__.__exit__(*args, **kwargs) + + +def get_traced_connection_proxy( + connection: ConnectionT, + db_api_integration: DatabaseApiIntegration | None, + *args: Any, + **kwargs: Any, +) -> TracedConnectionProxy[ConnectionT]: + return TracedConnectionProxy(connection, db_api_integration) -class CursorTracer: +class CursorTracer(Generic[CursorT]): def __init__(self, db_api_integration: DatabaseApiIntegration) -> None: self._db_api_integration = db_api_integration self._commenter_enabled = self._db_api_integration.enable_commenter @@ -434,14 +451,57 @@ def __init__(self, db_api_integration: DatabaseApiIntegration) -> None: if self._db_api_integration.commenter_options else {} ) + self._enable_attribute_commenter = ( + self._db_api_integration.enable_attribute_commenter + ) self._connect_module = self._db_api_integration.connect_module self._leading_comment_remover = re.compile(r"^/\*.*?\*/") + def _capture_mysql_version(self, cursor) -> None: + """Lazy capture of mysql-connector client version using cursor, if applicable""" + if ( + self._db_api_integration.database_system == "mysql" + and self._db_api_integration.connect_module.__name__ + == "mysql.connector" + and not self._db_api_integration.commenter_data[ + "mysql_client_version" + ] + ): + self._db_api_integration.commenter_data["mysql_client_version"] = ( + cursor._cnx._cmysql.get_client_info() + ) + + def _get_commenter_data(self) -> dict: + """Uses DB-API integration to return commenter data for sqlcomment""" + commenter_data = dict(self._db_api_integration.commenter_data) + if self._commenter_options.get("opentelemetry_values", True): + commenter_data.update(**_get_opentelemetry_values()) + return { + k: v + for k, v in commenter_data.items() + if self._commenter_options.get(k, True) + } + + def _update_args_with_added_sql_comment(self, args, cursor) -> tuple: + """Updates args with cursor info and adds sqlcomment to query statement""" + try: + args_list = list(args) + self._capture_mysql_version(cursor) + commenter_data = self._get_commenter_data() + statement = _add_sql_comment(args_list[0], **commenter_data) + args_list[0] = statement + args = tuple(args_list) + except Exception as exc: # pylint: disable=broad-except + _logger.exception( + "Exception while generating sql comment: %s", exc + ) + return args + def _populate_span( self, span: trace_api.Span, - cursor, - *args: typing.Tuple[typing.Any, typing.Any], + cursor: CursorT, + *args: tuple[Any, ...], ): if not span.is_recording(): return @@ -463,13 +523,15 @@ def _populate_span( if self._db_api_integration.capture_parameters and len(args) > 1: span.set_attribute("db.statement.parameters", str(args[1])) - def get_operation_name(self, cursor, args): # pylint: disable=no-self-use + def get_operation_name( + self, cursor: CursorT, args: tuple[Any, ...] + ) -> str: # pylint: disable=no-self-use if args and isinstance(args[0], str): # Strip leading comments so we get the operation name. return self._leading_comment_remover.sub("", args[0]).split()[0] return "" - def get_statement(self, cursor, args): # pylint: disable=no-self-use + def get_statement(self, cursor: CursorT, args: tuple[Any, ...]): # pylint: disable=no-self-use if not args: return "" statement = args[0] @@ -479,10 +541,10 @@ def get_statement(self, cursor, args): # pylint: disable=no-self-use def traced_execution( self, - cursor, - query_method: typing.Callable[..., typing.Any], - *args: typing.Tuple[typing.Any, typing.Any], - **kwargs: typing.Dict[typing.Any, typing.Any], + cursor: CursorT, + query_method: Callable[..., Any], + *args: tuple[Any, ...], + **kwargs: dict[Any, Any], ): name = self.get_operation_name(cursor, args) if not name: @@ -497,84 +559,63 @@ def traced_execution( ) as span: if span.is_recording(): if args and self._commenter_enabled: - try: - args_list = list(args) - - # lazy capture of mysql-connector client version using cursor - if ( - self._db_api_integration.database_system == "mysql" - and self._db_api_integration.connect_module.__name__ - == "mysql.connector" - and not self._db_api_integration.commenter_data[ - "mysql_client_version" - ] - ): - self._db_api_integration.commenter_data[ - "mysql_client_version" - ] = cursor._cnx._cmysql.get_client_info() - - commenter_data = dict( - self._db_api_integration.commenter_data - ) - if self._commenter_options.get( - "opentelemetry_values", True - ): - commenter_data.update( - **_get_opentelemetry_values() - ) - - # Filter down to just the requested attributes. - commenter_data = { - k: v - for k, v in commenter_data.items() - if self._commenter_options.get(k, True) - } - statement = _add_sql_comment( - args_list[0], **commenter_data + if self._enable_attribute_commenter: + # sqlcomment is added to executed query and db.statement span attribute + args = self._update_args_with_added_sql_comment( + args, cursor ) - - args_list[0] = statement - args = tuple(args_list) - - except Exception as exc: # pylint: disable=broad-except - _logger.exception( - "Exception while generating sql comment: %s", exc + self._populate_span(span, cursor, *args) + else: + # sqlcomment is only added to executed query + # so db.statement is set before add_sql_comment + self._populate_span(span, cursor, *args) + args = self._update_args_with_added_sql_comment( + args, cursor ) - - self._populate_span(span, cursor, *args) - + else: + # no sqlcomment anywhere + self._populate_span(span, cursor, *args) return query_method(*args, **kwargs) -def get_traced_cursor_proxy(cursor, db_api_integration, *args, **kwargs): - _cursor_tracer = CursorTracer(db_api_integration) +# pylint: disable=abstract-method +class TracedCursorProxy(wrapt.ObjectProxy, Generic[CursorT]): + # pylint: disable=unused-argument + def __init__( + self, + cursor: CursorT, + db_api_integration: DatabaseApiIntegration, + ): + wrapt.ObjectProxy.__init__(self, cursor) + self._self_cursor_tracer = CursorTracer[CursorT](db_api_integration) - # pylint: disable=abstract-method - class TracedCursorProxy(wrapt.ObjectProxy): - # pylint: disable=unused-argument - def __init__(self, cursor, *args, **kwargs): - wrapt.ObjectProxy.__init__(self, cursor) + def execute(self, *args: Any, **kwargs: Any): + return self._self_cursor_tracer.traced_execution( + self.__wrapped__, self.__wrapped__.execute, *args, **kwargs + ) - def execute(self, *args, **kwargs): - return _cursor_tracer.traced_execution( - self.__wrapped__, self.__wrapped__.execute, *args, **kwargs - ) + def executemany(self, *args: Any, **kwargs: Any): + return self._self_cursor_tracer.traced_execution( + self.__wrapped__, self.__wrapped__.executemany, *args, **kwargs + ) - def executemany(self, *args, **kwargs): - return _cursor_tracer.traced_execution( - self.__wrapped__, self.__wrapped__.executemany, *args, **kwargs - ) + def callproc(self, *args: Any, **kwargs: Any): + return self._self_cursor_tracer.traced_execution( + self.__wrapped__, self.__wrapped__.callproc, *args, **kwargs + ) - def callproc(self, *args, **kwargs): - return _cursor_tracer.traced_execution( - self.__wrapped__, self.__wrapped__.callproc, *args, **kwargs - ) + def __enter__(self): + self.__wrapped__.__enter__() + return self - def __enter__(self): - self.__wrapped__.__enter__() - return self + def __exit__(self, *args, **kwargs): + self.__wrapped__.__exit__(*args, **kwargs) - def __exit__(self, *args, **kwargs): - self.__wrapped__.__exit__(*args, **kwargs) - return TracedCursorProxy(cursor, *args, **kwargs) +def get_traced_cursor_proxy( + cursor: CursorT, + db_api_integration: DatabaseApiIntegration, + *args: Any, + **kwargs: Any, +) -> TracedCursorProxy[CursorT]: + return TracedCursorProxy(cursor, db_api_integration) diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/py.typed b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py b/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py index 2ffa2f3d5b..3d531fb791 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py +++ b/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +# pylint: disable=too-many-lines import logging import re @@ -277,6 +278,47 @@ def test_executemany_comment(self): cursor.query, r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) + + def test_executemany_comment_stmt_enabled(self): + connect_module = mock.MagicMock() + connect_module.__name__ = "test" + connect_module.__version__ = mock.MagicMock() + connect_module.__libpq_version__ = 123 + connect_module.apilevel = 123 + connect_module.threadsafety = 123 + connect_module.paramstyle = "test" + + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "postgresql", + enable_commenter=True, + commenter_options={"db_driver": False, "dbapi_level": False}, + connect_module=connect_module, + enable_attribute_commenter=True, + ) + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) def test_executemany_comment_non_pep_249_compliant(self): class MockConnectModule: @@ -306,8 +348,54 @@ def __getattr__(self, name): cursor.query, r"Select 1 /\*dbapi_level='1.0',dbapi_threadsafety='unknown',driver_paramstyle='unknown',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) - def test_executemany_comment_matches_db_statement_attribute(self): + def test_executemany_comment_non_pep_249_compliant_stmt_enabled(self): + class MockConnectModule: + def __getattr__(self, name): + if name == "__name__": + return "test" + if name == "__version__": + return mock.MagicMock() + if name == "__libpq_version__": + return 123 + raise AttributeError("attribute missing") + + connect_module = MockConnectModule() + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "postgresql", + enable_commenter=True, + connect_module=connect_module, + commenter_options={"db_driver": False}, + enable_attribute_commenter=True, + ) + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*dbapi_level='1.0',dbapi_threadsafety='unknown',driver_paramstyle='unknown',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*dbapi_level='1.0',dbapi_threadsafety='unknown',driver_paramstyle='unknown',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + + def test_executemany_comment_stmt_enabled_matches_db_statement_attribute( + self, + ): connect_module = mock.MagicMock() connect_module.__version__ = mock.MagicMock() connect_module.__libpq_version__ = 123 @@ -321,6 +409,7 @@ def test_executemany_comment_matches_db_statement_attribute(self): enable_commenter=True, commenter_options={"db_driver": False, "dbapi_level": False}, connect_module=connect_module, + enable_attribute_commenter=True, ) mock_connection = db_integration.wrapped_connection( mock_connect, {}, {} @@ -371,6 +460,50 @@ def test_compatible_build_version_psycopg_psycopg2_libpq(self): cursor.query, r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) + + def test_compatible_build_version_psycopg_psycopg2_libpq_stmt_enabled( + self, + ): + connect_module = mock.MagicMock() + connect_module.__name__ = "test" + connect_module.__version__ = mock.MagicMock() + connect_module.pq = mock.MagicMock() + connect_module.pq.__build_version__ = 123 + connect_module.apilevel = 123 + connect_module.threadsafety = 123 + connect_module.paramstyle = "test" + + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "postgresql", + enable_commenter=True, + commenter_options={"db_driver": False, "dbapi_level": False}, + connect_module=connect_module, + enable_attribute_commenter=True, + ) + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) def test_executemany_psycopg2_integration_comment(self): connect_module = mock.MagicMock() @@ -397,6 +530,47 @@ def test_executemany_psycopg2_integration_comment(self): cursor.query, r"Select 1 /\*db_driver='psycopg2%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) + + def test_executemany_psycopg2_integration_comment_stmt_enabled(self): + connect_module = mock.MagicMock() + connect_module.__name__ = "psycopg2" + connect_module.__version__ = "1.2.3" + connect_module.__libpq_version__ = 123 + connect_module.apilevel = 123 + connect_module.threadsafety = 123 + connect_module.paramstyle = "test" + + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "postgresql", + enable_commenter=True, + commenter_options={"db_driver": True, "dbapi_level": False}, + connect_module=connect_module, + enable_attribute_commenter=True, + ) + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*db_driver='psycopg2%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*db_driver='psycopg2%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) def test_executemany_psycopg_integration_comment(self): connect_module = mock.MagicMock() @@ -424,6 +598,48 @@ def test_executemany_psycopg_integration_comment(self): cursor.query, r"Select 1 /\*db_driver='psycopg%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) + + def test_executemany_psycopg_integration_comment_stmt_enabled(self): + connect_module = mock.MagicMock() + connect_module.__name__ = "psycopg" + connect_module.__version__ = "1.2.3" + connect_module.pq = mock.MagicMock() + connect_module.pq.__build_version__ = 123 + connect_module.apilevel = 123 + connect_module.threadsafety = 123 + connect_module.paramstyle = "test" + + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "postgresql", + enable_commenter=True, + commenter_options={"db_driver": True, "dbapi_level": False}, + connect_module=connect_module, + enable_attribute_commenter=True, + ) + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*db_driver='psycopg%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*db_driver='psycopg%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) def test_executemany_mysqlconnector_integration_comment(self): connect_module = mock.MagicMock() @@ -450,6 +666,47 @@ def test_executemany_mysqlconnector_integration_comment(self): cursor.query, r"Select 1 /\*db_driver='mysql.connector%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='1.2.3',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) + + def test_executemany_mysqlconnector_integration_comment_stmt_enabled(self): + connect_module = mock.MagicMock() + connect_module.__name__ = "mysql.connector" + connect_module.__version__ = "1.2.3" + connect_module.apilevel = 123 + connect_module.threadsafety = 123 + connect_module.paramstyle = "test" + + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "mysql", + enable_commenter=True, + commenter_options={"db_driver": True, "dbapi_level": False}, + connect_module=connect_module, + enable_attribute_commenter=True, + ) + + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*db_driver='mysql.connector%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='1.2.3',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*db_driver='mysql.connector%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='1.2.3',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) @mock.patch("opentelemetry.instrumentation.dbapi.util_version") def test_executemany_mysqlclient_integration_comment( @@ -485,6 +742,56 @@ def test_executemany_mysqlclient_integration_comment( cursor.query, r"Select 1 /\*db_driver='MySQLdb%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='123',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) + + @mock.patch("opentelemetry.instrumentation.dbapi.util_version") + def test_executemany_mysqlclient_integration_comment_stmt_enabled( + self, + mock_dbapi_util_version, + ): + mock_dbapi_util_version.return_value = "1.2.3" + connect_module = mock.MagicMock() + connect_module.__name__ = "MySQLdb" + connect_module.__version__ = "1.2.3" + connect_module.apilevel = 123 + connect_module.threadsafety = 123 + connect_module.paramstyle = "test" + connect_module._mysql = mock.MagicMock() + connect_module._mysql.get_client_info = mock.MagicMock( + return_value="123" + ) + + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "mysql", + enable_commenter=True, + commenter_options={"db_driver": True, "dbapi_level": False}, + connect_module=connect_module, + enable_attribute_commenter=True, + ) + + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*db_driver='MySQLdb%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='123',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*db_driver='MySQLdb%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='123',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) def test_executemany_pymysql_integration_comment(self): connect_module = mock.MagicMock() @@ -512,6 +819,48 @@ def test_executemany_pymysql_integration_comment(self): cursor.query, r"Select 1 /\*db_driver='pymysql%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='123',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) + + def test_executemany_pymysql_integration_comment_stmt_enabled(self): + connect_module = mock.MagicMock() + connect_module.__name__ = "pymysql" + connect_module.__version__ = "1.2.3" + connect_module.apilevel = 123 + connect_module.threadsafety = 123 + connect_module.paramstyle = "test" + connect_module.get_client_info = mock.MagicMock(return_value="123") + + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "mysql", + enable_commenter=True, + commenter_options={"db_driver": True, "dbapi_level": False}, + connect_module=connect_module, + enable_attribute_commenter=True, + ) + + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*db_driver='pymysql%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='123',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*db_driver='pymysql%%3A1.2.3',dbapi_threadsafety=123,driver_paramstyle='test',mysql_client_version='123',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) def test_executemany_flask_integration_comment(self): connect_module = mock.MagicMock() @@ -544,6 +893,58 @@ def test_executemany_flask_integration_comment(self): cursor.query, r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',flask=1,libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual( + span.attributes[SpanAttributes.DB_STATEMENT], + "Select 1;", + ) + + clear_context = context.set_value( + "SQLCOMMENTER_ORM_TAGS_AND_VALUES", {}, current_context + ) + context.attach(clear_context) + + def test_executemany_flask_integration_comment_stmt_enabled(self): + connect_module = mock.MagicMock() + connect_module.__name__ = "test" + connect_module.__version__ = mock.MagicMock() + connect_module.__libpq_version__ = 123 + connect_module.apilevel = 123 + connect_module.threadsafety = 123 + connect_module.paramstyle = "test" + + db_integration = dbapi.DatabaseApiIntegration( + "testname", + "postgresql", + enable_commenter=True, + commenter_options={"db_driver": False, "dbapi_level": False}, + connect_module=connect_module, + enable_attribute_commenter=True, + ) + current_context = context.get_current() + sqlcommenter_context = context.set_value( + "SQLCOMMENTER_ORM_TAGS_AND_VALUES", {"flask": 1}, current_context + ) + context.attach(sqlcommenter_context) + + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, {} + ) + cursor = mock_connection.cursor() + cursor.executemany("Select 1;") + self.assertRegex( + cursor.query, + r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',flask=1,libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertRegex( + span.attributes[SpanAttributes.DB_STATEMENT], + r"Select 1 /\*dbapi_threadsafety=123,driver_paramstyle='test',flask=1,libpq_version=123,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) clear_context = context.set_value( "SQLCOMMENTER_ORM_TAGS_AND_VALUES", {}, current_context @@ -603,6 +1004,7 @@ def test_instrument_connection_kwargs_defaults(self, mock_dbapiint): self.assertEqual(kwargs["enable_commenter"], False) self.assertEqual(kwargs["commenter_options"], None) self.assertEqual(kwargs["connect_module"], None) + self.assertEqual(kwargs["enable_attribute_commenter"], False) @mock.patch("opentelemetry.instrumentation.dbapi.DatabaseApiIntegration") def test_instrument_connection_kwargs_provided(self, mock_dbapiint): @@ -619,6 +1021,7 @@ def test_instrument_connection_kwargs_provided(self, mock_dbapiint): enable_commenter=True, commenter_options={"foo": "bar"}, connect_module=mock_connect_module, + enable_attribute_commenter=True, ) kwargs = mock_dbapiint.call_args[1] self.assertEqual(kwargs["connection_attributes"], {"foo": "bar"}) @@ -628,6 +1031,7 @@ def test_instrument_connection_kwargs_provided(self, mock_dbapiint): self.assertEqual(kwargs["enable_commenter"], True) self.assertEqual(kwargs["commenter_options"], {"foo": "bar"}) self.assertIs(kwargs["connect_module"], mock_connect_module) + self.assertEqual(kwargs["enable_attribute_commenter"], True) def test_uninstrument_connection(self): connection = mock.Mock() diff --git a/instrumentation/opentelemetry-instrumentation-django/pyproject.toml b/instrumentation/opentelemetry-instrumentation-django/pyproject.toml index 7a68a6206e..e19f06e54c 100644 --- a/instrumentation/opentelemetry-instrumentation-django/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-django/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -45,6 +46,7 @@ django = "opentelemetry.instrumentation.django:DjangoInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-django" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/django/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware/otel_middleware.py b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware/otel_middleware.py index da807cc310..f607046959 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware/otel_middleware.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware/otel_middleware.py @@ -25,13 +25,13 @@ from opentelemetry.instrumentation._semconv import ( _filter_semconv_active_request_count_attr, _filter_semconv_duration_attrs, - _HTTPStabilityMode, _report_new, _report_old, _server_active_requests_count_attrs_new, _server_active_requests_count_attrs_old, _server_duration_attrs_new, _server_duration_attrs_old, + _StabilityMode, ) from opentelemetry.instrumentation.propagators import ( get_global_response_propagator, @@ -158,7 +158,7 @@ class _DjangoMiddleware(MiddlewareMixin): _duration_histogram_old = None _duration_histogram_new = None _active_request_counter = None - _sem_conv_opt_in_mode = _HTTPStabilityMode.DEFAULT + _sem_conv_opt_in_mode = _StabilityMode.DEFAULT _otel_request_hook: Callable[[Span, HttpRequest], None] = None _otel_response_hook: Callable[[Span, HttpRequest, HttpResponse], None] = ( @@ -430,7 +430,7 @@ def process_response(self, request, response): duration_s = default_timer() - request_start_time if self._duration_histogram_old: duration_attrs_old = _parse_duration_attrs( - duration_attrs, _HTTPStabilityMode.DEFAULT + duration_attrs, _StabilityMode.DEFAULT ) # http.target to be included in old semantic conventions target = duration_attrs.get(SpanAttributes.HTTP_TARGET) @@ -441,7 +441,7 @@ def process_response(self, request, response): ) if self._duration_histogram_new: duration_attrs_new = _parse_duration_attrs( - duration_attrs, _HTTPStabilityMode.HTTP + duration_attrs, _StabilityMode.HTTP ) self._duration_histogram_new.record( max(duration_s, 0), duration_attrs_new @@ -455,7 +455,7 @@ def process_response(self, request, response): def _parse_duration_attrs( - req_attrs, sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT + req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT ): return _filter_semconv_duration_attrs( req_attrs, @@ -466,7 +466,7 @@ def _parse_duration_attrs( def _parse_active_request_count_attrs( - req_attrs, sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT + req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT ): return _filter_semconv_active_request_count_attr( req_attrs, diff --git a/instrumentation/opentelemetry-instrumentation-elasticsearch/pyproject.toml b/instrumentation/opentelemetry-instrumentation-elasticsearch/pyproject.toml index 051eb4d4a0..a54c827649 100644 --- a/instrumentation/opentelemetry-instrumentation-elasticsearch/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-elasticsearch/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ elasticsearch = "opentelemetry.instrumentation.elasticsearch:ElasticsearchInstru [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-elasticsearch" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/elasticsearch/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-falcon/pyproject.toml b/instrumentation/opentelemetry-instrumentation-falcon/pyproject.toml index 353020c014..5a416d216a 100644 --- a/instrumentation/opentelemetry-instrumentation-falcon/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-falcon/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -35,7 +36,7 @@ dependencies = [ [project.optional-dependencies] instruments = [ - "falcon >= 1.4.1, < 3.1.2", + "falcon >= 1.4.1, < 5.0.0", ] [project.entry-points.opentelemetry_instrumentor] @@ -43,6 +44,7 @@ falcon = "opentelemetry.instrumentation.falcon:FalconInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-falcon" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/falcon/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py index 28b394eaf0..1037f98f5f 100644 --- a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py @@ -542,7 +542,7 @@ def _remove_instrumented_middleware(self, app): for x in app._middlewares_list if not isinstance(x, _TraceMiddleware) ] - # pylint: disable=c-extension-no-member + # pylint: disable=no-member app._middleware = falcon.api_helpers.prepare_middleware( app._middlewares_list, independent_middleware=app._independent_middleware, diff --git a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/package.py b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/package.py index 2fd463739c..440a6e25f2 100644 --- a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/package.py +++ b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/package.py @@ -13,6 +13,6 @@ # limitations under the License. -_instruments = ("falcon >= 1.4.1, < 4.0.0",) +_instruments = ("falcon >= 1.4.1, < 5.0.0",) _supports_metrics = True diff --git a/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-3.txt b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-3.txt new file mode 100644 index 0000000000..392a1ce385 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-3.txt @@ -0,0 +1,16 @@ +asgiref==3.8.1 +Deprecated==1.2.14 +falcon==3.1.3 +iniconfig==2.0.0 +packaging==24.0 +pluggy==1.5.0 +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-wsgi +-e util/opentelemetry-util-http +-e instrumentation/opentelemetry-instrumentation-falcon diff --git a/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-4.txt b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-4.txt new file mode 100644 index 0000000000..0fd061b29a --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-4.txt @@ -0,0 +1,16 @@ +asgiref==3.8.1 +Deprecated==1.2.14 +falcon==4.0.2 +iniconfig==2.0.0 +packaging==24.0 +pluggy==1.5.0 +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-wsgi +-e util/opentelemetry-util-http +-e instrumentation/opentelemetry-instrumentation-falcon diff --git a/instrumentation/opentelemetry-instrumentation-falcon/tests/app.py b/instrumentation/opentelemetry-instrumentation-falcon/tests/app.py index a4d279149d..416ac80dff 100644 --- a/instrumentation/opentelemetry-instrumentation-falcon/tests/app.py +++ b/instrumentation/opentelemetry-instrumentation-falcon/tests/app.py @@ -4,12 +4,14 @@ # pylint:disable=R0201,W0613,E0602 +_parsed_falcon_version = package_version.parse(falcon.__version__) + + class HelloWorldResource: def _handle_request(self, _, resp): # pylint: disable=no-member resp.status = falcon.HTTP_201 - _parsed_falcon_version = package_version.parse(falcon.__version__) if _parsed_falcon_version < package_version.parse("3.0.0"): # Falcon 1 and Falcon 2 resp.body = "Hello World" @@ -65,11 +67,15 @@ class UserResource: def on_get(self, req, resp, user_id): # pylint: disable=no-member resp.status = falcon.HTTP_200 - resp.body = f"Hello user {user_id}" + + if _parsed_falcon_version < package_version.parse("3.0.0"): + # Falcon 1 and Falcon 2 + resp.body = f"Hello user {user_id}" + else: + resp.text = f"Hello user {user_id}" def make_app(): - _parsed_falcon_version = package_version.parse(falcon.__version__) if _parsed_falcon_version < package_version.parse("3.0.0"): # Falcon 1 and Falcon 2 app = falcon.API() diff --git a/instrumentation/opentelemetry-instrumentation-falcon/tests/test_falcon.py b/instrumentation/opentelemetry-instrumentation-falcon/tests/test_falcon.py index dbc2512ca0..f940deb34e 100644 --- a/instrumentation/opentelemetry-instrumentation-falcon/tests/test_falcon.py +++ b/instrumentation/opentelemetry-instrumentation-falcon/tests/test_falcon.py @@ -57,6 +57,8 @@ "http.server.duration": _server_duration_attrs_old, } +_parsed_falcon_version = package_version.parse(_falcon_version) + class TestFalconBase(TestBase): def setUp(self): @@ -76,6 +78,13 @@ def setUp(self): ) self.app = make_app() + @property + def _has_fixed_http_target(self): + # In falcon<3.1.2, HTTP_TARGET is always set to / in TestClient + # In falcon>=3.1.2, HTTP_TARGET is set to unencoded path by default + # https://github.com/falconry/falcon/blob/69cdcd6edd2ee33f4ac9f7793e1cc3c4f99da692/falcon/testing/helpers.py#L1153-1156 # noqa + return _parsed_falcon_version < package_version.parse("3.1.2") + def client(self): return testing.TestClient(self.app) @@ -124,7 +133,9 @@ def _test_method(self, method): SpanAttributes.HTTP_SCHEME: "http", SpanAttributes.NET_HOST_PORT: 80, SpanAttributes.HTTP_HOST: "falconframework.org", - SpanAttributes.HTTP_TARGET: "/", + SpanAttributes.HTTP_TARGET: "/" + if self._has_fixed_http_target + else "/hello", SpanAttributes.NET_PEER_PORT: 65133, SpanAttributes.HTTP_FLAVOR: "1.1", "falcon.resource": "HelloWorldResource", @@ -132,7 +143,7 @@ def _test_method(self, method): }, ) # In falcon<3, NET_PEER_IP is always set by default to 127.0.0.1 - # In falcon>3, NET_PEER_IP is not set to anything by default to + # In falcon>=3, NET_PEER_IP is not set to anything by default # https://github.com/falconry/falcon/blob/5233d0abed977d9dab78ebadf305f5abe2eef07c/falcon/testing/helpers.py#L1168-L1172 # noqa if SpanAttributes.NET_PEER_IP in span.attributes: self.assertEqual( @@ -155,14 +166,16 @@ def test_404(self): SpanAttributes.HTTP_SCHEME: "http", SpanAttributes.NET_HOST_PORT: 80, SpanAttributes.HTTP_HOST: "falconframework.org", - SpanAttributes.HTTP_TARGET: "/", + SpanAttributes.HTTP_TARGET: "/" + if self._has_fixed_http_target + else "/does-not-exist", SpanAttributes.NET_PEER_PORT: 65133, SpanAttributes.HTTP_FLAVOR: "1.1", SpanAttributes.HTTP_STATUS_CODE: 404, }, ) # In falcon<3, NET_PEER_IP is always set by default to 127.0.0.1 - # In falcon>3, NET_PEER_IP is not set to anything by default to + # In falcon>=3, NET_PEER_IP is not set to anything by default # https://github.com/falconry/falcon/blob/5233d0abed977d9dab78ebadf305f5abe2eef07c/falcon/testing/helpers.py#L1168-L1172 # noqa if SpanAttributes.NET_PEER_IP in span.attributes: self.assertEqual( @@ -192,14 +205,16 @@ def test_500(self): SpanAttributes.HTTP_SCHEME: "http", SpanAttributes.NET_HOST_PORT: 80, SpanAttributes.HTTP_HOST: "falconframework.org", - SpanAttributes.HTTP_TARGET: "/", + SpanAttributes.HTTP_TARGET: "/" + if self._has_fixed_http_target + else "/error", SpanAttributes.NET_PEER_PORT: 65133, SpanAttributes.HTTP_FLAVOR: "1.1", SpanAttributes.HTTP_STATUS_CODE: 500, }, ) # In falcon<3, NET_PEER_IP is always set by default to 127.0.0.1 - # In falcon>3, NET_PEER_IP is not set to anything by default to + # In falcon>=3, NET_PEER_IP is not set to anything by default # https://github.com/falconry/falcon/blob/5233d0abed977d9dab78ebadf305f5abe2eef07c/falcon/testing/helpers.py#L1168-L1172 # noqa if SpanAttributes.NET_PEER_IP in span.attributes: self.assertEqual( @@ -225,7 +240,9 @@ def test_url_template(self): SpanAttributes.HTTP_SCHEME: "http", SpanAttributes.NET_HOST_PORT: 80, SpanAttributes.HTTP_HOST: "falconframework.org", - SpanAttributes.HTTP_TARGET: "/", + SpanAttributes.HTTP_TARGET: "/" + if self._has_fixed_http_target + else "/user/123", SpanAttributes.NET_PEER_PORT: 65133, SpanAttributes.HTTP_FLAVOR: "1.1", "falcon.resource": "UserResource", @@ -524,8 +541,7 @@ def test_custom_request_header_not_added_in_internal_span(self): self.assertNotIn(key, span.attributes) @pytest.mark.skipif( - condition=package_version.parse(_falcon_version) - < package_version.parse("2.0.0"), + condition=_parsed_falcon_version < package_version.parse("2.0.0"), reason="falcon<2 does not implement custom response headers", ) def test_custom_response_header_added_in_server_span(self): @@ -559,8 +575,7 @@ def test_custom_response_header_added_in_server_span(self): self.assertNotIn(key, span.attributes) @pytest.mark.skipif( - condition=package_version.parse(_falcon_version) - < package_version.parse("2.0.0"), + condition=_parsed_falcon_version < package_version.parse("2.0.0"), reason="falcon<2 does not implement custom response headers", ) def test_custom_response_header_not_added_in_internal_span(self): diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml index ec5f3bedf4..17f00837b4 100644 --- a/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -42,6 +43,7 @@ fastapi = "opentelemetry.instrumentation.fastapi:FastAPIInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-fastapi" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/fastapi/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/__init__.py b/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/__init__.py index 7e4d0aac07..a19480b234 100644 --- a/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/__init__.py @@ -186,9 +186,9 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A from opentelemetry.instrumentation._semconv import ( _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, + _StabilityMode, ) from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware from opentelemetry.instrumentation.asgi.types import ( @@ -362,7 +362,7 @@ class _InstrumentedFastAPI(fastapi.FastAPI): _client_request_hook: ClientRequestHook = None _client_response_hook: ClientResponseHook = None _instrumented_fastapi_apps = set() - _sem_conv_opt_in_mode = _HTTPStabilityMode.DEFAULT + _sem_conv_opt_in_mode = _StabilityMode.DEFAULT def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/instrumentation/opentelemetry-instrumentation-flask/pyproject.toml b/instrumentation/opentelemetry-instrumentation-flask/pyproject.toml index f6ffbc8079..a0c80c23be 100644 --- a/instrumentation/opentelemetry-instrumentation-flask/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-flask/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -43,6 +44,7 @@ flask = "opentelemetry.instrumentation.flask:FlaskInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-flask" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/flask/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py b/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py index 6543e2caa3..0d36763e7d 100644 --- a/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py @@ -252,11 +252,11 @@ def response_hook(span: Span, status: str, response_headers: List): from opentelemetry import context, trace from opentelemetry.instrumentation._semconv import ( _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, _report_new, _report_old, + _StabilityMode, ) from opentelemetry.instrumentation.flask.package import _instruments from opentelemetry.instrumentation.flask.version import __version__ @@ -321,7 +321,7 @@ def _rewrapped_app( duration_histogram_old=None, response_hook=None, excluded_urls=None, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, duration_histogram_new=None, ): def _wrapped_app(wrapped_app_environ, start_response): @@ -392,7 +392,7 @@ def _start_response(status, response_headers, *args, **kwargs): duration_s = default_timer() - start if duration_histogram_old: duration_attrs_old = otel_wsgi._parse_duration_attrs( - attributes, _HTTPStabilityMode.DEFAULT + attributes, _StabilityMode.DEFAULT ) if request_route: @@ -406,7 +406,7 @@ def _start_response(status, response_headers, *args, **kwargs): ) if duration_histogram_new: duration_attrs_new = otel_wsgi._parse_duration_attrs( - attributes, _HTTPStabilityMode.HTTP + attributes, _StabilityMode.HTTP ) if request_route: @@ -427,7 +427,7 @@ def _wrapped_before_request( excluded_urls=None, enable_commenter=True, commenter_options=None, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ): def _before_request(): if excluded_urls and excluded_urls.url_disabled(flask.request.url): @@ -549,7 +549,7 @@ class _InstrumentedFlask(flask.Flask): _enable_commenter = True _commenter_options = None _meter_provider = None - _sem_conv_opt_in_mode = _HTTPStabilityMode.DEFAULT + _sem_conv_opt_in_mode = _StabilityMode.DEFAULT def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/instrumentation/opentelemetry-instrumentation-grpc/pyproject.toml b/instrumentation/opentelemetry-instrumentation-grpc/pyproject.toml index b776422690..cabbb40a4b 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-grpc/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -44,6 +45,7 @@ grpc_aio_server = "opentelemetry.instrumentation.grpc:GrpcAioInstrumentorServer" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-grpc" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/grpc/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt index 7618e99dfa..278f27cb9f 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt +++ b/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt @@ -1,6 +1,6 @@ asgiref==3.8.1 Deprecated==1.2.14 -grpcio==1.63.0 +grpcio==1.66.2 iniconfig==2.0.0 packaging==24.0 pluggy==1.5.0 diff --git a/instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml b/instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml index 255cea485a..05bd729c36 100644 --- a/instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -42,6 +43,7 @@ httpx = "opentelemetry.instrumentation.httpx:HTTPXClientInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-httpx" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/httpx/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py b/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py index 195c784408..27bb3d639d 100644 --- a/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py @@ -192,6 +192,8 @@ async def async_response_hook(span, request, response): --- """ +from __future__ import annotations + import logging import typing from asyncio import iscoroutinefunction @@ -203,7 +205,6 @@ async def async_response_hook(span, request, response): from opentelemetry.instrumentation._semconv import ( _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, _report_new, @@ -213,6 +214,7 @@ async def async_response_hook(span, request, response): _set_http_peer_port_client, _set_http_status_code, _set_http_url, + _StabilityMode, ) from opentelemetry.instrumentation.httpx.package import _instruments from opentelemetry.instrumentation.httpx.version import __version__ @@ -249,8 +251,8 @@ async def async_response_hook(span, request, response): class RequestInfo(typing.NamedTuple): method: bytes - url: URL - headers: typing.Optional[Headers] + url: httpx.URL + headers: httpx.Headers | None stream: typing.Optional[ typing.Union[httpx.SyncByteStream, httpx.AsyncByteStream] ] @@ -259,7 +261,7 @@ class RequestInfo(typing.NamedTuple): class ResponseInfo(typing.NamedTuple): status_code: int - headers: typing.Optional[Headers] + headers: httpx.Headers | None stream: typing.Iterable[bytes] extensions: typing.Optional[dict] @@ -332,7 +334,7 @@ def _apply_request_client_attributes_to_span( span_attributes: dict, url: typing.Union[str, URL, httpx.URL], method_original: str, - semconv: _HTTPStabilityMode, + semconv: _StabilityMode, ): url = httpx.URL(url) # http semconv transition: http.method -> http.request.method @@ -361,7 +363,7 @@ def _apply_response_client_attributes_to_span( span: Span, status_code: int, http_version: str, - semconv: _HTTPStabilityMode, + semconv: _StabilityMode, ): # http semconv transition: http.status_code -> http.response.status_code # TODO: use _set_status when it's stable for http clients diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/pyproject.toml b/instrumentation/opentelemetry-instrumentation-jinja2/pyproject.toml index 10fb75e60c..9c7b573ca4 100644 --- a/instrumentation/opentelemetry-instrumentation-jinja2/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-jinja2/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ jinja2 = "opentelemetry.instrumentation.jinja2:Jinja2Instrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-jinja2" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/jinja2/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/__init__.py b/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/__init__.py index 0b199cbe64..9867992d49 100644 --- a/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/__init__.py @@ -39,17 +39,21 @@ """ # pylint: disable=no-value-for-parameter +from __future__ import annotations + import logging -from typing import Collection +from types import CodeType +from typing import Any, Callable, Collection, TypeVar import jinja2 +from jinja2.environment import Template from wrapt import wrap_function_wrapper as _wrap from opentelemetry.instrumentation.instrumentor import BaseInstrumentor from opentelemetry.instrumentation.jinja2.package import _instruments from opentelemetry.instrumentation.jinja2.version import __version__ from opentelemetry.instrumentation.utils import unwrap -from opentelemetry.trace import SpanKind, get_tracer +from opentelemetry.trace import SpanKind, Tracer, get_tracer logger = logging.getLogger(__name__) @@ -57,12 +61,27 @@ ATTRIBUTE_JINJA2_TEMPLATE_PATH = "jinja2.template_path" DEFAULT_TEMPLATE_NAME = "" +R = TypeVar("R") + -def _with_tracer_wrapper(func): +def _with_tracer_wrapper( + func: Callable[ + [Tracer, Callable[..., R], Any, list[Any], dict[str, Any]], R + ], +) -> Callable[ + [Tracer], Callable[[Callable[..., R], Any, list[Any], dict[str, Any]], R] +]: """Helper for providing tracer for wrapper functions.""" - def _with_tracer(tracer): - def wrapper(wrapped, instance, args, kwargs): + def _with_tracer( + tracer: Tracer, + ) -> Callable[[Callable[..., R], Any, list[Any], dict[str, Any]], R]: + def wrapper( + wrapped: Callable[..., R], + instance: Any, + args: list[Any], + kwargs: dict[str, Any], + ) -> R: return func(tracer, wrapped, instance, args, kwargs) return wrapper @@ -71,7 +90,13 @@ def wrapper(wrapped, instance, args, kwargs): @_with_tracer_wrapper -def _wrap_render(tracer, wrapped, instance, args, kwargs): +def _wrap_render( + tracer: Tracer, + wrapped: Callable[..., Any], + instance: Template, + args: list[Any], + kwargs: dict[str, Any], +): """Wrap `Template.render()` or `Template.generate()`""" with tracer.start_as_current_span( "jinja2.render", @@ -84,7 +109,13 @@ def _wrap_render(tracer, wrapped, instance, args, kwargs): @_with_tracer_wrapper -def _wrap_compile(tracer, wrapped, _, args, kwargs): +def _wrap_compile( + tracer: Tracer, + wrapped: Callable[..., CodeType], + _, + args: list[Any], + kwargs: dict[str, Any], +) -> CodeType: with tracer.start_as_current_span( "jinja2.compile", kind=SpanKind.INTERNAL, @@ -100,7 +131,13 @@ def _wrap_compile(tracer, wrapped, _, args, kwargs): @_with_tracer_wrapper -def _wrap_load_template(tracer, wrapped, _, args, kwargs): +def _wrap_load_template( + tracer: Tracer, + wrapped: Callable[..., Template], + _, + args: list[Any], + kwargs: dict[str, Any], +) -> Template: with tracer.start_as_current_span( "jinja2.load", kind=SpanKind.INTERNAL, @@ -128,7 +165,7 @@ class Jinja2Instrumentor(BaseInstrumentor): def instrumentation_dependencies(self) -> Collection[str]: return _instruments - def _instrument(self, **kwargs): + def _instrument(self, **kwargs: Any): tracer_provider = kwargs.get("tracer_provider") tracer = get_tracer( __name__, @@ -146,7 +183,7 @@ def _instrument(self, **kwargs): _wrap_load_template(tracer), ) - def _uninstrument(self, **kwargs): + def _uninstrument(self, **kwargs: Any): unwrap(jinja2.Template, "render") unwrap(jinja2.Template, "generate") unwrap(jinja2.Environment, "compile") diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/py.typed b/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml b/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml index e2249ce07c..8d4716524e 100644 --- a/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.5", @@ -41,6 +42,7 @@ kafka = "opentelemetry.instrumentation.kafka:KafkaInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-kafka-python" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/kafka/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-logging/pyproject.toml b/instrumentation/opentelemetry-instrumentation-logging/pyproject.toml index 365539701e..bb8c87f035 100644 --- a/instrumentation/opentelemetry-instrumentation-logging/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-logging/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -37,6 +38,7 @@ logging = "opentelemetry.instrumentation.logging:LoggingInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-logging" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/logging/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-mysql/pyproject.toml b/instrumentation/opentelemetry-instrumentation-mysql/pyproject.toml index 1bfecd2183..8bc34c775c 100644 --- a/instrumentation/opentelemetry-instrumentation-mysql/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-mysql/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ mysql = "opentelemetry.instrumentation.mysql:MySQLInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-mysql" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/mysql/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-mysql/src/opentelemetry/instrumentation/mysql/__init__.py b/instrumentation/opentelemetry-instrumentation-mysql/src/opentelemetry/instrumentation/mysql/__init__.py index d88dffde2b..0116dab1c3 100644 --- a/instrumentation/opentelemetry-instrumentation-mysql/src/opentelemetry/instrumentation/mysql/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-mysql/src/opentelemetry/instrumentation/mysql/__init__.py @@ -26,14 +26,30 @@ import mysql.connector from opentelemetry.instrumentation.mysql import MySQLInstrumentor + # Call instrument() to wrap all database connections MySQLInstrumentor().instrument() cnx = mysql.connector.connect(database="MySQL_Database") cursor = cnx.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") cursor.execute("INSERT INTO test (testField) VALUES (123)") cursor.close() cnx.close() +.. code:: python + + import mysql.connector + from opentelemetry.instrumentation.mysql import MySQLInstrumentor + + # Alternatively, use instrument_connection for an individual connection + cnx = mysql.connector.connect(database="MySQL_Database") + instrumented_cnx = MySQLInstrumentor().instrument_connection(cnx) + cursor = instrumented_cnx.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") + cursor.execute("INSERT INTO test (testField) VALUES (123)") + cursor.close() + instrumented_cnx.close() + API --- """ @@ -86,12 +102,16 @@ def instrument_connection(self, connection, tracer_provider=None): """Enable instrumentation in a MySQL connection. Args: - connection: The connection to instrument. - tracer_provider: The optional tracer provider to use. If omitted - the current globally configured one is used. + connection: + The existing MySQL connection instance to instrument. This connection is typically + obtained through `mysql.connector.connect()` and is instrumented to collect telemetry + data about database interactions. + tracer_provider: + An optional `TracerProvider` instance to use for tracing. If not provided, the globally + configured tracer provider will be automatically used. Returns: - An instrumented connection. + An instrumented MySQL connection with OpenTelemetry tracing enabled. """ return dbapi.instrument_connection( __name__, diff --git a/instrumentation/opentelemetry-instrumentation-mysqlclient/pyproject.toml b/instrumentation/opentelemetry-instrumentation-mysqlclient/pyproject.toml index 4311f6b610..56f67f90a7 100644 --- a/instrumentation/opentelemetry-instrumentation-mysqlclient/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-mysqlclient/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ mysqlclient = "opentelemetry.instrumentation.mysqlclient:MySQLClientInstrumentor [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-mysqlclient" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/mysqlclient/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/__init__.py b/instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/__init__.py index 5b08b0b50d..e1c07096fa 100644 --- a/instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/__init__.py @@ -46,16 +46,40 @@ import MySQLdb from opentelemetry.instrumentation.mysqlclient import MySQLClientInstrumentor - + # Call instrument() to wrap all database connections MySQLClientInstrumentor().instrument(enable_commenter=True, commenter_options={}) cnx = MySQLdb.connect(database="MySQL_Database") cursor = cnx.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") cursor.execute("INSERT INTO test (testField) VALUES (123)" cnx.commit() cursor.close() cnx.close() +.. code:: python + + import MySQLdb + from opentelemetry.instrumentation.mysqlclient import MySQLClientInstrumentor + + # Alternatively, use instrument_connection for an individual connection + cnx = MySQLdb.connect(database="MySQL_Database") + instrumented_cnx = MySQLClientInstrumentor().instrument_connection( + cnx, + enable_commenter=True, + commenter_options={ + "db_driver": True, + "mysql_client_version": True, + "driver_paramstyle": False + } + ) + cursor = instrumented_cnx.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") + cursor.execute("INSERT INTO test (testField) VALUES (123)" + instrumented_cnx.commit() + cursor.close() + instrumented_cnx.close() + For example, :: @@ -162,12 +186,28 @@ def instrument_connection( """Enable instrumentation in a mysqlclient connection. Args: - connection: The connection to instrument. - tracer_provider: The optional tracer provider to use. If omitted - the current globally configured one is used. - + connection: + The MySQL connection instance to instrument. This connection is typically + created using `MySQLdb.connect()` and needs to be wrapped to collect telemetry. + tracer_provider: + A custom `TracerProvider` instance to be used for tracing. If not specified, + the globally configured tracer provider will be used. + enable_commenter: + A flag to enable the OpenTelemetry SQLCommenter feature. If set to `True`, + SQL queries will be enriched with contextual information (e.g., database client details). + Default is `None`. + commenter_options: + A dictionary of configuration options for SQLCommenter. All options are enabled (True) by default. + This allows you to customize metadata appended to queries. Possible options include: + + - `db_driver`: Adds the database driver name and version. + - `dbapi_threadsafety`: Adds threadsafety information. + - `dbapi_level`: Adds the DB-API version. + - `mysql_client_version`: Adds the MySQL client version. + - `driver_paramstyle`: Adds the parameter style. + - `opentelemetry_values`: Includes traceparent values. Returns: - An instrumented connection. + An instrumented MySQL connection with OpenTelemetry support enabled. """ return dbapi.instrument_connection( diff --git a/instrumentation/opentelemetry-instrumentation-pika/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pika/pyproject.toml index 8fadfad325..7b027be7dc 100644 --- a/instrumentation/opentelemetry-instrumentation-pika/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-pika/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-instrumentation == 0.51b0.dev", @@ -41,6 +42,7 @@ pika = "opentelemetry.instrumentation.pika:PikaInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-pika" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/pika/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-psycopg/pyproject.toml b/instrumentation/opentelemetry-instrumentation-psycopg/pyproject.toml index 363ae2807e..4352ba4a8e 100644 --- a/instrumentation/opentelemetry-instrumentation-psycopg/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-psycopg/pyproject.toml @@ -24,6 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ psycopg = "opentelemetry.instrumentation.psycopg:PsycopgInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-psycopg" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/psycopg/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-psycopg/src/opentelemetry/instrumentation/psycopg/__init__.py b/instrumentation/opentelemetry-instrumentation-psycopg/src/opentelemetry/instrumentation/psycopg/__init__.py index e986ec0d46..8c608b7655 100644 --- a/instrumentation/opentelemetry-instrumentation-psycopg/src/opentelemetry/instrumentation/psycopg/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-psycopg/src/opentelemetry/instrumentation/psycopg/__init__.py @@ -88,15 +88,31 @@ import psycopg from opentelemetry.instrumentation.psycopg import PsycopgInstrumentor - + # Call instrument() to wrap all database connections PsycopgInstrumentor().instrument() cnx = psycopg.connect(database='Database') + cursor = cnx.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") cursor.execute("INSERT INTO test (testField) VALUES (123)") cursor.close() cnx.close() +.. code-block:: python + + import psycopg + from opentelemetry.instrumentation.psycopg import PsycopgInstrumentor + + # Alternatively, use instrument_connection for an individual connection + cnx = psycopg.connect(database='Database') + instrumented_cnx = PsycopgInstrumentor().instrument_connection(cnx) + cursor = instrumented_cnx.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") + cursor.execute("INSERT INTO test (testField) VALUES (123)") + cursor.close() + instrumented_cnx.close() + API --- """ @@ -196,6 +212,18 @@ def _uninstrument(self, **kwargs): # TODO(owais): check if core dbapi can do this for all dbapi implementations e.g, pymysql and mysql @staticmethod def instrument_connection(connection, tracer_provider=None): + """Enable instrumentation in a psycopg connection. + + Args: + connection: psycopg.Connection + The psycopg connection object to be instrumented. + tracer_provider: opentelemetry.trace.TracerProvider, optional + The TracerProvider to use for instrumentation. If not provided, + the global TracerProvider will be used. + + Returns: + An instrumented psycopg connection object. + """ if not hasattr(connection, "_is_instrumented_by_opentelemetry"): connection._is_instrumented_by_opentelemetry = False diff --git a/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt index f45e3be149..f18f4522a9 100644 --- a/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt +++ b/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt @@ -3,7 +3,7 @@ Deprecated==1.2.14 iniconfig==2.0.0 packaging==24.0 pluggy==1.5.0 -psycopg==3.1.18 +psycopg==3.2.2 py-cpuinfo==9.0.0 pytest==7.4.4 tomli==2.0.1 diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml b/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml index 0e30861d6f..c8ce3e8dfa 100644 --- a/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ psycopg2 = "opentelemetry.instrumentation.psycopg2:Psycopg2Instrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-psycopg2" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/psycopg2/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/__init__.py b/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/__init__.py index de2e49f4c3..a811f4285a 100644 --- a/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/__init__.py @@ -88,15 +88,31 @@ import psycopg2 from opentelemetry.instrumentation.psycopg2 import Psycopg2Instrumentor - + # Call instrument() to wrap all database connections Psycopg2Instrumentor().instrument() cnx = psycopg2.connect(database='Database') + cursor = cnx.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") cursor.execute("INSERT INTO test (testField) VALUES (123)") cursor.close() cnx.close() +.. code-block:: python + + import psycopg2 + from opentelemetry.instrumentation.psycopg2 import Psycopg2Instrumentor + + # Alternatively, use instrument_connection for an individual connection + cnx = psycopg2.connect(database='Database') + instrumented_cnx = Psycopg2Instrumentor().instrument_connection(cnx) + cursor = instrumented_cnx.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") + cursor.execute("INSERT INTO test (testField) VALUES (123)") + cursor.close() + instrumented_cnx.close() + API --- """ @@ -160,6 +176,19 @@ def _uninstrument(self, **kwargs): # TODO(owais): check if core dbapi can do this for all dbapi implementations e.g, pymysql and mysql @staticmethod def instrument_connection(connection, tracer_provider=None): + """Enable instrumentation in a psycopg2 connection. + + Args: + connection: psycopg2.extensions.connection + The psycopg2 connection object to be instrumented. + tracer_provider: opentelemetry.trace.TracerProvider, optional + The TracerProvider to use for instrumentation. If not specified, + the global TracerProvider will be used. + + Returns: + An instrumented psycopg2 connection object. + """ + if not hasattr(connection, "_is_instrumented_by_opentelemetry"): connection._is_instrumented_by_opentelemetry = False diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt index 482c30222d..305185e362 100644 --- a/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt +++ b/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt @@ -3,7 +3,7 @@ Deprecated==1.2.14 iniconfig==2.0.0 packaging==24.0 pluggy==1.5.0 -psycopg2==2.9.9 +psycopg2==2.9.10 py-cpuinfo==9.0.0 pytest==7.4.4 tomli==2.0.1 diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pymemcache/pyproject.toml index f875c409d8..6fef4c284e 100644 --- a/instrumentation/opentelemetry-instrumentation-pymemcache/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-pymemcache/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ pymemcache = "opentelemetry.instrumentation.pymemcache:PymemcacheInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-pymemcache" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/pymemcache/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-pymongo/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pymongo/pyproject.toml index 8a3a971790..cfb94e4294 100644 --- a/instrumentation/opentelemetry-instrumentation-pymongo/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-pymongo/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ pymongo = "opentelemetry.instrumentation.pymongo:PymongoInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-pymongo" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/pymongo/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/__init__.py b/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/__init__.py index e0721f2f2d..bb609a08c6 100644 --- a/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/__init__.py @@ -75,8 +75,10 @@ def failed_hook(span, event): """ +from __future__ import annotations + from logging import getLogger -from typing import Callable, Collection +from typing import Any, Callable, Collection, TypeVar from pymongo import monitoring @@ -88,7 +90,7 @@ def failed_hook(span, event): from opentelemetry.instrumentation.pymongo.version import __version__ from opentelemetry.instrumentation.utils import is_instrumentation_enabled from opentelemetry.semconv.trace import DbSystemValues, SpanAttributes -from opentelemetry.trace import SpanKind, get_tracer +from opentelemetry.trace import SpanKind, Tracer, get_tracer from opentelemetry.trace.span import Span from opentelemetry.trace.status import Status, StatusCode @@ -98,14 +100,21 @@ def failed_hook(span, event): ResponseHookT = Callable[[Span, monitoring.CommandSucceededEvent], None] FailedHookT = Callable[[Span, monitoring.CommandFailedEvent], None] +CommandEvent = TypeVar( + "CommandEvent", + monitoring.CommandStartedEvent, + monitoring.CommandSucceededEvent, + monitoring.CommandFailedEvent, +) + -def dummy_callback(span, event): ... +def dummy_callback(span: Span, event: CommandEvent): ... class CommandTracer(monitoring.CommandListener): def __init__( self, - tracer, + tracer: Tracer, request_hook: RequestHookT = dummy_callback, response_hook: ResponseHookT = dummy_callback, failed_hook: FailedHookT = dummy_callback, @@ -195,10 +204,12 @@ def failed(self, event: monitoring.CommandFailedEvent): _LOG.exception(hook_exception) span.end() - def _pop_span(self, event): + def _pop_span(self, event: CommandEvent) -> Span | None: return self._span_dict.pop(_get_span_dict_key(event), None) - def _get_statement_by_command_name(self, command_name, event): + def _get_statement_by_command_name( + self, command_name: str, event: CommandEvent + ) -> str: statement = command_name command_attribute = COMMAND_TO_ATTRIBUTE_MAPPING.get(command_name) command = event.command.get(command_attribute) @@ -207,14 +218,16 @@ def _get_statement_by_command_name(self, command_name, event): return statement -def _get_span_dict_key(event): +def _get_span_dict_key( + event: CommandEvent, +) -> int | tuple[int, tuple[str, int | None]]: if event.connection_id is not None: return event.request_id, event.connection_id return event.request_id class PymongoInstrumentor(BaseInstrumentor): - _commandtracer_instance = None # type CommandTracer + _commandtracer_instance: CommandTracer | None = None # The instrumentation for PyMongo is based on the event listener interface # https://api.mongodb.com/python/current/api/pymongo/monitoring.html. # This interface only allows to register listeners and does not provide @@ -225,7 +238,7 @@ class PymongoInstrumentor(BaseInstrumentor): def instrumentation_dependencies(self) -> Collection[str]: return _instruments - def _instrument(self, **kwargs): + def _instrument(self, **kwargs: Any): """Integrate with pymongo to trace it using event listener. https://api.mongodb.com/python/current/api/pymongo/monitoring.html @@ -259,6 +272,6 @@ def _instrument(self, **kwargs): # If already created, just enable it self._commandtracer_instance.is_enabled = True - def _uninstrument(self, **kwargs): + def _uninstrument(self, **kwargs: Any): if self._commandtracer_instance is not None: self._commandtracer_instance.is_enabled = False diff --git a/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/py.typed b/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/instrumentation/opentelemetry-instrumentation-pymysql/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pymysql/pyproject.toml index c5f9b9955d..434493dce2 100644 --- a/instrumentation/opentelemetry-instrumentation-pymysql/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-pymysql/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ pymysql = "opentelemetry.instrumentation.pymysql:PyMySQLInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-pymysql" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/pymysql/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-pymysql/src/opentelemetry/instrumentation/pymysql/__init__.py b/instrumentation/opentelemetry-instrumentation-pymysql/src/opentelemetry/instrumentation/pymysql/__init__.py index eb4435813d..54c614f745 100644 --- a/instrumentation/opentelemetry-instrumentation-pymysql/src/opentelemetry/instrumentation/pymysql/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-pymysql/src/opentelemetry/instrumentation/pymysql/__init__.py @@ -26,6 +26,7 @@ import pymysql from opentelemetry.instrumentation.pymysql import PyMySQLInstrumentor + # Call instrument() to wrap all database connections PyMySQLInstrumentor().instrument() cnx = pymysql.connect(database="MySQL_Database") @@ -35,6 +36,28 @@ cursor.close() cnx.close() + +.. code:: python + + import pymysql + from opentelemetry.instrumentation.pymysql import PyMySQLInstrumentor + + # Alternatively, use instrument_connection for an individual connection + cnx = pymysql.connect(database="MySQL_Database") + instrumented_cnx = PyMySQLInstrumentor().instrument_connection( + cnx, + enable_commenter=True, + commenter_options={ + "db_driver": True, + "mysql_client_version": True + } + ) + cursor = instrumented_cnx.cursor() + cursor.execute("INSERT INTO test (testField) VALUES (123)" + instrumented_cnx.commit() + cursor.close() + instrumented_cnx.close() + SQLCOMMENTER ***************************************** You can optionally configure PyMySQL instrumentation to enable sqlcommenter which enriches @@ -165,10 +188,20 @@ def instrument_connection( """Enable instrumentation in a PyMySQL connection. Args: - connection: The connection to instrument. - tracer_provider: The optional tracer provider to use. If omitted - the current globally configured one is used. - + connection: + The existing PyMySQL connection instance that needs to be instrumented. + This connection was typically created using `pymysql.connect()` and is wrapped with OpenTelemetry tracing. + tracer_provider: + An optional `TracerProvider` instance that specifies which tracer provider should be used. + If not provided, the globally configured OpenTelemetry tracer provider is automatically applied. + enable_commenter: + A flag to enable the SQL Commenter feature. If `True`, query logs will be enriched with additional + contextual metadata (e.g., database version, traceparent IDs, driver information). + commenter_options: + A dictionary containing configuration options for the SQL Commenter feature. + You can specify various options, such as enabling driver information, database version logging, + traceparent propagation, and other customizable metadata enhancements. + See *SQLCommenter Configurations* above for more information. Returns: An instrumented connection. """ diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pyramid/pyproject.toml index d7289f4e42..18944afab4 100644 --- a/instrumentation/opentelemetry-instrumentation-pyramid/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-pyramid/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -43,6 +44,7 @@ pyramid = "opentelemetry.instrumentation.pyramid:PyramidInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-pyramid" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/pyramid/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-redis/pyproject.toml b/instrumentation/opentelemetry-instrumentation-redis/pyproject.toml index 00b44d2366..2d5450189d 100644 --- a/instrumentation/opentelemetry-instrumentation-redis/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-redis/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ redis = "opentelemetry.instrumentation.redis:RedisInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-redis" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/redis/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/__init__.py b/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/__init__.py index e81beb6f3d..8a3096ad41 100644 --- a/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/__init__.py @@ -91,8 +91,9 @@ def response_hook(span, instance, response): --- """ -import typing -from typing import Any, Collection +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Callable, Collection import redis from wrapt import wrap_function_wrapper @@ -109,18 +110,43 @@ def response_hook(span, instance, response): from opentelemetry.instrumentation.redis.version import __version__ from opentelemetry.instrumentation.utils import unwrap from opentelemetry.semconv.trace import SpanAttributes -from opentelemetry.trace import Span, StatusCode +from opentelemetry.trace import Span, StatusCode, Tracer -_DEFAULT_SERVICE = "redis" +if TYPE_CHECKING: + from typing import Awaitable, TypeVar -_RequestHookT = typing.Optional[ - typing.Callable[ - [Span, redis.connection.Connection, typing.List, typing.Dict], None + import redis.asyncio.client + import redis.asyncio.cluster + import redis.client + import redis.cluster + import redis.connection + + _RequestHookT = Callable[ + [Span, redis.connection.Connection, list[Any], dict[str, Any]], None ] -] -_ResponseHookT = typing.Optional[ - typing.Callable[[Span, redis.connection.Connection, Any], None] -] + _ResponseHookT = Callable[[Span, redis.connection.Connection, Any], None] + + AsyncPipelineInstance = TypeVar( + "AsyncPipelineInstance", + redis.asyncio.client.Pipeline, + redis.asyncio.cluster.ClusterPipeline, + ) + AsyncRedisInstance = TypeVar( + "AsyncRedisInstance", redis.asyncio.Redis, redis.asyncio.RedisCluster + ) + PipelineInstance = TypeVar( + "PipelineInstance", + redis.client.Pipeline, + redis.cluster.ClusterPipeline, + ) + RedisInstance = TypeVar( + "RedisInstance", redis.client.Redis, redis.cluster.RedisCluster + ) + R = TypeVar("R") + + +_DEFAULT_SERVICE = "redis" + _REDIS_ASYNCIO_VERSION = (4, 2, 0) if redis.VERSION >= _REDIS_ASYNCIO_VERSION: @@ -132,7 +158,9 @@ def response_hook(span, instance, response): _FIELD_TYPES = ["NUMERIC", "TEXT", "GEO", "TAG", "VECTOR"] -def _set_connection_attributes(span, conn): +def _set_connection_attributes( + span: Span, conn: RedisInstance | AsyncRedisInstance +) -> None: if not span.is_recording() or not hasattr(conn, "connection_pool"): return for key, value in _extract_conn_attributes( @@ -141,7 +169,9 @@ def _set_connection_attributes(span, conn): span.set_attribute(key, value) -def _build_span_name(instance, cmd_args): +def _build_span_name( + instance: RedisInstance | AsyncRedisInstance, cmd_args: tuple[Any, ...] +) -> str: if len(cmd_args) > 0 and cmd_args[0]: if cmd_args[0] == "FT.SEARCH": name = "redis.search" @@ -154,7 +184,9 @@ def _build_span_name(instance, cmd_args): return name -def _build_span_meta_data_for_pipeline(instance): +def _build_span_meta_data_for_pipeline( + instance: PipelineInstance | AsyncPipelineInstance, +) -> tuple[list[Any], str, str]: try: command_stack = ( instance.command_stack @@ -184,11 +216,16 @@ def _build_span_meta_data_for_pipeline(instance): # pylint: disable=R0915 def _instrument( - tracer, - request_hook: _RequestHookT = None, - response_hook: _ResponseHookT = None, + tracer: Tracer, + request_hook: _RequestHookT | None = None, + response_hook: _ResponseHookT | None = None, ): - def _traced_execute_command(func, instance, args, kwargs): + def _traced_execute_command( + func: Callable[..., R], + instance: RedisInstance, + args: tuple[Any, ...], + kwargs: dict[str, Any], + ) -> R: query = _format_command_args(args) name = _build_span_name(instance, args) with tracer.start_as_current_span( @@ -210,7 +247,12 @@ def _traced_execute_command(func, instance, args, kwargs): response_hook(span, instance, response) return response - def _traced_execute_pipeline(func, instance, args, kwargs): + def _traced_execute_pipeline( + func: Callable[..., R], + instance: PipelineInstance, + args: tuple[Any, ...], + kwargs: dict[str, Any], + ) -> R: ( command_stack, resource, @@ -242,7 +284,7 @@ def _traced_execute_pipeline(func, instance, args, kwargs): return response - def _add_create_attributes(span, args): + def _add_create_attributes(span: Span, args: tuple[Any, ...]): _set_span_attribute_if_value( span, "redis.create_index.index", _value_or_none(args, 1) ) @@ -266,7 +308,7 @@ def _add_create_attributes(span, args): field_attribute, ) - def _add_search_attributes(span, response, args): + def _add_search_attributes(span: Span, response, args): _set_span_attribute_if_value( span, "redis.search.index", _value_or_none(args, 1) ) @@ -326,7 +368,12 @@ def _add_search_attributes(span, response, args): _traced_execute_pipeline, ) - async def _async_traced_execute_command(func, instance, args, kwargs): + async def _async_traced_execute_command( + func: Callable[..., Awaitable[R]], + instance: AsyncRedisInstance, + args: tuple[Any, ...], + kwargs: dict[str, Any], + ) -> Awaitable[R]: query = _format_command_args(args) name = _build_span_name(instance, args) @@ -344,7 +391,12 @@ async def _async_traced_execute_command(func, instance, args, kwargs): response_hook(span, instance, response) return response - async def _async_traced_execute_pipeline(func, instance, args, kwargs): + async def _async_traced_execute_pipeline( + func: Callable[..., Awaitable[R]], + instance: AsyncPipelineInstance, + args: tuple[Any, ...], + kwargs: dict[str, Any], + ) -> Awaitable[R]: ( command_stack, resource, @@ -408,14 +460,15 @@ async def _async_traced_execute_pipeline(func, instance, args, kwargs): class RedisInstrumentor(BaseInstrumentor): - """An instrumentor for Redis + """An instrumentor for Redis. + See `BaseInstrumentor` """ def instrumentation_dependencies(self) -> Collection[str]: return _instruments - def _instrument(self, **kwargs): + def _instrument(self, **kwargs: Any): """Instruments the redis module Args: @@ -436,7 +489,7 @@ def _instrument(self, **kwargs): response_hook=kwargs.get("response_hook"), ) - def _uninstrument(self, **kwargs): + def _uninstrument(self, **kwargs: Any): if redis.VERSION < (3, 0, 0): unwrap(redis.StrictRedis, "execute_command") unwrap(redis.StrictRedis, "pipeline") diff --git a/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/py.typed b/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/instrumentation/opentelemetry-instrumentation-remoulade/pyproject.toml b/instrumentation/opentelemetry-instrumentation-remoulade/pyproject.toml index 97db24e18f..628b698cc9 100644 --- a/instrumentation/opentelemetry-instrumentation-remoulade/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-remoulade/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ remoulade = "opentelemetry.instrumentation.remoulade:RemouladeInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-remoulade" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/remoulade/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-requests/pyproject.toml b/instrumentation/opentelemetry-instrumentation-requests/pyproject.toml index a8a7792cc3..9d27fdbb7f 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-requests/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ requests = "opentelemetry.instrumentation.requests:RequestsInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-requests" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/requests/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index db67d378d9..6c197d530e 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -72,10 +72,12 @@ def response_hook(span, request_obj, response) --- """ +from __future__ import annotations + import functools import types from timeit import default_timer -from typing import Callable, Collection, Optional +from typing import Any, Callable, Collection, Optional from urllib.parse import urlparse from requests.models import PreparedRequest, Response @@ -87,7 +89,6 @@ def response_hook(span, request_obj, response) _client_duration_attrs_old, _filter_semconv_duration_attrs, _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, _report_new, @@ -100,6 +101,7 @@ def response_hook(span, request_obj, response) _set_http_scheme, _set_http_status_code, _set_http_url, + _StabilityMode, ) from opentelemetry.instrumentation.instrumentor import BaseInstrumentor from opentelemetry.instrumentation.requests.package import _instruments @@ -146,8 +148,8 @@ def _instrument( duration_histogram_new: Histogram, request_hook: _RequestHookT = None, response_hook: _ResponseHookT = None, - excluded_urls: ExcludeList = None, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + excluded_urls: ExcludeList | None = None, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): """Enables tracing of all requests calls that go through :code:`requests.session.Session.request` (this includes @@ -164,7 +166,9 @@ def _instrument( # pylint: disable-msg=too-many-locals,too-many-branches @functools.wraps(wrapped_send) - def instrumented_send(self, request, **kwargs): + def instrumented_send( + self: Session, request: PreparedRequest, **kwargs: Any + ): if excluded_urls and excluded_urls.url_disabled(request.url): return wrapped_send(self, request, **kwargs) @@ -312,7 +316,7 @@ def get_or_create_headers(): metric_labels, _client_duration_attrs_old, _client_duration_attrs_new, - _HTTPStabilityMode.DEFAULT, + _StabilityMode.DEFAULT, ) duration_histogram_old.record( max(round(elapsed_time * 1000), 0), @@ -323,7 +327,7 @@ def get_or_create_headers(): metric_labels, _client_duration_attrs_old, _client_duration_attrs_new, - _HTTPStabilityMode.HTTP, + _StabilityMode.HTTP, ) duration_histogram_new.record( elapsed_time, attributes=duration_attrs_new @@ -345,7 +349,7 @@ def _uninstrument(): _uninstrument_from(Session) -def _uninstrument_from(instr_root, restore_as_bound_func=False): +def _uninstrument_from(instr_root, restore_as_bound_func: bool = False): for instr_func_name in ("request", "send"): instr_func = getattr(instr_root, instr_func_name) if not getattr( @@ -361,7 +365,7 @@ def _uninstrument_from(instr_root, restore_as_bound_func=False): setattr(instr_root, instr_func_name, original) -def get_default_span_name(method): +def get_default_span_name(method: str) -> str: """ Default implementation for name_callback, returns HTTP {method_name}. https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/http/#name @@ -385,7 +389,7 @@ class RequestsInstrumentor(BaseInstrumentor): def instrumentation_dependencies(self) -> Collection[str]: return _instruments - def _instrument(self, **kwargs): + def _instrument(self, **kwargs: Any): """Instruments requests module Args: @@ -443,10 +447,10 @@ def _instrument(self, **kwargs): sem_conv_opt_in_mode=semconv_opt_in_mode, ) - def _uninstrument(self, **kwargs): + def _uninstrument(self, **kwargs: Any): _uninstrument() @staticmethod - def uninstrument_session(session): + def uninstrument_session(session: Session): """Disables instrumentation on the session object.""" _uninstrument_from(session, restore_as_bound_func=True) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/py.typed b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/pyproject.toml b/instrumentation/opentelemetry-instrumentation-sqlalchemy/pyproject.toml index 17c3095bf5..dd06af2de4 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -42,6 +43,7 @@ sqlalchemy = "opentelemetry.instrumentation.sqlalchemy:SQLAlchemyInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-sqlalchemy" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/sqlalchemy/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py index 4182c0034e..23b68a6c52 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py @@ -65,6 +65,30 @@ :: Enabling this flag will add traceparent values /*traceparent='00-03afa25236b8cd948fa853d67038ac79-405ff022e8247c46-01'*/ +SQLComment in span attribute +**************************** +If sqlcommenter is enabled, you can further configure SQLAlchemy instrumentation to append sqlcomment to the `db.statement` span attribute for convenience of your platform. + +.. code:: python + + from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor + + SQLAlchemyInstrumentor().instrument( + enable_commenter=True, + commenter_options={}, + enable_attribute_commenter=True, + ) + + +For example, +:: + + Invoking `engine.execute("select * from auth_users")` will lead to sql query "select * from auth_users" but when SQLCommenter and `attribute_commenter` is enabled + the query will get appended with some configurable tags like "select * from auth_users /*tag=value*/;" for both server query and `db.statement` span attribute. + +Warning: capture of sqlcomment in ``db.statement`` may have high cardinality without platform normalization. See `Semantic Conventions for database spans `_ for more information. + + Usage ----- .. code:: python @@ -138,6 +162,7 @@ def _instrument(self, **kwargs): ``meter_provider``: a MeterProvider, defaults to global ``enable_commenter``: bool to enable sqlcommenter, defaults to False ``commenter_options``: dict of sqlcommenter config, defaults to {} + ``enable_attribute_commenter``: bool to enable sqlcomment addition to span attribute, defaults to False. Must also set `enable_commenter`. Returns: An instrumented engine if passed in as an argument or list of instrumented engines, None otherwise. @@ -166,19 +191,30 @@ def _instrument(self, **kwargs): enable_commenter = kwargs.get("enable_commenter", False) commenter_options = kwargs.get("commenter_options", {}) + enable_attribute_commenter = kwargs.get( + "enable_attribute_commenter", False + ) _w( "sqlalchemy", "create_engine", _wrap_create_engine( - tracer, connections_usage, enable_commenter, commenter_options + tracer, + connections_usage, + enable_commenter, + commenter_options, + enable_attribute_commenter, ), ) _w( "sqlalchemy.engine", "create_engine", _wrap_create_engine( - tracer, connections_usage, enable_commenter, commenter_options + tracer, + connections_usage, + enable_commenter, + commenter_options, + enable_attribute_commenter, ), ) # sqlalchemy.engine.create is not present in earlier versions of sqlalchemy (which we support) @@ -191,6 +227,7 @@ def _instrument(self, **kwargs): connections_usage, enable_commenter, commenter_options, + enable_attribute_commenter, ), ) _w( @@ -207,6 +244,7 @@ def _instrument(self, **kwargs): connections_usage, enable_commenter, commenter_options, + enable_attribute_commenter, ), ) if kwargs.get("engine") is not None: @@ -216,6 +254,7 @@ def _instrument(self, **kwargs): connections_usage, kwargs.get("enable_commenter", False), kwargs.get("commenter_options", {}), + kwargs.get("enable_attribute_commenter", False), ) if kwargs.get("engines") is not None and isinstance( kwargs.get("engines"), Sequence @@ -227,6 +266,7 @@ def _instrument(self, **kwargs): connections_usage, kwargs.get("enable_commenter", False), kwargs.get("commenter_options", {}), + kwargs.get("enable_attribute_commenter", False), ) for engine in kwargs.get("engines") ] diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py index a20e481819..a3312bd77c 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py @@ -43,7 +43,11 @@ def _normalize_vendor(vendor): def _wrap_create_async_engine( - tracer, connections_usage, enable_commenter=False, commenter_options=None + tracer, + connections_usage, + enable_commenter=False, + commenter_options=None, + enable_attribute_commenter=False, ): # pylint: disable=unused-argument def _wrap_create_async_engine_internal(func, module, args, kwargs): @@ -57,6 +61,7 @@ def _wrap_create_async_engine_internal(func, module, args, kwargs): connections_usage, enable_commenter, commenter_options, + enable_attribute_commenter, ) return engine @@ -64,7 +69,11 @@ def _wrap_create_async_engine_internal(func, module, args, kwargs): def _wrap_create_engine( - tracer, connections_usage, enable_commenter=False, commenter_options=None + tracer, + connections_usage, + enable_commenter=False, + commenter_options=None, + enable_attribute_commenter=False, ): def _wrap_create_engine_internal(func, _module, args, kwargs): """Trace the SQLAlchemy engine, creating an `EngineTracer` @@ -77,6 +86,7 @@ def _wrap_create_engine_internal(func, _module, args, kwargs): connections_usage, enable_commenter, commenter_options, + enable_attribute_commenter, ) return engine @@ -110,12 +120,14 @@ def __init__( connections_usage, enable_commenter=False, commenter_options=None, + enable_attribute_commenter=False, ): self.tracer = tracer self.connections_usage = connections_usage self.vendor = _normalize_vendor(engine.name) self.enable_commenter = enable_commenter self.commenter_options = commenter_options if commenter_options else {} + self.enable_attribute_commenter = enable_attribute_commenter self._engine_attrs = _get_attributes_from_engine(engine) self._leading_comment_remover = re.compile(r"^/\*.*?\*/") @@ -218,6 +230,32 @@ def _operation_name(self, db_name, statement): return self.vendor return " ".join(parts) + def _get_commenter_data(self, conn) -> dict: + """Calculate sqlcomment contents from conn and configured options""" + commenter_data = { + "db_driver": conn.engine.driver, + # Driver/framework centric information. + "db_framework": f"sqlalchemy:{sqlalchemy.__version__}", + } + + if self.commenter_options.get("opentelemetry_values", True): + commenter_data.update(**_get_opentelemetry_values()) + + # Filter down to just the requested attributes. + commenter_data = { + k: v + for k, v in commenter_data.items() + if self.commenter_options.get(k, True) + } + return commenter_data + + def _set_db_client_span_attributes(self, span, statement, attrs) -> None: + """Uses statement and attrs to set attributes of provided Otel span""" + span.set_attribute(SpanAttributes.DB_STATEMENT, statement) + span.set_attribute(SpanAttributes.DB_SYSTEM, self.vendor) + for key, value in attrs.items(): + span.set_attribute(key, value) + def _before_cur_exec( self, conn, cursor, statement, params, context, _executemany ): @@ -233,30 +271,30 @@ def _before_cur_exec( with trace.use_span(span, end_on_exit=False): if span.is_recording(): if self.enable_commenter: - commenter_data = { - "db_driver": conn.engine.driver, - # Driver/framework centric information. - "db_framework": f"sqlalchemy:{sqlalchemy.__version__}", - } - - if self.commenter_options.get( - "opentelemetry_values", True - ): - commenter_data.update(**_get_opentelemetry_values()) - - # Filter down to just the requested attributes. - commenter_data = { - k: v - for k, v in commenter_data.items() - if self.commenter_options.get(k, True) - } - - statement = _add_sql_comment(statement, **commenter_data) - - span.set_attribute(SpanAttributes.DB_STATEMENT, statement) - span.set_attribute(SpanAttributes.DB_SYSTEM, self.vendor) - for key, value in attrs.items(): - span.set_attribute(key, value) + commenter_data = self._get_commenter_data(conn) + + if self.enable_attribute_commenter: + # sqlcomment is added to executed query and db.statement span attribute + statement = _add_sql_comment( + statement, **commenter_data + ) + self._set_db_client_span_attributes( + span, statement, attrs + ) + + else: + # sqlcomment is only added to executed query + # so db.statement is set before add_sql_comment + self._set_db_client_span_attributes( + span, statement, attrs + ) + statement = _add_sql_comment( + statement, **commenter_data + ) + + else: + # no sqlcomment anywhere + self._set_db_client_span_attributes(span, statement, attrs) context._otel_span = span diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt index 885cee8c62..13ea334c4d 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt @@ -1,7 +1,7 @@ aiosqlite==0.20.0 asgiref==3.8.1 Deprecated==1.2.14 -greenlet==3.0.3 +greenlet==3.1.1 iniconfig==2.0.0 packaging==24.0 pluggy==1.5.0 diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py index 27a253decb..8f5d0f2a94 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py @@ -209,6 +209,44 @@ def test_create_engine_wrapper_enable_commenter(self): 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}'\*/;", ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + def test_create_engine_wrapper_enable_commenter_stmt_enabled(self): + logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) + SQLAlchemyInstrumentor().instrument( + enable_commenter=True, + commenter_options={"db_framework": False}, + enable_attribute_commenter=True, + ) + from sqlalchemy import create_engine # pylint: disable-all + + engine = create_engine("sqlite:///:memory:") + cnx = engine.connect() + cnx.execute(text("SELECT 1;")).fetchall() + # sqlcommenter + 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}'\*/;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertRegex( + query_span.attributes[SpanAttributes.DB_STATEMENT], + r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) def test_create_engine_wrapper_enable_commenter_otel_values_false(self): logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) @@ -229,6 +267,49 @@ def test_create_engine_wrapper_enable_commenter_otel_values_false(self): self.caplog.records[-2].getMessage(), r"SELECT 1 /\*db_driver='(.*)'\*/;", ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + def test_create_engine_wrapper_enable_commenter_stmt_enabled_otel_values_false( + self, + ): + logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) + SQLAlchemyInstrumentor().instrument( + enable_commenter=True, + commenter_options={ + "db_framework": False, + "opentelemetry_values": False, + }, + enable_attribute_commenter=True, + ) + from sqlalchemy import create_engine # pylint: disable-all + + engine = create_engine("sqlite:///:memory:") + cnx = engine.connect() + cnx.execute(text("SELECT 1;")).fetchall() + # sqlcommenter + self.assertRegex( + self.caplog.records[-2].getMessage(), + r"SELECT 1 /\*db_driver='(.*)'\*/;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertRegex( + query_span.attributes[SpanAttributes.DB_STATEMENT], + r"SELECT 1 /\*db_driver='(.*)'\*/;", + ) def test_custom_tracer_provider(self): provider = TracerProvider( @@ -321,6 +402,55 @@ async def run(): self.caplog.records[1].getMessage(), r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + asyncio.get_event_loop().run_until_complete(run()) + + @pytest.mark.skipif( + not sqlalchemy.__version__.startswith("1.4"), + reason="only run async tests for 1.4", + ) + def test_create_async_engine_wrapper_enable_commenter_stmt_enabled(self): + async def run(): + logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) + SQLAlchemyInstrumentor().instrument( + enable_commenter=True, + commenter_options={ + "db_framework": False, + }, + enable_attribute_commenter=True, + ) + from sqlalchemy.ext.asyncio import ( # pylint: disable-all + create_async_engine, + ) + + engine = create_async_engine("sqlite+aiosqlite:///:memory:") + async with engine.connect() as cnx: + await cnx.execute(text("SELECT 1;")) + # sqlcommenter + self.assertRegex( + self.caplog.records[1].getMessage(), + r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertRegex( + query_span.attributes[SpanAttributes.DB_STATEMENT], + r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) asyncio.get_event_loop().run_until_complete(run()) @@ -352,6 +482,58 @@ async def run(): self.caplog.records[1].getMessage(), r"SELECT 1 /\*db_driver='(.*)'\*/;", ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + asyncio.get_event_loop().run_until_complete(run()) + + @pytest.mark.skipif( + not sqlalchemy.__version__.startswith("1.4"), + reason="only run async tests for 1.4", + ) + def test_create_async_engine_wrapper_enable_commenter_stmt_enabled_otel_values_false( + self, + ): + async def run(): + logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) + SQLAlchemyInstrumentor().instrument( + enable_commenter=True, + commenter_options={ + "db_framework": False, + "opentelemetry_values": False, + }, + enable_attribute_commenter=True, + ) + from sqlalchemy.ext.asyncio import ( # pylint: disable-all + create_async_engine, + ) + + engine = create_async_engine("sqlite+aiosqlite:///:memory:") + async with engine.connect() as cnx: + await cnx.execute(text("SELECT 1;")) + # sqlcommenter + self.assertRegex( + self.caplog.records[1].getMessage(), + r"SELECT 1 /\*db_driver='(.*)'\*/;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertRegex( + query_span.attributes[SpanAttributes.DB_STATEMENT], + r"SELECT 1 /\*db_driver='(.*)'*/;", + ) asyncio.get_event_loop().run_until_complete(run()) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlcommenter.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlcommenter.py index 8490721e3e..d8144dadc1 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlcommenter.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlcommenter.py @@ -61,13 +61,97 @@ def test_sqlcommenter_enabled(self): 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_enabled_matches_db_statement_attribute(self): + def test_sqlcommenter_default_stmt_enabled_no_comments_anywhere(self): + engine = create_engine("sqlite:///:memory:") + SQLAlchemyInstrumentor().instrument( + engine=engine, + tracer_provider=self.tracer_provider, + # enable_commenter not set + enable_attribute_commenter=True, + ) + cnx = engine.connect() + cnx.execute(text("SELECT 1;")).fetchall() + query_log = self.caplog.records[-2].getMessage() + self.assertEqual( + query_log, + "SELECT 1;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + def test_sqlcommenter_disabled_stmt_enabled_no_comments_anywhere(self): + engine = create_engine("sqlite:///:memory:") + SQLAlchemyInstrumentor().instrument( + engine=engine, + tracer_provider=self.tracer_provider, + enable_commenter=False, + enable_attribute_commenter=True, + ) + cnx = engine.connect() + cnx.execute(text("SELECT 1;")).fetchall() + query_log = self.caplog.records[-2].getMessage() + self.assertEqual( + query_log, + "SELECT 1;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + def test_sqlcommenter_enabled_stmt_disabled_default( + self, + ): + engine = create_engine("sqlite:///:memory:") + SQLAlchemyInstrumentor().instrument( + engine=engine, + tracer_provider=self.tracer_provider, + enable_commenter=True, + commenter_options={"db_framework": False}, + # enable_attribute_commenter not set + ) + cnx = engine.connect() + cnx.execute(text("SELECT 1;")).fetchall() + query_log = self.caplog.records[-2].getMessage() + self.assertRegex( + query_log, + r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + def test_sqlcommenter_enabled_stmt_enabled_matches_db_statement_attribute( + self, + ): engine = create_engine("sqlite:///:memory:") SQLAlchemyInstrumentor().instrument( engine=engine, tracer_provider=self.tracer_provider, enable_commenter=True, commenter_options={"db_framework": False}, + enable_attribute_commenter=True, ) cnx = engine.connect() cnx.execute(text("SELECT 1;")).fetchall() @@ -110,6 +194,45 @@ def test_sqlcommenter_enabled_otel_values_false(self): self.caplog.records[-2].getMessage(), r"SELECT 1 /\*db_driver='(.*)'\*/;", ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + r"SELECT 1;", + ) + + def test_sqlcommenter_enabled_stmt_enabled_otel_values_false(self): + engine = create_engine("sqlite:///:memory:") + SQLAlchemyInstrumentor().instrument( + engine=engine, + tracer_provider=self.tracer_provider, + enable_commenter=True, + commenter_options={ + "db_framework": False, + "opentelemetry_values": False, + }, + enable_attribute_commenter=True, + ) + cnx = engine.connect() + cnx.execute(text("SELECT 1;")).fetchall() + self.assertRegex( + self.caplog.records[-2].getMessage(), + r"SELECT 1 /\*db_driver='(.*)'\*/;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertRegex( + query_span.attributes[SpanAttributes.DB_STATEMENT], + r"SELECT 1 /\*db_driver='(.*)'*/;", + ) def test_sqlcommenter_flask_integration(self): engine = create_engine("sqlite:///:memory:") @@ -132,6 +255,49 @@ def test_sqlcommenter_flask_integration(self): 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}'\*/;", ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + def test_sqlcommenter_stmt_enabled_flask_integration(self): + engine = create_engine("sqlite:///:memory:") + SQLAlchemyInstrumentor().instrument( + engine=engine, + tracer_provider=self.tracer_provider, + enable_commenter=True, + commenter_options={"db_framework": False}, + enable_attribute_commenter=True, + ) + cnx = engine.connect() + + current_context = context.get_current() + sqlcommenter_context = context.set_value( + "SQLCOMMENTER_ORM_TAGS_AND_VALUES", {"flask": 1}, current_context + ) + context.attach(sqlcommenter_context) + + cnx.execute(text("SELECT 1;")).fetchall() + self.assertRegex( + 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}'\*/;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertRegex( + query_span.attributes[SpanAttributes.DB_STATEMENT], + 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( @@ -147,6 +313,44 @@ def test_sqlcommenter_enabled_create_engine_after_instrumentation(self): 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}'\*/;", ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertEqual( + query_span.attributes[SpanAttributes.DB_STATEMENT], + "SELECT 1;", + ) + + def test_sqlcommenter_enabled_stmt_enabled_create_engine_after_instrumentation( + self, + ): + SQLAlchemyInstrumentor().instrument( + tracer_provider=self.tracer_provider, + enable_commenter=True, + enable_attribute_commenter=True, + ) + from sqlalchemy import create_engine # pylint: disable-all + + engine = create_engine("sqlite:///:memory:") + cnx = engine.connect() + cnx.execute(text("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}'\*/;", + ) + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 2) + # first span is connection to db + self.assertEqual(spans[0].name, "connect") + # second span is query itself + query_span = spans[1] + self.assertRegex( + query_span.attributes[SpanAttributes.DB_STATEMENT], + 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( diff --git a/instrumentation/opentelemetry-instrumentation-sqlite3/pyproject.toml b/instrumentation/opentelemetry-instrumentation-sqlite3/pyproject.toml index 40e5b140af..e006ae9b86 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlite3/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-sqlite3/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -38,6 +39,7 @@ sqlite3 = "opentelemetry.instrumentation.sqlite3:SQLite3Instrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-sqlite3" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/sqlite3/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/__init__.py b/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/__init__.py index ec4f8ecc50..086d47f3f5 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/__init__.py @@ -27,16 +27,31 @@ import sqlite3 from opentelemetry.instrumentation.sqlite3 import SQLite3Instrumentor - + # Call instrument() to wrap all database connections SQLite3Instrumentor().instrument() cnx = sqlite3.connect(':memory:') cursor = cnx.cursor() - cursor.execute("CREATE TABLE test (testField INTEGER)") + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") cursor.execute("INSERT INTO test (testField) VALUES (123)") cursor.close() cnx.close() +.. code:: python + + import sqlite3 + from opentelemetry.instrumentation.sqlite3 import SQLite3Instrumentor + + # Alternatively, use instrument_connection for an individual connection + conn = sqlite3.connect(":memory:") + instrumented_connection = SQLite3Instrumentor().instrument_connection(conn) + cursor = instrumented_connection.cursor() + cursor.execute("CREATE TABLE IF NOT EXISTS test (testField INTEGER)") + cursor.execute("INSERT INTO test (testField) VALUES (123)") + cursor.execute("SELECT * FROM test") + cursor.close() + instrumented_connection.close() + API --- """ @@ -104,9 +119,10 @@ def instrument_connection( the current globally configured one is used. Returns: - An instrumented connection. - """ + An instrumented SQLite connection that supports + telemetry for tracing database operations. + """ return dbapi.instrument_connection( __name__, connection, diff --git a/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/py.typed b/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/instrumentation/opentelemetry-instrumentation-sqlite3/tests/test_sqlite3.py b/instrumentation/opentelemetry-instrumentation-sqlite3/tests/test_sqlite3.py index 581920232b..b9fb1f10ec 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlite3/tests/test_sqlite3.py +++ b/instrumentation/opentelemetry-instrumentation-sqlite3/tests/test_sqlite3.py @@ -29,6 +29,10 @@ def setUp(self): self._cursor = self._connection.cursor() self._connection2 = dbapi2.connect(":memory:") self._cursor2 = self._connection2.cursor() + self._connection3 = SQLite3Instrumentor.instrument_connection( + dbapi2.connect(":memory:") + ) + self._cursor3 = self._connection3.cursor() def tearDown(self): super().tearDown() @@ -40,6 +44,10 @@ def tearDown(self): self._cursor2.close() if self._connection2: self._connection2.close() + if self._cursor3: + self._cursor3.close() + if self._connection3: + self._connection3.close() SQLite3Instrumentor().uninstrument() def validate_spans(self, span_name): @@ -65,6 +73,7 @@ def _create_tables(self): stmt = "CREATE TABLE IF NOT EXISTS test (id integer)" self._cursor.execute(stmt) self._cursor2.execute(stmt) + self._cursor3.execute(stmt) self.memory_exporter.clear() def test_execute(self): @@ -78,6 +87,10 @@ def test_execute(self): self._cursor2.execute(stmt) self.validate_spans("CREATE") + with self._tracer.start_as_current_span("rootSpan"): + self._cursor3.execute(stmt) + self.validate_spans("CREATE") + def test_executemany(self): """Should create a child span for executemany""" self._create_tables() @@ -93,6 +106,10 @@ def test_executemany(self): self._cursor2.executemany(stmt, data) self.validate_spans("INSERT") + with self._tracer.start_as_current_span("rootSpan"): + self._cursor3.executemany(stmt, data) + self.validate_spans("INSERT") + def test_callproc(self): """Should create a child span for callproc""" with self._tracer.start_as_current_span("rootSpan"), self.assertRaises( diff --git a/instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml b/instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml index 4be53c57ab..279fd35d93 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -42,6 +43,7 @@ starlette = "opentelemetry.instrumentation.starlette:StarletteInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-starlette" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/starlette/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/py.typed b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/pyproject.toml b/instrumentation/opentelemetry-instrumentation-system-metrics/pyproject.toml index e8bc8375fd..42ed452cd1 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-instrumentation == 0.51b0.dev", @@ -40,6 +41,7 @@ system_metrics = "opentelemetry.instrumentation.system_metrics:SystemMetricsInst [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-system-metrics" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/system_metrics/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py index aff86ea77b..a81c5bf7ff 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py @@ -76,18 +76,18 @@ --- """ +from __future__ import annotations + import gc import logging import os import sys import threading from platform import python_implementation -from typing import Collection, Dict, Iterable, List, Optional +from typing import Any, Collection, Iterable import psutil -# FIXME Remove this pylint disabling line when Github issue is cleared -# pylint: disable=no-name-in-module from opentelemetry.instrumentation.instrumentor import BaseInstrumentor from opentelemetry.instrumentation.system_metrics.package import _instruments from opentelemetry.instrumentation.system_metrics.version import __version__ @@ -96,7 +96,7 @@ _logger = logging.getLogger(__name__) -_DEFAULT_CONFIG = { +_DEFAULT_CONFIG: dict[str, list[str] | None] = { "system.cpu.time": ["idle", "user", "system", "irq"], "system.cpu.utilization": ["idle", "user", "system", "irq"], "system.memory.usage": ["used", "free", "cached"], @@ -129,8 +129,8 @@ class SystemMetricsInstrumentor(BaseInstrumentor): def __init__( self, - labels: Optional[Dict[str, str]] = None, - config: Optional[Dict[str, List[str]]] = None, + labels: dict[str, str] | None = None, + config: dict[str, list[str] | None] | None = None, ): super().__init__() if config is None: @@ -176,7 +176,7 @@ def __init__( def instrumentation_dependencies(self) -> Collection[str]: return _instruments - def _instrument(self, **kwargs): + def _instrument(self, **kwargs: Any): # pylint: disable=too-many-branches meter_provider = kwargs.get("meter_provider") self._meter = get_meter( @@ -408,7 +408,7 @@ def _instrument(self, **kwargs): description="Number of file descriptors in use by the process.", ) - def _uninstrument(self, **__): + def _uninstrument(self, **kwargs: Any): pass def _get_open_file_descriptors( diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/py.typed b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/instrumentation/opentelemetry-instrumentation-threading/pyproject.toml b/instrumentation/opentelemetry-instrumentation-threading/pyproject.toml index 5c0efc09aa..e7478709b6 100644 --- a/instrumentation/opentelemetry-instrumentation-threading/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-threading/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -38,6 +39,7 @@ threading = "opentelemetry.instrumentation.threading:ThreadingInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-threading" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/threading/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-tornado/pyproject.toml b/instrumentation/opentelemetry-instrumentation-tornado/pyproject.toml index 18104a99c4..cfc08f40fc 100644 --- a/instrumentation/opentelemetry-instrumentation-tornado/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-tornado/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -40,6 +41,7 @@ tornado = "opentelemetry.instrumentation.tornado:TornadoInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-tornado" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/tornado/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-tortoiseorm/pyproject.toml b/instrumentation/opentelemetry-instrumentation-tortoiseorm/pyproject.toml index c83d9fbd5f..2ee1e00161 100644 --- a/instrumentation/opentelemetry-instrumentation-tortoiseorm/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-tortoiseorm/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -41,6 +42,7 @@ tortoiseorm = "opentelemetry.instrumentation.tortoiseorm:TortoiseORMInstrumentor [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-tortoiseorm" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/tortoiseorm/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-urllib/pyproject.toml b/instrumentation/opentelemetry-instrumentation-urllib/pyproject.toml index 71ecc981c1..7b0abcf278 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-urllib/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -39,6 +40,7 @@ urllib = "opentelemetry.instrumentation.urllib:URLLibInstrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-urllib" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/urllib/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py b/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py index 8b72a2f3db..9fe9996ba4 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py @@ -90,7 +90,6 @@ def response_hook(span, request_obj, response) _client_duration_attrs_old, _filter_semconv_duration_attrs, _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, _report_new, @@ -99,6 +98,7 @@ def response_hook(span, request_obj, response) _set_http_network_protocol_version, _set_http_url, _set_status, + _StabilityMode, ) from opentelemetry.instrumentation.instrumentor import BaseInstrumentor from opentelemetry.instrumentation.urllib.package import _instruments @@ -209,7 +209,7 @@ def _instrument( request_hook: _RequestHookT = None, response_hook: _ResponseHookT = None, excluded_urls: ExcludeList = None, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): """Enables tracing of all requests calls that go through :code:`urllib.Client._make_request`""" @@ -305,13 +305,13 @@ def _instrumented_open_call( labels, _client_duration_attrs_old, _client_duration_attrs_new, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ) duration_attrs_new = _filter_semconv_duration_attrs( labels, _client_duration_attrs_old, _client_duration_attrs_new, - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP, + sem_conv_opt_in_mode=_StabilityMode.HTTP, ) duration_attrs_old[SpanAttributes.HTTP_URL] = url @@ -372,7 +372,7 @@ def _set_status_code_attribute( span: Span, status_code: int, metric_attributes: dict = None, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ) -> None: status_code_str = str(status_code) try: @@ -394,7 +394,7 @@ def _set_status_code_attribute( def _create_client_histograms( - meter, sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT + meter, sem_conv_opt_in_mode=_StabilityMode.DEFAULT ) -> Dict[str, Histogram]: histograms = {} if _report_old(sem_conv_opt_in_mode): @@ -442,7 +442,7 @@ def _record_histograms( request_size: int, response_size: int, duration_s: float, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): if _report_old(sem_conv_opt_in_mode): duration = max(round(duration_s * 1000), 0) diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/pyproject.toml b/instrumentation/opentelemetry-instrumentation-urllib3/pyproject.toml index 70a6183d99..391a344dd9 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib3/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-urllib3/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -42,6 +43,7 @@ urllib3 = "opentelemetry.instrumentation.urllib3:URLLib3Instrumentor" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-urllib3" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/urllib3/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py b/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py index eda66bea37..2d1cf4c1b0 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py @@ -98,7 +98,6 @@ def response_hook( _client_duration_attrs_old, _filter_semconv_duration_attrs, _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, _report_new, @@ -111,6 +110,7 @@ def response_hook( _set_http_scheme, _set_http_url, _set_status, + _StabilityMode, ) from opentelemetry.instrumentation.instrumentor import BaseInstrumentor from opentelemetry.instrumentation.urllib3.package import _instruments @@ -309,7 +309,7 @@ def _instrument( response_hook: _ResponseHookT = None, url_filter: _UrlFilterT = None, excluded_urls: ExcludeList = None, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): def instrumented_urlopen(wrapped, instance, args, kwargs): if not is_http_instrumentation_enabled(): @@ -461,7 +461,7 @@ def _set_status_code_attribute( span: Span, status_code: int, metric_attributes: dict = None, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ) -> None: status_code_str = str(status_code) try: @@ -487,7 +487,7 @@ def _set_metric_attributes( instance: urllib3.connectionpool.HTTPConnectionPool, response: urllib3.response.HTTPResponse, method: str, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ) -> None: _set_http_host_client( metric_attributes, instance.host, sem_conv_opt_in_mode @@ -516,7 +516,7 @@ def _set_metric_attributes( def _filter_attributes_semconv( metric_attributes, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): duration_attrs_old = None duration_attrs_new = None @@ -525,14 +525,14 @@ def _filter_attributes_semconv( metric_attributes, _client_duration_attrs_old, _client_duration_attrs_new, - _HTTPStabilityMode.DEFAULT, + _StabilityMode.DEFAULT, ) if _report_new(sem_conv_opt_in_mode): duration_attrs_new = _filter_semconv_duration_attrs( metric_attributes, _client_duration_attrs_old, _client_duration_attrs_new, - _HTTPStabilityMode.HTTP, + _StabilityMode.HTTP, ) return (duration_attrs_old, duration_attrs_new) @@ -549,7 +549,7 @@ def _record_metrics( duration_s: float, request_size: typing.Optional[int], response_size: int, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): attrs_old, attrs_new = _filter_attributes_semconv( metric_attributes, sem_conv_opt_in_mode diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/tests/test_urllib3_integration.py b/instrumentation/opentelemetry-instrumentation-urllib3/tests/test_urllib3_integration.py index 69bed0eaee..e5a9f3b7e1 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib3/tests/test_urllib3_integration.py +++ b/instrumentation/opentelemetry-instrumentation-urllib3/tests/test_urllib3_integration.py @@ -24,8 +24,8 @@ from opentelemetry import trace from opentelemetry.instrumentation._semconv import ( OTEL_SEMCONV_STABILITY_OPT_IN, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, + _StabilityMode, ) from opentelemetry.instrumentation.urllib3 import ( RequestInfo, @@ -106,7 +106,7 @@ def assert_success_span( self, response: urllib3.response.HTTPResponse, url: str, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): self.assertEqual(b"Hello!", response.data) @@ -129,9 +129,9 @@ def assert_success_span( } attributes = { - _HTTPStabilityMode.DEFAULT: expected_attr_old, - _HTTPStabilityMode.HTTP: expected_attr_new, - _HTTPStabilityMode.HTTP_DUP: { + _StabilityMode.DEFAULT: expected_attr_old, + _StabilityMode.HTTP: expected_attr_new, + _StabilityMode.HTTP_DUP: { **expected_attr_new, **expected_attr_old, }, @@ -143,7 +143,7 @@ def assert_success_span( def assert_exception_span( self, url: str, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): span = self.assert_span() @@ -159,9 +159,9 @@ def assert_exception_span( } attributes = { - _HTTPStabilityMode.DEFAULT: expected_attr_old, - _HTTPStabilityMode.HTTP: expected_attr_new, - _HTTPStabilityMode.HTTP_DUP: { + _StabilityMode.DEFAULT: expected_attr_old, + _StabilityMode.HTTP: expected_attr_new, + _StabilityMode.HTTP_DUP: { **expected_attr_new, **expected_attr_old, }, @@ -192,7 +192,7 @@ def test_basic_http_success(self): self.assert_success_span( response, self.HTTP_URL, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ) def test_basic_http_success_new_semconv(self): @@ -200,7 +200,7 @@ def test_basic_http_success_new_semconv(self): self.assert_success_span( response, self.HTTP_URL, - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP, + sem_conv_opt_in_mode=_StabilityMode.HTTP, ) def test_basic_http_success_both_semconv(self): @@ -208,7 +208,7 @@ def test_basic_http_success_both_semconv(self): self.assert_success_span( response, self.HTTP_URL, - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP_DUP, + sem_conv_opt_in_mode=_StabilityMode.HTTP_DUP, ) def test_basic_http_success_using_connection_pool(self): @@ -471,7 +471,7 @@ def test_request_exception_new_semconv(self, _): ) self.assert_exception_span( - self.HTTP_URL, sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP + self.HTTP_URL, sem_conv_opt_in_mode=_StabilityMode.HTTP ) @mock.patch( @@ -485,7 +485,7 @@ def test_request_exception_both_semconv(self, _): ) self.assert_exception_span( - self.HTTP_URL, sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP_DUP + self.HTTP_URL, sem_conv_opt_in_mode=_StabilityMode.HTTP_DUP ) @mock.patch( diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-wsgi/pyproject.toml index ed9fd9bf24..a36418110f 100644 --- a/instrumentation/opentelemetry-instrumentation-wsgi/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-wsgi/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -36,6 +37,7 @@ instruments = [] [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-wsgi" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/wsgi/version.py" diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py b/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py index c0384d594b..bd3b2d18db 100644 --- a/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py @@ -217,7 +217,6 @@ def response_hook(span: Span, environ: WSGIEnvironment, status: str, response_he _filter_semconv_active_request_count_attr, _filter_semconv_duration_attrs, _get_schema_url, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _OpenTelemetryStabilitySignalType, _report_new, @@ -237,6 +236,7 @@ def response_hook(span: Span, environ: WSGIEnvironment, status: str, response_he _set_http_target, _set_http_user_agent, _set_status, + _StabilityMode, ) from opentelemetry.instrumentation.utils import _start_internal_or_server_span from opentelemetry.instrumentation.wsgi.version import __version__ @@ -308,7 +308,7 @@ def setifnotnone(dic, key, value): def collect_request_attributes( environ, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ): """Collects HTTP request attributes from the PEP3333-conforming WSGI environ and returns a dictionary to be used as span creation attributes. @@ -449,7 +449,7 @@ def _parse_status_code(resp_status): def _parse_active_request_count_attrs( - req_attrs, sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT + req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT ): return _filter_semconv_active_request_count_attr( req_attrs, @@ -460,7 +460,7 @@ def _parse_active_request_count_attrs( def _parse_duration_attrs( - req_attrs, sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT + req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT ): return _filter_semconv_duration_attrs( req_attrs, @@ -475,16 +475,12 @@ def add_response_attributes( start_response_status, response_headers, duration_attrs=None, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ): # pylint: disable=unused-argument """Adds HTTP response attributes to span using the arguments passed to a PEP3333-conforming start_response callable. """ - if not span.is_recording(): - return status_code_str, _ = start_response_status.split(" ", 1) - - status_code = 0 try: status_code = int(status_code_str) except ValueError: @@ -685,14 +681,14 @@ def __call__(self, environ, start_response): duration_s = default_timer() - start if self.duration_histogram_old: duration_attrs_old = _parse_duration_attrs( - req_attrs, _HTTPStabilityMode.DEFAULT + req_attrs, _StabilityMode.DEFAULT ) self.duration_histogram_old.record( max(round(duration_s * 1000), 0), duration_attrs_old ) if self.duration_histogram_new: duration_attrs_new = _parse_duration_attrs( - req_attrs, _HTTPStabilityMode.HTTP + req_attrs, _StabilityMode.HTTP ) self.duration_histogram_new.record( max(duration_s, 0), duration_attrs_new diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_wsgi_middleware.py b/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_wsgi_middleware.py index 095e263732..9d7d1240a7 100644 --- a/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_wsgi_middleware.py +++ b/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_wsgi_middleware.py @@ -24,12 +24,12 @@ from opentelemetry import trace as trace_api from opentelemetry.instrumentation._semconv import ( OTEL_SEMCONV_STABILITY_OPT_IN, - _HTTPStabilityMode, _OpenTelemetrySemanticConventionStability, _server_active_requests_count_attrs_new, _server_active_requests_count_attrs_old, _server_duration_attrs_new, _server_duration_attrs_old, + _StabilityMode, ) from opentelemetry.sdk.metrics.export import ( HistogramDataPoint, @@ -527,7 +527,7 @@ def test_request_attributes_new_semconv(self): attrs = otel_wsgi.collect_request_attributes( self.environ, - _HTTPStabilityMode.HTTP, + _StabilityMode.HTTP, ) self.assertDictEqual( attrs, @@ -742,7 +742,7 @@ def test_request_attributes_with_full_request_uri(self): self.assertGreaterEqual( otel_wsgi.collect_request_attributes( self.environ, - _HTTPStabilityMode.HTTP, + _StabilityMode.HTTP, ).items(), expected_new.items(), ) @@ -758,7 +758,7 @@ def test_http_user_agent_attribute(self): self.assertGreaterEqual( otel_wsgi.collect_request_attributes( self.environ, - _HTTPStabilityMode.HTTP, + _StabilityMode.HTTP, ).items(), expected_new.items(), ) @@ -769,7 +769,7 @@ def test_response_attributes(self): self.span, "404 Not Found", {}, - sem_conv_opt_in_mode=_HTTPStabilityMode.HTTP, + sem_conv_opt_in_mode=_StabilityMode.HTTP, ) expected = (mock.call(SpanAttributes.HTTP_STATUS_CODE, 404),) expected_new = ( @@ -779,6 +779,19 @@ def test_response_attributes(self): self.span.set_attribute.assert_has_calls(expected, any_order=True) self.span.set_attribute.assert_has_calls(expected_new, any_order=True) + def test_response_attributes_noop(self): + mock_span = mock.Mock() + mock_span.is_recording.return_value = False + + attrs = {} + otel_wsgi.add_response_attributes( + mock_span, "404 Not Found", {}, duration_attrs=attrs + ) + + self.assertEqual(mock_span.set_attribute.call_count, 0) + self.assertEqual(mock_span.is_recording.call_count, 2) + self.assertEqual(attrs[SpanAttributes.HTTP_STATUS_CODE], 404) + def test_credential_removal(self): self.environ["HTTP_HOST"] = "username:password@mock" self.environ["PATH_INFO"] = "/status/200" diff --git a/opentelemetry-contrib-instrumentations/pyproject.toml b/opentelemetry-contrib-instrumentations/pyproject.toml index 36aec6a5c5..e19c0d69d8 100644 --- a/opentelemetry-contrib-instrumentations/pyproject.toml +++ b/opentelemetry-contrib-instrumentations/pyproject.toml @@ -27,6 +27,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-instrumentation-aio-pika==0.51b0.dev", @@ -82,6 +83,7 @@ dependencies = [ [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-contrib-instrumentations" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/contrib-instrumentations/version.py" diff --git a/opentelemetry-distro/pyproject.toml b/opentelemetry-distro/pyproject.toml index 32c06ca723..3e6050946b 100644 --- a/opentelemetry-distro/pyproject.toml +++ b/opentelemetry-distro/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Typing :: Typed", ] dependencies = [ @@ -44,6 +45,7 @@ distro = "opentelemetry.distro:OpenTelemetryDistro" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-distro" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/distro/version.py" diff --git a/opentelemetry-instrumentation/pyproject.toml b/opentelemetry-instrumentation/pyproject.toml index 616c22f7e9..4f80b22491 100644 --- a/opentelemetry-instrumentation/pyproject.toml +++ b/opentelemetry-instrumentation/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.4", @@ -40,6 +41,7 @@ instrumentation = "opentelemetry.instrumentation.environment_variables" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-instrumentation" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/instrumentation/version.py" diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py index c4e720fd04..091c876535 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py @@ -109,23 +109,23 @@ class _OpenTelemetryStabilitySignalType: HTTP = "http" + DATABASE = "database" -class _HTTPStabilityMode(Enum): - # http - emit the new, stable HTTP and networking conventions ONLY +class _StabilityMode(Enum): + DEFAULT = "default" HTTP = "http" - # http/dup - emit both the old and the stable HTTP and networking conventions HTTP_DUP = "http/dup" - # default - continue emitting old experimental HTTP and networking conventions - DEFAULT = "default" + DATABASE = "database" + DATABASE_DUP = "database/dup" -def _report_new(mode): - return mode.name != _HTTPStabilityMode.DEFAULT.name +def _report_new(mode: _StabilityMode): + return mode != _StabilityMode.DEFAULT -def _report_old(mode): - return mode.name != _HTTPStabilityMode.HTTP.name +def _report_old(mode: _StabilityMode): + return mode not in (_StabilityMode.HTTP, _StabilityMode.DATABASE) class _OpenTelemetrySemanticConventionStability: @@ -135,35 +135,61 @@ class _OpenTelemetrySemanticConventionStability: @classmethod def _initialize(cls): - with _OpenTelemetrySemanticConventionStability._lock: - if not _OpenTelemetrySemanticConventionStability._initialized: - # Users can pass in comma delimited string for opt-in options - # Only values for http stability are supported for now - opt_in = os.environ.get(OTEL_SEMCONV_STABILITY_OPT_IN, "") - opt_in_list = [] - if opt_in: - opt_in_list = [s.strip() for s in opt_in.split(",")] - http_opt_in = _HTTPStabilityMode.DEFAULT - if opt_in_list: - # Process http opt-in - # http/dup takes priority over http - if _HTTPStabilityMode.HTTP_DUP.value in opt_in_list: - http_opt_in = _HTTPStabilityMode.HTTP_DUP - elif _HTTPStabilityMode.HTTP.value in opt_in_list: - http_opt_in = _HTTPStabilityMode.HTTP - _OpenTelemetrySemanticConventionStability._OTEL_SEMCONV_STABILITY_SIGNAL_MAPPING[ - _OpenTelemetryStabilitySignalType.HTTP - ] = http_opt_in - _OpenTelemetrySemanticConventionStability._initialized = True + with cls._lock: + if cls._initialized: + return + + # Users can pass in comma delimited string for opt-in options + # Only values for http and database stability are supported for now + opt_in = os.environ.get(OTEL_SEMCONV_STABILITY_OPT_IN) + + if not opt_in: + # early return in case of default + cls._OTEL_SEMCONV_STABILITY_SIGNAL_MAPPING = { + _OpenTelemetryStabilitySignalType.HTTP: _StabilityMode.DEFAULT, + _OpenTelemetryStabilitySignalType.DATABASE: _StabilityMode.DEFAULT, + } + cls._initialized = True + return + + opt_in_list = [s.strip() for s in opt_in.split(",")] + + cls._OTEL_SEMCONV_STABILITY_SIGNAL_MAPPING[ + _OpenTelemetryStabilitySignalType.HTTP + ] = cls._filter_mode( + opt_in_list, _StabilityMode.HTTP, _StabilityMode.HTTP_DUP + ) + + cls._OTEL_SEMCONV_STABILITY_SIGNAL_MAPPING[ + _OpenTelemetryStabilitySignalType.DATABASE + ] = cls._filter_mode( + opt_in_list, + _StabilityMode.DATABASE, + _StabilityMode.DATABASE_DUP, + ) + + cls._initialized = True + + @staticmethod + def _filter_mode(opt_in_list, stable_mode, dup_mode): + # Process semconv stability opt-in + # http/dup,database/dup has higher precedence over http,database + if dup_mode.value in opt_in_list: + return dup_mode + + return ( + stable_mode + if stable_mode.value in opt_in_list + else _StabilityMode.DEFAULT + ) @classmethod - # Get OpenTelemetry opt-in mode based off of signal type (http, messaging, etc.) def _get_opentelemetry_stability_opt_in_mode( - cls, - signal_type: _OpenTelemetryStabilitySignalType, - ) -> _HTTPStabilityMode: - return _OpenTelemetrySemanticConventionStability._OTEL_SEMCONV_STABILITY_SIGNAL_MAPPING.get( - signal_type, _HTTPStabilityMode.DEFAULT + cls, signal_type: _OpenTelemetryStabilitySignalType + ) -> _StabilityMode: + # Get OpenTelemetry opt-in mode based off of signal type (http, messaging, etc.) + return cls._OTEL_SEMCONV_STABILITY_SIGNAL_MAPPING.get( + signal_type, _StabilityMode.DEFAULT ) @@ -171,14 +197,12 @@ def _filter_semconv_duration_attrs( attrs, old_attrs, new_attrs, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ): filtered_attrs = {} # duration is two different metrics depending on sem_conv_opt_in_mode, so no DUP attributes allowed_attributes = ( - new_attrs - if sem_conv_opt_in_mode == _HTTPStabilityMode.HTTP - else old_attrs + new_attrs if sem_conv_opt_in_mode == _StabilityMode.HTTP else old_attrs ) for key, val in attrs.items(): if key in allowed_attributes: @@ -190,7 +214,7 @@ def _filter_semconv_active_request_count_attr( attrs, old_attrs, new_attrs, - sem_conv_opt_in_mode=_HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, ): filtered_attrs = {} if _report_old(sem_conv_opt_in_mode): @@ -367,10 +391,11 @@ def _set_status( status_code: int, status_code_str: str, server_span: bool = True, - sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT, + sem_conv_opt_in_mode: _StabilityMode = _StabilityMode.DEFAULT, ): if status_code < 0: - metrics_attributes[ERROR_TYPE] = status_code_str + if _report_new(sem_conv_opt_in_mode): + metrics_attributes[ERROR_TYPE] = status_code_str if span.is_recording(): if _report_new(sem_conv_opt_in_mode): span.set_attribute(ERROR_TYPE, status_code_str) @@ -404,7 +429,7 @@ def _set_status( # Get schema version based off of opt-in mode -def _get_schema_url(mode: _HTTPStabilityMode) -> str: - if mode is _HTTPStabilityMode.DEFAULT: +def _get_schema_url(mode: _StabilityMode) -> str: + if mode is _StabilityMode.DEFAULT: return "https://opentelemetry.io/schemas/1.11.0" return SpanAttributes.SCHEMA_URL diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py index cffc612662..a55f0ccd8e 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py @@ -20,6 +20,10 @@ "library": "openai >= 1.26.0", "instrumentation": "opentelemetry-instrumentation-openai-v2==2.1b0.dev", }, + { + "library": "google-cloud-aiplatform >= 1.64", + "instrumentation": "opentelemetry-instrumentation-vertexai==2.1b0.dev", + }, { "library": "aio_pika >= 7.2.0, < 10.0.0", "instrumentation": "opentelemetry-instrumentation-aio-pika==0.51b0.dev", @@ -77,7 +81,7 @@ "instrumentation": "opentelemetry-instrumentation-click==0.51b0.dev", }, { - "library": "confluent-kafka >= 1.8.2, <= 2.4.0", + "library": "confluent-kafka >= 1.8.2, <= 2.7.0", "instrumentation": "opentelemetry-instrumentation-confluent-kafka==0.51b0.dev", }, { @@ -89,7 +93,7 @@ "instrumentation": "opentelemetry-instrumentation-elasticsearch==0.51b0.dev", }, { - "library": "falcon >= 1.4.1, < 3.1.2", + "library": "falcon >= 1.4.1, < 5.0.0", "instrumentation": "opentelemetry-instrumentation-falcon==0.51b0.dev", }, { diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/dependencies.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/dependencies.py index 8f0a383412..b7e4cff400 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/dependencies.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/dependencies.py @@ -47,13 +47,14 @@ def get_dist_dependency_conflicts( extra = "extra" instruments = "instruments" instruments_marker = {extra: instruments} - for dep in dist.requires: - if extra not in dep or instruments not in dep: - continue - - req = Requirement(dep) - if req.marker.evaluate(instruments_marker): - instrumentation_deps.append(req) + if dist.requires: + for dep in dist.requires: + if extra not in dep or instruments not in dep: + continue + + req = Requirement(dep) + if req.marker.evaluate(instruments_marker): + instrumentation_deps.append(req) return get_dependency_conflicts(instrumentation_deps) diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py index a0d9ae18f9..d5bf5db7fd 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py @@ -12,11 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + import urllib.parse from contextlib import contextmanager from importlib import import_module from re import escape, sub -from typing import Dict, Iterable, Sequence, Union +from typing import Any, Dict, Generator, Sequence from wrapt import ObjectProxy @@ -44,9 +46,9 @@ def extract_attributes_from_object( - obj: any, attributes: Sequence[str], existing: Dict[str, str] = None + obj: Any, attributes: Sequence[str], existing: Dict[str, str] | None = None ) -> Dict[str, str]: - extracted = {} + extracted: dict[str, str] = {} if existing: extracted.update(existing) for attr in attributes: @@ -81,7 +83,7 @@ def http_status_to_status_code( return StatusCode.ERROR -def unwrap(obj: Union[object, str], attr: str): +def unwrap(obj: object, attr: str): """Given a function that was wrapped by wrapt.wrap_function_wrapper, unwrap it The object containing the function to unwrap may be passed as dotted module path string. @@ -152,7 +154,7 @@ def _start_internal_or_server_span( return span, token -def _url_quote(s) -> str: # pylint: disable=invalid-name +def _url_quote(s: Any) -> str: # pylint: disable=invalid-name if not isinstance(s, (str, bytes)): return s quoted = urllib.parse.quote(s) @@ -163,13 +165,13 @@ def _url_quote(s) -> str: # pylint: disable=invalid-name return quoted.replace("%", "%%") -def _get_opentelemetry_values() -> dict: +def _get_opentelemetry_values() -> dict[str, Any]: """ Return the OpenTelemetry Trace and Span IDs if Span ID is set in the OpenTelemetry execution context. """ # Insert the W3C TraceContext generated - _headers = {} + _headers: dict[str, Any] = {} propagator.inject(_headers) return _headers @@ -196,7 +198,7 @@ def is_http_instrumentation_enabled() -> bool: @contextmanager -def _suppress_instrumentation(*keys: str) -> Iterable[None]: +def _suppress_instrumentation(*keys: str) -> Generator[None]: """Suppress instrumentation within the context.""" ctx = context.get_current() for key in keys: @@ -209,7 +211,7 @@ def _suppress_instrumentation(*keys: str) -> Iterable[None]: @contextmanager -def suppress_instrumentation() -> Iterable[None]: +def suppress_instrumentation() -> Generator[None]: """Suppress instrumentation within the context.""" with _suppress_instrumentation( _SUPPRESS_INSTRUMENTATION_KEY, _SUPPRESS_INSTRUMENTATION_KEY_PLAIN @@ -218,7 +220,7 @@ def suppress_instrumentation() -> Iterable[None]: @contextmanager -def suppress_http_instrumentation() -> Iterable[None]: +def suppress_http_instrumentation() -> Generator[None]: """Suppress instrumentation within the context.""" with _suppress_instrumentation(_SUPPRESS_HTTP_INSTRUMENTATION_KEY): yield diff --git a/opentelemetry-instrumentation/tests/test_dependencies.py b/opentelemetry-instrumentation/tests/test_dependencies.py index bdee0f6f01..ca04833181 100644 --- a/opentelemetry-instrumentation/tests/test_dependencies.py +++ b/opentelemetry-instrumentation/tests/test_dependencies.py @@ -86,3 +86,19 @@ def requires(self): str(conflict), 'DependencyConflict: requested: "test-pkg~=1.0; extra == "instruments"" but found: "None"', ) + + def test_get_dist_dependency_conflicts_requires_none(self): + class MockDistribution(Distribution): + def locate_file(self, path): + pass + + def read_text(self, filename): + pass + + @property + def requires(self): + return None + + dist = MockDistribution() + conflict = get_dist_dependency_conflicts(dist) + self.assertTrue(conflict is None) diff --git a/opentelemetry-instrumentation/tests/test_semconv.py b/opentelemetry-instrumentation/tests/test_semconv.py new file mode 100644 index 0000000000..6a56efcc37 --- /dev/null +++ b/opentelemetry-instrumentation/tests/test_semconv.py @@ -0,0 +1,258 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +from unittest import TestCase +from unittest.mock import Mock, patch + +from opentelemetry.instrumentation._semconv import ( + OTEL_SEMCONV_STABILITY_OPT_IN, + _OpenTelemetrySemanticConventionStability, + _OpenTelemetryStabilitySignalType, + _set_status, + _StabilityMode, +) +from opentelemetry.trace.status import StatusCode + + +def stability_mode(mode): + def decorator(test_case): + @patch.dict(os.environ, {OTEL_SEMCONV_STABILITY_OPT_IN: mode}) + def wrapper(*args, **kwargs): + _OpenTelemetrySemanticConventionStability._initialized = False + _OpenTelemetrySemanticConventionStability._initialize() + return test_case(*args, **kwargs) + + return wrapper + + return decorator + + +class TestOpenTelemetrySemConvStability(TestCase): + @stability_mode("") + def test_default_mode(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.HTTP + ), + _StabilityMode.DEFAULT, + ) + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.DATABASE + ), + _StabilityMode.DEFAULT, + ) + + @stability_mode("http") + def test_http_stable_mode(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.HTTP + ), + _StabilityMode.HTTP, + ) + + @stability_mode("http/dup") + def test_http_dup_mode(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.HTTP + ), + _StabilityMode.HTTP_DUP, + ) + + @stability_mode("database") + def test_database_stable_mode(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.DATABASE + ), + _StabilityMode.DATABASE, + ) + + @stability_mode("database/dup") + def test_database_dup_mode(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.DATABASE + ), + _StabilityMode.DATABASE_DUP, + ) + + @stability_mode("database,http") + def test_multiple_stability_database_http_modes(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.DATABASE + ), + _StabilityMode.DATABASE, + ) + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.HTTP + ), + _StabilityMode.HTTP, + ) + + @stability_mode("database,http/dup") + def test_multiple_stability_database_http_dup_modes(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.DATABASE + ), + _StabilityMode.DATABASE, + ) + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.HTTP + ), + _StabilityMode.HTTP_DUP, + ) + + @stability_mode("database/dup,http") + def test_multiple_stability_database_dup_http_stable_modes(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.DATABASE + ), + _StabilityMode.DATABASE_DUP, + ) + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.HTTP + ), + _StabilityMode.HTTP, + ) + + @stability_mode("database,database/dup,http,http/dup") + def test_stability_mode_dup_precedence(self): + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.DATABASE + ), + _StabilityMode.DATABASE_DUP, + ) + self.assertEqual( + _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode( + _OpenTelemetryStabilitySignalType.HTTP + ), + _StabilityMode.HTTP_DUP, + ) + + +class TestOpenTelemetrySemConvStabilityHTTP(TestCase): + def test_set_status_for_non_http_code_with_recording_span(self): + span = Mock() + span.is_recording.return_value = True + metric_attributes = {} + _set_status( + span, + metric_attributes, + -1, + "Exception", + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, + ) + + self.assertIsNone(metric_attributes.get("error.type")) + span.set_attribute.assert_not_called() + status_call = span.set_status.call_args[0][0] + self.assertEqual(status_call.status_code, StatusCode.ERROR) + self.assertEqual( + status_call.description, "Non-integer HTTP status: " + "Exception" + ) + + def test_status_code_http_default(self): + span = Mock() + metrics_attributes = {} + _set_status( + span=span, + metrics_attributes=metrics_attributes, + status_code=404, + status_code_str="404", + server_span=True, + sem_conv_opt_in_mode=_StabilityMode.DEFAULT, + ) + # Verify only old conventions are emitted + span.set_attribute.assert_called_with("http.status_code", 404) + self.assertIn("http.status_code", metrics_attributes) + self.assertNotIn("http.response_status_code", metrics_attributes) + + def test_status_code_http_stable(self): + span = Mock() + metrics_attributes = {} + _set_status( + span=span, + metrics_attributes=metrics_attributes, + status_code=200, + status_code_str="200", + server_span=True, + sem_conv_opt_in_mode=_StabilityMode.HTTP, + ) + # Verify only new conventions are emitted + span.set_attribute.assert_called_with("http.response.status_code", 200) + self.assertIn("http.response.status_code", metrics_attributes) + self.assertNotIn("http.status_code", metrics_attributes) + + def test_status_code_http_dup(self): + span = Mock() + metrics_attributes = {} + _set_status( + span=span, + metrics_attributes=metrics_attributes, + status_code=500, + status_code_str="500", + server_span=True, + sem_conv_opt_in_mode=_StabilityMode.HTTP_DUP, + ) + # Verify both old and new conventions are emitted + span.set_attribute.assert_any_call("http.status_code", 500) + span.set_attribute.assert_any_call("http.response.status_code", 500) + self.assertIn("http.status_code", metrics_attributes) + self.assertIn("http.response.status_code", metrics_attributes) + + def test_error_status_code_new_mode(self): + span = Mock() + metrics_attributes = {} + _set_status( + span=span, + metrics_attributes=metrics_attributes, + status_code=500, + status_code_str="500", + server_span=True, + sem_conv_opt_in_mode=_StabilityMode.HTTP, + ) + # Verify error type is set for new conventions + span.set_attribute.assert_any_call("error.type", "500") + self.assertIn("error.type", metrics_attributes) + self.assertEqual(metrics_attributes["error.type"], "500") + + def test_non_recording_span(self): + span = Mock() + span.is_recording.return_value = False + metrics_attributes = {} + _set_status( + span=span, + metrics_attributes=metrics_attributes, + status_code=200, + status_code_str="200", + server_span=True, + sem_conv_opt_in_mode=_StabilityMode.HTTP_DUP, + ) + # Verify no span attributes are set if not recording + span.set_attribute.assert_not_called() + span.set_status.assert_not_called() + # Verify status code set for metrics independent of tracing decision + self.assertIn("http.status_code", metrics_attributes) + self.assertIn("http.response.status_code", metrics_attributes) diff --git a/processor/opentelemetry-processor-baggage/README.rst b/processor/opentelemetry-processor-baggage/README.rst index 6d3a439d8a..9c49a6ff75 100644 --- a/processor/opentelemetry-processor-baggage/README.rst +++ b/processor/opentelemetry-processor-baggage/README.rst @@ -33,7 +33,8 @@ Do not put sensitive information in Baggage. To repeat: a consequence of adding data to Baggage is that the keys and values will appear in all outgoing HTTP headers from the application. -## Usage +Usage +----- Add the span processor when configuring the tracer provider. diff --git a/processor/opentelemetry-processor-baggage/pyproject.toml b/processor/opentelemetry-processor-baggage/pyproject.toml index 29fc2e8681..f08cc6ccc9 100644 --- a/processor/opentelemetry-processor-baggage/pyproject.toml +++ b/processor/opentelemetry-processor-baggage/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.5", @@ -32,6 +33,7 @@ dependencies = [ [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/processor/opentelemetry-processor-baggage" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/processor/baggage/version.py" diff --git a/propagator/opentelemetry-propagator-aws-xray/pyproject.toml b/propagator/opentelemetry-propagator-aws-xray/pyproject.toml index 14f16409b3..98fc28f06e 100644 --- a/propagator/opentelemetry-propagator-aws-xray/pyproject.toml +++ b/propagator/opentelemetry-propagator-aws-xray/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.16", @@ -34,6 +35,7 @@ xray-lambda = "opentelemetry.propagators.aws:AwsXRayLambdaPropagator" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/propagator/opentelemetry-propagator-aws-xray" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/propagators/aws/version.py" diff --git a/propagator/opentelemetry-propagator-ot-trace/pyproject.toml b/propagator/opentelemetry-propagator-ot-trace/pyproject.toml index 93c7ad6784..45965e7b95 100644 --- a/propagator/opentelemetry-propagator-ot-trace/pyproject.toml +++ b/propagator/opentelemetry-propagator-ot-trace/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-api ~= 1.12", @@ -34,6 +35,7 @@ ottrace = "opentelemetry.propagators.ot_trace:OTTracePropagator" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/propagator/opentelemetry-propagator-ot-trace" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/propagators/ot_trace/version.py" diff --git a/resource/opentelemetry-resource-detector-azure/pyproject.toml b/resource/opentelemetry-resource-detector-azure/pyproject.toml index 9427a1bee4..7216d2b73d 100644 --- a/resource/opentelemetry-resource-detector-azure/pyproject.toml +++ b/resource/opentelemetry-resource-detector-azure/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-sdk ~= 1.21", @@ -36,6 +37,7 @@ azure_vm = "opentelemetry.resource.detector.azure.vm:AzureVMResourceDetector" [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/resource/opentelemetry-resource-detector-azure" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/resource/detector/azure/version.py" diff --git a/resource/opentelemetry-resource-detector-container/pyproject.toml b/resource/opentelemetry-resource-detector-container/pyproject.toml index 3993ecd06c..f70d35e56e 100644 --- a/resource/opentelemetry-resource-detector-container/pyproject.toml +++ b/resource/opentelemetry-resource-detector-container/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-sdk ~= 1.12", @@ -33,6 +34,7 @@ container = "opentelemetry.resource.detector.container:ContainerResourceDetector [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/resource/opentelemetry-resource-detector-container" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/resource/detector/container/version.py" diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/CHANGELOG.md b/sdk-extension/opentelemetry-sdk-extension-aws/CHANGELOG.md index 2d01260554..a66805003c 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/CHANGELOG.md +++ b/sdk-extension/opentelemetry-sdk-extension-aws/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## Version 2.1.0 (2024-12-24) + +- Make ec2 resource detector silent when loaded outside AWS + ([#3120](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3120)) +- Make ecs and beanstalk resource detector silent when loaded outside AWS + ([#3076](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3076)) +- Make EKS resource detector don't warn when not running in EKS + ([#3074](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3074)) + ## Version 2.0.2 (2024-08-05) See [common CHANGELOG](../../CHANGELOG.md) for the changes in this and prior versions. diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/pyproject.toml b/sdk-extension/opentelemetry-sdk-extension-aws/pyproject.toml index 767bebdd10..edf4522853 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/pyproject.toml +++ b/sdk-extension/opentelemetry-sdk-extension-aws/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dependencies = [ "opentelemetry-sdk ~= 1.12", @@ -40,6 +41,7 @@ aws_lambda = "opentelemetry.sdk.extension.aws.resource._lambda:AwsLambdaResource [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/sdk-extension/opentelemetry-sdk-extension-aws" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/sdk/extension/aws/version.py" diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/beanstalk.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/beanstalk.py index 7d6fcd96ce..12e28bf35b 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/beanstalk.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/beanstalk.py @@ -41,6 +41,9 @@ def detect(self) -> "Resource": else: conf_file_path = "/var/elasticbeanstalk/xray/environment.conf" + if not os.path.exists(conf_file_path): + return Resource.get_empty() + try: with open(conf_file_path, encoding="utf-8") as conf_file: parsed_data = json.load(conf_file) diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ec2.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ec2.py index b0cfeeb312..cc497264f5 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ec2.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ec2.py @@ -14,6 +14,7 @@ import json import logging +from urllib.error import URLError from urllib.request import Request, urlopen from opentelemetry.sdk.resources import Resource, ResourceDetector @@ -27,39 +28,47 @@ _AWS_METADATA_TOKEN_HEADER = "X-aws-ec2-metadata-token" _GET_METHOD = "GET" +_AWS_METADATA_HOST = "169.254.169.254" -def _aws_http_request(method, path, headers): +def _aws_http_request(method, path, headers, timeout=None): + if timeout is None: + timeout = 5 with urlopen( Request( - "http://169.254.169.254" + path, headers=headers, method=method + "http://" + _AWS_METADATA_HOST + path, + headers=headers, + method=method, ), - timeout=5, + timeout=timeout, ) as response: return response.read().decode("utf-8") -def _get_token(): +def _get_token(timeout=None): return _aws_http_request( "PUT", "/latest/api/token", {"X-aws-ec2-metadata-token-ttl-seconds": "60"}, + timeout, ) -def _get_identity(token): +def _get_identity(token, timeout=None): return _aws_http_request( _GET_METHOD, "/latest/dynamic/instance-identity/document", {_AWS_METADATA_TOKEN_HEADER: token}, + timeout, ) -def _get_host(token): +def _get_host(token, timeout=None): return _aws_http_request( _GET_METHOD, "/latest/meta-data/hostname", {_AWS_METADATA_TOKEN_HEADER: token}, + timeout, ) @@ -72,7 +81,17 @@ class AwsEc2ResourceDetector(ResourceDetector): def detect(self) -> "Resource": try: - token = _get_token() + # If can't get a token quick assume we are not on ec2 + try: + token = _get_token(timeout=1) + except URLError as exception: + logger.debug( + "%s failed to get token: %s", + self.__class__.__name__, + exception, + ) + return Resource.get_empty() + identity_dict = json.loads(_get_identity(token)) hostname = _get_host(token) diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ecs.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ecs.py index b780633b69..07d4553350 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ecs.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ecs.py @@ -41,9 +41,7 @@ def detect(self) -> "Resource": if not os.environ.get( "ECS_CONTAINER_METADATA_URI" ) and not os.environ.get("ECS_CONTAINER_METADATA_URI_V4"): - raise RuntimeError( - "Missing ECS_CONTAINER_METADATA_URI therefore process is not on ECS." - ) + return Resource.get_empty() container_id = "" try: diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/eks.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/eks.py index c712e9875f..07f78b2d29 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/eks.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/eks.py @@ -14,6 +14,7 @@ import json import logging +import os import ssl from urllib.request import Request, urlopen @@ -29,6 +30,9 @@ _CONTAINER_ID_LENGTH = 64 _GET_METHOD = "GET" +_TOKEN_PATH = "/var/run/secrets/kubernetes.io/serviceaccount/token" +_CERT_PATH = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" + def _aws_http_request(method, path, cred_value): with urlopen( @@ -39,7 +43,7 @@ def _aws_http_request(method, path, cred_value): ), timeout=5, context=ssl.create_default_context( - cafile="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" + cafile=_CERT_PATH, ), ) as response: return response.read().decode("utf-8") @@ -47,10 +51,7 @@ def _aws_http_request(method, path, cred_value): def _get_k8s_cred_value(): try: - with open( - "/var/run/secrets/kubernetes.io/serviceaccount/token", - encoding="utf8", - ) as token_file: + with open(_TOKEN_PATH, encoding="utf8") as token_file: return "Bearer " + token_file.read() # pylint: disable=broad-except except Exception as exception: @@ -97,6 +98,10 @@ def _get_container_id(): return container_id +def _is_k8s() -> bool: + return os.path.exists(_TOKEN_PATH) and os.path.exists(_CERT_PATH) + + class AwsEksResourceDetector(ResourceDetector): """Detects attribute values only available when the app is running on AWS Elastic Kubernetes Service (EKS) and returns them in a Resource. @@ -106,6 +111,10 @@ class AwsEksResourceDetector(ResourceDetector): def detect(self) -> "Resource": try: + # if we are not running on eks exit early without warnings + if not _is_k8s(): + return Resource.get_empty() + cred_value = _get_k8s_cred_value() if not _is_eks(cred_value): diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/version.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/version.py index b065755302..9d12794ffb 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/version.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.1.0.dev" +__version__ = "2.2.0.dev" diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_beanstalk.py b/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_beanstalk.py index 29db8e459c..d41c0d9adb 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_beanstalk.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_beanstalk.py @@ -41,9 +41,19 @@ class AwsBeanstalkResourceDetectorTest(unittest.TestCase): new_callable=mock_open, read_data=f'{{"deployment_id":"{MockBeanstalkResourceAttributes[ResourceAttributes.SERVICE_INSTANCE_ID]}","environment_name":"{MockBeanstalkResourceAttributes[ResourceAttributes.SERVICE_NAMESPACE]}","version_label":"{MockBeanstalkResourceAttributes[ResourceAttributes.SERVICE_VERSION]}"}}', ) - def test_simple_create(self, mock_open_function): + @patch("os.path.exists", return_value=True) + def test_simple_create(self, mock_path_exists, mock_open_function): actual = AwsBeanstalkResourceDetector().detect() self.assertDictEqual( actual.attributes.copy(), OrderedDict(MockBeanstalkResourceAttributes), ) + + @patch("os.name", "posix") + @patch("os.path.exists", return_value=False) + def test_not_on_beanstalk(self, mock_path_exists): + actual = AwsBeanstalkResourceDetector().detect() + self.assertDictEqual(actual.attributes.copy(), {}) + mock_path_exists.assert_called_once_with( + "/var/elasticbeanstalk/xray/environment.conf" + ) diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ec2.py b/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ec2.py index 300f963ac5..88815ed55b 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ec2.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ec2.py @@ -15,6 +15,7 @@ import unittest from collections import OrderedDict from unittest.mock import patch +from urllib.error import URLError from opentelemetry.sdk.extension.aws.resource.ec2 import ( # pylint: disable=no-name-in-module AwsEc2ResourceDetector, @@ -73,3 +74,22 @@ def test_simple_create( self.assertDictEqual( actual.attributes.copy(), OrderedDict(MockEc2ResourceAttributes) ) + + @patch( + "opentelemetry.sdk.extension.aws.resource.ec2._get_token", + side_effect=URLError("Something went wrong"), + ) + def test_empty_resource_if_token_returns_an_url_error( + self, mock_get_token + ): + with self.assertLogs( + "opentelemetry.sdk.extension.aws.resource.ec2", level="DEBUG" + ) as logger: + actual = AwsEc2ResourceDetector().detect() + self.assertEqual( + logger.output, + [ + "DEBUG:opentelemetry.sdk.extension.aws.resource.ec2:AwsEc2ResourceDetector failed to get token: " + ], + ) + self.assertDictEqual(actual.attributes.copy(), OrderedDict()) diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ecs.py b/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ecs.py index 4f892cc1bb..b116ae8229 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ecs.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ecs.py @@ -79,6 +79,11 @@ def _http_get_function_fargate(url: str, *args, **kwargs) -> str: class AwsEcsResourceDetectorTest(unittest.TestCase): + @patch.dict("os.environ", {}, clear=True) + def test_not_on_ecs(self): + actual = AwsEcsResourceDetector().detect() + self.assertDictEqual(actual.attributes.copy(), {}) + @patch.dict( "os.environ", {"ECS_CONTAINER_METADATA_URI": "mock-uri"}, diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_eks.py b/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_eks.py index a3819e6383..a2adcb3969 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_eks.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_eks.py @@ -42,6 +42,10 @@ class AwsEksResourceDetectorTest(unittest.TestCase): "opentelemetry.sdk.extension.aws.resource.eks._is_eks", return_value=True, ) + @patch( + "opentelemetry.sdk.extension.aws.resource.eks._is_k8s", + return_value=True, + ) @patch( "opentelemetry.sdk.extension.aws.resource.eks._get_cluster_info", return_value=f"""{{ @@ -88,6 +92,7 @@ def test_simple_create( self, mock_open_function, mock_get_cluster_info, + mock_is_k8s, mock_is_eks, mock_get_k8_cred_value, ): @@ -104,8 +109,32 @@ def test_simple_create( "opentelemetry.sdk.extension.aws.resource.eks._is_eks", return_value=False, ) + @patch( + "opentelemetry.sdk.extension.aws.resource.eks._is_k8s", + return_value=True, + ) def test_if_no_eks_env_var_and_should_raise( - self, mock_is_eks, mock_get_k8_cred_value + self, mock_is_k8s, mock_is_eks, mock_get_k8_cred_value ): with self.assertRaises(RuntimeError): AwsEksResourceDetector(raise_on_error=True).detect() + + @patch( + "opentelemetry.sdk.extension.aws.resource.eks._get_k8s_cred_value", + return_value="MOCK_TOKEN", + ) + @patch( + "opentelemetry.sdk.extension.aws.resource.eks._is_eks", + return_value=False, + ) + @patch( + "opentelemetry.sdk.extension.aws.resource.eks._is_k8s", + return_value=False, + ) + def test_if_no_eks_paths_should_not_raise( + self, mock_is_k8s, mock_is_eks, mock_get_k8_cred_value + ): + try: + AwsEksResourceDetector(raise_on_error=True).detect() + except RuntimeError: + self.fail("Should not raise") diff --git a/tests/opentelemetry-docker-tests/tests/test-requirements.txt b/tests/opentelemetry-docker-tests/tests/test-requirements.txt new file mode 100644 index 0000000000..374aef7fff --- /dev/null +++ b/tests/opentelemetry-docker-tests/tests/test-requirements.txt @@ -0,0 +1,75 @@ +aiopg==1.4.0 +amqp==5.2.0 +asgiref==3.8.1 +async-timeout==4.0.3 +asyncpg==0.29.0 +attrs==23.2.0 +bcrypt==4.1.2 +billiard==4.2.0 +celery==5.3.6 +certifi==2024.2.2 +cffi==1.16.0 +chardet==3.0.4 +click==8.1.7 +click-didyoumean==0.3.0 +click-plugins==1.1.1 +click-repl==0.3.0 +cryptography==42.0.5 +Deprecated==1.2.14 +distro==1.9.0 +dnspython==2.6.1 +docker==5.0.3 +docker-compose==1.29.2 +dockerpty==0.4.1 +docopt==0.6.2 +exceptiongroup==1.2.0 +flaky==3.7.0 +greenlet==3.0.3 +grpcio==1.62.1 +idna==2.10 +iniconfig==2.0.0 +jsonschema==3.2.0 +kombu==5.3.5 +mysql-connector-python==8.3.0 +mysqlclient==2.1.1 +opencensus-proto==0.1.0 +packaging==24.0 +paramiko==3.4.0 +pluggy==1.4.0 +prometheus_client==0.20.0 +prompt-toolkit==3.0.43 +protobuf==3.20.3 +# prerequisite: install libpq-dev (debian) or postgresql-devel (rhel), postgresql (mac) +# see https://www.psycopg.org/docs/install.html#build-prerequisites +# you might have to install additional packages depending on your OS +psycopg==3.1.18 +psycopg2==2.9.9 +psycopg2-binary==2.9.9 +pycparser==2.21 +pymongo==4.6.3 +PyMySQL==0.10.1 +PyNaCl==1.5.0 +# prerequisite: install unixodbc +pyodbc==5.0.1 +pyrsistent==0.20.0 +pytest==8.0.2 +pytest-celery==0.0.0 +python-dateutil==2.9.0.post0 +python-dotenv==0.21.1 +pytz==2024.1 +PyYAML==5.3.1 +redis==5.0.1 +remoulade==3.2.0 +requests==2.25.0 +six==1.16.0 +SQLAlchemy==1.4.52 +texttable==1.7.0 +tomli==2.0.1 +typing_extensions==4.12.2 +tzdata==2024.1 +urllib3==1.26.19 +vine==5.1.0 +wcwidth==0.2.13 +websocket-client==0.59.0 +wrapt==1.16.0 +zipp==3.18.0 diff --git a/tox.ini b/tox.ini index 5fa58e5139..2f1c0a577e 100644 --- a/tox.ini +++ b/tox.ini @@ -7,64 +7,70 @@ envlist = ; for specifying supported Python versions per package. ; instrumentation-openai - py3{8,9,10,11,12}-test-instrumentation-openai-v2-{0,1} + py3{8,9,10,11,12,13}-test-instrumentation-openai-v2-{0,1} pypy3-test-instrumentation-openai-v2-{0,1} lint-instrumentation-openai-v2 + ; instrumentation-vertexai + py3{8,9,10,11,12,13}-test-instrumentation-vertexai-{0,1} + # Disabling pypy3 as shapely does not have wheels and fails to compile + # pypy3-test-instrumentation-vertexai-{0,1} + lint-instrumentation-vertexai + ; opentelemetry-resource-detector-container - py3{8,9,10,11,12}-test-resource-detector-container + py3{8,9,10,11,12,13}-test-resource-detector-container pypy3-test-resource-detector-container lint-resource-detector-container ; opentelemetry-resource-detector-azure - py3{8,9,10,11,12}-test-resource-detector-azure-{0,1} + py3{8,9,10,11,12,13}-test-resource-detector-azure-{0,1} pypy3-test-resource-detector-azure-{0,1} lint-resource-detector-azure ; opentelemetry-sdk-extension-aws - py3{8,9,10,11,12}-test-sdk-extension-aws-{0,1} + py3{8,9,10,11,12,13}-test-sdk-extension-aws-{0,1} pypy3-test-sdk-extension-aws-{0,1} lint-sdk-extension-aws benchmark-sdk-extension-aws ; opentelemetry-distro - py3{8,9,10,11,12}-test-distro + py3{8,9,10,11,12,13}-test-distro pypy3-test-distro lint-distro ; opentelemetry-instrumentation - py3{8,9,10,11,12}-test-opentelemetry-instrumentation + py3{8,9,10,11,12,13}-test-opentelemetry-instrumentation pypy3-test-opentelemetry-instrumentation lint-opentelemetry-instrumentation ; opentelemetry-instrumentation-aiohttp-client - py3{8,9,10,11,12}-test-instrumentation-aiohttp-client + py3{8,9,10,11,12,13}-test-instrumentation-aiohttp-client pypy3-test-instrumentation-aiohttp-client lint-instrumentation-aiohttp-client ; opentelemetry-instrumentation-aiohttp-server - py3{8,9,10,11,12}-test-instrumentation-aiohttp-server + py3{8,9,10,11,12,13}-test-instrumentation-aiohttp-server pypy3-test-instrumentation-aiohttp-server lint-instrumentation-aiohttp-server ; opentelemetry-instrumentation-aiopg - py3{8,9,10,11,12}-test-instrumentation-aiopg + py3{8,9,10,11,12,13}-test-instrumentation-aiopg ; instrumentation-aiopg intentionally excluded from pypy3 lint-instrumentation-aiopg ; opentelemetry-instrumentation-aws-lambda - py3{8,9,10,11,12}-test-instrumentation-aws-lambda + py3{8,9,10,11,12,13}-test-instrumentation-aws-lambda pypy3-test-instrumentation-aws-lambda lint-instrumentation-aws-lambda ; opentelemetry-instrumentation-botocore - py3{8,9,10,11,12}-test-instrumentation-botocore + py3{8,9,10,11,12,13}-test-instrumentation-botocore ; FIXME: see https://github.com/open-telemetry/opentelemetry-python-contrib/issues/1736 ; pypy3-test-instrumentation-botocore lint-instrumentation-botocore ; opentelemetry-instrumentation-boto3sqs - py3{8,9,10,11,12}-test-instrumentation-boto3sqs + py3{8,9,10,11,12,13}-test-instrumentation-boto3sqs pypy3-test-instrumentation-boto3sqs lint-instrumentation-boto3sqs @@ -80,11 +86,12 @@ envlist = ; 3: django>=4.0b1,<5.0 py3{8,9}-test-instrumentation-django-{0,1,2} py3{10,11,12}-test-instrumentation-django-{1,3} + py313-test-instrumentation-django-3 pypy3-test-instrumentation-django-{0,1} lint-instrumentation-django ; opentelemetry-instrumentation-dbapi - py3{8,9,10,11,12}-test-instrumentation-dbapi + py3{8,9,10,11,12,13}-test-instrumentation-dbapi pypy3-test-instrumentation-dbapi lint-instrumentation-dbapi @@ -95,7 +102,7 @@ envlist = lint-instrumentation-boto ; opentelemetry-instrumentation-click - py3{8,9,10,11,12}-test-instrumentation-click + py3{8,9,10,11,12,13}-test-instrumentation-click pypy3-test-instrumentation-click lint-instrumentation-click @@ -105,24 +112,28 @@ envlist = ; 0: elasticsearch-dsl==6.4.0 elasticsearch==6.8.2 ; 1: elasticsearch-dsl==7.4.1 elasticsearch==7.17.9 ; 2: elasticsearch-dsl==8.13.1 elasticsearch==8.13.1 - py3{8,9,10,11,12}-test-instrumentation-elasticsearch-{0,1,2} + py3{8,9,10,11,12,13}-test-instrumentation-elasticsearch-{0,1,2} pypy3-test-instrumentation-elasticsearch-{0,1,2} lint-instrumentation-elasticsearch ; opentelemetry-instrumentation-falcon ; py310 does not work with falcon 1 + ; py3{8,9} will be dropped for falcon 4 ; The numbers at the end of the environment names ; below mean these dependencies are being used: ; 0: falcon ==1.4.1 ; 1: falcon >=2.0.0,<3.0.0 - ; 2: falcon >=3.0.0,<4.0.0 - py3{8,9}-test-instrumentation-falcon-{0,1,2} - py3{10,11,12}-test-instrumentation-falcon-{1,2} - pypy3-test-instrumentation-falcon-{0,1,2} + ; 2: falcon >=3.0.0,<3.1.2 + ; 3: falcon >=3.1.2,<4.0.0 + ; 4: falcon >=4.0.0,<5.0.0 + py3{8,9}-test-instrumentation-falcon-{0,1,2,3} + py3{10,11,12}-test-instrumentation-falcon-{1,2,3,4} + py313-test-instrumentation-falcon-4 + pypy3-test-instrumentation-falcon-{0,1,2,3,4} lint-instrumentation-falcon ; opentelemetry-instrumentation-fastapi - py3{8,9,10,11,12}-test-instrumentation-fastapi + py3{8,9,10,11,12,13}-test-instrumentation-fastapi pypy3-test-instrumentation-fastapi lint-instrumentation-fastapi @@ -132,13 +143,12 @@ envlist = ; 0: Flask ==2.1.3 Werkzeug <3.0.0 ; 1: Flask ==2.2.0 Werkzeug <3.0.0 ; 2: Flask >=3.0.0 Werkzeug >=3.0.0 - py3{8,9,10,11,12}-test-instrumentation-flask-{0,1} - py3{8,9,10,11,12}-test-instrumentation-flask-{2} + py3{8,9,10,11,12,13}-test-instrumentation-flask-{0,1,2} pypy3-test-instrumentation-flask-{0,1} lint-instrumentation-flask ; opentelemetry-instrumentation-urllib - py3{8,9,10,11,12}-test-instrumentation-urllib + py3{8,9,10,11,12,13}-test-instrumentation-urllib pypy3-test-instrumentation-urllib lint-instrumentation-urllib @@ -147,37 +157,37 @@ envlist = ; below mean these dependencies are being used: ; 0: urllib3 >=1.0.0,<2.0.0 ; 1: urllib3 >=2.0.0,<3.0.0 - py3{8,9,10,11,12}-test-instrumentation-urllib3-{0,1} + py3{8,9,10,11,12,13}-test-instrumentation-urllib3-{0,1} pypy3-test-instrumentation-urllib3-{0,1} lint-instrumentation-urllib3 ; opentelemetry-instrumentation-requests - py3{8,9,10,11,12}-test-instrumentation-requests + py3{8,9,10,11,12,13}-test-instrumentation-requests ;pypy3-test-instrumentation-requests lint-instrumentation-requests ; opentelemetry-instrumentation-starlette - py3{8,9,10,11,12}-test-instrumentation-starlette + py3{8,9,10,11,12,13}-test-instrumentation-starlette pypy3-test-instrumentation-starlette lint-instrumentation-starlette ; opentelemetry-instrumentation-jinja2 - py3{8,9,10,11,12}-test-instrumentation-jinja2 + py3{8,9,10,11,12,13}-test-instrumentation-jinja2 pypy3-test-instrumentation-jinja2 lint-instrumentation-jinja2 ; opentelemetry-instrumentation-logging - py3{8,9,10,11,12}-test-instrumentation-logging + py3{8,9,10,11,12,13}-test-instrumentation-logging pypy3-test-instrumentation-logging lint-instrumentation-logging ; opentelemetry-exporter-richconsole - py3{8,9,10,11,12}-test-exporter-richconsole + py3{8,9,10,11,12,13}-test-exporter-richconsole pypy3-test-exporter-richconsole lint-exporter-richconsole ; opentelemetry-exporter-prometheus-remote-write - py3{8,9,10,11,12}-test-exporter-prometheus-remote-write + py3{8,9,10,11,12,13}-test-exporter-prometheus-remote-write pypy3-test-exporter-prometheus-remote-write lint-exporter-prometheus-remote-write @@ -186,12 +196,12 @@ envlist = ; below mean these dependencies are being used: ; 0: mysql-connector-python >=8.0.0,<9.0.0 ; 1: mysql-connector-python ~=9.0.0 - py3{8,9,10,11,12}-test-instrumentation-mysql-{0,1} + py3{8,9,10,11,12,13}-test-instrumentation-mysql-{0,1} pypy3-test-instrumentation-mysql-{0,1} lint-instrumentation-mysql ; opentelemetry-instrumentation-mysqlclient - py3{8,9,10,11,12}-test-instrumentation-mysqlclient + py3{8,9,10,11,12,13}-test-instrumentation-mysqlclient pypy3-test-instrumentation-mysqlclient ; prerequisite: follow the instructions here ; https://github.com/PyMySQL/mysqlclient#install @@ -199,12 +209,12 @@ envlist = lint-instrumentation-mysqlclient ; opentelemetry-instrumentation-psycopg2 - py3{8,9,10,11,12}-test-instrumentation-psycopg2 + py3{8,9,10,11,12,13}-test-instrumentation-psycopg2 ; ext-psycopg2 intentionally excluded from pypy3 lint-instrumentation-psycopg2 ; opentelemetry-instrumentation-psycopg - py3{8,9,10,11,12}-test-instrumentation-psycopg + py3{8,9,10,11,12,13}-test-instrumentation-psycopg pypy3-test-instrumentation-psycopg lint-instrumentation-psycopg @@ -216,42 +226,43 @@ envlist = ; 2: pymemcache >3.0.0,<3.4.2 ; 3: pymemcache ==3.4.2 ; 4: pymemcache ==4.0.0 - py3{8,9,10,11,12}-test-instrumentation-pymemcache-{0,1,2,3,4} + py3{8,9,10,11,12,13}-test-instrumentation-pymemcache-{0,1,2,3,4} pypy3-test-instrumentation-pymemcache-{0,1,2,3,4} lint-instrumentation-pymemcache ; opentelemetry-instrumentation-pymongo - py3{8,9,10,11,12}-test-instrumentation-pymongo + py3{8,9,10,11,12,13}-test-instrumentation-pymongo pypy3-test-instrumentation-pymongo lint-instrumentation-pymongo ; opentelemetry-instrumentation-pymysql - py3{8,9,10,11,12}-test-instrumentation-pymysql + py3{8,9,10,11,12,13}-test-instrumentation-pymysql pypy3-test-instrumentation-pymysql lint-instrumentation-pymysql ; opentelemetry-instrumentation-pyramid + ; TODO: add py313 when supported by pyramid py3{8,9,10,11,12}-test-instrumentation-pyramid pypy3-test-instrumentation-pyramid lint-instrumentation-pyramid ; opentelemetry-instrumentation-asgi - py3{8,9,10,11,12}-test-instrumentation-asgi + py3{8,9,10,11,12,13}-test-instrumentation-asgi pypy3-test-instrumentation-asgi lint-instrumentation-asgi ; opentelemetry-instrumentation-asyncpg - py3{8,9,10,11,12}-test-instrumentation-asyncpg + py3{8,9,10,11,12,13}-test-instrumentation-asyncpg ; ext-asyncpg intentionally excluded from pypy3 lint-instrumentation-asyncpg ; opentelemetry-instrumentation-sqlite3 - py3{8,9,10,11,12}-test-instrumentation-sqlite3 + py3{8,9,10,11,12,13}-test-instrumentation-sqlite3 pypy3-test-instrumentation-sqlite3 lint-instrumentation-sqlite3 ; opentelemetry-instrumentation-wsgi - py3{8,9,10,11,12}-test-instrumentation-wsgi + py3{8,9,10,11,12,13}-test-instrumentation-wsgi pypy3-test-instrumentation-wsgi lint-instrumentation-wsgi @@ -259,8 +270,9 @@ envlist = ; The numbers at the end of the environment names ; below mean these dependencies are being used: ; 0: grpcio==1.62.0 - ; 1: grpcio==1.63.0 + ; 1: grpcio==1.66.2 py3{8,9,10,11,12}-test-instrumentation-grpc-{0,1} + py313-test-instrumentation-grpc-1 lint-instrumentation-grpc ; opentelemetry-instrumentation-sqlalchemy @@ -269,42 +281,42 @@ envlist = ; 0: sqlalchemy>=1.1,<1.2 ; 1: sqlalchemy~=1.4 aiosqlite ; 2: sqlalchemy~=2.0.0 - py3{8,9,10,11,12}-test-instrumentation-sqlalchemy-{1,2} + py3{8,9,10,11,12,13}-test-instrumentation-sqlalchemy-{1,2} pypy3-test-instrumentation-sqlalchemy-{0,1,2} lint-instrumentation-sqlalchemy ; opentelemetry-instrumentation-redis - py3{8,9,10,11,12}-test-instrumentation-redis + py3{8,9,10,11,12,13}-test-instrumentation-redis pypy3-test-instrumentation-redis lint-instrumentation-redis ; opentelemetry-instrumentation-remoulade - py3{8,9,10,11,12}-test-instrumentation-remoulade + py3{8,9,10,11,12,13}-test-instrumentation-remoulade ; instrumentation-remoulade intentionally excluded from pypy3 lint-instrumentation-remoulade ; opentelemetry-instrumentation-celery - py3{8,9,10,11,12}-test-instrumentation-celery + py3{8,9,10,11,12,13}-test-instrumentation-celery pypy3-test-instrumentation-celery lint-instrumentation-celery ; opentelemetry-instrumentation-system-metrics - py3{8,9,10,11,12}-test-instrumentation-system-metrics + py3{8,9,10,11,12,13}-test-instrumentation-system-metrics pypy3-test-instrumentation-system-metrics lint-instrumentation-system-metrics ; opentelemetry-instrumentation-threading - py3{8,9,10,11,12}-test-instrumentation-threading + py3{8,9,10,11,12,13}-test-instrumentation-threading pypy3-test-instrumentation-threading lint-instrumentation-threading ; opentelemetry-instrumentation-tornado - py3{8,9,10,11,12}-test-instrumentation-tornado + py3{8,9,10,11,12,13}-test-instrumentation-tornado pypy3-test-instrumentation-tornado lint-instrumentation-tornado ; opentelemetry-instrumentation-tortoiseorm - py3{8,9,10,11,12}-test-instrumentation-tortoiseorm + py3{8,9,10,11,12,13}-test-instrumentation-tortoiseorm pypy3-test-instrumentation-tortoiseorm lint-instrumentation-tortoiseorm @@ -314,22 +326,23 @@ envlist = ; 0: httpx>=0.18.0,<0.19.0 respx~=0.17.0 ; 1: httpx>=0.19.0 respx~=0.20.1 py3{8,9,10,11,12}-test-instrumentation-httpx-{0,1} + py313-test-instrumentation-httpx-1 pypy3-test-instrumentation-httpx-{0,1} lint-instrumentation-httpx ; opentelemetry-util-http - py3{8,9,10,11,12}-test-util-http + py3{8,9,10,11,12,13}-test-util-http pypy3-test-util-http lint-util-http ; opentelemetry-propagator-aws-xray - py3{8,9,10,11,12}-test-propagator-aws-xray-{0,1} + py3{8,9,10,11,12,13}-test-propagator-aws-xray-{0,1} pypy3-test-propagator-aws-xray-{0,1} lint-propagator-aws-xray benchmark-propagator-aws-xray ; opentelemetry-propagator-ot-trace - py3{8,9,10,11,12}-test-propagator-ot-trace + py3{8,9,10,11,12,13}-test-propagator-ot-trace pypy3-test-propagator-ot-trace lint-propagator-ot-trace @@ -338,7 +351,7 @@ envlist = ; below mean these dependencies are being used: ; 0: pika>=0.12.0,<1.0.0 ; 1: pika>=1.0.0 - py3{8,9,10,11,12}-test-instrumentation-sio-pika-{0,1} + py3{8,9,10,11,12,13}-test-instrumentation-sio-pika-{0,1} pypy3-test-instrumentation-sio-pika-{0,1} lint-instrumentation-sio-pika @@ -349,37 +362,37 @@ envlist = ; 1: aio_pika==8.3.0 ; 2: aio_pika==9.0.5 ; 3: aio_pika==9.4.1 - py3{8,9,10,11,12}-test-instrumentation-aio-pika-{0,1,2,3} + py3{8,9,10,11,12,13}-test-instrumentation-aio-pika-{0,1,2,3} pypy3-test-instrumentation-aio-pika-{0,1,2,3} lint-instrumentation-aio-pika ; opentelemetry-instrumentation-aiokafka - py3{8,9,10,11,12}-test-instrumentation-aiokafka + py3{8,9,10,11,12,13}-test-instrumentation-aiokafka pypy3-test-instrumentation-aiokafka lint-instrumentation-aiokafka ; opentelemetry-instrumentation-kafka-python py3{8,9,10,11}-test-instrumentation-kafka-python - py3{8,9,10,11,12}-test-instrumentation-kafka-pythonng + py3{8,9,10,11,12,13}-test-instrumentation-kafka-pythonng pypy3-test-instrumentation-kafka-python pypy3-test-instrumentation-kafka-pythonng lint-instrumentation-kafka-python ; opentelemetry-instrumentation-confluent-kafka - py3{8,9,10,11,12}-test-instrumentation-confluent-kafka + py3{8,9,10,11,12,13}-test-instrumentation-confluent-kafka lint-instrumentation-confluent-kafka ; opentelemetry-instrumentation-asyncio - py3{8,9,10,11,12}-test-instrumentation-asyncio + py3{8,9,10,11,12,13}-test-instrumentation-asyncio lint-instrumentation-asyncio ; opentelemetry-instrumentation-cassandra - py3{8,9,10,11,12}-test-instrumentation-cassandra + py3{8,9,10,11,12,13}-test-instrumentation-cassandra pypy3-test-instrumentation-cassandra lint-instrumentation-cassandra ; opentelemetry-processor-baggage - py3{8,9,10,11,12}-test-processor-baggage + py3{8,9,10,11,12,13}-test-processor-baggage pypy3-test-processor-baggage ; requires snappy headers to be available on the system lint-processor-baggage @@ -393,456 +406,288 @@ envlist = ruff [testenv] +test_deps = + opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api + opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions + opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk + opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils + deps = lint: -r dev-requirements.txt coverage: pytest coverage: pytest-cov - ; FIXME: add coverage testing - ; FIXME: add mypy testing -allowlist_externals = - sh + opentelemetry-instrumentation: {[testenv]test_deps} + opentelemetry-instrumentation: -r {toxinidir}/opentelemetry-instrumentation/test-requirements.txt -setenv = - ; override CORE_REPO_SHA via env variable when testing other branches/commits than main - ; i.e: CORE_REPO_SHA=dde62cebffe519c35875af6d06fae053b3be65ec tox -e - CORE_REPO_SHA={env:CORE_REPO_SHA:main} - CORE_REPO=git+https://github.com/open-telemetry/opentelemetry-python.git@{env:CORE_REPO_SHA} - -commands_pre = - opentelemetry-instrumentation: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - opentelemetry-instrumentation: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - opentelemetry-instrumentation: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - opentelemetry-instrumentation: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - opentelemetry-instrumentation: pip install -r {toxinidir}/opentelemetry-instrumentation/test-requirements.txt + distro: {[testenv]test_deps} + distro: -r {toxinidir}/opentelemetry-distro/test-requirements.txt # packages that are released individually should provide a test-requirements.txt with the lowest version of OTel API # and SDK supported to test we are honoring it - openai-0: pip install -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-openai-v2/test-requirements-0.txt + openai-0: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-openai-v2/test-requirements-0.txt # and the latest version of OTel API and SDK - openai-1: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - openai-1: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - openai-1: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - openai-1: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - openai-1: pip install -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-openai-v2/test-requirements-1.txt - lint-instrumentation-openai-v2: pip install -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-openai-v2/test-requirements-0.txt - - distro: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - distro: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - distro: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - distro: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - distro: pip install -r {toxinidir}/opentelemetry-distro/test-requirements.txt - - asgi: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - asgi: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - asgi: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - asgi: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - asgi: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-asgi/test-requirements.txt - - celery: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - celery: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - celery: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - celery: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - py3{8,9}-test-instrumentation-celery: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-celery/test-requirements-0.txt - py3{10,11,12}-test-instrumentation-celery: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt - pypy3-test-instrumentation-celery: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt - lint-instrumentation-celery: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt - - click: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - click: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - click: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - click: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - click: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-click/test-requirements.txt - - sio-pika: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - sio-pika: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - sio-pika: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - sio-pika-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pika/test-requirements-0.txt - sio-pika-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pika/test-requirements-1.txt - lint-instrumentation-sio-pika: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pika/test-requirements-1.txt - - aio-pika: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - aio-pika: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - aio-pika: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - aio-pika-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-0.txt - aio-pika-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-1.txt - aio-pika-2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-2.txt - aio-pika-3: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-3.txt - lint-instrumentation-aio-pika: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-3.txt - - aiokafka: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - aiokafka: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - aiokafka: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - aiokafka: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - aiokafka: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka/test-requirements.txt - - kafka-python: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - kafka-python: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - kafka-python: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - kafka-python: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements.txt - kafka-pythonng: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - kafka-pythonng: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - kafka-pythonng: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - kafka-pythonng: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements-ng.txt - - confluent-kafka: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - confluent-kafka: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - confluent-kafka: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - confluent-kafka: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - confluent-kafka: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt - - grpc: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - grpc: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - grpc: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - grpc: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - grpc-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-0.txt - grpc-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt - lint-instrumentation-grpc: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt - - wsgi: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - wsgi: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - wsgi: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - wsgi: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - wsgi: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-wsgi/test-requirements.txt - - asyncpg: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - asyncpg: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - asyncpg: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - asyncpg: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - asyncpg: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt - - aws-lambda: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - aws-lambda: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - aws-lambda: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - aws-lambda: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - aws-lambda: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aws-lambda/test-requirements.txt - - boto: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - boto: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - boto: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - boto: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - boto: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-boto/test-requirements.txt - - boto3sqs: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - boto3sqs: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - boto3sqs: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - boto3sqs: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - boto3sqs: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-boto3sqs/test-requirements.txt - - falcon: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - falcon: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - falcon: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - falcon: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - falcon-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-0.txt - falcon-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-1.txt - falcon-2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-2.txt - lint-instrumentation-falcon: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-2.txt - - flask: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - flask: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - flask: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - flask: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - flask-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-flask/test-requirements-0.txt - flask-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-flask/test-requirements-1.txt - flask-2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-flask/test-requirements-2.txt - lint-instrumentation-flask: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-flask/test-requirements-2.txt - - urllib: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - urllib: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - urllib: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - urllib: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - urllib: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-urllib/test-requirements.txt - - urllib3: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - urllib3: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - urllib3: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - urllib3: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - urllib3-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-0.txt - urllib3-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-1.txt - lint-instrumentation-urllib3: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-1.txt - - botocore: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - botocore: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - botocore: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - botocore: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - botocore: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-botocore/test-requirements.txt - - cassandra: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - cassandra: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - cassandra: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - cassandra: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - cassandra: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-cassandra/test-requirements.txt - - dbapi: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - dbapi: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - dbapi: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - dbapi: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - dbapi: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-dbapi/test-requirements.txt - - django: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - django: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - django: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - django: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - py3{8,9}-test-instrumentation-django-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-0.txt - py3{8,9}-test-instrumentation-django-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt - py3{8,9}-test-instrumentation-django-2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-2.txt - py3{10,11,12}-test-instrumentation-django-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt - py3{10,11,12}-test-instrumentation-django-3: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-3.txt - pypy3-test-instrumentation-django-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-0.txt - pypy3-test-instrumentation-django-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt - lint-instrumentation-django: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-3.txt - - fastapi: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - fastapi: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - fastapi: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - fastapi: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - fastapi: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-fastapi/test-requirements.txt - - mysql: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - mysql: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - mysql: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - mysql: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - mysql-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-0.txt - mysql-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-1.txt - lint-instrumentation-mysql: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-1.txt - - mysqlclient: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - mysqlclient: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - mysqlclient: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - mysqlclient: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - mysqlclient: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-mysqlclient/test-requirements.txt - - pymemcache: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - pymemcache: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - pymemcache: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - pymemcache: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - pymemcache-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-0.txt - pymemcache-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-1.txt - pymemcache-2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-2.txt - pymemcache-3: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-3.txt - pymemcache-4: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-4.txt - lint-instrumentation-pymemcache: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-4.txt - - pymongo: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - pymongo: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - pymongo: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - pymongo: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - pymongo: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymongo/test-requirements.txt - - psycopg: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - psycopg: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - psycopg: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - psycopg: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - py3{8,9}-test-instrumentation-psycopg: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-0.txt - py3{10,11,12}-test-instrumentation-psycopg: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt - pypy3-test-instrumentation-psycopg: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt - lint-instrumentation-psycopg: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt - - psycopg2: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - psycopg2: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - psycopg2: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - psycopg2: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - psycopg2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt - - pymysql: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - pymysql: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - pymysql: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - pymysql: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - pymysql: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymysql/test-requirements.txt - - pyramid: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - pyramid: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - pyramid: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - pyramid: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - pyramid: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pyramid/test-requirements.txt - - sqlite3: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - sqlite3: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - sqlite3: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - sqlite3: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - sqlite3: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlite3/test-requirements.txt - - redis: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - redis: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - redis: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - redis: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - redis: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-redis/test-requirements.txt - - remoulade: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - remoulade: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - remoulade: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - remoulade: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - remoulade: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-remoulade/test-requirements.txt - - requests: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - requests: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - requests: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - requests: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - requests: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-requests/test-requirements.txt - - starlette: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - starlette: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - starlette: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - starlette: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - starlette: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-starlette/test-requirements.txt - - system-metrics: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - system-metrics: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - system-metrics: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - system-metrics: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - system-metrics: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-system-metrics/test-requirements.txt - - threading: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - threading: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - threading: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - threading: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - threading: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-threading/test-requirements.txt - - tornado: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - tornado: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - tornado: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - tornado: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - tornado: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-tornado/test-requirements.txt - - tortoiseorm: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - tortoiseorm: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - tortoiseorm: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - tortoiseorm: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - tortoiseorm: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-tortoiseorm/test-requirements.txt - - jinja2: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - jinja2: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - jinja2: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - jinja2: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - jinja2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-jinja2/test-requirements.txt - - logging: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - logging: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - logging: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - logging: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - logging: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-logging/test-requirements.txt - - aiohttp-client: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - aiohttp-client: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - aiohttp-client: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - aiohttp-client: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - aiohttp-client: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aiohttp-client/test-requirements.txt - - aiohttp-server: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - aiohttp-server: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - aiohttp-server: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - aiohttp-server: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - aiohttp-server: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aiohttp-server/test-requirements.txt - - aiopg: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - aiopg: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - aiopg: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - aiopg: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - aiopg: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt - - richconsole: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - richconsole: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - richconsole: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - richconsole: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - richconsole: pip install -r {toxinidir}/exporter/opentelemetry-exporter-richconsole/test-requirements.txt - - prometheus: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - prometheus: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - prometheus: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - prometheus: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - prometheus: pip install -r {toxinidir}/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt - - sqlalchemy: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - sqlalchemy: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - sqlalchemy: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - sqlalchemy: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - sqlalchemy-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-0.txt - sqlalchemy-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt - sqlalchemy-2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-2.txt - lint-instrumentation-sqlalchemy: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt - - elasticsearch: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - elasticsearch: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - elasticsearch: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - elasticsearch: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - elasticsearch-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-0.txt - elasticsearch-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-1.txt - elasticsearch-2: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-2.txt - lint-instrumentation-elasticsearch: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-2.txt - - asyncio: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - asyncio: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - asyncio: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - asyncio: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - asyncio: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-asyncio/test-requirements.txt - - httpx: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - httpx: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - httpx: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - httpx: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - httpx-0: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-0.txt - httpx-1: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-1.txt - lint-instrumentation-httpx: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-1.txt + openai-1: {[testenv]test_deps} + openai-1: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-openai-v2/test-requirements-1.txt + lint-instrumentation-openai-v2: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-openai-v2/test-requirements-0.txt + + vertexai-0: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-0.txt + vertexai-1: {[testenv]test_deps} + vertexai-1: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-1.txt + lint-instrumentation-vertexai: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-vertexai/test-requirements-0.txt + + asgi: {[testenv]test_deps} + asgi: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-asgi/test-requirements.txt + + celery: {[testenv]test_deps} + py3{8,9}-test-instrumentation-celery: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-celery/test-requirements-0.txt + py3{10,11,12,13}-test-instrumentation-celery: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt + pypy3-test-instrumentation-celery: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt + lint-instrumentation-celery: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt + + click: {[testenv]test_deps} + click: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-click/test-requirements.txt + + sio-pika: {[testenv]test_deps} + sio-pika-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pika/test-requirements-0.txt + sio-pika-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pika/test-requirements-1.txt + lint-instrumentation-sio-pika: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pika/test-requirements-1.txt + + aio-pika: {[testenv]test_deps} + aio-pika-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-0.txt + aio-pika-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-1.txt + aio-pika-2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-2.txt + aio-pika-3: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-3.txt + lint-instrumentation-aio-pika: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-3.txt + + aiokafka: {[testenv]test_deps} + aiokafka: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka/test-requirements.txt + + kafka-python: {[testenv]test_deps} + kafka-python: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements.txt + + kafka-pythonng: {[testenv]test_deps} + kafka-pythonng: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements-ng.txt + + confluent-kafka: {[testenv]test_deps} + confluent-kafka: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt + + grpc: {[testenv]test_deps} + grpc-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-0.txt + grpc-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt + lint-instrumentation-grpc: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt + + wsgi: {[testenv]test_deps} + wsgi: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-wsgi/test-requirements.txt + + asyncpg: {[testenv]test_deps} + asyncpg: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt + + aws-lambda: {[testenv]test_deps} + aws-lambda: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aws-lambda/test-requirements.txt + + boto: {[testenv]test_deps} + boto: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-boto/test-requirements.txt + + boto3sqs: {[testenv]test_deps} + boto3sqs: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-boto3sqs/test-requirements.txt + + falcon: {[testenv]test_deps} + falcon-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-0.txt + falcon-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-1.txt + falcon-2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-2.txt + falcon-3: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-3.txt + falcon-4: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-4.txt + lint-instrumentation-falcon: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-4.txt + + flask: {[testenv]test_deps} + flask-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-flask/test-requirements-0.txt + flask-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-flask/test-requirements-1.txt + flask-2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-flask/test-requirements-2.txt + lint-instrumentation-flask: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-flask/test-requirements-2.txt + + urllib: {[testenv]test_deps} + urllib: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-urllib/test-requirements.txt + + urllib3: {[testenv]test_deps} + urllib3-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-0.txt + urllib3-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-1.txt + lint-instrumentation-urllib3: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-1.txt + + botocore: {[testenv]test_deps} + botocore: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-botocore/test-requirements.txt + + cassandra: {[testenv]test_deps} + cassandra: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-cassandra/test-requirements.txt + + dbapi: {[testenv]test_deps} + dbapi: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-dbapi/test-requirements.txt + + django: {[testenv]test_deps} + py3{8,9}-test-instrumentation-django-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-0.txt + py3{8,9}-test-instrumentation-django-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt + py3{8,9}-test-instrumentation-django-2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-2.txt + py3{10,11,12}-test-instrumentation-django-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt + py3{10,11,12,13}-test-instrumentation-django-3: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-3.txt + pypy3-test-instrumentation-django-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-0.txt + pypy3-test-instrumentation-django-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt + lint-instrumentation-django: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-django/test-requirements-3.txt + + fastapi: {[testenv]test_deps} + fastapi: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-fastapi/test-requirements.txt + + mysql: {[testenv]test_deps} + mysql-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-0.txt + mysql-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-1.txt + lint-instrumentation-mysql: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-1.txt + + mysqlclient: {[testenv]test_deps} + mysqlclient: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-mysqlclient/test-requirements.txt + + pymemcache: {[testenv]test_deps} + pymemcache-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-0.txt + pymemcache-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-1.txt + pymemcache-2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-2.txt + pymemcache-3: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-3.txt + pymemcache-4: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-4.txt + lint-instrumentation-pymemcache: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-4.txt + + pymongo: {[testenv]test_deps} + pymongo: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymongo/test-requirements.txt + + psycopg: {[testenv]test_deps} + py3{8,9}-test-instrumentation-psycopg: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-0.txt + py3{10,11,12,13}-test-instrumentation-psycopg: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt + pypy3-test-instrumentation-psycopg: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt + lint-instrumentation-psycopg: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt + + psycopg2: {[testenv]test_deps} + psycopg2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt + + pymysql: {[testenv]test_deps} + pymysql: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pymysql/test-requirements.txt + + pyramid: {[testenv]test_deps} + pyramid: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-pyramid/test-requirements.txt + + sqlite3: {[testenv]test_deps} + sqlite3: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlite3/test-requirements.txt + + redis: {[testenv]test_deps} + redis: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-redis/test-requirements.txt + + remoulade: {[testenv]test_deps} + remoulade: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-remoulade/test-requirements.txt + + requests: {[testenv]test_deps} + requests: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-requests/test-requirements.txt + + starlette: {[testenv]test_deps} + starlette: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-starlette/test-requirements.txt + + system-metrics: {[testenv]test_deps} + system-metrics: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-system-metrics/test-requirements.txt + + threading: {[testenv]test_deps} + threading: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-threading/test-requirements.txt + + tornado: {[testenv]test_deps} + tornado: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-tornado/test-requirements.txt + + tortoiseorm: {[testenv]test_deps} + tortoiseorm: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-tortoiseorm/test-requirements.txt + + jinja2: {[testenv]test_deps} + jinja2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-jinja2/test-requirements.txt + + logging: {[testenv]test_deps} + logging: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-logging/test-requirements.txt + + aiohttp-client: {[testenv]test_deps} + aiohttp-client: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aiohttp-client/test-requirements.txt + + aiohttp-server: {[testenv]test_deps} + aiohttp-server: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aiohttp-server/test-requirements.txt + + aiopg: {[testenv]test_deps} + aiopg: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt + + richconsole: {[testenv]test_deps} + richconsole: -r {toxinidir}/exporter/opentelemetry-exporter-richconsole/test-requirements.txt + + prometheus: {[testenv]test_deps} + prometheus: -r {toxinidir}/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt + + sqlalchemy: {[testenv]test_deps} + sqlalchemy-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-0.txt + sqlalchemy-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt + sqlalchemy-2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-2.txt + lint-instrumentation-sqlalchemy: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-2.txt + + elasticsearch: {[testenv]test_deps} + elasticsearch-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-0.txt + elasticsearch-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-1.txt + elasticsearch-2: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-2.txt + lint-instrumentation-elasticsearch: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-2.txt + + asyncio: {[testenv]test_deps} + asyncio: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-asyncio/test-requirements.txt + + httpx: {[testenv]test_deps} + httpx-0: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-0.txt + httpx-1: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-1.txt + lint-instrumentation-httpx: -r {toxinidir}/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-1.txt # packages that are released individually should provide a test-requirements.txt with the lowest version of OTel API # and SDK supported to test we are honoring it - sdk-extension-aws-0: pip install -r {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements-0.txt + sdk-extension-aws-0: -r {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements-0.txt # and the latest version of OTel API and SDK - sdk-extension-aws-1: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - sdk-extension-aws-1: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - sdk-extension-aws-1: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - sdk-extension-aws-1: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - sdk-extension-aws-1: pip install -r {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements-1.txt - lint-sdk-extension-aws: pip install -r {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements-0.txt - benchmark-sdk-extension-aws: pip install -r {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws/benchmark-requirements.txt - - resource-detector-container: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - resource-detector-container: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - resource-detector-container: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - resource-detector-container: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - resource-detector-container: pip install -r {toxinidir}/resource/opentelemetry-resource-detector-container/test-requirements.txt + sdk-extension-aws-1: {[testenv]test_deps} + sdk-extension-aws-1: -r {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements-1.txt + lint-sdk-extension-aws: -r {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements-0.txt + benchmark-sdk-extension-aws: -r {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws/benchmark-requirements.txt + + resource-detector-container: {[testenv]test_deps} + resource-detector-container: -r {toxinidir}/resource/opentelemetry-resource-detector-container/test-requirements.txt # packages that are released individually should provide a test-requirements.txt with the lowest version of OTel API # and SDK supported to test we are honoring it - resource-detector-azure-0: pip install -r {toxinidir}/resource/opentelemetry-resource-detector-azure/test-requirements-0.txt + resource-detector-azure-0: -r {toxinidir}/resource/opentelemetry-resource-detector-azure/test-requirements-0.txt # and the latest version of OTel API and SDK - resource-detector-azure-1: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - resource-detector-azure-1: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - resource-detector-azure-1: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - resource-detector-azure-1: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - resource-detector-azure-1: pip install -r {toxinidir}/resource/opentelemetry-resource-detector-azure/test-requirements-1.txt - lint-resource-detector-azure: pip install -r {toxinidir}/resource/opentelemetry-resource-detector-azure/test-requirements-0.txt - - propagator-ot-trace: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - propagator-ot-trace: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - propagator-ot-trace: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - propagator-ot-trace: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - propagator-ot-trace: pip install -r {toxinidir}/propagator/opentelemetry-propagator-ot-trace/test-requirements.txt + resource-detector-azure-1: {[testenv]test_deps} + resource-detector-azure-1: -r {toxinidir}/resource/opentelemetry-resource-detector-azure/test-requirements-1.txt + lint-resource-detector-azure: -r {toxinidir}/resource/opentelemetry-resource-detector-azure/test-requirements-0.txt + + propagator-ot-trace: {[testenv]test_deps} + propagator-ot-trace: -r {toxinidir}/propagator/opentelemetry-propagator-ot-trace/test-requirements.txt # packages that are released individually should provide a test-requirements.txt with the lowest version of OTel API # and SDK supported to test we are honoring it - propagator-aws-xray-0: pip install -r {toxinidir}/propagator/opentelemetry-propagator-aws-xray/test-requirements-0.txt + propagator-aws-xray-0: -r {toxinidir}/propagator/opentelemetry-propagator-aws-xray/test-requirements-0.txt # and the latest version of OTel API and SDK - propagator-aws-xray-1: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - propagator-aws-xray-1: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - propagator-aws-xray-1: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - propagator-aws-xray-1: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - propagator-aws-xray-1: pip install -r {toxinidir}/propagator/opentelemetry-propagator-aws-xray/test-requirements-1.txt - lint-propagator-aws-xray: pip install -r {toxinidir}/propagator/opentelemetry-propagator-aws-xray/test-requirements-0.txt - benchmark-propagator-aws-xray: pip install -r {toxinidir}/propagator/opentelemetry-propagator-aws-xray/benchmark-requirements.txt - - processor-baggage: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - processor-baggage: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - processor-baggage: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - processor-baggage: pip install -r {toxinidir}/processor/opentelemetry-processor-baggage/test-requirements.txt - - util-http: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - util-http: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - util-http: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - util-http: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils - util-http: pip install -r {toxinidir}/util/opentelemetry-util-http/test-requirements.txt - util-http: pip install {toxinidir}/util/opentelemetry-util-http + propagator-aws-xray-1: {[testenv]test_deps} + propagator-aws-xray-1: -r {toxinidir}/propagator/opentelemetry-propagator-aws-xray/test-requirements-1.txt + lint-propagator-aws-xray: -r {toxinidir}/propagator/opentelemetry-propagator-aws-xray/test-requirements-0.txt + benchmark-propagator-aws-xray: -r {toxinidir}/propagator/opentelemetry-propagator-aws-xray/benchmark-requirements.txt + processor-baggage: {[testenv]test_deps} + processor-baggage: -r {toxinidir}/processor/opentelemetry-processor-baggage/test-requirements.txt + + util-http: {[testenv]test_deps} + util-http: -r {toxinidir}/util/opentelemetry-util-http/test-requirements.txt + util-http: {toxinidir}/util/opentelemetry-util-http + ; FIXME: add coverage testing + ; FIXME: add mypy testing +allowlist_externals = + sh + +setenv = + ; override CORE_REPO_SHA via env variable when testing other branches/commits than main + ; i.e: CORE_REPO_SHA=dde62cebffe519c35875af6d06fae053b3be65ec tox -e + CORE_REPO_SHA={env:CORE_REPO_SHA:main} + CORE_REPO=git+https://github.com/open-telemetry/opentelemetry-python.git@{env:CORE_REPO_SHA} + +commands_pre = ; In order to get a health coverage report, ; we have to install packages in editable mode. coverage: python {toxinidir}/scripts/eachdist.py install --editable @@ -944,6 +789,9 @@ commands = test-instrumentation-openai-v2: pytest {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-openai-v2/tests {posargs} lint-instrumentation-openai-v2: sh -c "cd instrumentation-genai && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-openai-v2" + test-instrumentation-vertexai: pytest {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests {posargs} + lint-instrumentation-vertexai: sh -c "cd instrumentation-genai && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-vertexai" + test-instrumentation-sio-pika: pytest {toxinidir}/instrumentation/opentelemetry-instrumentation-pika/tests {posargs} lint-instrumentation-sio-pika: sh -c "cd instrumentation && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-pika" @@ -1043,13 +891,9 @@ deps = -c {toxinidir}/dev-requirements.txt -r {toxinidir}/docs-requirements.txt pytest - -commands_pre = - python -m pip install {env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api - python -m pip install {env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions - python -m pip install {env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk - python -m pip install {toxinidir}/opentelemetry-instrumentation - python -m pip install {toxinidir}/util/opentelemetry-util-http + {[testenv]test_deps} + {toxinidir}/opentelemetry-instrumentation + {toxinidir}/util/opentelemetry-util-http changedir = docs @@ -1068,81 +912,27 @@ commands = [testenv:docker-tests] basepython: python3 deps = - aiopg==1.4.0 - amqp==5.2.0 - asgiref==3.8.1 - async-timeout==4.0.3 - asyncpg==0.29.0 - attrs==23.2.0 - bcrypt==4.1.2 - billiard==4.2.0 - celery==5.3.6 - certifi==2024.2.2 - cffi==1.16.0 - chardet==3.0.4 - click==8.1.7 - click-didyoumean==0.3.0 - click-plugins==1.1.1 - click-repl==0.3.0 - cryptography==42.0.5 - Deprecated==1.2.14 - distro==1.9.0 - dnspython==2.6.1 - docker==5.0.3 - docker-compose==1.29.2 - dockerpty==0.4.1 - docopt==0.6.2 - exceptiongroup==1.2.0 - flaky==3.7.0 - greenlet==3.0.3 - grpcio==1.62.1 - idna==2.10 - iniconfig==2.0.0 - jsonschema==3.2.0 - kombu==5.3.5 - mysql-connector-python==8.3.0 - mysqlclient==2.1.1 - opencensus-proto==0.1.0 - packaging==24.0 - paramiko==3.4.0 - pluggy==1.4.0 - prometheus_client==0.20.0 - prompt-toolkit==3.0.43 - protobuf==3.20.3 - # prerequisite: install libpq-dev (debian) or postgresql-devel (rhel), postgresql (mac) - # see https://www.psycopg.org/docs/install.html#build-prerequisites - # you might have to install additional packages depending on your OS - psycopg==3.1.18 - psycopg2==2.9.9 - psycopg2-binary==2.9.9 - pycparser==2.21 - pymongo==4.6.3 - PyMySQL==0.10.1 - PyNaCl==1.5.0 - # prerequisite: install unixodbc - pyodbc==5.0.1 - pyrsistent==0.20.0 - pytest==8.0.2 - pytest-celery==0.0.0 - python-dateutil==2.9.0.post0 - python-dotenv==0.21.1 - pytz==2024.1 - PyYAML==5.3.1 - redis==5.0.1 - remoulade==3.2.0 - requests==2.25.0 - six==1.16.0 - SQLAlchemy==1.4.52 - texttable==1.7.0 - tomli==2.0.1 - typing_extensions==4.12.2 - tzdata==2024.1 - urllib3==1.26.19 - vine==5.1.0 - wcwidth==0.2.13 - websocket-client==0.59.0 - wrapt==1.16.0 - zipp==3.18.0 + {[testenv]test_deps} + -r {toxinidir}/tests/opentelemetry-docker-tests/tests/test-requirements.txt + -e {toxinidir}/opentelemetry-instrumentation + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-asyncpg + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-celery + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-pika + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-confluent-kafka + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-dbapi + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-mysqlclient + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2 + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-pymongo + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-pymysql + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-aiopg + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-redis + -e {toxinidir}/instrumentation/opentelemetry-instrumentation-remoulade + opentelemetry-exporter-opencensus@{env:CORE_REPO}\#egg=opentelemetry-exporter-opencensus&subdirectory=exporter/opentelemetry-exporter-opencensus changedir = tests/opentelemetry-docker-tests/tests @@ -1150,29 +940,6 @@ changedir = commands_pre = sh -c "sudo apt update -y && sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev unixodbc" python -c "import pyodbc; print(pyodbc.drivers())" - pip install {env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api \ - {env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions \ - {env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk \ - {env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils \ - -e {toxinidir}/opentelemetry-instrumentation \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-asyncpg \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-celery \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-pika \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-confluent-kafka \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-dbapi \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-mysqlclient \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2 \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-pymongo \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-pymysql \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-aiopg \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-redis \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-remoulade \ - {env:CORE_REPO}\#egg=opentelemetry-exporter-opencensus&subdirectory=exporter/opentelemetry-exporter-opencensus docker-compose up -d python check_availability.py @@ -1197,9 +964,9 @@ commands = {toxinidir}/scripts/generate_instrumentation_metapackage.py [testenv:generate-workflows] - -commands_pre = - pip install {toxinidir}/.github/workflows/generate_workflows_lib +recreate = True +deps = + {toxinidir}/.github/workflows/generate_workflows_lib commands = python {toxinidir}/.github/workflows/generate_workflows.py diff --git a/util/opentelemetry-util-http/pyproject.toml b/util/opentelemetry-util-http/pyproject.toml index 0e632a81b3..a386deba2e 100644 --- a/util/opentelemetry-util-http/pyproject.toml +++ b/util/opentelemetry-util-http/pyproject.toml @@ -23,10 +23,12 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/util/opentelemetry-util-http" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" [tool.hatch.version] path = "src/opentelemetry/util/http/version.py" diff --git a/util/opentelemetry-util-http/src/opentelemetry/util/http/__init__.py b/util/opentelemetry-util-http/src/opentelemetry/util/http/__init__.py index f5dacf0fff..c7dd9f7b06 100644 --- a/util/opentelemetry-util-http/src/opentelemetry/util/http/__init__.py +++ b/util/opentelemetry-util-http/src/opentelemetry/util/http/__init__.py @@ -19,7 +19,7 @@ from re import IGNORECASE as RE_IGNORECASE from re import compile as re_compile from re import search -from typing import Callable, Iterable, Optional +from typing import Callable, Iterable from urllib.parse import urlparse, urlunparse from opentelemetry.semconv.trace import SpanAttributes @@ -121,18 +121,16 @@ def sanitize_header_values( _root = r"OTEL_PYTHON_{}" -def get_traced_request_attrs(instrumentation): +def get_traced_request_attrs(instrumentation: str) -> list[str]: traced_request_attrs = environ.get( - _root.format(f"{instrumentation}_TRACED_REQUEST_ATTRS"), [] + _root.format(f"{instrumentation}_TRACED_REQUEST_ATTRS") ) - if traced_request_attrs: - traced_request_attrs = [ + return [ traced_request_attr.strip() for traced_request_attr in traced_request_attrs.split(",") ] - - return traced_request_attrs + return [] def get_excluded_urls(instrumentation: str) -> ExcludeList: @@ -193,7 +191,7 @@ def normalise_response_header_name(header: str) -> str: return f"http.response.header.{key}" -def sanitize_method(method: Optional[str]) -> Optional[str]: +def sanitize_method(method: str | None) -> str | None: if method is None: return None method = method.upper() diff --git a/util/opentelemetry-util-http/src/opentelemetry/util/http/httplib.py b/util/opentelemetry-util-http/src/opentelemetry/util/http/httplib.py index 3d6b875752..f375e2f7c8 100644 --- a/util/opentelemetry-util-http/src/opentelemetry/util/http/httplib.py +++ b/util/opentelemetry-util-http/src/opentelemetry/util/http/httplib.py @@ -17,12 +17,14 @@ not create spans on its own. """ +from __future__ import annotations + import contextlib import http.client import logging import socket # pylint:disable=unused-import # Used for typing import typing -from typing import Collection +from typing import Any, Callable, Collection, TypedDict, cast import wrapt @@ -36,20 +38,22 @@ logger = logging.getLogger(__name__) +R = typing.TypeVar("R") + class HttpClientInstrumentor(BaseInstrumentor): def instrumentation_dependencies(self) -> Collection[str]: return () # This instruments http.client from stdlib; no extra deps. - def _instrument(self, **kwargs): + def _instrument(self, **kwargs: Any): """Instruments the http.client module (not creating spans on its own)""" _instrument() - def _uninstrument(self, **kwargs): + def _uninstrument(self, **kwargs: Any): _uninstrument() -def _remove_nonrecording(spanlist: typing.List[Span]): +def _remove_nonrecording(spanlist: list[Span]) -> bool: idx = len(spanlist) - 1 while idx >= 0: if not spanlist[idx].is_recording(): @@ -67,7 +71,9 @@ def _remove_nonrecording(spanlist: typing.List[Span]): return True -def trysetip(conn: http.client.HTTPConnection, loglevel=logging.DEBUG) -> bool: +def trysetip( + conn: http.client.HTTPConnection, loglevel: int = logging.DEBUG +) -> bool: """Tries to set the net.peer.ip semantic attribute on the current span from the given HttpConnection. @@ -110,14 +116,17 @@ def trysetip(conn: http.client.HTTPConnection, loglevel=logging.DEBUG) -> bool: def _instrumented_connect( - wrapped, instance: http.client.HTTPConnection, args, kwargs -): + wrapped: Callable[..., R], + instance: http.client.HTTPConnection, + args: tuple[Any, ...], + kwargs: dict[str, Any], +) -> R: result = wrapped(*args, **kwargs) trysetip(instance, loglevel=logging.WARNING) return result -def instrument_connect(module, name="connect"): +def instrument_connect(module: type[Any], name: str = "connect"): """Instrument additional connect() methods, e.g. for derived classes.""" wrapt.wrap_function_wrapper( @@ -129,8 +138,11 @@ def instrument_connect(module, name="connect"): def _instrument(): def instrumented_send( - wrapped, instance: http.client.HTTPConnection, args, kwargs - ): + wrapped: Callable[..., R], + instance: http.client.HTTPConnection, + args: tuple[Any, ...], + kwargs: dict[str, Any], + ) -> R: done = trysetip(instance) result = wrapped(*args, **kwargs) if not done: @@ -147,8 +159,12 @@ def instrumented_send( # No need to instrument HTTPSConnection, as it calls super().connect() -def _getstate() -> typing.Optional[dict]: - return context.get_value(_STATE_KEY) +class _ConnectionState(TypedDict): + need_ip: list[Span] + + +def _getstate() -> _ConnectionState | None: + return cast(_ConnectionState, context.get_value(_STATE_KEY)) @contextlib.contextmanager @@ -163,7 +179,7 @@ def set_ip_on_next_http_connection(span: Span): finally: context.detach(token) else: - spans: typing.List[Span] = state["need_ip"] + spans = state["need_ip"] spans.append(span) try: yield diff --git a/util/opentelemetry-util-http/src/opentelemetry/util/http/py.typed b/util/opentelemetry-util-http/src/opentelemetry/util/http/py.typed new file mode 100644 index 0000000000..e69de29bb2