diff --git a/.github/component_owners.yml b/.github/component_owners.yml
index b092d5d2c3..dcc1013476 100644
--- a/.github/component_owners.yml
+++ b/.github/component_owners.yml
@@ -45,27 +45,13 @@ components:
instrumentation/opentelemetry-instrumentation-urllib:
- shalevr
- - ocelotl
instrumentation/opentelemetry-instrumentation-urllib3:
- shalevr
- - ocelotl
instrumentation/opentelemetry-instrumentation-sqlalchemy:
- shalevr
- instrumentation/opentelemetry-instrumentation-flask:
- - ocelotl
-
- instrumentation/opentelemetry-instrumentation-jinja2:
- - ocelotl
-
- instrumentation/opentelemetry-instrumentation-logging:
- - ocelotl
-
- instrumentation/opentelemetry-instrumentation-requests:
- - ocelotl
-
instrumentation/opentelemetry-instrumentation-cassandra:
- mattcontinisio
@@ -75,5 +61,8 @@ components:
instrumentation/opentelemetry-instrumentation-psycopg:
- federicobond
+ instrumentation/opentelemetry-instrumentation-aiokafka:
+ - dimastbk
+
processor/opentelemetry-processor-baggage:
- codeboten
diff --git a/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/misc.yml.j2 b/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/misc.yml.j2
index 807da0eb1a..87f726b587 100644
--- a/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/misc.yml.j2
+++ b/.github/workflows/generate_workflows_lib/src/generate_workflows_lib/misc.yml.j2
@@ -23,12 +23,12 @@ jobs:
{%- if job_data == "generate-workflows" %}
if: |
!contains(github.event.pull_request.labels.*.name, 'Skip generate-workflows')
- && github.actor != 'opentelemetrybot'
+ && github.actor != 'opentelemetrybot' && github.event_name == 'pull_request'
{%- endif %}
{%- if job_data == "public-symbols-check" %}
if: |
!contains(github.event.pull_request.labels.*.name, 'Approve Public API check')
- && github.actor != 'opentelemetrybot'
+ && github.actor != 'opentelemetrybot' && github.event_name == 'pull_request'
{%- endif %}
steps:
- name: Checkout repo @ SHA - ${% raw %}{{ github.sha }}{% endraw %}
diff --git a/.github/workflows/lint_0.yml b/.github/workflows/lint_0.yml
index b5d20541e5..2236dc422c 100644
--- a/.github/workflows/lint_0.yml
+++ b/.github/workflows/lint_0.yml
@@ -970,6 +970,24 @@ jobs:
- name: Run tests
run: tox -e lint-instrumentation-aio-pika
+ lint-instrumentation-aiokafka:
+ name: instrumentation-aiokafka
+ 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 lint-instrumentation-aiokafka
+
lint-instrumentation-kafka-python:
name: instrumentation-kafka-python
runs-on: ubuntu-latest
diff --git a/.github/workflows/misc_0.yml b/.github/workflows/misc_0.yml
index f7b9faa9f3..3c3f7bfacf 100644
--- a/.github/workflows/misc_0.yml
+++ b/.github/workflows/misc_0.yml
@@ -96,7 +96,7 @@ jobs:
runs-on: ubuntu-latest
if: |
!contains(github.event.pull_request.labels.*.name, 'Skip generate-workflows')
- && github.actor != 'opentelemetrybot'
+ && github.actor != 'opentelemetrybot' && github.event_name == 'pull_request'
steps:
- name: Checkout repo @ SHA - ${{ github.sha }}
uses: actions/checkout@v4
diff --git a/.github/workflows/test_1.yml b/.github/workflows/test_1.yml
index f7e71dd6b6..30ca4e67d2 100644
--- a/.github/workflows/test_1.yml
+++ b/.github/workflows/test_1.yml
@@ -3094,6 +3094,114 @@ jobs:
- 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
+
+ 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
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d34f8c83a..b67d738b42 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,23 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
-## Added
+### Added
+
+- `opentelemetry-instrumentation-fastapi` Add autoinstrumentation mechanism tests.
+ ([#2860](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2860))
+- `opentelemetry-instrumentation-aiokafka` Add instrumentor and auto instrumentation support for aiokafka
+ ([#2082](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2082))
+
+
+### Fixed
+
+- `opentelemetry-instrumentation-aiokafka` Wrap `AIOKafkaConsumer.getone()` instead of `AIOKafkaConsumer.__anext__`
+ ([#2874](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2874))
+
+## Version 1.27.0/0.48b0 ()
+
+### Added
- `opentelemetry-instrumentation-kafka-python` Instrument temporary fork, kafka-python-ng
inside kafka-python's instrumentation
([#2537](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2537))
+- `opentelemetry-instrumentation-asgi`, `opentelemetry-instrumentation-fastapi` Add ability to disable internal HTTP send and receive spans
+ ([#2802](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2802))
+- `opentelemetry-instrumentation-asgi` Add fallback decoding for ASGI headers
+ ([#2837](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2837))
-## Breaking changes
+### Breaking changes
- `opentelemetry-bootstrap` Remove `opentelemetry-instrumentation-aws-lambda` from the defaults instrumentations
([#2786](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2786))
-## Fixed
+### Fixed
+- `opentelemetry-instrumentation-httpx` fix handling of async hooks
+ ([#2823](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2823))
- `opentelemetry-instrumentation-system-metrics` fix `process.runtime.cpu.utilization` values to be shown in range of 0 to 1
- ([2812](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2812))
+ ([#2812](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2812))
- `opentelemetry-instrumentation-fastapi` fix `fastapi` auto-instrumentation by removing `fastapi-slim` support, `fastapi-slim` itself is discontinued from maintainers
- ([2783](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2783))
+ ([#2783](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2783))
- `opentelemetry-instrumentation-aws-lambda` Avoid exception when a handler is not present.
([#2750](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2750))
- `opentelemetry-instrumentation-django` Fix regression - `http.target` re-added back to old semconv duration metrics
@@ -42,6 +63,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#2563](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2563))
- `opentelemetry-instrumentation-sqlalchemy` Fixes engines from `sqlalchemy.engine_from_config` not being fully instrumented
([#2816](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2816))
+- `opentelemetry-instrumentation` fix `http.host` new http semantic convention mapping to depend on `kind` of span
+ ([#2814](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2814))
+- `opentelemetry-instrumentation` Fix the description of `http.server.duration` and `http.server.request.duration`
+ ([#2753](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2753))
+- `opentelemetry-instrumentation-grpc` Fix grpc supported version
+ ([#2845](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2845))
## Version 1.26.0/0.47b0 (2024-07-23)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d01d43181f..61f261f001 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -235,7 +235,7 @@ Some of the tox targets install packages from the [OpenTelemetry Python Core Rep
CORE_REPO_SHA=c49ad57bfe35cfc69bfa863d74058ca9bec55fc3 tox
```
-The continuous integration overrides that environment variable with as per the configuration [here](https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/.github/workflows/test.yml#L9).
+The continuous integration overrides that environment variable with as per the configuration [here](https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/.github/workflows/test_0.yml#L14).
## Style Guide
@@ -275,6 +275,7 @@ Below is a checklist of things to be mindful of when implementing a new instrume
- Isolate sync and async test
- For synchronous tests, the typical test case class is inherited from `opentelemetry.test.test_base.TestBase`. However, if you want to write asynchronous tests, the test case class should inherit also from `IsolatedAsyncioTestCase`. Adding asynchronous tests to a common test class can lead to tests passing without actually running, which can be misleading.
- ex.
+- All instrumentations have the same version. If you are going to develop a new instrumentation it would probably have `X.Y.dev` version and depends on `opentelemetry-instrumentation` and `opentelemetry-semantic-conventions` for the same version. That means that if you want to install your instrumentation you need to install its dependencies from this repo and the core repo also from git.
## Expectations from contributors
diff --git a/README.md b/README.md
index dcb2ebbba5..a04c4b7c7b 100644
--- a/README.md
+++ b/README.md
@@ -20,8 +20,11 @@
-
-
+
+
+
+
+
@@ -70,7 +73,7 @@ pip install opentelemetry-instrumentation-{integration}
To install the development versions of these packages instead, clone or fork
this repo and do an [editable
-install](https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs):
+install](https://pip.pypa.io/en/stable/topics/local-project-installs/#editable-installs):
```sh
pip install -e ./instrumentation/opentelemetry-instrumentation-{integration}
@@ -109,12 +112,10 @@ Meeting notes are available as a public [Google doc](https://docs.google.com/doc
Approvers ([@open-telemetry/python-approvers](https://github.com/orgs/open-telemetry/teams/python-approvers)):
-- [Aaron Abbott](https://github.com/aabmass), Google
- [EmÃdio Neto](https://github.com/emdneto), Zenvia
- [Jeremy Voss](https://github.com/jeremydvoss), Microsoft
- [Owais Lone](https://github.com/owais), Splunk
- [Pablo Collins](https://github.com/pmcollins), Splunk
-- [Riccardo Magliocchetti](https://github.com/xrmx), Elastic
- [Sanket Mehta](https://github.com/sanketmehta28), Cisco
- [Srikanth Chekuri](https://github.com/srikanthccv), signoz.io
- [Tammy Baylis](https://github.com/tammy-baylis-swi), SolarWinds
@@ -131,8 +132,10 @@ Emeritus Approvers:
Maintainers ([@open-telemetry/python-maintainers](https://github.com/orgs/open-telemetry/teams/python-maintainers)):
+- [Aaron Abbott](https://github.com/aabmass), Google
- [Diego Hurtado](https://github.com/ocelotl), Lightstep
- [Leighton Chen](https://github.com/lzchen), Microsoft
+- [Riccardo Magliocchetti](https://github.com/xrmx), Elastic
- [Shalev Roda](https://github.com/shalevr), Cisco
Emeritus Maintainers:
diff --git a/_template/version.py b/_template/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/_template/version.py
+++ b/_template/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/docs-requirements.txt b/docs-requirements.txt
index 34ce74ca7a..6342594af3 100644
--- a/docs-requirements.txt
+++ b/docs-requirements.txt
@@ -20,6 +20,7 @@ django>=2.2
# Required by instrumentation and exporter packages
aio_pika~=7.2.0
aiohttp~=3.0
+aiokafka~=0.11.0
aiopg>=0.13.0,<1.3.0
asyncpg>=0.12.0
boto~=2.0
diff --git a/docs/instrumentation/aiokafka/aiokafka.rst b/docs/instrumentation/aiokafka/aiokafka.rst
new file mode 100644
index 0000000000..4ff9c57c81
--- /dev/null
+++ b/docs/instrumentation/aiokafka/aiokafka.rst
@@ -0,0 +1,10 @@
+.. include:: ../../../instrumentation/opentelemetry-instrumentation-aiokafka/README.rst
+ :end-before: References
+
+API
+---
+
+.. automodule:: opentelemetry.instrumentation.aiokafka
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/eachdist.ini b/eachdist.ini
index 2bcbde9c7c..79c865b334 100644
--- a/eachdist.ini
+++ b/eachdist.ini
@@ -16,7 +16,7 @@ sortfirst=
ext/*
[stable]
-version=1.27.0.dev
+version=1.28.0.dev
packages=
opentelemetry-sdk
@@ -34,7 +34,7 @@ packages=
opentelemetry-api
[prerelease]
-version=0.48b0.dev
+version=0.49b0.dev
packages=
all
diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/version.py b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/version.py
+++ b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt b/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt
index f7e66ddd13..318e1e68d5 100644
--- a/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt
+++ b/exporter/opentelemetry-exporter-prometheus-remote-write/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
certifi==2024.7.4
charset-normalizer==3.3.2
# We can drop this after bumping baseline to pypy-39
@@ -16,7 +16,7 @@ pytest==7.4.4
python-snappy==0.7.1
requests==2.32.3
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
urllib3==2.2.2
wrapt==1.16.0
zipp==3.19.2
diff --git a/exporter/opentelemetry-exporter-richconsole/pyproject.toml b/exporter/opentelemetry-exporter-richconsole/pyproject.toml
index 6d38226160..eb00eb0437 100644
--- a/exporter/opentelemetry-exporter-richconsole/pyproject.toml
+++ b/exporter/opentelemetry-exporter-richconsole/pyproject.toml
@@ -27,7 +27,7 @@ classifiers = [
dependencies = [
"opentelemetry-api ~= 1.12",
"opentelemetry-sdk ~= 1.12",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"rich>=10.0.0",
]
diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/version.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/version.py
+++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/exporter/opentelemetry-exporter-richconsole/test-requirements.txt b/exporter/opentelemetry-exporter-richconsole/test-requirements.txt
index dee47c7880..a63c91d0d8 100644
--- a/exporter/opentelemetry-exporter-richconsole/test-requirements.txt
+++ b/exporter/opentelemetry-exporter-richconsole/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
flaky==3.7.0
importlib-metadata==6.11.0
@@ -12,7 +12,7 @@ Pygments==2.17.2
pytest==7.4.4
rich==13.7.1
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e exporter/opentelemetry-exporter-richconsole
diff --git a/instrumentation/README.md b/instrumentation/README.md
index 22c4241bab..b87bf6f844 100644
--- a/instrumentation/README.md
+++ b/instrumentation/README.md
@@ -4,6 +4,7 @@
| [opentelemetry-instrumentation-aio-pika](./opentelemetry-instrumentation-aio-pika) | aio_pika >= 7.2.0, < 10.0.0 | No | experimental
| [opentelemetry-instrumentation-aiohttp-client](./opentelemetry-instrumentation-aiohttp-client) | aiohttp ~= 3.0 | No | migration
| [opentelemetry-instrumentation-aiohttp-server](./opentelemetry-instrumentation-aiohttp-server) | aiohttp ~= 3.0 | No | experimental
+| [opentelemetry-instrumentation-aiokafka](./opentelemetry-instrumentation-aiokafka) | aiokafka >= 0.8, < 1.0 | No | experimental
| [opentelemetry-instrumentation-aiopg](./opentelemetry-instrumentation-aiopg) | aiopg >= 0.13.0, < 2.0.0 | No | experimental
| [opentelemetry-instrumentation-asgi](./opentelemetry-instrumentation-asgi) | asgiref ~= 3.0 | Yes | migration
| [opentelemetry-instrumentation-asyncio](./opentelemetry-instrumentation-asyncio) | asyncio | No | experimental
@@ -21,7 +22,7 @@
| [opentelemetry-instrumentation-falcon](./opentelemetry-instrumentation-falcon) | falcon >= 1.4.1, < 4.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.27 | No | experimental
+| [opentelemetry-instrumentation-grpc](./opentelemetry-instrumentation-grpc) | grpcio >= 1.42.0 | No | experimental
| [opentelemetry-instrumentation-httpx](./opentelemetry-instrumentation-httpx) | httpx >= 0.18.0 | No | migration
| [opentelemetry-instrumentation-jinja2](./opentelemetry-instrumentation-jinja2) | jinja2 >= 2.7, < 4.0 | No | experimental
| [opentelemetry-instrumentation-kafka-python](./opentelemetry-instrumentation-kafka-python) | kafka-python >= 2.0, < 3.0,kafka-python-ng >= 2.0, < 3.0 | No | experimental
diff --git a/instrumentation/opentelemetry-instrumentation-aio-pika/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aio-pika/pyproject.toml
index c8be384fe6..65dfe3c7ac 100644
--- a/instrumentation/opentelemetry-instrumentation-aio-pika/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-aio-pika/pyproject.toml
@@ -26,7 +26,7 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.5",
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-aio-pika/src/opentelemetry/instrumentation/aio_pika/version.py b/instrumentation/opentelemetry-instrumentation-aio-pika/src/opentelemetry/instrumentation/aio_pika/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-aio-pika/src/opentelemetry/instrumentation/aio_pika/version.py
+++ b/instrumentation/opentelemetry-instrumentation-aio-pika/src/opentelemetry/instrumentation/aio_pika/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-0.txt
index a08f6427db..26c7046817 100644
--- a/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-0.txt
@@ -1,6 +1,6 @@
aio-pika==7.2.0
aiormq==6.2.3
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
idna==3.7
importlib-metadata==6.11.0
@@ -12,7 +12,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
yarl==1.9.4
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-1.txt
index 99b5fdfd1f..fac907831a 100644
--- a/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-1.txt
@@ -1,6 +1,6 @@
aio-pika==8.3.0
aiormq==6.6.4
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
idna==3.7
importlib-metadata==6.11.0
@@ -12,7 +12,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
yarl==1.9.4
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-2.txt b/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-2.txt
index 7051299461..ad807173e8 100644
--- a/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-2.txt
+++ b/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-2.txt
@@ -1,6 +1,6 @@
aio-pika==9.0.5
aiormq==6.7.1
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
idna==3.7
importlib-metadata==6.11.0
@@ -12,7 +12,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
yarl==1.9.4
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-3.txt b/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-3.txt
index de5e8b310f..766cc6cf86 100644
--- a/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-3.txt
+++ b/instrumentation/opentelemetry-instrumentation-aio-pika/test-requirements-3.txt
@@ -1,6 +1,6 @@
aio-pika==9.4.1
aiormq==6.8.0
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
idna==3.7
importlib-metadata==6.11.0
@@ -12,7 +12,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
yarl==1.9.4
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-client/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aiohttp-client/pyproject.toml
index cfc53f723a..fbe663a50b 100644
--- a/instrumentation/opentelemetry-instrumentation-aiohttp-client/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-aiohttp-client/pyproject.toml
@@ -26,9 +26,9 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/version.py b/instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/version.py
index aa0c1a911f..49b83ce95e 100644
--- a/instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/version.py
+++ b/instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-client/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-aiohttp-client/test-requirements.txt
index be0311238f..f4da0edc25 100644
--- a/instrumentation/opentelemetry-instrumentation-aiohttp-client/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-aiohttp-client/test-requirements.txt
@@ -1,6 +1,6 @@
aiohttp==3.10.2
aiosignal==1.3.1
-asgiref==3.7.2
+asgiref==3.8.1
async-timeout==4.0.3
blinker==1.7.0
certifi==2024.7.4
@@ -23,7 +23,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
requests==2.32.3
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
urllib3==2.2.2
Werkzeug==3.0.3
wrapt==1.16.0
diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-server/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aiohttp-server/pyproject.toml
index 6d62bd7956..a8e912e68d 100644
--- a/instrumentation/opentelemetry-instrumentation-aiohttp-server/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-aiohttp-server/pyproject.toml
@@ -26,9 +26,9 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py b/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py
index 659ff24af6..6db7719c76 100644
--- a/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py
@@ -207,7 +207,7 @@ async def middleware(request, handler):
duration_histogram = meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="Duration of HTTP server requests.",
+ description="Measures the duration of inbound HTTP requests.",
)
active_requests_counter = meter.create_up_down_counter(
diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/version.py b/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/version.py
+++ b/instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-aiohttp-server/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-aiohttp-server/test-requirements.txt
index 9cd6a3c111..d84eccb649 100644
--- a/instrumentation/opentelemetry-instrumentation-aiohttp-server/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-aiohttp-server/test-requirements.txt
@@ -1,6 +1,6 @@
aiohttp==3.10.2
aiosignal==1.3.1
-asgiref==3.7.2
+asgiref==3.8.1
async-timeout==4.0.3
Deprecated==1.2.14
frozenlist==1.4.1
@@ -15,7 +15,7 @@ pytest==7.4.4
pytest-aiohttp==1.0.5
pytest-asyncio==0.23.5
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
yarl==1.9.4
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/LICENSE b/instrumentation/opentelemetry-instrumentation-aiokafka/LICENSE
new file mode 100644
index 0000000000..261eeb9e9f
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/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/opentelemetry-instrumentation-aiokafka/README.rst b/instrumentation/opentelemetry-instrumentation-aiokafka/README.rst
new file mode 100644
index 0000000000..33a3645fbd
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/README.rst
@@ -0,0 +1,22 @@
+OpenTelemetry aiokafka instrumentation
+=======================================
+
+|pypi|
+
+.. |pypi| image:: https://badge.fury.io/py/opentelemetry-instrumentation-aiokafka.svg
+ :target: https://pypi.org/project/opentelemetry-instrumentation-aiokafka/
+
+Installation
+------------
+
+::
+
+ pip install opentelemetry-instrumentation-aiokafka
+
+
+References
+----------
+
+* `OpenTelemetry aiokafka Instrumentation `_
+* `OpenTelemetry Project `_
+* `OpenTelemetry Python Examples `_
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aiokafka/pyproject.toml
new file mode 100644
index 0000000000..b2c72bc397
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/pyproject.toml
@@ -0,0 +1,49 @@
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[project]
+name = "opentelemetry-instrumentation-aiokafka"
+dynamic = ["version"]
+description = "OpenTelemetry aiokafka 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.27",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+]
+
+[project.optional-dependencies]
+instruments = ["aiokafka >= 0.8, < 1.0"]
+
+[project.entry-points.opentelemetry_instrumentor]
+aiokafka = "opentelemetry.instrumentation.aiokafka:AIOKafkaInstrumentor"
+
+[project.urls]
+Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-aiokafka"
+
+[tool.hatch.version]
+path = "src/opentelemetry/instrumentation/aiokafka/version.py"
+
+[tool.hatch.build.targets.sdist]
+include = ["/src", "/tests"]
+
+[tool.hatch.build.targets.wheel]
+packages = ["src/opentelemetry"]
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/__init__.py b/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/__init__.py
new file mode 100644
index 0000000000..7d994be622
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/__init__.py
@@ -0,0 +1,135 @@
+# 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.
+
+"""
+Instrument aiokafka to report instrumentation-kafka produced and consumed messages
+
+Usage
+-----
+
+..code:: python
+
+ from opentelemetry.instrumentation.aiokafka import AIOKafkaInstrumentor
+ from aiokafka import AIOKafkaProducer, AIOKafkaConsumer
+
+ # Instrument kafka
+ AIOKafkaInstrumentor().instrument()
+
+ # report a span of type producer with the default settings
+ producer = AIOKafkaProducer(bootstrap_servers=['localhost:9092'])
+ await producer.send('my-topic', b'raw_bytes')
+
+ # report a span of type consumer with the default settings
+ consumer = AIOKafkaConsumer('my-topic', group_id='my-group', bootstrap_servers=['localhost:9092'])
+ async for message in consumer:
+ # process message
+
+The _instrument() method accepts the following keyword args:
+tracer_provider (TracerProvider) - an optional tracer provider
+async_produce_hook (Callable) - a function with extra user-defined logic to be performed before sending the message
+this function signature is:
+def async_produce_hook(span: Span, args, kwargs)
+async_consume_hook (Callable) - a function with extra user-defined logic to be performed after consuming a message
+this function signature is:
+def async_consume_hook(span: Span, record: kafka.record.ABCRecord, args, kwargs)
+for example:
+
+.. code: python
+ from opentelemetry.instrumentation.kafka import AIOKafkaInstrumentor
+ from aiokafka import AIOKafkaProducer, AIOKafkaConsumer
+
+ async def async_produce_hook(span, args, kwargs):
+ if span and span.is_recording():
+ span.set_attribute("custom_user_attribute_from_async_response_hook", "some-value")
+ async def async_consume_hook(span, record, args, kwargs):
+ if span and span.is_recording():
+ span.set_attribute("custom_user_attribute_from_consume_hook", "some-value")
+
+ # instrument kafka with produce and consume hooks
+ AIOKafkaInstrumentor().instrument(async_produce_hook=async_produce_hook, async_consume_hook=async_consume_hook)
+
+ # Using kafka as normal now will automatically generate spans,
+ # including user custom attributes added from the hooks
+ producer = AIOKafkaProducer(bootstrap_servers=['localhost:9092'])
+ await producer.send('my-topic', b'raw_bytes')
+
+API
+___
+"""
+from asyncio import iscoroutinefunction
+from typing import Collection
+
+import aiokafka
+from wrapt import wrap_function_wrapper
+
+from opentelemetry import trace
+from opentelemetry.instrumentation.aiokafka.package import _instruments
+from opentelemetry.instrumentation.aiokafka.utils import (
+ _wrap_getone,
+ _wrap_send,
+)
+from opentelemetry.instrumentation.aiokafka.version import __version__
+from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
+from opentelemetry.instrumentation.utils import unwrap
+from opentelemetry.semconv.schemas import Schemas
+
+
+class AIOKafkaInstrumentor(BaseInstrumentor):
+ """An instrumentor for kafka module
+ See `BaseInstrumentor`
+ """
+
+ def instrumentation_dependencies(self) -> Collection[str]:
+ return _instruments
+
+ def _instrument(self, **kwargs):
+ """Instruments the kafka module
+
+ Args:
+ **kwargs: Optional arguments
+ ``tracer_provider``: a TracerProvider, defaults to global.
+ ``async_produce_hook``: a callable to be executed just before producing a message
+ ``async_consume_hook``: a callable to be executed just after consuming a message
+ """
+ tracer_provider = kwargs.get("tracer_provider")
+
+ async_produce_hook = kwargs.get("async_produce_hook")
+ if not iscoroutinefunction(async_produce_hook):
+ async_produce_hook = None
+
+ async_consume_hook = kwargs.get("async_consume_hook")
+ if not iscoroutinefunction(async_consume_hook):
+ async_consume_hook = None
+
+ tracer = trace.get_tracer(
+ __name__,
+ __version__,
+ tracer_provider=tracer_provider,
+ schema_url=Schemas.V1_27_0.value,
+ )
+
+ wrap_function_wrapper(
+ aiokafka.AIOKafkaProducer,
+ "send",
+ _wrap_send(tracer, async_produce_hook),
+ )
+ wrap_function_wrapper(
+ aiokafka.AIOKafkaConsumer,
+ "getone",
+ _wrap_getone(tracer, async_consume_hook),
+ )
+
+ def _uninstrument(self, **kwargs):
+ unwrap(aiokafka.AIOKafkaProducer, "send")
+ unwrap(aiokafka.AIOKafkaConsumer, "getone")
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/package.py b/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/package.py
new file mode 100644
index 0000000000..69367d3447
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/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 = ("aiokafka >= 0.8, < 1.0",)
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/utils.py b/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/utils.py
new file mode 100644
index 0000000000..cae0d97717
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/utils.py
@@ -0,0 +1,370 @@
+import json
+from logging import getLogger
+from typing import Any, Awaitable, Callable, Dict, List, Optional, Tuple, Union
+
+import aiokafka
+from aiokafka import ConsumerRecord
+
+from opentelemetry import context, propagate, trace
+from opentelemetry.context import Context
+from opentelemetry.propagators import textmap
+from opentelemetry.semconv._incubating.attributes import messaging_attributes
+from opentelemetry.semconv.attributes import server_attributes
+from opentelemetry.trace import Tracer
+from opentelemetry.trace.span import Span
+
+_LOG = getLogger(__name__)
+
+
+def _extract_bootstrap_servers(
+ client: aiokafka.AIOKafkaClient,
+) -> Union[str, List[str]]:
+ return client._bootstrap_servers
+
+
+def _extract_client_id(client: aiokafka.AIOKafkaClient) -> str:
+ return client._client_id
+
+
+def _extract_consumer_group(
+ consumer: aiokafka.AIOKafkaConsumer,
+) -> Optional[str]:
+ return consumer._group_id
+
+
+def _extract_argument(
+ key: str,
+ position: int,
+ default_value: Any,
+ args: Tuple[Any],
+ kwargs: Dict[str, Any],
+) -> Any:
+ if len(args) > position:
+ return args[position]
+ return kwargs.get(key, default_value)
+
+
+def _extract_send_topic(args: Tuple[Any], kwargs: Dict[str, Any]) -> str:
+ """extract topic from `send` method arguments in AIOKafkaProducer class"""
+ return _extract_argument("topic", 0, "unknown", args, kwargs)
+
+
+def _extract_send_value(
+ args: Tuple[Any], kwargs: Dict[str, Any]
+) -> Optional[Any]:
+ """extract value from `send` method arguments in AIOKafkaProducer class"""
+ return _extract_argument("value", 1, None, args, kwargs)
+
+
+def _extract_send_key(
+ args: Tuple[Any], kwargs: Dict[str, Any]
+) -> Optional[Any]:
+ """extract key from `send` method arguments in AIOKafkaProducer class"""
+ return _extract_argument("key", 2, None, args, kwargs)
+
+
+def _extract_send_headers(args: Tuple[Any], kwargs: Dict[str, Any]):
+ """extract headers from `send` method arguments in AIOKafkaProducer class"""
+ return _extract_argument("headers", 5, None, args, kwargs)
+
+
+async def _extract_send_partition(
+ instance: aiokafka.AIOKafkaProducer,
+ args: Tuple[Any],
+ kwargs: Dict[str, Any],
+) -> Optional[int]:
+ """extract partition `send` method arguments, using the `_partition` method in AIOKafkaProducer class"""
+ try:
+ topic = _extract_send_topic(args, kwargs)
+ key = _extract_send_key(args, kwargs)
+ value = _extract_send_value(args, kwargs)
+ partition = _extract_argument("partition", 3, None, args, kwargs)
+ key_bytes, value_bytes = instance._serialize(topic, key, value)
+ valid_types = (bytes, bytearray, memoryview, type(None))
+ if (
+ type(key_bytes) not in valid_types
+ or type(value_bytes) not in valid_types
+ ):
+ return None
+
+ await instance.client._wait_on_metadata(topic)
+
+ return instance._partition(
+ topic, partition, key, value, key_bytes, value_bytes
+ )
+ except Exception as exception: # pylint: disable=W0703
+ _LOG.debug("Unable to extract partition: %s", exception)
+ return None
+
+
+ProduceHookT = Optional[Callable[[Span, Tuple, Dict], Awaitable[None]]]
+ConsumeHookT = Optional[
+ Callable[[Span, ConsumerRecord, Tuple, Dict], Awaitable[None]]
+]
+
+HeadersT = List[Tuple[str, Optional[bytes]]]
+
+
+class AIOKafkaContextGetter(textmap.Getter[HeadersT]):
+ def get(self, carrier: HeadersT, key: str) -> Optional[List[str]]:
+ if carrier is None:
+ return None
+
+ for item_key, value in carrier:
+ if item_key == key:
+ if value is not None:
+ return [value.decode()]
+ return None
+
+ def keys(self, carrier: HeadersT) -> List[str]:
+ if carrier is None:
+ return []
+ return [key for (key, value) in carrier]
+
+
+class AIOKafkaContextSetter(textmap.Setter[HeadersT]):
+ def set(
+ self, carrier: HeadersT, key: Optional[str], value: Optional[str]
+ ) -> None:
+ if carrier is None or key is None:
+ return
+
+ if value is not None:
+ carrier.append((key, value.encode()))
+ else:
+ carrier.append((key, value))
+
+
+_aiokafka_getter = AIOKafkaContextGetter()
+_aiokafka_setter = AIOKafkaContextSetter()
+
+
+def _enrich_base_span(
+ span: Span,
+ *,
+ bootstrap_servers: Union[str, List[str]],
+ client_id: str,
+ topic: str,
+ partition: Optional[int],
+ key: Optional[Any],
+) -> None:
+ span.set_attribute(
+ messaging_attributes.MESSAGING_SYSTEM,
+ messaging_attributes.MessagingSystemValues.KAFKA.value,
+ )
+ span.set_attribute(
+ server_attributes.SERVER_ADDRESS, json.dumps(bootstrap_servers)
+ )
+ span.set_attribute(messaging_attributes.MESSAGING_CLIENT_ID, client_id)
+ span.set_attribute(messaging_attributes.MESSAGING_DESTINATION_NAME, topic)
+
+ if partition is not None:
+ span.set_attribute(
+ messaging_attributes.MESSAGING_DESTINATION_PARTITION_ID,
+ str(partition),
+ )
+
+ if key is not None:
+ span.set_attribute(
+ messaging_attributes.MESSAGING_KAFKA_MESSAGE_KEY, key
+ )
+
+
+def _enrich_send_span(
+ span: Span,
+ *,
+ bootstrap_servers: Union[str, List[str]],
+ client_id: str,
+ topic: str,
+ partition: Optional[int],
+ key: Optional[str],
+) -> None:
+ if not span.is_recording():
+ return
+
+ _enrich_base_span(
+ span,
+ bootstrap_servers=bootstrap_servers,
+ client_id=client_id,
+ topic=topic,
+ partition=partition,
+ key=key,
+ )
+
+ span.set_attribute(messaging_attributes.MESSAGING_OPERATION_NAME, "send")
+ span.set_attribute(
+ messaging_attributes.MESSAGING_OPERATION_TYPE,
+ messaging_attributes.MessagingOperationTypeValues.PUBLISH.value,
+ )
+
+
+def _enrich_anext_span(
+ span: Span,
+ *,
+ bootstrap_servers: Union[str, List[str]],
+ client_id: str,
+ consumer_group: Optional[str],
+ topic: str,
+ partition: Optional[int],
+ key: Optional[str],
+ offset: int,
+) -> None:
+ if not span.is_recording():
+ return
+
+ _enrich_base_span(
+ span,
+ bootstrap_servers=bootstrap_servers,
+ client_id=client_id,
+ topic=topic,
+ partition=partition,
+ key=key,
+ )
+
+ if consumer_group is not None:
+ span.set_attribute(
+ messaging_attributes.MESSAGING_CONSUMER_GROUP_NAME, consumer_group
+ )
+
+ span.set_attribute(
+ messaging_attributes.MESSAGING_OPERATION_NAME, "receive"
+ )
+ span.set_attribute(
+ messaging_attributes.MESSAGING_OPERATION_TYPE,
+ messaging_attributes.MessagingOperationTypeValues.RECEIVE.value,
+ )
+
+ span.set_attribute(
+ messaging_attributes.MESSAGING_KAFKA_MESSAGE_OFFSET, offset
+ )
+
+ # https://stackoverflow.com/questions/65935155/identify-and-find-specific-message-in-kafka-topic
+ # A message within Kafka is uniquely defined by its topic name, topic partition and offset.
+ if partition is not None:
+ span.set_attribute(
+ messaging_attributes.MESSAGING_MESSAGE_ID,
+ f"{topic}.{partition}.{offset}",
+ )
+
+
+def _get_span_name(operation: str, topic: str):
+ return f"{topic} {operation}"
+
+
+def _wrap_send(
+ tracer: Tracer, async_produce_hook: ProduceHookT
+) -> Callable[..., Awaitable[None]]:
+ async def _traced_send(
+ func: Callable[..., Awaitable[None]],
+ instance: aiokafka.AIOKafkaProducer,
+ args: Tuple[Any],
+ kwargs: Dict[str, Any],
+ ) -> None:
+ headers = _extract_send_headers(args, kwargs)
+ if headers is None:
+ headers = []
+ kwargs["headers"] = headers
+
+ topic = _extract_send_topic(args, kwargs)
+ bootstrap_servers = _extract_bootstrap_servers(instance.client)
+ client_id = _extract_client_id(instance.client)
+ key = _extract_send_key(args, kwargs)
+ partition = await _extract_send_partition(instance, args, kwargs)
+ span_name = _get_span_name("send", topic)
+ with tracer.start_as_current_span(
+ span_name, kind=trace.SpanKind.PRODUCER
+ ) as span:
+ _enrich_send_span(
+ span,
+ bootstrap_servers=bootstrap_servers,
+ client_id=client_id,
+ topic=topic,
+ partition=partition,
+ key=key,
+ )
+ propagate.inject(
+ headers,
+ context=trace.set_span_in_context(span),
+ setter=_aiokafka_setter,
+ )
+ try:
+ if async_produce_hook is not None:
+ await async_produce_hook(span, args, kwargs)
+ except Exception as hook_exception: # pylint: disable=W0703
+ _LOG.exception(hook_exception)
+
+ return await func(*args, **kwargs)
+
+ return _traced_send
+
+
+async def _create_consumer_span(
+ tracer: Tracer,
+ async_consume_hook: ConsumeHookT,
+ record: ConsumerRecord,
+ extracted_context: Context,
+ bootstrap_servers: Union[str, List[str]],
+ client_id: str,
+ consumer_group: Optional[str],
+ args: Tuple[Any],
+ kwargs: Dict[str, Any],
+):
+ span_name = _get_span_name("receive", record.topic)
+ with tracer.start_as_current_span(
+ span_name,
+ context=extracted_context,
+ kind=trace.SpanKind.CONSUMER,
+ ) as span:
+ new_context = trace.set_span_in_context(span, extracted_context)
+ token = context.attach(new_context)
+ _enrich_anext_span(
+ span,
+ bootstrap_servers=bootstrap_servers,
+ client_id=client_id,
+ consumer_group=consumer_group,
+ topic=record.topic,
+ partition=record.partition,
+ key=record.key,
+ offset=record.offset,
+ )
+ try:
+ if async_consume_hook is not None:
+ await async_consume_hook(span, record, args, kwargs)
+ except Exception as hook_exception: # pylint: disable=W0703
+ _LOG.exception(hook_exception)
+ context.detach(token)
+
+
+def _wrap_getone(
+ tracer: Tracer, async_consume_hook: ConsumeHookT
+) -> Callable[..., Awaitable[aiokafka.ConsumerRecord]]:
+ async def _traced_next(
+ func: Callable[..., Awaitable[aiokafka.ConsumerRecord]],
+ instance: aiokafka.AIOKafkaConsumer,
+ args: Tuple[Any],
+ kwargs: Dict[str, Any],
+ ) -> aiokafka.ConsumerRecord:
+ record = await func(*args, **kwargs)
+
+ if record:
+ bootstrap_servers = _extract_bootstrap_servers(instance._client)
+ client_id = _extract_client_id(instance._client)
+ consumer_group = _extract_consumer_group(instance)
+
+ extracted_context = propagate.extract(
+ record.headers, getter=_aiokafka_getter
+ )
+ await _create_consumer_span(
+ tracer,
+ async_consume_hook,
+ record,
+ extracted_context,
+ bootstrap_servers,
+ client_id,
+ consumer_group,
+ args,
+ kwargs,
+ )
+ return record
+
+ return _traced_next
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/version.py b/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/version.py
new file mode 100644
index 0000000000..ee5a6342e7
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/src/opentelemetry/instrumentation/aiokafka/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__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-aiokafka/test-requirements.txt
new file mode 100644
index 0000000000..460e58e091
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/test-requirements.txt
@@ -0,0 +1,4 @@
+aiokafka==0.11.0
+pytest==7.4.4
+-e opentelemetry-instrumentation
+-e instrumentation/opentelemetry-instrumentation-aiokafka
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/tests/__init__.py b/instrumentation/opentelemetry-instrumentation-aiokafka/tests/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/tests/test_instrumentation.py b/instrumentation/opentelemetry-instrumentation-aiokafka/tests/test_instrumentation.py
new file mode 100644
index 0000000000..8211566239
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/tests/test_instrumentation.py
@@ -0,0 +1,320 @@
+# 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 uuid
+from typing import Any, List, Sequence, Tuple
+from unittest import IsolatedAsyncioTestCase, TestCase, mock
+
+from aiokafka import (
+ AIOKafkaConsumer,
+ AIOKafkaProducer,
+ ConsumerRecord,
+ TopicPartition,
+)
+from wrapt import BoundFunctionWrapper
+
+from opentelemetry import baggage, context
+from opentelemetry.instrumentation.aiokafka import AIOKafkaInstrumentor
+from opentelemetry.sdk.trace import ReadableSpan
+from opentelemetry.semconv._incubating.attributes import messaging_attributes
+from opentelemetry.semconv.attributes import server_attributes
+from opentelemetry.test.test_base import TestBase
+from opentelemetry.trace import SpanKind, format_trace_id, set_span_in_context
+
+
+class TestAIOKafkaInstrumentor(TestCase):
+ def test_instrument_api(self) -> None:
+ instrumentation = AIOKafkaInstrumentor()
+
+ instrumentation.instrument()
+ self.assertTrue(
+ isinstance(AIOKafkaProducer.send, BoundFunctionWrapper)
+ )
+ self.assertTrue(
+ isinstance(AIOKafkaConsumer.getone, BoundFunctionWrapper)
+ )
+
+ instrumentation.uninstrument()
+ self.assertFalse(
+ isinstance(AIOKafkaProducer.send, BoundFunctionWrapper)
+ )
+ self.assertFalse(
+ isinstance(AIOKafkaConsumer.getone, BoundFunctionWrapper)
+ )
+
+
+class TestAIOKafkaInstrumentation(TestBase, IsolatedAsyncioTestCase):
+ @staticmethod
+ def consumer_record_factory(
+ number: int, headers: Tuple[Tuple[str, bytes], ...]
+ ) -> ConsumerRecord:
+ return ConsumerRecord(
+ f"topic_{number}",
+ number,
+ number,
+ number,
+ number,
+ f"key_{number}".encode(),
+ f"value_{number}".encode(),
+ None,
+ number,
+ number,
+ headers=headers,
+ )
+
+ @staticmethod
+ async def consumer_factory(**consumer_kwargs: Any) -> AIOKafkaConsumer:
+ consumer = AIOKafkaConsumer(**consumer_kwargs)
+
+ consumer._client.bootstrap = mock.AsyncMock()
+ consumer._client._wait_on_metadata = mock.AsyncMock()
+
+ await consumer.start()
+
+ consumer._fetcher.next_record = mock.AsyncMock()
+
+ return consumer
+
+ @staticmethod
+ async def producer_factory() -> AIOKafkaProducer:
+ producer = AIOKafkaProducer(api_version="1.0")
+
+ producer.client._wait_on_metadata = mock.AsyncMock()
+ producer.client.bootstrap = mock.AsyncMock()
+ producer._message_accumulator.add_message = mock.AsyncMock()
+ producer._sender.start = mock.AsyncMock()
+ producer._partition = mock.Mock(return_value=1)
+
+ await producer.start()
+
+ return producer
+
+ async def test_getone(self) -> None:
+ AIOKafkaInstrumentor().uninstrument()
+ AIOKafkaInstrumentor().instrument(tracer_provider=self.tracer_provider)
+
+ client_id = str(uuid.uuid4())
+ group_id = str(uuid.uuid4())
+ consumer = await self.consumer_factory(
+ client_id=client_id, group_id=group_id
+ )
+ next_record_mock: mock.AsyncMock = consumer._fetcher.next_record
+
+ expected_spans = [
+ {
+ "name": "topic_1 receive",
+ "kind": SpanKind.CONSUMER,
+ "attributes": {
+ messaging_attributes.MESSAGING_SYSTEM: messaging_attributes.MessagingSystemValues.KAFKA.value,
+ server_attributes.SERVER_ADDRESS: '"localhost"',
+ messaging_attributes.MESSAGING_CLIENT_ID: client_id,
+ messaging_attributes.MESSAGING_DESTINATION_NAME: "topic_1",
+ messaging_attributes.MESSAGING_DESTINATION_PARTITION_ID: "1",
+ messaging_attributes.MESSAGING_KAFKA_MESSAGE_KEY: "key_1",
+ messaging_attributes.MESSAGING_CONSUMER_GROUP_NAME: group_id,
+ messaging_attributes.MESSAGING_OPERATION_NAME: "receive",
+ messaging_attributes.MESSAGING_OPERATION_TYPE: messaging_attributes.MessagingOperationTypeValues.RECEIVE.value,
+ messaging_attributes.MESSAGING_KAFKA_MESSAGE_OFFSET: 1,
+ messaging_attributes.MESSAGING_MESSAGE_ID: "topic_1.1.1",
+ },
+ },
+ {
+ "name": "topic_2 receive",
+ "kind": SpanKind.CONSUMER,
+ "attributes": {
+ messaging_attributes.MESSAGING_SYSTEM: messaging_attributes.MessagingSystemValues.KAFKA.value,
+ server_attributes.SERVER_ADDRESS: '"localhost"',
+ messaging_attributes.MESSAGING_CLIENT_ID: client_id,
+ messaging_attributes.MESSAGING_DESTINATION_NAME: "topic_2",
+ messaging_attributes.MESSAGING_DESTINATION_PARTITION_ID: "2",
+ messaging_attributes.MESSAGING_KAFKA_MESSAGE_KEY: "key_2",
+ messaging_attributes.MESSAGING_CONSUMER_GROUP_NAME: group_id,
+ messaging_attributes.MESSAGING_OPERATION_NAME: "receive",
+ messaging_attributes.MESSAGING_OPERATION_TYPE: messaging_attributes.MessagingOperationTypeValues.RECEIVE.value,
+ messaging_attributes.MESSAGING_KAFKA_MESSAGE_OFFSET: 2,
+ messaging_attributes.MESSAGING_MESSAGE_ID: "topic_2.2.2",
+ },
+ },
+ ]
+ self.memory_exporter.clear()
+
+ next_record_mock.side_effect = [
+ self.consumer_record_factory(
+ 1,
+ headers=(
+ (
+ "traceparent",
+ b"00-03afa25236b8cd948fa853d67038ac79-405ff022e8247c46-01",
+ ),
+ ),
+ ),
+ self.consumer_record_factory(2, headers=()),
+ ]
+
+ await consumer.getone()
+ next_record_mock.assert_awaited_with(())
+
+ first_span = self.memory_exporter.get_finished_spans()[0]
+ self.assertEqual(
+ format_trace_id(first_span.get_span_context().trace_id),
+ "03afa25236b8cd948fa853d67038ac79",
+ )
+
+ await consumer.getone()
+ next_record_mock.assert_awaited_with(())
+
+ span_list = self.memory_exporter.get_finished_spans()
+ self._compare_spans(span_list, expected_spans)
+
+ async def test_getone_baggage(self) -> None:
+ received_baggage = None
+
+ async def async_consume_hook(span, *_) -> None:
+ nonlocal received_baggage
+ received_baggage = baggage.get_all(set_span_in_context(span))
+
+ AIOKafkaInstrumentor().uninstrument()
+ AIOKafkaInstrumentor().instrument(
+ tracer_provider=self.tracer_provider,
+ async_consume_hook=async_consume_hook,
+ )
+
+ consumer = await self.consumer_factory()
+ next_record_mock: mock.AsyncMock = consumer._fetcher.next_record
+
+ self.memory_exporter.clear()
+
+ next_record_mock.side_effect = [
+ self.consumer_record_factory(
+ 1,
+ headers=(
+ (
+ "traceparent",
+ b"00-03afa25236b8cd948fa853d67038ac79-405ff022e8247c46-01",
+ ),
+ ("baggage", b"foo=bar"),
+ ),
+ ),
+ ]
+
+ await consumer.getone()
+ next_record_mock.assert_awaited_with(())
+
+ self.assertEqual(received_baggage, {"foo": "bar"})
+
+ async def test_getone_consume_hook(self) -> None:
+ async_consume_hook_mock = mock.AsyncMock()
+
+ AIOKafkaInstrumentor().uninstrument()
+ AIOKafkaInstrumentor().instrument(
+ tracer_provider=self.tracer_provider,
+ async_consume_hook=async_consume_hook_mock,
+ )
+
+ consumer = await self.consumer_factory()
+ next_record_mock: mock.AsyncMock = consumer._fetcher.next_record
+
+ next_record_mock.side_effect = [
+ self.consumer_record_factory(1, headers=())
+ ]
+
+ await consumer.getone()
+
+ async_consume_hook_mock.assert_awaited_once()
+
+ async def test_send(self) -> None:
+ AIOKafkaInstrumentor().uninstrument()
+ AIOKafkaInstrumentor().instrument(tracer_provider=self.tracer_provider)
+
+ producer = await self.producer_factory()
+ add_message_mock: mock.AsyncMock = (
+ producer._message_accumulator.add_message
+ )
+
+ tracer = self.tracer_provider.get_tracer(__name__)
+ with tracer.start_as_current_span("test_span") as span:
+ await producer.send("topic_1", b"value_1")
+
+ add_message_mock.assert_awaited_with(
+ TopicPartition(topic="topic_1", partition=1),
+ None,
+ b"value_1",
+ 40.0,
+ timestamp_ms=None,
+ headers=[("traceparent", mock.ANY)],
+ )
+ add_message_mock.call_args_list[0].kwargs["headers"][0][1].startswith(
+ f"00-{format_trace_id(span.get_span_context().trace_id)}-".encode()
+ )
+
+ await producer.send("topic_2", b"value_2")
+ add_message_mock.assert_awaited_with(
+ TopicPartition(topic="topic_2", partition=1),
+ None,
+ b"value_2",
+ 40.0,
+ timestamp_ms=None,
+ headers=[("traceparent", mock.ANY)],
+ )
+
+ async def test_send_baggage(self) -> None:
+ AIOKafkaInstrumentor().uninstrument()
+ AIOKafkaInstrumentor().instrument(tracer_provider=self.tracer_provider)
+
+ producer = await self.producer_factory()
+ add_message_mock: mock.AsyncMock = (
+ producer._message_accumulator.add_message
+ )
+
+ tracer = self.tracer_provider.get_tracer(__name__)
+ ctx = baggage.set_baggage("foo", "bar")
+ context.attach(ctx)
+
+ with tracer.start_as_current_span("test_span", context=ctx):
+ await producer.send("topic_1", b"value_1")
+
+ add_message_mock.assert_awaited_with(
+ TopicPartition(topic="topic_1", partition=1),
+ None,
+ b"value_1",
+ 40.0,
+ timestamp_ms=None,
+ headers=[("traceparent", mock.ANY), ("baggage", b"foo=bar")],
+ )
+
+ async def test_send_produce_hook(self) -> None:
+ async_produce_hook_mock = mock.AsyncMock()
+
+ AIOKafkaInstrumentor().uninstrument()
+ AIOKafkaInstrumentor().instrument(
+ tracer_provider=self.tracer_provider,
+ async_produce_hook=async_produce_hook_mock,
+ )
+
+ producer = await self.producer_factory()
+
+ await producer.send("topic_1", b"value_1")
+
+ async_produce_hook_mock.assert_awaited_once()
+
+ def _compare_spans(
+ self, spans: Sequence[ReadableSpan], expected_spans: List[dict]
+ ) -> None:
+ self.assertEqual(len(spans), len(expected_spans))
+ for span, expected_span in zip(spans, expected_spans):
+ self.assertEqual(expected_span["name"], span.name)
+ self.assertEqual(expected_span["kind"], span.kind)
+ self.assertEqual(
+ expected_span["attributes"], dict(span.attributes)
+ )
diff --git a/instrumentation/opentelemetry-instrumentation-aiokafka/tests/test_utils.py b/instrumentation/opentelemetry-instrumentation-aiokafka/tests/test_utils.py
new file mode 100644
index 0000000000..09a8655309
--- /dev/null
+++ b/instrumentation/opentelemetry-instrumentation-aiokafka/tests/test_utils.py
@@ -0,0 +1,306 @@
+# 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.
+# pylint: disable=unnecessary-dunder-call
+
+from unittest import IsolatedAsyncioTestCase, mock
+
+from opentelemetry.instrumentation.aiokafka.utils import (
+ AIOKafkaContextGetter,
+ AIOKafkaContextSetter,
+ _aiokafka_getter,
+ _aiokafka_setter,
+ _create_consumer_span,
+ _extract_send_partition,
+ _get_span_name,
+ _wrap_getone,
+ _wrap_send,
+)
+from opentelemetry.trace import SpanKind
+
+
+class TestUtils(IsolatedAsyncioTestCase):
+ def setUp(self) -> None:
+ super().setUp()
+ self.topic_name = "test_topic"
+ self.args = [self.topic_name]
+ self.headers = []
+ self.kwargs = {"partition": 0, "headers": self.headers}
+
+ def test_context_setter(self) -> None:
+ context_setter = AIOKafkaContextSetter()
+
+ carrier_list = [("key1", b"val1")]
+ context_setter.set(carrier_list, "key2", "val2")
+ self.assertTrue(("key2", "val2".encode()) in carrier_list)
+
+ def test_context_getter(self) -> None:
+ context_setter = AIOKafkaContextSetter()
+ context_getter = AIOKafkaContextGetter()
+
+ carrier_list = []
+ context_setter.set(carrier_list, "key1", "val1")
+ self.assertEqual(context_getter.get(carrier_list, "key1"), ["val1"])
+ self.assertEqual(["key1"], context_getter.keys(carrier_list))
+
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._extract_bootstrap_servers"
+ )
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._extract_send_partition"
+ )
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._enrich_send_span"
+ )
+ @mock.patch("opentelemetry.trace.set_span_in_context")
+ @mock.patch("opentelemetry.propagate.inject")
+ async def test_wrap_send_with_topic_as_arg(
+ self,
+ inject: mock.MagicMock,
+ set_span_in_context: mock.MagicMock,
+ enrich_span: mock.MagicMock,
+ extract_send_partition: mock.MagicMock,
+ extract_bootstrap_servers: mock.MagicMock,
+ ) -> None:
+ await self.wrap_send_helper(
+ inject,
+ set_span_in_context,
+ enrich_span,
+ extract_send_partition,
+ extract_bootstrap_servers,
+ )
+
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._extract_bootstrap_servers"
+ )
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._extract_send_partition"
+ )
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._enrich_send_span"
+ )
+ @mock.patch("opentelemetry.trace.set_span_in_context")
+ @mock.patch("opentelemetry.propagate.inject")
+ async def test_wrap_send_with_topic_as_kwarg(
+ self,
+ inject: mock.MagicMock,
+ set_span_in_context: mock.MagicMock,
+ enrich_span: mock.MagicMock,
+ extract_send_partition: mock.AsyncMock,
+ extract_bootstrap_servers: mock.MagicMock,
+ ) -> None:
+ self.args = []
+ self.kwargs["topic"] = self.topic_name
+ await self.wrap_send_helper(
+ inject,
+ set_span_in_context,
+ enrich_span,
+ extract_send_partition,
+ extract_bootstrap_servers,
+ )
+
+ async def wrap_send_helper(
+ self,
+ inject: mock.MagicMock,
+ set_span_in_context: mock.MagicMock,
+ enrich_span: mock.MagicMock,
+ extract_send_partition: mock.AsyncMock,
+ extract_bootstrap_servers: mock.MagicMock,
+ ) -> None:
+ tracer = mock.MagicMock()
+ produce_hook = mock.AsyncMock()
+ original_send_callback = mock.AsyncMock()
+ kafka_producer = mock.MagicMock()
+ expected_span_name = _get_span_name("send", self.topic_name)
+
+ wrapped_send = _wrap_send(tracer, produce_hook)
+ retval = await wrapped_send(
+ original_send_callback, kafka_producer, self.args, self.kwargs
+ )
+
+ extract_bootstrap_servers.assert_called_once_with(
+ kafka_producer.client
+ )
+ extract_send_partition.assert_awaited_once_with(
+ kafka_producer, self.args, self.kwargs
+ )
+ tracer.start_as_current_span.assert_called_once_with(
+ expected_span_name, kind=SpanKind.PRODUCER
+ )
+
+ span = tracer.start_as_current_span().__enter__.return_value
+ enrich_span.assert_called_once_with(
+ span,
+ bootstrap_servers=extract_bootstrap_servers.return_value,
+ client_id=kafka_producer.client._client_id,
+ topic=self.topic_name,
+ partition=extract_send_partition.return_value,
+ key=None,
+ )
+
+ set_span_in_context.assert_called_once_with(span)
+ context = set_span_in_context.return_value
+ inject.assert_called_once_with(
+ self.headers, context=context, setter=_aiokafka_setter
+ )
+
+ produce_hook.assert_awaited_once_with(span, self.args, self.kwargs)
+
+ original_send_callback.assert_awaited_once_with(
+ *self.args, **self.kwargs
+ )
+ self.assertEqual(retval, original_send_callback.return_value)
+
+ @mock.patch("opentelemetry.propagate.extract")
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._create_consumer_span"
+ )
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._extract_bootstrap_servers"
+ )
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._extract_client_id"
+ )
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._extract_consumer_group"
+ )
+ async def test_wrap_next(
+ self,
+ extract_consumer_group: mock.MagicMock,
+ extract_client_id: mock.MagicMock,
+ extract_bootstrap_servers: mock.MagicMock,
+ _create_consumer_span: mock.MagicMock,
+ extract: mock.MagicMock,
+ ) -> None:
+ tracer = mock.MagicMock()
+ consume_hook = mock.AsyncMock()
+ original_next_callback = mock.AsyncMock()
+ kafka_consumer = mock.MagicMock()
+
+ wrapped_next = _wrap_getone(tracer, consume_hook)
+ record = await wrapped_next(
+ original_next_callback, kafka_consumer, self.args, self.kwargs
+ )
+
+ extract_bootstrap_servers.assert_called_once_with(
+ kafka_consumer._client
+ )
+ bootstrap_servers = extract_bootstrap_servers.return_value
+
+ extract_client_id.assert_called_once_with(kafka_consumer._client)
+ client_id = extract_client_id.return_value
+
+ extract_consumer_group.assert_called_once_with(kafka_consumer)
+ consumer_group = extract_consumer_group.return_value
+
+ original_next_callback.assert_awaited_once_with(
+ *self.args, **self.kwargs
+ )
+ self.assertEqual(record, original_next_callback.return_value)
+
+ extract.assert_called_once_with(
+ record.headers, getter=_aiokafka_getter
+ )
+ context = extract.return_value
+
+ _create_consumer_span.assert_called_once_with(
+ tracer,
+ consume_hook,
+ record,
+ context,
+ bootstrap_servers,
+ client_id,
+ consumer_group,
+ self.args,
+ self.kwargs,
+ )
+
+ @mock.patch("opentelemetry.trace.set_span_in_context")
+ @mock.patch("opentelemetry.context.attach")
+ @mock.patch(
+ "opentelemetry.instrumentation.aiokafka.utils._enrich_anext_span"
+ )
+ @mock.patch("opentelemetry.context.detach")
+ async def test_create_consumer_span(
+ self,
+ detach: mock.MagicMock,
+ enrich_span: mock.MagicMock,
+ attach: mock.MagicMock,
+ set_span_in_context: mock.MagicMock,
+ ) -> None:
+ tracer = mock.MagicMock()
+ consume_hook = mock.AsyncMock()
+ bootstrap_servers = mock.MagicMock()
+ extracted_context = mock.MagicMock()
+ record = mock.MagicMock()
+ client_id = mock.MagicMock()
+ consumer_group = mock.MagicMock()
+
+ await _create_consumer_span(
+ tracer,
+ consume_hook,
+ record,
+ extracted_context,
+ bootstrap_servers,
+ client_id,
+ consumer_group,
+ self.args,
+ self.kwargs,
+ )
+
+ expected_span_name = _get_span_name("receive", record.topic)
+
+ tracer.start_as_current_span.assert_called_once_with(
+ expected_span_name,
+ context=extracted_context,
+ kind=SpanKind.CONSUMER,
+ )
+ span = tracer.start_as_current_span.return_value.__enter__()
+ set_span_in_context.assert_called_once_with(span, extracted_context)
+ attach.assert_called_once_with(set_span_in_context.return_value)
+
+ enrich_span.assert_called_once_with(
+ span,
+ bootstrap_servers=bootstrap_servers,
+ client_id=client_id,
+ consumer_group=consumer_group,
+ topic=record.topic,
+ partition=record.partition,
+ key=record.key,
+ offset=record.offset,
+ )
+ consume_hook.assert_awaited_once_with(
+ span, record, self.args, self.kwargs
+ )
+ detach.assert_called_once_with(attach.return_value)
+
+ async def test_kafka_properties_extractor(self):
+ aiokafka_instance_mock = mock.Mock()
+ aiokafka_instance_mock._serialize.return_value = None, None
+ aiokafka_instance_mock._partition.return_value = "partition"
+ aiokafka_instance_mock.client._wait_on_metadata = mock.AsyncMock()
+ assert (
+ await _extract_send_partition(
+ aiokafka_instance_mock, self.args, self.kwargs
+ )
+ == "partition"
+ )
+ aiokafka_instance_mock.client._wait_on_metadata.side_effect = (
+ Exception("mocked error")
+ )
+ assert (
+ await _extract_send_partition(
+ aiokafka_instance_mock, self.args, self.kwargs
+ )
+ is None
+ )
diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aiopg/pyproject.toml
index 404bc9c445..3a583db3dd 100644
--- a/instrumentation/opentelemetry-instrumentation-aiopg/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-aiopg/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-dbapi == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/version.py b/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/version.py
+++ b/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt
index bc61c3d6fc..df527586f7 100644
--- a/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt
@@ -1,5 +1,5 @@
aiopg==1.4.0
-asgiref==3.7.2
+asgiref==3.8.1
async-timeout==4.0.3
Deprecated==1.2.14
importlib-metadata==6.11.0
@@ -10,7 +10,7 @@ psycopg2-binary==2.9.9
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-asgi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-asgi/pyproject.toml
index 480ca75df7..45c436aad4 100644
--- a/instrumentation/opentelemetry-instrumentation-asgi/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-asgi/pyproject.toml
@@ -27,9 +27,9 @@ classifiers = [
dependencies = [
"asgiref ~= 3.0",
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
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 8e3199cef8..bc45eacaa4 100644
--- a/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py
@@ -215,10 +215,10 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A
_server_duration_attrs_new,
_server_duration_attrs_old,
_set_http_flavor_version,
- _set_http_host,
+ _set_http_host_server,
_set_http_method,
_set_http_net_host_port,
- _set_http_peer_ip,
+ _set_http_peer_ip_server,
_set_http_peer_port_server,
_set_http_scheme,
_set_http_target,
@@ -284,9 +284,9 @@ def get(
# ASGI header keys are in lower case
key = key.lower()
decoded = [
- _value.decode("utf8")
+ _decode_header_item(_value)
for (_key, _value) in headers
- if _key.decode("utf8").lower() == key
+ if _decode_header_item(_key).lower() == key
]
if not decoded:
return None
@@ -294,7 +294,7 @@ def get(
def keys(self, carrier: dict) -> typing.List[str]:
headers = carrier.get("headers") or []
- return [_key.decode("utf8") for (_key, _value) in headers]
+ return [_decode_header_item(_key) for (_key, _value) in headers]
asgi_getter = ASGIGetter()
@@ -342,7 +342,7 @@ def collect_request_attributes(
if scheme:
_set_http_scheme(result, scheme, sem_conv_opt_in_mode)
if server_host:
- _set_http_host(result, server_host, sem_conv_opt_in_mode)
+ _set_http_host_server(result, server_host, sem_conv_opt_in_mode)
if port:
_set_http_net_host_port(result, port, sem_conv_opt_in_mode)
flavor = scope.get("http_version")
@@ -380,7 +380,9 @@ def collect_request_attributes(
_set_http_user_agent(result, http_user_agent[0], sem_conv_opt_in_mode)
if "client" in scope and scope["client"] is not None:
- _set_http_peer_ip(result, scope.get("client")[0], sem_conv_opt_in_mode)
+ _set_http_peer_ip_server(
+ result, scope.get("client")[0], sem_conv_opt_in_mode
+ )
_set_http_peer_port_server(
result, scope.get("client")[1], sem_conv_opt_in_mode
)
@@ -408,7 +410,9 @@ def collect_custom_headers_attributes(
if raw_headers:
for key, value in raw_headers:
# Decode headers before processing.
- headers[key.decode()].append(value.decode())
+ headers[_decode_header_item(key)].append(
+ _decode_header_item(value)
+ )
return sanitize.sanitize_header_values(
headers,
@@ -481,7 +485,7 @@ def get_default_span_details(scope: dict) -> Tuple[str, dict]:
def _collect_target_attribute(
- scope: typing.Dict[str, typing.Any]
+ scope: typing.Dict[str, typing.Any],
) -> typing.Optional[str]:
"""
Returns the target path as defined by the Semantic Conventions.
@@ -527,6 +531,7 @@ class OpenTelemetryMiddleware:
the current globally configured one is used.
meter_provider: The optional meter provider to use. If omitted
the current globally configured one is used.
+ exclude_spans: Optionally exclude HTTP `send` and/or `receive` spans from the trace.
"""
# pylint: disable=too-many-branches
@@ -545,6 +550,7 @@ def __init__(
http_capture_headers_server_request: list[str] | None = None,
http_capture_headers_server_response: list[str] | None = None,
http_capture_headers_sanitize_fields: list[str] | None = None,
+ exclude_spans: list[typing.Literal["receive", "send"]] | None = None,
):
# initialize semantic conventions opt-in if needed
_OpenTelemetrySemanticConventionStability._initialize()
@@ -577,7 +583,7 @@ def __init__(
self.duration_histogram_old = self.meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="Duration of HTTP server requests.",
+ description="Measures the duration of inbound HTTP requests.",
)
self.duration_histogram_new = None
if _report_new(sem_conv_opt_in_mode):
@@ -651,6 +657,12 @@ def __init__(
)
or []
)
+ self.exclude_receive_span = (
+ "receive" in exclude_spans if exclude_spans else False
+ )
+ self.exclude_send_span = (
+ "send" in exclude_spans if exclude_spans else False
+ )
# pylint: disable=too-many-statements
async def __call__(
@@ -794,8 +806,10 @@ async def __call__(
span.end()
# pylint: enable=too-many-branches
-
def _get_otel_receive(self, server_span_name, scope, receive):
+ if self.exclude_receive_span:
+ return receive
+
@wraps(receive)
async def otel_receive():
with self.tracer.start_as_current_span(
@@ -819,6 +833,66 @@ async def otel_receive():
return otel_receive
+ def _set_send_span(
+ self,
+ server_span_name,
+ scope,
+ send,
+ message,
+ status_code,
+ expecting_trailers,
+ ):
+ """Set send span attributes and status code."""
+ with self.tracer.start_as_current_span(
+ " ".join((server_span_name, scope["type"], "send"))
+ ) as send_span:
+ if callable(self.client_response_hook):
+ self.client_response_hook(send_span, scope, message)
+
+ if send_span.is_recording():
+ if message["type"] == "http.response.start":
+ expecting_trailers = message.get("trailers", False)
+ send_span.set_attribute("asgi.event.type", message["type"])
+
+ if status_code:
+ set_status_code(
+ send_span,
+ status_code,
+ None,
+ self._sem_conv_opt_in_mode,
+ )
+ return expecting_trailers
+
+ def _set_server_span(
+ self, server_span, message, status_code, duration_attrs
+ ):
+ """Set server span attributes and status code."""
+ if (
+ server_span.is_recording()
+ and server_span.kind == trace.SpanKind.SERVER
+ and "headers" in message
+ ):
+ custom_response_attributes = (
+ collect_custom_headers_attributes(
+ message,
+ self.http_capture_headers_sanitize_fields,
+ self.http_capture_headers_server_response,
+ normalise_response_header_name,
+ )
+ if self.http_capture_headers_server_response
+ else {}
+ )
+ if len(custom_response_attributes) > 0:
+ server_span.set_attributes(custom_response_attributes)
+
+ if status_code:
+ set_status_code(
+ server_span,
+ status_code,
+ duration_attrs,
+ self._sem_conv_opt_in_mode,
+ )
+
def _get_otel_send(
self,
server_span,
@@ -832,74 +906,46 @@ def _get_otel_send(
@wraps(send)
async def otel_send(message: dict[str, Any]):
nonlocal expecting_trailers
- with self.tracer.start_as_current_span(
- " ".join((server_span_name, scope["type"], "send"))
- ) as send_span:
- if callable(self.client_response_hook):
- self.client_response_hook(send_span, scope, message)
- status_code = None
- if message["type"] == "http.response.start":
- status_code = message["status"]
- elif message["type"] == "websocket.send":
- status_code = 200
-
- if send_span.is_recording():
- if message["type"] == "http.response.start":
- expecting_trailers = message.get("trailers", False)
- send_span.set_attribute("asgi.event.type", message["type"])
- if (
- server_span.is_recording()
- and server_span.kind == trace.SpanKind.SERVER
- and "headers" in message
- ):
- custom_response_attributes = (
- collect_custom_headers_attributes(
- message,
- self.http_capture_headers_sanitize_fields,
- self.http_capture_headers_server_response,
- normalise_response_header_name,
- )
- if self.http_capture_headers_server_response
- else {}
- )
- if len(custom_response_attributes) > 0:
- server_span.set_attributes(
- custom_response_attributes
- )
- if status_code:
- # We record metrics only once
- set_status_code(
- server_span,
- status_code,
- duration_attrs,
- self._sem_conv_opt_in_mode,
- )
- set_status_code(
- send_span,
- status_code,
- None,
- self._sem_conv_opt_in_mode,
- )
+ status_code = None
+ if message["type"] == "http.response.start":
+ status_code = message["status"]
+ elif message["type"] == "websocket.send":
+ status_code = 200
- propagator = get_global_response_propagator()
- if propagator:
- propagator.inject(
- message,
- context=set_span_in_context(
- server_span, trace.context_api.Context()
- ),
- setter=asgi_setter,
- )
+ if not self.exclude_send_span:
+ expecting_trailers = self._set_send_span(
+ server_span_name,
+ scope,
+ send,
+ message,
+ status_code,
+ expecting_trailers,
+ )
- content_length = asgi_getter.get(message, "content-length")
- if content_length:
- try:
- self.content_length_header = int(content_length[0])
- except ValueError:
- pass
+ self._set_server_span(
+ server_span, message, status_code, duration_attrs
+ )
+
+ propagator = get_global_response_propagator()
+ if propagator:
+ propagator.inject(
+ message,
+ context=set_span_in_context(
+ server_span, trace.context_api.Context()
+ ),
+ setter=asgi_setter,
+ )
+
+ content_length = asgi_getter.get(message, "content-length")
+ if content_length:
+ try:
+ self.content_length_header = int(content_length[0])
+ except ValueError:
+ pass
+
+ await send(message)
- await send(message)
# pylint: disable=too-many-boolean-expressions
if (
not expecting_trailers
@@ -935,3 +981,13 @@ def _parse_active_request_count_attrs(
_server_active_requests_count_attrs_new,
sem_conv_opt_in_mode,
)
+
+
+def _decode_header_item(value):
+ try:
+ return value.decode("utf-8")
+ except ValueError:
+ # ASGI header encoding specs, see:
+ # - https://asgi.readthedocs.io/en/latest/specs/www.html#wsgi-encoding-differences (see: WSGI encoding differences)
+ # - https://docs.python.org/3/library/codecs.html#text-encodings (see: Text Encodings)
+ return value.decode("unicode_escape")
diff --git a/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/version.py b/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/version.py
+++ b/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-asgi/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-asgi/test-requirements.txt
index ebe439d1d2..de88049226 100644
--- a/instrumentation/opentelemetry-instrumentation-asgi/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-asgi/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_custom_headers.py b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_custom_headers.py
index 5394d62ff0..1b191e30e7 100644
--- a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_custom_headers.py
+++ b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_custom_headers.py
@@ -1,7 +1,21 @@
+# 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
import opentelemetry.instrumentation.asgi as otel_asgi
-from opentelemetry.test.asgitestutil import AsgiTestBase
+from opentelemetry.test.asgitestutil import AsyncAsgiTestBase
from opentelemetry.test.test_base import TestBase
from opentelemetry.trace import SpanKind
from opentelemetry.util.http import (
@@ -34,6 +48,14 @@ async def http_app_with_custom_headers(scope, receive, send):
b"my-custom-regex-value-3,my-custom-regex-value-4",
),
(b"my-secret-header", b"my-secret-value"),
+ (
+ b"non-utf8-header",
+ b"Moto Z\xb2",
+ ),
+ (
+ b"Moto-Z\xb2-non-utf8-header-key",
+ b"Moto Z\xb2",
+ ),
],
}
)
@@ -90,7 +112,7 @@ async def websocket_app_with_custom_headers(scope, receive, send):
break
-class TestCustomHeaders(AsgiTestBase, TestBase):
+class TestCustomHeaders(AsyncAsgiTestBase):
constructor_params = {}
__test__ = False
@@ -108,7 +130,7 @@ def setUp(self):
**self.constructor_params,
)
- def test_http_custom_request_headers_in_span_attributes(self):
+ async def test_http_custom_request_headers_in_span_attributes(self):
self.scope["headers"].extend(
[
(b"custom-test-header-1", b"test-header-value-1"),
@@ -116,11 +138,19 @@ def test_http_custom_request_headers_in_span_attributes(self):
(b"Regex-Test-Header-1", b"Regex Test Value 1"),
(b"regex-test-header-2", b"RegexTestValue2,RegexTestValue3"),
(b"My-Secret-Header", b"My Secret Value"),
+ (
+ b"non-utf8-header",
+ b"Moto Z\xb2",
+ ),
+ (
+ b"Moto-Z\xb2-non-utf8-header-key",
+ b"Moto Z\xb2",
+ ),
]
)
self.seed_app(self.app)
- self.send_default_request()
- self.get_all_output()
+ await self.send_default_request()
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
"http.request.header.custom_test_header_1": (
@@ -133,13 +163,15 @@ def test_http_custom_request_headers_in_span_attributes(self):
"http.request.header.regex_test_header_2": (
"RegexTestValue2,RegexTestValue3",
),
+ "http.request.header.non_utf8_header": ("Moto Z²",),
+ "http.request.header.moto_z²_non_utf8_header_key": ("Moto Z²",),
"http.request.header.my_secret_header": ("[REDACTED]",),
}
for span in span_list:
if span.kind == SpanKind.SERVER:
self.assertSpanHasAttributes(span, expected)
- def test_http_repeat_request_headers_in_span_attributes(self):
+ async def test_http_repeat_request_headers_in_span_attributes(self):
self.scope["headers"].extend(
[
(b"custom-test-header-1", b"test-header-value-1"),
@@ -147,8 +179,8 @@ def test_http_repeat_request_headers_in_span_attributes(self):
]
)
self.seed_app(self.app)
- self.send_default_request()
- self.get_all_output()
+ await self.send_default_request()
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
"http.request.header.custom_test_header_1": (
@@ -159,15 +191,15 @@ def test_http_repeat_request_headers_in_span_attributes(self):
span = next(span for span in span_list if span.kind == SpanKind.SERVER)
self.assertSpanHasAttributes(span, expected)
- def test_http_custom_request_headers_not_in_span_attributes(self):
+ async def test_http_custom_request_headers_not_in_span_attributes(self):
self.scope["headers"].extend(
[
(b"custom-test-header-1", b"test-header-value-1"),
]
)
self.seed_app(self.app)
- self.send_default_request()
- self.get_all_output()
+ await self.send_default_request()
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
"http.request.header.custom_test_header_1": (
@@ -185,15 +217,15 @@ def test_http_custom_request_headers_not_in_span_attributes(self):
for key, _ in not_expected.items():
self.assertNotIn(key, span.attributes)
- def test_http_custom_response_headers_in_span_attributes(self):
+ async def test_http_custom_response_headers_in_span_attributes(self):
self.app = otel_asgi.OpenTelemetryMiddleware(
http_app_with_custom_headers,
tracer_provider=self.tracer_provider,
**self.constructor_params,
)
self.seed_app(self.app)
- self.send_default_request()
- self.get_all_output()
+ await self.send_default_request()
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
"http.response.header.custom_test_header_1": (
@@ -209,20 +241,22 @@ def test_http_custom_response_headers_in_span_attributes(self):
"my-custom-regex-value-3,my-custom-regex-value-4",
),
"http.response.header.my_secret_header": ("[REDACTED]",),
+ "http.response.header.non_utf8_header": ("Moto Z²",),
+ "http.response.header.moto_z²_non_utf8_header_key": ("Moto Z²",),
}
for span in span_list:
if span.kind == SpanKind.SERVER:
self.assertSpanHasAttributes(span, expected)
- def test_http_repeat_response_headers_in_span_attributes(self):
+ async def test_http_repeat_response_headers_in_span_attributes(self):
self.app = otel_asgi.OpenTelemetryMiddleware(
http_app_with_repeat_headers,
tracer_provider=self.tracer_provider,
**self.constructor_params,
)
self.seed_app(self.app)
- self.send_default_request()
- self.get_all_output()
+ await self.send_default_request()
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
"http.response.header.custom_test_header_1": (
@@ -233,15 +267,15 @@ def test_http_repeat_response_headers_in_span_attributes(self):
span = next(span for span in span_list if span.kind == SpanKind.SERVER)
self.assertSpanHasAttributes(span, expected)
- def test_http_custom_response_headers_not_in_span_attributes(self):
+ async def test_http_custom_response_headers_not_in_span_attributes(self):
self.app = otel_asgi.OpenTelemetryMiddleware(
http_app_with_custom_headers,
tracer_provider=self.tracer_provider,
**self.constructor_params,
)
self.seed_app(self.app)
- self.send_default_request()
- self.get_all_output()
+ await self.send_default_request()
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
not_expected = {
"http.response.header.custom_test_header_3": (
@@ -253,7 +287,7 @@ def test_http_custom_response_headers_not_in_span_attributes(self):
for key, _ in not_expected.items():
self.assertNotIn(key, span.attributes)
- def test_websocket_custom_request_headers_in_span_attributes(self):
+ async def test_websocket_custom_request_headers_in_span_attributes(self):
self.scope = {
"type": "websocket",
"http_version": "1.1",
@@ -271,11 +305,11 @@ def test_websocket_custom_request_headers_in_span_attributes(self):
"server": ("127.0.0.1", 80),
}
self.seed_app(self.app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
- self.get_all_output()
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
"http.request.header.custom_test_header_1": (
@@ -294,7 +328,9 @@ def test_websocket_custom_request_headers_in_span_attributes(self):
if span.kind == SpanKind.SERVER:
self.assertSpanHasAttributes(span, expected)
- def test_websocket_custom_request_headers_not_in_span_attributes(self):
+ async def test_websocket_custom_request_headers_not_in_span_attributes(
+ self,
+ ):
self.scope = {
"type": "websocket",
"http_version": "1.1",
@@ -309,11 +345,11 @@ def test_websocket_custom_request_headers_not_in_span_attributes(self):
"server": ("127.0.0.1", 80),
}
self.seed_app(self.app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
- self.get_all_output()
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
not_expected = {
"http.request.header.custom_test_header_3": (
@@ -325,7 +361,7 @@ def test_websocket_custom_request_headers_not_in_span_attributes(self):
for key, _ in not_expected.items():
self.assertNotIn(key, span.attributes)
- def test_websocket_custom_response_headers_in_span_attributes(self):
+ async def test_websocket_custom_response_headers_in_span_attributes(self):
self.scope = {
"type": "websocket",
"http_version": "1.1",
@@ -342,10 +378,10 @@ def test_websocket_custom_response_headers_in_span_attributes(self):
**self.constructor_params,
)
self.seed_app(self.app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
- self.get_all_output()
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
"http.response.header.custom_test_header_1": (
@@ -366,7 +402,9 @@ def test_websocket_custom_response_headers_in_span_attributes(self):
if span.kind == SpanKind.SERVER:
self.assertSpanHasAttributes(span, expected)
- def test_websocket_custom_response_headers_not_in_span_attributes(self):
+ async def test_websocket_custom_response_headers_not_in_span_attributes(
+ self,
+ ):
self.scope = {
"type": "websocket",
"http_version": "1.1",
@@ -383,10 +421,10 @@ def test_websocket_custom_response_headers_not_in_span_attributes(self):
**self.constructor_params,
)
self.seed_app(self.app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
- self.get_all_output()
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
+ await self.get_all_output()
span_list = self.exporter.get_finished_spans()
not_expected = {
"http.response.header.custom_test_header_3": (
@@ -400,8 +438,8 @@ def test_websocket_custom_response_headers_not_in_span_attributes(self):
SANITIZE_FIELDS_TEST_VALUE = ".*my-secret.*"
-SERVER_REQUEST_TEST_VALUE = "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,Regex-Test-Header-.*,Regex-Invalid-Test-Header-.*,.*my-secret.*"
-SERVER_RESPONSE_TEST_VALUE = "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,my-custom-regex-header-.*,invalid-regex-header-.*,.*my-secret.*"
+SERVER_REQUEST_TEST_VALUE = "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,Regex-Test-Header-.*,Regex-Invalid-Test-Header-.*,.*my-secret.*,non-utf8-header,Moto-Z²-non-utf8-header-key"
+SERVER_RESPONSE_TEST_VALUE = "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,my-custom-regex-header-.*,invalid-regex-header-.*,.*my-secret.*,non-utf8-header,Moto-Z²-non-utf8-header-key"
class TestCustomHeadersEnv(TestCustomHeaders):
diff --git a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py
index af51faa808..a9d7897ea6 100644
--- a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py
+++ b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py
@@ -14,7 +14,6 @@
# pylint: disable=too-many-lines
-import asyncio
import sys
import time
import unittest
@@ -53,10 +52,7 @@
from opentelemetry.semconv.attributes.network_attributes import (
NETWORK_PROTOCOL_VERSION,
)
-from opentelemetry.semconv.attributes.server_attributes import (
- SERVER_ADDRESS,
- SERVER_PORT,
-)
+from opentelemetry.semconv.attributes.server_attributes import SERVER_PORT
from opentelemetry.semconv.attributes.url_attributes import (
URL_PATH,
URL_QUERY,
@@ -67,7 +63,7 @@
)
from opentelemetry.semconv.trace import SpanAttributes
from opentelemetry.test.asgitestutil import (
- AsgiTestBase,
+ AsyncAsgiTestBase,
setup_testing_defaults,
)
from opentelemetry.test.test_base import TestBase
@@ -278,7 +274,7 @@ async def error_asgi(scope, receive, send):
# pylint: disable=too-many-public-methods
-class TestAsgiApplication(AsgiTestBase):
+class TestAsgiApplication(AsyncAsgiTestBase):
def setUp(self):
super().setUp()
@@ -406,7 +402,6 @@ def validate_outputs(
HTTP_REQUEST_METHOD: "GET",
URL_SCHEME: "http",
SERVER_PORT: 80,
- SERVER_ADDRESS: "127.0.0.1",
NETWORK_PROTOCOL_VERSION: "1.0",
URL_PATH: "/",
CLIENT_ADDRESS: "127.0.0.1",
@@ -442,7 +437,6 @@ def validate_outputs(
HTTP_REQUEST_METHOD: "GET",
URL_SCHEME: "http",
SERVER_PORT: 80,
- SERVER_ADDRESS: "127.0.0.1",
NETWORK_PROTOCOL_VERSION: "1.0",
URL_PATH: "/",
CLIENT_ADDRESS: "127.0.0.1",
@@ -482,31 +476,31 @@ def validate_outputs(
"opentelemetry.instrumentation.asgi",
)
- def test_basic_asgi_call(self):
+ async def test_basic_asgi_call(self):
"""Test that spans are emitted as expected."""
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs)
- def test_basic_asgi_call_new_semconv(self):
+ async def test_basic_asgi_call_new_semconv(self):
"""Test that spans are emitted as expected."""
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs, old_sem_conv=False, new_sem_conv=True)
- def test_basic_asgi_call_both_semconv(self):
+ async def test_basic_asgi_call_both_semconv(self):
"""Test that spans are emitted as expected."""
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs, old_sem_conv=True, new_sem_conv=True)
- def test_asgi_not_recording(self):
+ async def test_asgi_not_recording(self):
mock_tracer = mock.Mock()
mock_span = mock.Mock()
mock_span.is_recording.return_value = False
@@ -519,21 +513,21 @@ def test_asgi_not_recording(self):
tracer.return_value = mock_tracer
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
self.assertFalse(mock_span.is_recording())
self.assertTrue(mock_span.is_recording.called)
self.assertFalse(mock_span.set_attribute.called)
self.assertFalse(mock_span.set_status.called)
- def test_asgi_exc_info(self):
+ async def test_asgi_exc_info(self):
"""Test that exception information is emitted as expected."""
app = otel_asgi.OpenTelemetryMiddleware(error_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs, error=ValueError)
- def test_long_response(self):
+ async def test_long_response(self):
"""Test that the server span is ended on the final response body message.
If the server span is ended early then this test will fail due
@@ -541,8 +535,8 @@ def test_long_response(self):
"""
app = otel_asgi.OpenTelemetryMiddleware(long_response_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
def add_more_body_spans(expected: list):
more_body_span = {
@@ -556,12 +550,12 @@ def add_more_body_spans(expected: list):
self.validate_outputs(outputs, modifiers=[add_more_body_spans])
- def test_background_execution(self):
+ async def test_background_execution(self):
"""Test that the server span is ended BEFORE the background task is finished."""
app = otel_asgi.OpenTelemetryMiddleware(background_execution_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs)
span_list = self.memory_exporter.get_finished_spans()
server_span = span_list[-1]
@@ -572,15 +566,39 @@ def test_background_execution(self):
_SIMULATED_BACKGROUND_TASK_EXECUTION_TIME_S * 10**9,
)
- def test_trailers(self):
+ async def test_exclude_internal_spans(self):
+ """Test that internal spans are excluded from the emitted spans when
+ the `exclude_receive_span` or `exclude_send_span` attributes are set.
+ """
+ cases = [
+ (["receive", "send"], ["GET / http receive", "GET / http send"]),
+ (["send"], ["GET / http send"]),
+ (["receive"], ["GET / http receive"]),
+ ([], []),
+ ]
+ for exclude_spans, excluded_spans in cases:
+ self.memory_exporter.clear()
+ app = otel_asgi.OpenTelemetryMiddleware(
+ simple_asgi, exclude_spans=exclude_spans
+ )
+ self.seed_app(app)
+ await self.send_default_request()
+ await self.get_all_output()
+ span_list = self.memory_exporter.get_finished_spans()
+ self.assertTrue(span_list)
+ for span in span_list:
+ for excluded_span in excluded_spans:
+ self.assertNotEqual(span.name, excluded_span)
+
+ async def test_trailers(self):
"""Test that trailers are emitted as expected and that the server span is ended
BEFORE the background task is finished."""
app = otel_asgi.OpenTelemetryMiddleware(
background_execution_trailers_asgi
)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
def add_body_and_trailer_span(expected: list):
body_span = {
@@ -607,7 +625,7 @@ def add_body_and_trailer_span(expected: list):
_SIMULATED_BACKGROUND_TASK_EXECUTION_TIME_S * 10**9,
)
- def test_override_span_name(self):
+ async def test_override_span_name(self):
"""Test that default span_names can be overwritten by our callback function."""
span_name = "Dymaxion"
@@ -628,11 +646,11 @@ def update_expected_span_name(expected):
simple_asgi, default_span_details=get_predefined_span_details
)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs, modifiers=[update_expected_span_name])
- def test_custom_tracer_provider_otel_asgi(self):
+ async def test_custom_tracer_provider_otel_asgi(self):
resource = resources.Resource.create({"service-test-key": "value"})
result = TestBase.create_tracer_provider(resource=resource)
tracer_provider, exporter = result
@@ -641,28 +659,28 @@ def test_custom_tracer_provider_otel_asgi(self):
simple_asgi, tracer_provider=tracer_provider
)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
span_list = exporter.get_finished_spans()
for span in span_list:
self.assertEqual(
span.resource.attributes["service-test-key"], "value"
)
- def test_no_op_tracer_provider_otel_asgi(self):
+ async def test_no_op_tracer_provider_otel_asgi(self):
app = otel_asgi.OpenTelemetryMiddleware(
simple_asgi, tracer_provider=trace_api.NoOpTracerProvider()
)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
- response_start, response_body, *_ = self.get_all_output()
+ response_start, response_body, *_ = await self.get_all_output()
self.assertEqual(response_body["body"], b"*")
self.assertEqual(response_start["status"], 200)
span_list = self.memory_exporter.get_finished_spans()
self.assertEqual(len(span_list), 0)
- def test_behavior_with_scope_server_as_none(self):
+ async def test_behavior_with_scope_server_as_none(self):
"""Test that middleware is ok when server is none in scope."""
def update_expected_server(expected):
@@ -678,17 +696,17 @@ def update_expected_server(expected):
self.scope["server"] = None
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs, modifiers=[update_expected_server])
- def test_behavior_with_scope_server_as_none_new_semconv(self):
+ async def test_behavior_with_scope_server_as_none_new_semconv(self):
"""Test that middleware is ok when server is none in scope."""
def update_expected_server(expected):
expected[3]["attributes"].update(
{
- SERVER_ADDRESS: "0.0.0.0",
+ CLIENT_ADDRESS: "0.0.0.0",
SERVER_PORT: 80,
}
)
@@ -697,8 +715,8 @@ def update_expected_server(expected):
self.scope["server"] = None
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(
outputs,
modifiers=[update_expected_server],
@@ -706,7 +724,7 @@ def update_expected_server(expected):
new_sem_conv=True,
)
- def test_behavior_with_scope_server_as_none_both_semconv(self):
+ async def test_behavior_with_scope_server_as_none_both_semconv(self):
"""Test that middleware is ok when server is none in scope."""
def update_expected_server(expected):
@@ -715,7 +733,7 @@ def update_expected_server(expected):
SpanAttributes.HTTP_HOST: "0.0.0.0",
SpanAttributes.NET_HOST_PORT: 80,
SpanAttributes.HTTP_URL: "http://0.0.0.0/",
- SERVER_ADDRESS: "0.0.0.0",
+ CLIENT_ADDRESS: "0.0.0.0",
SERVER_PORT: 80,
}
)
@@ -724,8 +742,8 @@ def update_expected_server(expected):
self.scope["server"] = None
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(
outputs,
modifiers=[update_expected_server],
@@ -733,7 +751,7 @@ def update_expected_server(expected):
new_sem_conv=True,
)
- def test_host_header(self):
+ async def test_host_header(self):
"""Test that host header is converted to http.server_name."""
hostname = b"server_name_1"
@@ -746,11 +764,11 @@ def update_expected_server(expected):
self.scope["headers"].append([b"host", hostname])
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs, modifiers=[update_expected_server])
- def test_host_header_both_semconv(self):
+ async def test_host_header_both_semconv(self):
"""Test that host header is converted to http.server_name."""
hostname = b"server_name_1"
@@ -763,8 +781,8 @@ def update_expected_server(expected):
self.scope["headers"].append([b"host", hostname])
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(
outputs,
modifiers=[update_expected_server],
@@ -772,7 +790,7 @@ def update_expected_server(expected):
new_sem_conv=True,
)
- def test_user_agent(self):
+ async def test_user_agent(self):
"""Test that host header is converted to http.server_name."""
user_agent = b"test-agent"
@@ -785,11 +803,11 @@ def update_expected_user_agent(expected):
self.scope["headers"].append([b"user-agent", user_agent])
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(outputs, modifiers=[update_expected_user_agent])
- def test_user_agent_new_semconv(self):
+ async def test_user_agent_new_semconv(self):
"""Test that host header is converted to http.server_name."""
user_agent = b"test-agent"
@@ -802,8 +820,8 @@ def update_expected_user_agent(expected):
self.scope["headers"].append([b"user-agent", user_agent])
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(
outputs,
modifiers=[update_expected_user_agent],
@@ -811,7 +829,7 @@ def update_expected_user_agent(expected):
new_sem_conv=True,
)
- def test_user_agent_both_semconv(self):
+ async def test_user_agent_both_semconv(self):
"""Test that host header is converted to http.server_name."""
user_agent = b"test-agent"
@@ -827,8 +845,8 @@ def update_expected_user_agent(expected):
self.scope["headers"].append([b"user-agent", user_agent])
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(
outputs,
modifiers=[update_expected_user_agent],
@@ -836,7 +854,7 @@ def update_expected_user_agent(expected):
new_sem_conv=True,
)
- def test_traceresponse_header(self):
+ async def test_traceresponse_header(self):
"""Test a traceresponse header is sent when a global propagator is set."""
orig = get_global_response_propagator()
@@ -844,12 +862,12 @@ def test_traceresponse_header(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ response_start, response_body, *_ = await self.get_all_output()
span = self.memory_exporter.get_finished_spans()[-1]
self.assertEqual(trace_api.SpanKind.SERVER, span.kind)
- response_start, response_body, *_ = self.get_all_output()
self.assertEqual(response_body["body"], b"*")
self.assertEqual(response_start["status"], 200)
@@ -869,7 +887,7 @@ def test_traceresponse_header(self):
set_global_response_propagator(orig)
- def test_websocket(self):
+ async def test_websocket(self):
self.scope = {
"method": "GET",
"type": "websocket",
@@ -883,10 +901,10 @@ def test_websocket(self):
}
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
- self.get_all_output()
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
+ await self.get_all_output()
span_list = self.memory_exporter.get_finished_spans()
self.assertEqual(len(span_list), 6)
expected = [
@@ -943,7 +961,7 @@ def test_websocket(self):
self.assertEqual(span.kind, expected["kind"])
self.assertDictEqual(dict(span.attributes), expected["attributes"])
- def test_websocket_new_semconv(self):
+ async def test_websocket_new_semconv(self):
self.scope = {
"method": "GET",
"type": "websocket",
@@ -957,10 +975,10 @@ def test_websocket_new_semconv(self):
}
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
- self.get_all_output()
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
+ await self.get_all_output()
span_list = self.memory_exporter.get_finished_spans()
self.assertEqual(len(span_list), 6)
expected = [
@@ -1001,7 +1019,6 @@ def test_websocket_new_semconv(self):
"attributes": {
URL_SCHEME: self.scope["scheme"],
SERVER_PORT: self.scope["server"][1],
- SERVER_ADDRESS: self.scope["server"][0],
NETWORK_PROTOCOL_VERSION: self.scope["http_version"],
URL_PATH: self.scope["path"],
CLIENT_ADDRESS: self.scope["client"][0],
@@ -1016,7 +1033,7 @@ def test_websocket_new_semconv(self):
self.assertEqual(span.kind, expected["kind"])
self.assertDictEqual(dict(span.attributes), expected["attributes"])
- def test_websocket_both_semconv(self):
+ async def test_websocket_both_semconv(self):
self.scope = {
"method": "GET",
"type": "websocket",
@@ -1030,10 +1047,10 @@ def test_websocket_both_semconv(self):
}
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
- self.get_all_output()
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
+ await self.get_all_output()
span_list = self.memory_exporter.get_finished_spans()
self.assertEqual(len(span_list), 6)
expected = [
@@ -1086,7 +1103,6 @@ def test_websocket_both_semconv(self):
SpanAttributes.HTTP_METHOD: self.scope["method"],
URL_SCHEME: self.scope["scheme"],
SERVER_PORT: self.scope["server"][1],
- SERVER_ADDRESS: self.scope["server"][0],
NETWORK_PROTOCOL_VERSION: self.scope["http_version"],
URL_PATH: self.scope["path"],
CLIENT_ADDRESS: self.scope["client"][0],
@@ -1101,7 +1117,7 @@ def test_websocket_both_semconv(self):
self.assertEqual(span.kind, expected["kind"])
self.assertDictEqual(dict(span.attributes), expected["attributes"])
- def test_websocket_traceresponse_header(self):
+ async def test_websocket_traceresponse_header(self):
"""Test a traceresponse header is set for websocket messages"""
orig = get_global_response_propagator()
@@ -1119,10 +1135,10 @@ def test_websocket_traceresponse_header(self):
}
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
- _, socket_send, *_ = self.get_all_output()
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
+ _, socket_send, *_ = await self.get_all_output()
span = self.memory_exporter.get_finished_spans()[-1]
self.assertEqual(trace_api.SpanKind.SERVER, span.kind)
@@ -1141,15 +1157,15 @@ def test_websocket_traceresponse_header(self):
set_global_response_propagator(orig)
- def test_lifespan(self):
+ async def test_lifespan(self):
self.scope["type"] = "lifespan"
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
span_list = self.memory_exporter.get_finished_spans()
self.assertEqual(len(span_list), 0)
- def test_hooks(self):
+ async def test_hooks(self):
def server_request_hook(span, scope):
span.update_name("name from server hook")
@@ -1176,20 +1192,23 @@ def update_expected_hook_results(expected):
client_response_hook=client_response_hook,
)
self.seed_app(app)
- self.send_default_request()
- outputs = self.get_all_output()
+ await self.send_default_request()
+ outputs = await self.get_all_output()
self.validate_outputs(
outputs, modifiers=[update_expected_hook_results]
)
- def test_asgi_metrics(self):
+ async def test_asgi_metrics(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
metrics_list = self.memory_metrics_reader.get_metrics_data()
number_data_point_seen = False
histogram_data_point_seen = False
@@ -1218,14 +1237,17 @@ def test_asgi_metrics(self):
)
self.assertTrue(number_data_point_seen and histogram_data_point_seen)
- def test_asgi_metrics_new_semconv(self):
+ async def test_asgi_metrics_new_semconv(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
metrics_list = self.memory_metrics_reader.get_metrics_data()
number_data_point_seen = False
histogram_data_point_seen = False
@@ -1254,14 +1276,17 @@ def test_asgi_metrics_new_semconv(self):
)
self.assertTrue(number_data_point_seen and histogram_data_point_seen)
- def test_asgi_metrics_both_semconv(self):
+ async def test_asgi_metrics_both_semconv(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
metrics_list = self.memory_metrics_reader.get_metrics_data()
number_data_point_seen = False
histogram_data_point_seen = False
@@ -1290,12 +1315,13 @@ def test_asgi_metrics_both_semconv(self):
)
self.assertTrue(number_data_point_seen and histogram_data_point_seen)
- def test_basic_metric_success(self):
+ async def test_basic_metric_success(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
start = default_timer()
- self.send_default_request()
+ await self.send_default_request()
duration = max(round((default_timer() - start) * 1000), 0)
+ await self.get_all_output()
expected_duration_attributes = {
"http.method": "GET",
"http.host": "127.0.0.1",
@@ -1337,7 +1363,7 @@ def test_basic_metric_success(self):
)
self.assertEqual(point.value, 0)
- def test_basic_metric_success_nonrecording_span(self):
+ async def test_basic_metric_success_nonrecording_span(self):
mock_tracer = mock.Mock()
mock_span = mock.Mock()
mock_span.is_recording.return_value = False
@@ -1351,8 +1377,9 @@ def test_basic_metric_success_nonrecording_span(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
start = default_timer()
- self.send_default_request()
+ await self.send_default_request()
duration = max(round((default_timer() - start) * 1000), 0)
+ await self.get_all_output()
expected_duration_attributes = {
"http.method": "GET",
"http.host": "127.0.0.1",
@@ -1381,7 +1408,7 @@ def test_basic_metric_success_nonrecording_span(self):
self.assertEqual(point.count, 1)
if metric.name == "http.server.duration":
self.assertAlmostEqual(
- duration, point.sum, delta=5
+ duration, point.sum, delta=15
)
elif (
metric.name == "http.server.response.size"
@@ -1396,12 +1423,13 @@ def test_basic_metric_success_nonrecording_span(self):
)
self.assertEqual(point.value, 0)
- def test_basic_metric_success_new_semconv(self):
+ async def test_basic_metric_success_new_semconv(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
start = default_timer()
- self.send_default_request()
+ await self.send_default_request()
duration_s = max(default_timer() - start, 0)
+ await self.get_all_output()
expected_duration_attributes = {
"http.request.method": "GET",
"url.scheme": "http",
@@ -1443,13 +1471,14 @@ def test_basic_metric_success_new_semconv(self):
)
self.assertEqual(point.value, 0)
- def test_basic_metric_success_both_semconv(self):
+ async def test_basic_metric_success_both_semconv(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
start = default_timer()
- self.send_default_request()
+ await self.send_default_request()
duration = max(round((default_timer() - start) * 1000), 0)
duration_s = max(default_timer() - start, 0)
+ await self.get_all_output()
expected_duration_attributes_old = {
"http.method": "GET",
"http.host": "127.0.0.1",
@@ -1531,7 +1560,7 @@ def test_basic_metric_success_both_semconv(self):
)
self.assertEqual(point.value, 0)
- def test_metric_target_attribute(self):
+ async def test_metric_target_attribute(self):
expected_target = "/api/user/{id}"
class TestRoute:
@@ -1547,7 +1576,8 @@ async def target_asgi(scope, receive, send):
app = otel_asgi.OpenTelemetryMiddleware(target_asgi)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
metrics_list = self.memory_metrics_reader.get_metrics_data()
assertions = 0
for resource_metric in metrics_list.resource_metrics:
@@ -1564,7 +1594,7 @@ async def target_asgi(scope, receive, send):
assertions += 1
self.assertEqual(assertions, 3)
- def test_no_metric_for_websockets(self):
+ async def test_no_metric_for_websockets(self):
self.scope = {
"type": "websocket",
"http_version": "1.1",
@@ -1577,10 +1607,10 @@ def test_no_metric_for_websockets(self):
}
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
- self.send_input({"type": "websocket.connect"})
- self.send_input({"type": "websocket.receive", "text": "ping"})
- self.send_input({"type": "websocket.disconnect"})
- self.get_all_output()
+ await self.send_input({"type": "websocket.connect"})
+ await self.send_input({"type": "websocket.receive", "text": "ping"})
+ await self.send_input({"type": "websocket.disconnect"})
+ await self.get_all_output()
self.assertIsNone(self.memory_metrics_reader.get_metrics_data())
@@ -1629,7 +1659,6 @@ def test_request_attributes_new_semconv(self):
attrs,
{
HTTP_REQUEST_METHOD: "GET",
- SERVER_ADDRESS: "127.0.0.1",
URL_PATH: "/",
URL_QUERY: "foo=bar",
SERVER_PORT: 80,
@@ -1665,7 +1694,6 @@ def test_request_attributes_both_semconv(self):
SpanAttributes.NET_PEER_IP: "127.0.0.1",
SpanAttributes.NET_PEER_PORT: 32767,
HTTP_REQUEST_METHOD: "GET",
- SERVER_ADDRESS: "127.0.0.1",
URL_PATH: "/",
URL_QUERY: "foo=bar",
SERVER_PORT: 80,
@@ -1690,7 +1718,7 @@ def test_query_string_new_semconv(self):
_HTTPStabilityMode.HTTP,
)
self.assertEqual(attrs[URL_SCHEME], "http")
- self.assertEqual(attrs[SERVER_ADDRESS], "127.0.0.1")
+ self.assertEqual(attrs[CLIENT_ADDRESS], "127.0.0.1")
self.assertEqual(attrs[URL_PATH], "/")
self.assertEqual(attrs[URL_QUERY], "foo=bar")
@@ -1704,7 +1732,7 @@ def test_query_string_both_semconv(self):
attrs[SpanAttributes.HTTP_URL], "http://127.0.0.1/?foo=bar"
)
self.assertEqual(attrs[URL_SCHEME], "http")
- self.assertEqual(attrs[SERVER_ADDRESS], "127.0.0.1")
+ self.assertEqual(attrs[CLIENT_ADDRESS], "127.0.0.1")
self.assertEqual(attrs[URL_PATH], "/")
self.assertEqual(attrs[URL_QUERY], "foo=bar")
@@ -1799,8 +1827,10 @@ def test_collect_target_attribute_fastapi_starlette_invalid(self):
)
-class TestWrappedApplication(AsgiTestBase):
- def test_mark_span_internal_in_presence_of_span_from_other_framework(self):
+class TestWrappedApplication(AsyncAsgiTestBase):
+ async def test_mark_span_internal_in_presence_of_span_from_other_framework(
+ self,
+ ):
tracer_provider, exporter = TestBase.create_tracer_provider()
tracer = tracer_provider.get_tracer(__name__)
app = otel_asgi.OpenTelemetryMiddleware(
@@ -1815,7 +1845,8 @@ async def wrapped_app(scope, receive, send):
await app(scope, receive, send)
self.seed_app(wrapped_app)
- self.send_default_request()
+ await self.send_default_request()
+ await self.get_all_output()
span_list = exporter.get_finished_spans()
self.assertEqual(SpanKind.INTERNAL, span_list[0].kind)
@@ -1832,11 +1863,11 @@ async def wrapped_app(scope, receive, send):
)
-class TestAsgiApplicationRaisingError(AsgiTestBase):
+class TestAsgiApplicationRaisingError(AsyncAsgiTestBase):
def tearDown(self):
pass
- def test_asgi_issue_1883(self):
+ async def test_asgi_value_error_exception(self):
"""
Test that exception UnboundLocalError local variable 'start' referenced before assignment is not raised
See https://github.com/open-telemetry/opentelemetry-python-contrib/issues/1883
@@ -1847,11 +1878,9 @@ async def bad_app(_scope, _receive, _send):
app = otel_asgi.OpenTelemetryMiddleware(bad_app)
self.seed_app(app)
- self.send_default_request()
+ await self.send_default_request()
try:
- asyncio.get_event_loop().run_until_complete(
- self.communicator.stop()
- )
+ await self.communicator.wait()
except ValueError as exc_info:
self.assertEqual(exc_info.args[0], "whatever")
except Exception as exc_info: # pylint: disable=W0703
diff --git a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_getter.py b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_getter.py
index 26bb652b50..3f76e0e5ce 100644
--- a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_getter.py
+++ b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_getter.py
@@ -69,3 +69,13 @@ def test_keys(self):
expected_val,
"Should be equal",
)
+
+ def test_non_utf8_headers(self):
+ getter = ASGIGetter()
+ carrier = {"headers": [(b"test-key", b"Moto Z\xb2")]}
+ expected_val = ["Moto Z²"]
+ self.assertEqual(
+ getter.get(carrier, "test-key"),
+ expected_val,
+ "Should be equal",
+ )
diff --git a/instrumentation/opentelemetry-instrumentation-asyncio/pyproject.toml b/instrumentation/opentelemetry-instrumentation-asyncio/pyproject.toml
index cda5403ef5..36ed960392 100644
--- a/instrumentation/opentelemetry-instrumentation-asyncio/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-asyncio/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.14",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/__init__.py b/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/__init__.py
index ae10560861..e83f384a8c 100644
--- a/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/__init__.py
@@ -14,7 +14,7 @@
"""
.. asyncio: https://github.com/python/asyncio
-The opentelemetry-instrumentation-asycnio package allows tracing asyncio applications.
+The opentelemetry-instrumentation-asyncio package allows tracing asyncio applications.
The metric for coroutine, future, is generated even if there is no setting to generate a span.
Run instrumented application
diff --git a/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/version.py b/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/version.py
+++ b/instrumentation/opentelemetry-instrumentation-asyncio/src/opentelemetry/instrumentation/asyncio/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-asyncio/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-asyncio/test-requirements.txt
index a196e8d4e3..190e1cbe02 100644
--- a/instrumentation/opentelemetry-instrumentation-asyncio/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-asyncio/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
pytest-asyncio==0.23.5
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-asyncpg/pyproject.toml b/instrumentation/opentelemetry-instrumentation-asyncpg/pyproject.toml
index 820c86070d..5a6632a028 100644
--- a/instrumentation/opentelemetry-instrumentation-asyncpg/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-asyncpg/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-asyncpg/src/opentelemetry/instrumentation/asyncpg/version.py b/instrumentation/opentelemetry-instrumentation-asyncpg/src/opentelemetry/instrumentation/asyncpg/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-asyncpg/src/opentelemetry/instrumentation/asyncpg/version.py
+++ b/instrumentation/opentelemetry-instrumentation-asyncpg/src/opentelemetry/instrumentation/asyncpg/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt
index badc61cde8..bb41329e66 100644
--- a/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-asyncpg/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
async-timeout==4.0.3
asyncpg==0.29.0
Deprecated==1.2.14
@@ -9,7 +9,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/pyproject.toml b/instrumentation/opentelemetry-instrumentation-aws-lambda/pyproject.toml
index b512faa3eb..debc3ce033 100644
--- a/instrumentation/opentelemetry-instrumentation-aws-lambda/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/pyproject.toml
@@ -25,9 +25,9 @@ classifiers = [
"Programming Language :: Python :: 3.12",
]
dependencies = [
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
"opentelemetry-propagator-aws-xray ~= 1.0.1",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/version.py b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/version.py
+++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-aws-lambda/test-requirements.txt
index 6540349a2e..a80527dd36 100644
--- a/instrumentation/opentelemetry-instrumentation-aws-lambda/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-boto/pyproject.toml b/instrumentation/opentelemetry-instrumentation-boto/pyproject.toml
index 3abda7b175..a2bdba302f 100644
--- a/instrumentation/opentelemetry-instrumentation-boto/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-boto/pyproject.toml
@@ -25,8 +25,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-boto/src/opentelemetry/instrumentation/boto/version.py b/instrumentation/opentelemetry-instrumentation-boto/src/opentelemetry/instrumentation/boto/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-boto/src/opentelemetry/instrumentation/boto/version.py
+++ b/instrumentation/opentelemetry-instrumentation-boto/src/opentelemetry/instrumentation/boto/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-boto/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-boto/test-requirements.txt
index ab4819b538..bb56100ecb 100644
--- a/instrumentation/opentelemetry-instrumentation-boto/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-boto/test-requirements.txt
@@ -1,9 +1,9 @@
-asgiref==3.7.2
+asgiref==3.8.1
boto==2.49.0
boto3==1.34.44
botocore==1.34.44
certifi==2024.7.4
-cffi==1.16.0
+cffi==1.17.0
charset-normalizer==3.3.2
cryptography==42.0.5
Deprecated==1.2.14
@@ -28,7 +28,7 @@ responses==0.25.0
s3transfer==0.10.0
six==1.16.0
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
urllib3==1.26.19
Werkzeug==2.3.8
wrapt==1.16.0
diff --git a/instrumentation/opentelemetry-instrumentation-boto3sqs/pyproject.toml b/instrumentation/opentelemetry-instrumentation-boto3sqs/pyproject.toml
index cbbf9cd679..72dc38cbec 100644
--- a/instrumentation/opentelemetry-instrumentation-boto3sqs/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-boto3sqs/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-boto3sqs/src/opentelemetry/instrumentation/boto3sqs/version.py b/instrumentation/opentelemetry-instrumentation-boto3sqs/src/opentelemetry/instrumentation/boto3sqs/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-boto3sqs/src/opentelemetry/instrumentation/boto3sqs/version.py
+++ b/instrumentation/opentelemetry-instrumentation-boto3sqs/src/opentelemetry/instrumentation/boto3sqs/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-boto3sqs/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-boto3sqs/test-requirements.txt
index c5942b6a72..dfa17c79a7 100644
--- a/instrumentation/opentelemetry-instrumentation-boto3sqs/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-boto3sqs/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
boto3==1.34.44
botocore==1.34.44
Deprecated==1.2.14
@@ -13,7 +13,7 @@ python-dateutil==2.8.2
s3transfer==0.10.0
six==1.16.0
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
urllib3==1.26.19
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-botocore/pyproject.toml b/instrumentation/opentelemetry-instrumentation-botocore/pyproject.toml
index f286e7fc7b..797145b728 100644
--- a/instrumentation/opentelemetry-instrumentation-botocore/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-botocore/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"opentelemetry-propagator-aws-xray ~= 1.0.1",
]
diff --git a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/version.py b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/version.py
+++ b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-botocore/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-botocore/test-requirements.txt
index e45fa6ba44..f0ceb9f467 100644
--- a/instrumentation/opentelemetry-instrumentation-botocore/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-botocore/test-requirements.txt
@@ -1,9 +1,9 @@
-asgiref==3.7.2
+asgiref==3.8.1
aws-xray-sdk==2.12.1
boto3==1.28.80
botocore==1.31.80
certifi==2024.7.4
-cffi==1.16.0
+cffi==1.17.0
charset-normalizer==3.3.2
cryptography==42.0.5
Deprecated==1.2.14
@@ -28,7 +28,7 @@ responses==0.25.0
s3transfer==0.7.0
six==1.16.0
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
urllib3==1.26.19
Werkzeug==3.0.3
wrapt==1.16.0
diff --git a/instrumentation/opentelemetry-instrumentation-cassandra/pyproject.toml b/instrumentation/opentelemetry-instrumentation-cassandra/pyproject.toml
index b2ee19bdd2..3e785d1e8b 100644
--- a/instrumentation/opentelemetry-instrumentation-cassandra/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-cassandra/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-cassandra/src/opentelemetry/instrumentation/cassandra/version.py b/instrumentation/opentelemetry-instrumentation-cassandra/src/opentelemetry/instrumentation/cassandra/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-cassandra/src/opentelemetry/instrumentation/cassandra/version.py
+++ b/instrumentation/opentelemetry-instrumentation-cassandra/src/opentelemetry/instrumentation/cassandra/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-cassandra/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-cassandra/test-requirements.txt
index dc2090627d..25bf51f2a5 100644
--- a/instrumentation/opentelemetry-instrumentation-cassandra/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-cassandra/test-requirements.txt
@@ -1,5 +1,6 @@
-asgiref==3.7.2
+asgiref==3.8.1
cassandra-driver==3.29.0
+pyasyncore==1.0.4 # for python 3.13 (should removed when cassandra-driver replaces asyncore with recommended asyncio)
click==8.1.7
Deprecated==1.2.14
geomet==0.2.1.post1
@@ -13,7 +14,7 @@ PyYAML==6.0.1
scylla-driver==3.26.6
six==1.16.0
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-celery/pyproject.toml b/instrumentation/opentelemetry-instrumentation-celery/pyproject.toml
index 0d302a4206..9f0f594581 100644
--- a/instrumentation/opentelemetry-instrumentation-celery/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-celery/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/version.py b/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/version.py
+++ b/instrumentation/opentelemetry-instrumentation-celery/src/opentelemetry/instrumentation/celery/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-celery/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-celery/test-requirements-0.txt
index 401921f5e4..1e018aae6e 100644
--- a/instrumentation/opentelemetry-instrumentation-celery/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-celery/test-requirements-0.txt
@@ -1,5 +1,5 @@
amqp==5.2.0
-asgiref==3.7.2
+asgiref==3.8.1
backports.zoneinfo==0.2.1
billiard==4.2.0
celery==5.3.6
@@ -19,7 +19,7 @@ pytest==7.4.4
python-dateutil==2.8.2
six==1.16.0
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
tzdata==2024.1
vine==5.1.0
wcwidth==0.2.13
diff --git a/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt
index 1c5aad2c07..c7d494aceb 100644
--- a/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-celery/test-requirements-1.txt
@@ -1,5 +1,5 @@
amqp==5.2.0
-asgiref==3.7.2
+asgiref==3.8.1
billiard==4.2.0
celery==5.3.6
click==8.1.7
@@ -18,7 +18,7 @@ pytest==7.4.4
python-dateutil==2.8.2
six==1.16.0
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
tzdata==2024.1
vine==5.1.0
wcwidth==0.2.13
diff --git a/instrumentation/opentelemetry-instrumentation-confluent-kafka/pyproject.toml b/instrumentation/opentelemetry-instrumentation-confluent-kafka/pyproject.toml
index 13433ba9e2..2edfdeb038 100644
--- a/instrumentation/opentelemetry-instrumentation-confluent-kafka/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-confluent-kafka/pyproject.toml
@@ -25,7 +25,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
]
dependencies = [
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
"opentelemetry-api ~= 1.12",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/version.py b/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/version.py
+++ b/instrumentation/opentelemetry-instrumentation-confluent-kafka/src/opentelemetry/instrumentation/confluent_kafka/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt
index 5400e507f5..7f389a12af 100644
--- a/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-confluent-kafka/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
confluent-kafka==2.4.0
Deprecated==1.2.14
importlib-metadata==6.11.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-dbapi/pyproject.toml
index 991c7bb8af..bfa63dbcad 100644
--- a/instrumentation/opentelemetry-instrumentation-dbapi/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-dbapi/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/version.py b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/version.py
index e0bef4b1e3..79e27849a4 100644
--- a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/version.py
+++ b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/version.py
@@ -12,6 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
_instruments = tuple()
diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-dbapi/test-requirements.txt
index 0d98d28069..1275616d45 100644
--- a/instrumentation/opentelemetry-instrumentation-dbapi/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-dbapi/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-django/pyproject.toml b/instrumentation/opentelemetry-instrumentation-django/pyproject.toml
index a8b53820bc..27cdf157c4 100644
--- a/instrumentation/opentelemetry-instrumentation-django/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-django/pyproject.toml
@@ -26,15 +26,15 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-wsgi == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-wsgi == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
asgi = [
- "opentelemetry-instrumentation-asgi == 0.48b0.dev",
+ "opentelemetry-instrumentation-asgi == 0.49b0.dev",
]
instruments = [
"django >= 1.10",
diff --git a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py
index 651df12043..d37c45993c 100644
--- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py
@@ -344,7 +344,7 @@ def _instrument(self, **kwargs):
_DjangoMiddleware._duration_histogram_old = meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="Duration of HTTP server requests.",
+ description="Measures the duration of inbound HTTP requests.",
)
_DjangoMiddleware._duration_histogram_new = None
if _report_new(sem_conv_opt_in_mode):
diff --git a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/version.py b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/version.py
+++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-django/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-django/test-requirements-0.txt
index 5f22f2cadb..6c1b8337a4 100644
--- a/instrumentation/opentelemetry-instrumentation-django/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-django/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
Django==2.2.28
importlib-metadata==6.11.0
@@ -10,7 +10,7 @@ pytest==7.4.4
pytz==2024.1
sqlparse==0.5.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt
index 0a042a1bf5..357fd273f5 100644
--- a/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-django/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
Django==3.2.25
importlib-metadata==6.11.0
@@ -10,7 +10,7 @@ pytest==7.4.4
pytz==2024.1
sqlparse==0.5.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-django/test-requirements-2.txt b/instrumentation/opentelemetry-instrumentation-django/test-requirements-2.txt
index 4f49efb39e..1d15b1336b 100644
--- a/instrumentation/opentelemetry-instrumentation-django/test-requirements-2.txt
+++ b/instrumentation/opentelemetry-instrumentation-django/test-requirements-2.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
backports.zoneinfo==0.2.1
Deprecated==1.2.14
Django==4.2.15
@@ -10,7 +10,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
sqlparse==0.5.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-django/test-requirements-3.txt b/instrumentation/opentelemetry-instrumentation-django/test-requirements-3.txt
index 9be1266014..fa483e5ade 100644
--- a/instrumentation/opentelemetry-instrumentation-django/test-requirements-3.txt
+++ b/instrumentation/opentelemetry-instrumentation-django/test-requirements-3.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
Django==4.2.15
importlib-metadata==6.11.0
@@ -9,7 +9,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
sqlparse==0.5.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-elasticsearch/pyproject.toml b/instrumentation/opentelemetry-instrumentation-elasticsearch/pyproject.toml
index 29d7bec6cc..e086d2c335 100644
--- a/instrumentation/opentelemetry-instrumentation-elasticsearch/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-elasticsearch/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-elasticsearch/src/opentelemetry/instrumentation/elasticsearch/version.py b/instrumentation/opentelemetry-instrumentation-elasticsearch/src/opentelemetry/instrumentation/elasticsearch/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-elasticsearch/src/opentelemetry/instrumentation/elasticsearch/version.py
+++ b/instrumentation/opentelemetry-instrumentation-elasticsearch/src/opentelemetry/instrumentation/elasticsearch/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-0.txt
index 07ea98e4d6..977a440c85 100644
--- a/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
elasticsearch==6.8.2
elasticsearch-dsl==6.4.0
@@ -11,7 +11,7 @@ pytest==7.4.4
python-dateutil==2.8.2
six==1.16.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
urllib3==1.26.19
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-1.txt
index 228601485d..44451736c8 100644
--- a/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
elasticsearch==7.17.9
elasticsearch-dsl==7.4.1
@@ -11,7 +11,7 @@ pytest==7.4.4
python-dateutil==2.8.2
six==1.16.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
urllib3==1.26.19
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-2.txt b/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-2.txt
index 272675c119..a02a9c0270 100644
--- a/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-2.txt
+++ b/instrumentation/opentelemetry-instrumentation-elasticsearch/test-requirements-2.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
elasticsearch==8.13.1
elasticsearch-dsl==8.13.1
@@ -12,7 +12,7 @@ pytest==7.4.4
python-dateutil==2.8.2
six==1.16.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
urllib3==2.2.2
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-falcon/pyproject.toml b/instrumentation/opentelemetry-instrumentation-falcon/pyproject.toml
index 6f505f60ae..f118ff4296 100644
--- a/instrumentation/opentelemetry-instrumentation-falcon/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-falcon/pyproject.toml
@@ -26,10 +26,10 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-wsgi == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-wsgi == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
"packaging >= 20.0",
]
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 1a252b9a16..2dce5f1ef5 100644
--- a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py
@@ -268,7 +268,7 @@ def __init__(self, *args, **kwargs):
self.duration_histogram = self._otel_meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="Duration of HTTP server requests.",
+ description="Measures the duration of inbound HTTP requests.",
)
self.active_requests_counter = self._otel_meter.create_up_down_counter(
name=MetricInstruments.HTTP_SERVER_ACTIVE_REQUESTS,
diff --git a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/version.py b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/version.py
+++ b/instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-0.txt
index d0f6381b42..11a84eef70 100644
--- a/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
falcon==1.4.1
importlib-metadata==6.11.0
@@ -10,7 +10,7 @@ pytest==7.4.4
python-mimeparse==1.6.0
six==1.16.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-1.txt
index 5a84f224f1..9d646f3bbb 100644
--- a/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
falcon==2.0.0
importlib-metadata==6.11.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-2.txt b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-2.txt
index 0790e8a4cb..d2a921eb87 100644
--- a/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-2.txt
+++ b/instrumentation/opentelemetry-instrumentation-falcon/test-requirements-2.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
falcon==3.1.1
importlib-metadata==6.11.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml
index 3017dc040a..89f6602e86 100644
--- a/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml
@@ -26,10 +26,10 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-asgi == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-asgi == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
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 37a293764e..7e4d0aac07 100644
--- a/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/__init__.py
@@ -179,7 +179,7 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A
from __future__ import annotations
import logging
-from typing import Collection
+from typing import Collection, Literal
import fastapi
from starlette.routing import Match
@@ -222,7 +222,7 @@ class FastAPIInstrumentor(BaseInstrumentor):
@staticmethod
def instrument_app(
- app: fastapi.FastAPI,
+ app,
server_request_hook: ServerRequestHook = None,
client_request_hook: ClientRequestHook = None,
client_response_hook: ClientResponseHook = None,
@@ -232,8 +232,28 @@ def instrument_app(
http_capture_headers_server_request: list[str] | None = None,
http_capture_headers_server_response: list[str] | None = None,
http_capture_headers_sanitize_fields: list[str] | None = None,
+ exclude_spans: list[Literal["receive", "send"]] | None = None,
):
- """Instrument an uninstrumented FastAPI application."""
+ """Instrument an uninstrumented FastAPI application.
+
+ Args:
+ app: The fastapi ASGI application callable to forward requests to.
+ server_request_hook: Optional callback which is called with the server span and ASGI
+ scope object for every incoming request.
+ client_request_hook: Optional callback which is called with the internal span, and ASGI
+ scope and event which are sent as dictionaries for when the method receive is called.
+ client_response_hook: Optional callback which is called with the internal span, and ASGI
+ scope and event which are sent as dictionaries for when the method send is called.
+ tracer_provider: The optional tracer provider to use. If omitted
+ the current globally configured one is used.
+ meter_provider: The optional meter provider to use. If omitted
+ the current globally configured one is used.
+ excluded_urls: Optional comma delimited string of regexes to match URLs that should not be traced.
+ http_capture_headers_server_request: Optional list of HTTP headers to capture from the request.
+ http_capture_headers_server_response: Optional list of HTTP headers to capture from the response.
+ http_capture_headers_sanitize_fields: Optional list of HTTP headers to sanitize.
+ exclude_spans: Optionally exclude HTTP `send` and/or `receive` spans from the trace.
+ """
if not hasattr(app, "_is_instrumented_by_opentelemetry"):
app._is_instrumented_by_opentelemetry = False
@@ -273,6 +293,7 @@ def instrument_app(
http_capture_headers_server_request=http_capture_headers_server_request,
http_capture_headers_server_response=http_capture_headers_server_response,
http_capture_headers_sanitize_fields=http_capture_headers_sanitize_fields,
+ exclude_spans=exclude_spans,
)
app._is_instrumented_by_opentelemetry = True
if app not in _InstrumentedFastAPI._instrumented_fastapi_apps:
@@ -323,6 +344,7 @@ def _instrument(self, **kwargs):
else parse_excluded_urls(_excluded_urls)
)
_InstrumentedFastAPI._meter_provider = kwargs.get("meter_provider")
+ _InstrumentedFastAPI._exclude_spans = kwargs.get("exclude_spans")
fastapi.FastAPI = _InstrumentedFastAPI
def _uninstrument(self, **kwargs):
@@ -373,6 +395,7 @@ def __init__(self, *args, **kwargs):
http_capture_headers_server_request=_InstrumentedFastAPI._http_capture_headers_server_request,
http_capture_headers_server_response=_InstrumentedFastAPI._http_capture_headers_server_response,
http_capture_headers_sanitize_fields=_InstrumentedFastAPI._http_capture_headers_sanitize_fields,
+ exclude_spans=_InstrumentedFastAPI._exclude_spans,
)
self._is_instrumented_by_opentelemetry = True
_InstrumentedFastAPI._instrumented_fastapi_apps.add(self)
diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/version.py b/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/version.py
+++ b/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-fastapi/test-requirements.txt
index 00242d5410..0417301559 100644
--- a/instrumentation/opentelemetry-instrumentation-fastapi/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-fastapi/test-requirements.txt
@@ -1,6 +1,6 @@
-annotated-types==0.6.0
+annotated-types==0.7.0
anyio==4.3.0
-asgiref==3.7.2
+asgiref==3.8.1
certifi==2024.7.4
charset-normalizer==3.3.2
Deprecated==1.2.14
@@ -15,14 +15,14 @@ iniconfig==2.0.0
packaging==24.0
pluggy==1.5.0
py-cpuinfo==9.0.0
-pydantic==2.6.2
-pydantic_core==2.16.3
+pydantic==2.8.2
+pydantic_core==2.20.1
pytest==7.4.4
requests==2.32.3
sniffio==1.3.0
starlette==0.36.3
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
urllib3==2.2.2
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py b/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py
index 91ed514096..b8a6ef010e 100644
--- a/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py
+++ b/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py
@@ -16,12 +16,13 @@
import unittest
from timeit import default_timer
-from unittest.mock import patch
+from unittest.mock import Mock, patch
import fastapi
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
from fastapi.responses import JSONResponse
from fastapi.testclient import TestClient
+from pkg_resources import DistributionNotFound, iter_entry_points
import opentelemetry.instrumentation.fastapi as otel_fastapi
from opentelemetry import trace
@@ -34,6 +35,9 @@
_server_duration_attrs_old,
)
from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware
+from opentelemetry.instrumentation.auto_instrumentation._load import (
+ _load_instrumentors,
+)
from opentelemetry.sdk.metrics.export import (
HistogramDataPoint,
NumberDataPoint,
@@ -530,7 +534,7 @@ def test_basic_metric_success(self):
dict(point.attributes),
)
self.assertEqual(point.count, 1)
- self.assertAlmostEqual(duration, point.sum, delta=40)
+ self.assertAlmostEqual(duration, point.sum, delta=350)
if isinstance(point, NumberDataPoint):
self.assertDictEqual(
expected_requests_count_attributes,
@@ -565,7 +569,9 @@ def test_basic_metric_success_new_semconv(self):
)
self.assertEqual(point.count, 1)
if metric.name == "http.server.request.duration":
- self.assertAlmostEqual(duration_s, point.sum, places=1)
+ self.assertAlmostEqual(
+ duration_s * 0.1, point.sum, places=1
+ )
elif metric.name == "http.server.response.body.size":
self.assertEqual(25, point.sum)
elif metric.name == "http.server.request.body.size":
@@ -615,9 +621,11 @@ def test_basic_metric_success_both_semconv(self):
for point in list(metric.data.data_points):
if isinstance(point, HistogramDataPoint):
self.assertEqual(point.count, 1)
- self.assertAlmostEqual(duration, point.sum, delta=40)
+ self.assertAlmostEqual(duration, point.sum, delta=350)
if metric.name == "http.server.request.duration":
- self.assertAlmostEqual(duration_s, point.sum, places=1)
+ self.assertAlmostEqual(
+ duration_s * 0.1, point.sum, places=1
+ )
self.assertDictEqual(
expected_duration_attributes_new,
dict(point.attributes),
@@ -635,7 +643,7 @@ def test_basic_metric_success_both_semconv(self):
dict(point.attributes),
)
elif metric.name == "http.server.duration":
- self.assertAlmostEqual(duration, point.sum, delta=40)
+ self.assertAlmostEqual(duration, point.sum, delta=350)
self.assertDictEqual(
expected_duration_attributes_old,
dict(point.attributes),
@@ -691,7 +699,7 @@ def test_basic_metric_nonstandard_http_method_success(self):
dict(point.attributes),
)
self.assertEqual(point.count, 1)
- self.assertAlmostEqual(duration, point.sum, delta=40)
+ self.assertAlmostEqual(duration, point.sum, delta=350)
if isinstance(point, NumberDataPoint):
self.assertDictEqual(
expected_requests_count_attributes,
@@ -726,7 +734,9 @@ def test_basic_metric_nonstandard_http_method_success_new_semconv(self):
)
self.assertEqual(point.count, 1)
if metric.name == "http.server.request.duration":
- self.assertAlmostEqual(duration_s, point.sum, places=1)
+ self.assertAlmostEqual(
+ duration_s * 0.1, point.sum, places=1
+ )
elif metric.name == "http.server.response.body.size":
self.assertEqual(31, point.sum)
elif metric.name == "http.server.request.body.size":
@@ -777,7 +787,9 @@ def test_basic_metric_nonstandard_http_method_success_both_semconv(self):
if isinstance(point, HistogramDataPoint):
self.assertEqual(point.count, 1)
if metric.name == "http.server.request.duration":
- self.assertAlmostEqual(duration_s, point.sum, places=1)
+ self.assertAlmostEqual(
+ duration_s * 0.1, point.sum, places=1
+ )
self.assertDictEqual(
expected_duration_attributes_new,
dict(point.attributes),
@@ -795,7 +807,7 @@ def test_basic_metric_nonstandard_http_method_success_both_semconv(self):
dict(point.attributes),
)
elif metric.name == "http.server.duration":
- self.assertAlmostEqual(duration, point.sum, delta=40)
+ self.assertAlmostEqual(duration, point.sum, delta=350)
self.assertDictEqual(
expected_duration_attributes_old,
dict(point.attributes),
@@ -836,7 +848,7 @@ def test_basic_post_request_metric_success(self):
if isinstance(point, HistogramDataPoint):
self.assertEqual(point.count, 1)
if metric.name == "http.server.duration":
- self.assertAlmostEqual(duration, point.sum, delta=40)
+ self.assertAlmostEqual(duration, point.sum, delta=350)
elif metric.name == "http.server.response.size":
self.assertEqual(response_size, point.sum)
elif metric.name == "http.server.request.size":
@@ -861,7 +873,9 @@ def test_basic_post_request_metric_success_new_semconv(self):
if isinstance(point, HistogramDataPoint):
self.assertEqual(point.count, 1)
if metric.name == "http.server.request.duration":
- self.assertAlmostEqual(duration_s, point.sum, places=1)
+ self.assertAlmostEqual(
+ duration_s * 0.1, point.sum, places=1
+ )
elif metric.name == "http.server.response.body.size":
self.assertEqual(response_size, point.sum)
elif metric.name == "http.server.request.body.size":
@@ -887,13 +901,15 @@ def test_basic_post_request_metric_success_both_semconv(self):
if isinstance(point, HistogramDataPoint):
self.assertEqual(point.count, 1)
if metric.name == "http.server.request.duration":
- self.assertAlmostEqual(duration_s, point.sum, places=1)
+ self.assertAlmostEqual(
+ duration_s * 0.1, point.sum, places=1
+ )
elif metric.name == "http.server.response.body.size":
self.assertEqual(response_size, point.sum)
elif metric.name == "http.server.request.body.size":
self.assertEqual(request_size, point.sum)
elif metric.name == "http.server.duration":
- self.assertAlmostEqual(duration, point.sum, delta=40)
+ self.assertAlmostEqual(duration, point.sum, delta=350)
elif metric.name == "http.server.response.size":
self.assertEqual(response_size, point.sum)
elif metric.name == "http.server.request.size":
@@ -1012,6 +1028,18 @@ def client_response_hook(send_span, scope, message):
)
+def get_distribution_with_fastapi(*args, **kwargs):
+ dist = args[0]
+ if dist == "fastapi~=0.58":
+ # Value does not matter. Only whether an exception is thrown
+ return None
+ raise DistributionNotFound()
+
+
+def get_distribution_without_fastapi(*args, **kwargs):
+ raise DistributionNotFound()
+
+
class TestAutoInstrumentation(TestBaseAutoFastAPI):
"""Test the auto-instrumented variant
@@ -1019,6 +1047,46 @@ class TestAutoInstrumentation(TestBaseAutoFastAPI):
to both.
"""
+ def test_entry_point_exists(self):
+ eps = iter_entry_points("opentelemetry_instrumentor")
+ ep = next(eps)
+ self.assertEqual(ep.dist.key, "opentelemetry-instrumentation-fastapi")
+ self.assertEqual(
+ ep.module_name, "opentelemetry.instrumentation.fastapi"
+ )
+ self.assertEqual(ep.attrs, ("FastAPIInstrumentor",))
+ self.assertEqual(ep.name, "fastapi")
+ self.assertIsNone(next(eps, None))
+
+ @patch("opentelemetry.instrumentation.dependencies.get_distribution")
+ def test_instruments_with_fastapi_installed(self, mock_get_distribution):
+ mock_get_distribution.side_effect = get_distribution_with_fastapi
+ mock_distro = Mock()
+ _load_instrumentors(mock_distro)
+ mock_get_distribution.assert_called_once_with("fastapi~=0.58")
+ self.assertEqual(len(mock_distro.load_instrumentor.call_args_list), 1)
+ args = mock_distro.load_instrumentor.call_args.args
+ ep = args[0]
+ self.assertEqual(ep.dist.key, "opentelemetry-instrumentation-fastapi")
+ self.assertEqual(
+ ep.module_name, "opentelemetry.instrumentation.fastapi"
+ )
+ self.assertEqual(ep.attrs, ("FastAPIInstrumentor",))
+ self.assertEqual(ep.name, "fastapi")
+
+ @patch("opentelemetry.instrumentation.dependencies.get_distribution")
+ def test_instruments_without_fastapi_installed(
+ self, mock_get_distribution
+ ):
+ mock_get_distribution.side_effect = get_distribution_without_fastapi
+ mock_distro = Mock()
+ _load_instrumentors(mock_distro)
+ mock_get_distribution.assert_called_once_with("fastapi~=0.58")
+ with self.assertRaises(DistributionNotFound):
+ mock_get_distribution("fastapi~=0.58")
+ self.assertEqual(len(mock_distro.load_instrumentor.call_args_list), 0)
+ mock_distro.load_instrumentor.assert_not_called()
+
def _create_app(self):
# instrumentation is handled by the instrument call
resource = Resource.create({"key1": "value1", "key2": "value2"})
diff --git a/instrumentation/opentelemetry-instrumentation-flask/pyproject.toml b/instrumentation/opentelemetry-instrumentation-flask/pyproject.toml
index ffafdbacc6..0e74ca331f 100644
--- a/instrumentation/opentelemetry-instrumentation-flask/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-flask/pyproject.toml
@@ -26,10 +26,10 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-wsgi == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-wsgi == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
"packaging >= 21.0",
"importlib-metadata >= 4.0",
]
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 0093715ae1..192e044655 100644
--- a/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/__init__.py
@@ -568,14 +568,14 @@ def __init__(self, *args, **kwargs):
duration_histogram_old = meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="measures the duration of the inbound HTTP request",
+ description="Measures the duration of inbound HTTP requests.",
)
duration_histogram_new = None
if _report_new(_InstrumentedFlask._sem_conv_opt_in_mode):
duration_histogram_new = meter.create_histogram(
name=HTTP_SERVER_REQUEST_DURATION,
unit="s",
- description="measures the duration of the inbound HTTP request",
+ description="Duration of HTTP server requests.",
)
active_requests_counter = meter.create_up_down_counter(
name=MetricInstruments.HTTP_SERVER_ACTIVE_REQUESTS,
@@ -701,14 +701,14 @@ def instrument_app(
duration_histogram_old = meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="measures the duration of the inbound HTTP request",
+ description="Measures the duration of inbound HTTP requests.",
)
duration_histogram_new = None
if _report_new(sem_conv_opt_in_mode):
duration_histogram_new = meter.create_histogram(
name=HTTP_SERVER_REQUEST_DURATION,
unit="s",
- description="measures the duration of the inbound HTTP request",
+ description="Duration of HTTP server requests.",
)
active_requests_counter = meter.create_up_down_counter(
name=MetricInstruments.HTTP_SERVER_ACTIVE_REQUESTS,
diff --git a/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/version.py b/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/version.py
+++ b/instrumentation/opentelemetry-instrumentation-flask/src/opentelemetry/instrumentation/flask/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-flask/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-flask/test-requirements-0.txt
index a222e011a7..e6fa669267 100644
--- a/instrumentation/opentelemetry-instrumentation-flask/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-flask/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
click==8.1.7
Deprecated==1.2.14
Flask==2.1.3
@@ -12,7 +12,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
Werkzeug==2.3.8
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-flask/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-flask/test-requirements-1.txt
index e799218273..ecd3f680d8 100644
--- a/instrumentation/opentelemetry-instrumentation-flask/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-flask/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
click==8.1.7
Deprecated==1.2.14
Flask==2.2.0
@@ -12,7 +12,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
Werkzeug==2.3.8
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-flask/test-requirements-2.txt b/instrumentation/opentelemetry-instrumentation-flask/test-requirements-2.txt
index 91ae64700c..da044a29e9 100644
--- a/instrumentation/opentelemetry-instrumentation-flask/test-requirements-2.txt
+++ b/instrumentation/opentelemetry-instrumentation-flask/test-requirements-2.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
blinker==1.7.0
click==8.1.7
Deprecated==1.2.14
@@ -13,7 +13,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
Werkzeug==3.0.3
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-flask/tests/test_programmatic.py b/instrumentation/opentelemetry-instrumentation-flask/tests/test_programmatic.py
index 4458daae21..e6bc8202df 100644
--- a/instrumentation/opentelemetry-instrumentation-flask/tests/test_programmatic.py
+++ b/instrumentation/opentelemetry-instrumentation-flask/tests/test_programmatic.py
@@ -520,7 +520,7 @@ def test_flask_metrics_new_semconv(self):
if isinstance(point, HistogramDataPoint):
self.assertEqual(point.count, 3)
self.assertAlmostEqual(
- duration_s, point.sum, places=2
+ duration_s, point.sum, places=1
)
histogram_data_point_seen = True
if isinstance(point, NumberDataPoint):
diff --git a/instrumentation/opentelemetry-instrumentation-grpc/pyproject.toml b/instrumentation/opentelemetry-instrumentation-grpc/pyproject.toml
index d0a7d54298..fd84d6aac0 100644
--- a/instrumentation/opentelemetry-instrumentation-grpc/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-grpc/pyproject.toml
@@ -26,14 +26,14 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
[project.optional-dependencies]
instruments = [
- "grpcio ~= 1.27",
+ "grpcio >= 1.42.0",
]
[project.entry-points.opentelemetry_instrumentor]
diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/package.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/package.py
index 91bdeab555..66ef914bdb 100644
--- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/package.py
+++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/package.py
@@ -13,4 +13,4 @@
# limitations under the License.
-_instruments = ("grpcio ~= 1.27",)
+_instruments = ("grpcio >= 1.42.0",)
diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/version.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/version.py
+++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-0.txt
index 457c285715..cdea5fca4b 100644
--- a/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
grpcio==1.62.0
importlib-metadata==6.11.0
@@ -9,7 +9,7 @@ protobuf==3.20.3
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt
index 221359e184..9b2d088da3 100644
--- a/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-grpc/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
grpcio==1.63.0
importlib-metadata==6.11.0
@@ -9,7 +9,7 @@ protobuf==3.20.3
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml b/instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml
index 5e4629e281..599091716b 100644
--- a/instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml
@@ -26,9 +26,9 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
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 f2a18a2770..15ee59a183 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,7 @@ async def async_response_hook(span, request, response):
"""
import logging
import typing
+from asyncio import iscoroutinefunction
from types import TracebackType
import httpx
@@ -202,7 +203,7 @@ async def async_response_hook(span, request, response):
_OpenTelemetrySemanticConventionStability,
_OpenTelemetryStabilitySignalType,
_report_new,
- _set_http_host,
+ _set_http_host_client,
_set_http_method,
_set_http_network_protocol_version,
_set_http_peer_port_client,
@@ -342,7 +343,7 @@ def _apply_request_client_attributes_to_span(
if _report_new(semconv):
if url.host:
# http semconv transition: http.host -> server.address
- _set_http_host(span_attributes, url.host, semconv)
+ _set_http_host_client(span_attributes, url.host, semconv)
# http semconv transition: net.sock.peer.addr -> network.peer.address
span_attributes[NETWORK_PEER_ADDRESS] = url.host
if url.port:
@@ -731,15 +732,19 @@ def _instrument(self, **kwargs):
self._original_async_client = httpx.AsyncClient
request_hook = kwargs.get("request_hook")
response_hook = kwargs.get("response_hook")
- async_request_hook = kwargs.get("async_request_hook", request_hook)
- async_response_hook = kwargs.get("async_response_hook", response_hook)
+ async_request_hook = kwargs.get("async_request_hook")
+ async_response_hook = kwargs.get("async_response_hook")
if callable(request_hook):
_InstrumentedClient._request_hook = request_hook
- if callable(async_request_hook):
+ if callable(async_request_hook) and iscoroutinefunction(
+ async_request_hook
+ ):
_InstrumentedAsyncClient._request_hook = async_request_hook
if callable(response_hook):
_InstrumentedClient._response_hook = response_hook
- if callable(async_response_hook):
+ if callable(async_response_hook) and iscoroutinefunction(
+ async_response_hook
+ ):
_InstrumentedAsyncClient._response_hook = async_response_hook
tracer_provider = kwargs.get("tracer_provider")
_InstrumentedClient._tracer_provider = tracer_provider
diff --git a/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/version.py b/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/version.py
+++ b/instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-0.txt
index 35ebe6b954..34eac9d10c 100644
--- a/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-0.txt
@@ -1,5 +1,5 @@
anyio==3.7.1
-asgiref==3.7.2
+asgiref==3.8.1
certifi==2024.7.4
Deprecated==1.2.14
exceptiongroup==1.2.0
@@ -17,7 +17,7 @@ respx==0.17.1
rfc3986==1.5.0
sniffio==1.3.1
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-1.txt
index c70677f06b..93b4d024cb 100644
--- a/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-httpx/test-requirements-1.txt
@@ -1,5 +1,5 @@
anyio==4.3.0
-asgiref==3.7.2
+asgiref==3.8.1
certifi==2024.7.4
Deprecated==1.2.14
exceptiongroup==1.2.0
@@ -16,7 +16,7 @@ pytest==7.4.4
respx==0.20.2
sniffio==1.3.1
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-httpx/tests/test_httpx_integration.py b/instrumentation/opentelemetry-instrumentation-httpx/tests/test_httpx_integration.py
index 011b5e57d2..27535800cb 100644
--- a/instrumentation/opentelemetry-instrumentation-httpx/tests/test_httpx_integration.py
+++ b/instrumentation/opentelemetry-instrumentation-httpx/tests/test_httpx_integration.py
@@ -723,6 +723,7 @@ def test_client_mounts_with_instrumented_transport(self):
spans[1].attributes[SpanAttributes.HTTP_URL], https_url
)
+ @mock.patch.dict("os.environ", {"NO_PROXY": ""}, clear=True)
class BaseInstrumentorTest(BaseTest, metaclass=abc.ABCMeta):
@abc.abstractmethod
def create_client(
@@ -780,9 +781,15 @@ def test_custom_tracer_provider(self):
HTTPXClientInstrumentor().uninstrument()
def test_response_hook(self):
+ response_hook_key = (
+ "async_response_hook"
+ if asyncio.iscoroutinefunction(self.response_hook)
+ else "response_hook"
+ )
+ response_hook_kwargs = {response_hook_key: self.response_hook}
HTTPXClientInstrumentor().instrument(
tracer_provider=self.tracer_provider,
- response_hook=self.response_hook,
+ **response_hook_kwargs,
)
client = self.create_client()
result = self.perform_request(self.URL, client=client)
@@ -823,9 +830,15 @@ def test_response_hook_sync_async_kwargs(self):
HTTPXClientInstrumentor().uninstrument()
def test_request_hook(self):
+ request_hook_key = (
+ "async_request_hook"
+ if asyncio.iscoroutinefunction(self.request_hook)
+ else "request_hook"
+ )
+ request_hook_kwargs = {request_hook_key: self.request_hook}
HTTPXClientInstrumentor().instrument(
tracer_provider=self.tracer_provider,
- request_hook=self.request_hook,
+ **request_hook_kwargs,
)
client = self.create_client()
result = self.perform_request(self.URL, client=client)
@@ -1214,3 +1227,36 @@ def test_basic_multiple(self):
self.perform_request(self.URL, client=self.client)
self.perform_request(self.URL, client=self.client2)
self.assert_span(num_spans=2)
+
+ def test_async_response_hook_does_nothing_if_not_coroutine(self):
+ HTTPXClientInstrumentor().instrument(
+ tracer_provider=self.tracer_provider,
+ async_response_hook=_response_hook,
+ )
+ client = self.create_client()
+ result = self.perform_request(self.URL, client=client)
+
+ self.assertEqual(result.text, "Hello!")
+ span = self.assert_span()
+ self.assertEqual(
+ dict(span.attributes),
+ {
+ SpanAttributes.HTTP_METHOD: "GET",
+ SpanAttributes.HTTP_URL: self.URL,
+ SpanAttributes.HTTP_STATUS_CODE: 200,
+ },
+ )
+ HTTPXClientInstrumentor().uninstrument()
+
+ def test_async_request_hook_does_nothing_if_not_coroutine(self):
+ HTTPXClientInstrumentor().instrument(
+ tracer_provider=self.tracer_provider,
+ async_request_hook=_request_hook,
+ )
+ client = self.create_client()
+ result = self.perform_request(self.URL, client=client)
+
+ self.assertEqual(result.text, "Hello!")
+ span = self.assert_span()
+ self.assertEqual(span.name, "GET")
+ HTTPXClientInstrumentor().uninstrument()
diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/pyproject.toml b/instrumentation/opentelemetry-instrumentation-jinja2/pyproject.toml
index f74b8ca488..40159c3485 100644
--- a/instrumentation/opentelemetry-instrumentation-jinja2/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-jinja2/pyproject.toml
@@ -26,7 +26,7 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/version.py b/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/version.py
+++ b/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-jinja2/test-requirements.txt
index 05d94d6fb0..c7a30b8eb5 100644
--- a/instrumentation/opentelemetry-instrumentation-jinja2/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-jinja2/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -9,7 +9,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/tests/test_jinja2.py b/instrumentation/opentelemetry-instrumentation-jinja2/tests/test_jinja2.py
index 26ba98e69b..98344c47e4 100644
--- a/instrumentation/opentelemetry-instrumentation-jinja2/tests/test_jinja2.py
+++ b/instrumentation/opentelemetry-instrumentation-jinja2/tests/test_jinja2.py
@@ -143,7 +143,7 @@ def test_generate_inline_template(self):
def test_file_template_with_root(self):
with self.tracer.start_as_current_span("root"):
loader = jinja2.loaders.FileSystemLoader(TMPL_DIR)
- env = jinja2.Environment(loader=loader)
+ env = jinja2.Environment(loader=loader, autoescape=True)
template = env.get_template("template.html")
self.assertEqual(
template.render(name="Jinja"), "Message: Hello Jinja!"
@@ -164,7 +164,7 @@ def test_file_template_with_root(self):
def test_file_template(self):
loader = jinja2.loaders.FileSystemLoader(TMPL_DIR)
- env = jinja2.Environment(loader=loader)
+ env = jinja2.Environment(loader=loader, autoescape=True)
template = env.get_template("template.html")
self.assertEqual(
template.render(name="Jinja"), "Message: Hello Jinja!"
diff --git a/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml b/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml
index c256c71b94..d47672fa07 100644
--- a/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.5",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/version.py b/instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/version.py
+++ b/instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements-ng.txt b/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements-ng.txt
index 7b587031ec..05e169a7e3 100644
--- a/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements-ng.txt
+++ b/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements-ng.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
diff --git a/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements.txt
index 4adc515de7..a042ce833e 100644
--- a/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-logging/pyproject.toml b/instrumentation/opentelemetry-instrumentation-logging/pyproject.toml
index 2c1b2ad897..62656bea22 100644
--- a/instrumentation/opentelemetry-instrumentation-logging/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-logging/pyproject.toml
@@ -26,7 +26,7 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-logging/src/opentelemetry/instrumentation/logging/version.py b/instrumentation/opentelemetry-instrumentation-logging/src/opentelemetry/instrumentation/logging/version.py
index e0bef4b1e3..79e27849a4 100644
--- a/instrumentation/opentelemetry-instrumentation-logging/src/opentelemetry/instrumentation/logging/version.py
+++ b/instrumentation/opentelemetry-instrumentation-logging/src/opentelemetry/instrumentation/logging/version.py
@@ -12,6 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
_instruments = tuple()
diff --git a/instrumentation/opentelemetry-instrumentation-logging/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-logging/test-requirements.txt
index eca8ce5f34..600d066cc1 100644
--- a/instrumentation/opentelemetry-instrumentation-logging/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-logging/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-mysql/pyproject.toml b/instrumentation/opentelemetry-instrumentation-mysql/pyproject.toml
index 3c7d0c9166..629ab5325e 100644
--- a/instrumentation/opentelemetry-instrumentation-mysql/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-mysql/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-dbapi == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-mysql/src/opentelemetry/instrumentation/mysql/version.py b/instrumentation/opentelemetry-instrumentation-mysql/src/opentelemetry/instrumentation/mysql/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-mysql/src/opentelemetry/instrumentation/mysql/version.py
+++ b/instrumentation/opentelemetry-instrumentation-mysql/src/opentelemetry/instrumentation/mysql/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-0.txt
index 75ee9797b8..22e61d9df3 100644
--- a/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-1.txt
index dd609e594a..1a58c16a05 100644
--- a/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-mysql/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
diff --git a/instrumentation/opentelemetry-instrumentation-mysqlclient/pyproject.toml b/instrumentation/opentelemetry-instrumentation-mysqlclient/pyproject.toml
index 0ede691e36..0cc4553384 100644
--- a/instrumentation/opentelemetry-instrumentation-mysqlclient/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-mysqlclient/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-dbapi == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/version.py b/instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/version.py
+++ b/instrumentation/opentelemetry-instrumentation-mysqlclient/src/opentelemetry/instrumentation/mysqlclient/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-mysqlclient/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-mysqlclient/test-requirements.txt
index 534c7869cb..3dfa1b161d 100644
--- a/instrumentation/opentelemetry-instrumentation-mysqlclient/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-mysqlclient/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pika/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pika/pyproject.toml
index 145439b242..bc01323ee4 100644
--- a/instrumentation/opentelemetry-instrumentation-pika/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-pika/pyproject.toml
@@ -25,7 +25,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
]
dependencies = [
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
"opentelemetry-api ~= 1.5",
"packaging >= 20.0",
"wrapt >= 1.0.0, < 2.0.0",
diff --git a/instrumentation/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/version.py b/instrumentation/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/version.py
+++ b/instrumentation/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-pika/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-pika/test-requirements-0.txt
index cc874af2cc..871d4feac1 100644
--- a/instrumentation/opentelemetry-instrumentation-pika/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-pika/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pika/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-pika/test-requirements-1.txt
index 4a09147744..b1c9e9094f 100644
--- a/instrumentation/opentelemetry-instrumentation-pika/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-pika/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-psycopg/pyproject.toml b/instrumentation/opentelemetry-instrumentation-psycopg/pyproject.toml
index 717257821d..513064ae7f 100644
--- a/instrumentation/opentelemetry-instrumentation-psycopg/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-psycopg/pyproject.toml
@@ -27,8 +27,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-dbapi == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-psycopg/src/opentelemetry/instrumentation/psycopg/version.py b/instrumentation/opentelemetry-instrumentation-psycopg/src/opentelemetry/instrumentation/psycopg/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-psycopg/src/opentelemetry/instrumentation/psycopg/version.py
+++ b/instrumentation/opentelemetry-instrumentation-psycopg/src/opentelemetry/instrumentation/psycopg/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-0.txt
index e60531b112..93ea09ca15 100644
--- a/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
backports.zoneinfo==0.2.1
Deprecated==1.2.14
importlib-metadata==6.11.0
@@ -9,7 +9,7 @@ psycopg==3.1.18
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt
index 6ad211f9c0..096d31599a 100644
--- a/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-psycopg/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ psycopg==3.1.18
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml b/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml
index 7db83dcc5c..592c15b4db 100644
--- a/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-dbapi == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/version.py b/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/version.py
+++ b/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt
index 4d6682b3d6..5ae59dc5ea 100644
--- a/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-psycopg2/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ psycopg2==2.9.9
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/tests/test_psycopg2_integration.py b/instrumentation/opentelemetry-instrumentation-psycopg2/tests/test_psycopg2_integration.py
index 369d63d5cf..6671073043 100644
--- a/instrumentation/opentelemetry-instrumentation-psycopg2/tests/test_psycopg2_integration.py
+++ b/instrumentation/opentelemetry-instrumentation-psycopg2/tests/test_psycopg2_integration.py
@@ -18,6 +18,7 @@
import psycopg2
import opentelemetry.instrumentation.psycopg2
+from opentelemetry import trace
from opentelemetry.instrumentation.psycopg2 import Psycopg2Instrumentor
from opentelemetry.sdk import resources
from opentelemetry.test.test_base import TestBase
@@ -269,3 +270,14 @@ def test_sqlcommenter_disabled(self, event_mocked):
cursor.execute(query)
kwargs = event_mocked.call_args[1]
self.assertEqual(kwargs["enable_commenter"], False)
+
+ def test_no_op_tracer_provider(self):
+ Psycopg2Instrumentor().instrument(
+ tracer_provider=trace.NoOpTracerProvider()
+ )
+ cnx = psycopg2.connect(database="test")
+ cursor = cnx.cursor()
+ query = "SELECT * FROM test"
+ cursor.execute(query)
+ spans_list = self.memory_exporter.get_finished_spans()
+ self.assertEqual(len(spans_list), 0)
diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pymemcache/pyproject.toml
index 47df236c42..c20ffd3dee 100644
--- a/instrumentation/opentelemetry-instrumentation-pymemcache/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-pymemcache/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/version.py b/instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/version.py
+++ b/instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-0.txt
index 28a62d84b4..25e0f03bd6 100644
--- a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -9,7 +9,7 @@ pymemcache==1.3.5
pytest==7.4.4
six==1.16.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-1.txt
index 4be0dbee52..3005dc7aa8 100644
--- a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -9,7 +9,7 @@ pymemcache==2.2.2
pytest==7.4.4
six==1.16.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-2.txt b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-2.txt
index f07d79374a..4c259345c6 100644
--- a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-2.txt
+++ b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-2.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -9,7 +9,7 @@ pymemcache==3.4.1
pytest==7.4.4
six==1.16.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-3.txt b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-3.txt
index 4e4871147c..b0e2147639 100644
--- a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-3.txt
+++ b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-3.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -9,7 +9,7 @@ pymemcache==3.4.2
pytest==7.4.4
six==1.16.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-4.txt b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-4.txt
index 28fe27f0ef..36d0164961 100644
--- a/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-4.txt
+++ b/instrumentation/opentelemetry-instrumentation-pymemcache/test-requirements-4.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ py-cpuinfo==9.0.0
pymemcache==4.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pymongo/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pymongo/pyproject.toml
index ccd75ffeaa..61f4fd2b72 100644
--- a/instrumentation/opentelemetry-instrumentation-pymongo/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-pymongo/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/version.py b/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/version.py
+++ b/instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-pymongo/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-pymongo/test-requirements.txt
index eb41ee6bd9..a9319d5fdb 100644
--- a/instrumentation/opentelemetry-instrumentation-pymongo/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-pymongo/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
dnspython==2.6.1
importlib-metadata==6.11.0
@@ -9,7 +9,7 @@ py-cpuinfo==9.0.0
pymongo==4.6.3
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pymysql/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pymysql/pyproject.toml
index 08ee94fd9e..9e1bc1a881 100644
--- a/instrumentation/opentelemetry-instrumentation-pymysql/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-pymysql/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-dbapi == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-pymysql/src/opentelemetry/instrumentation/pymysql/version.py b/instrumentation/opentelemetry-instrumentation-pymysql/src/opentelemetry/instrumentation/pymysql/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-pymysql/src/opentelemetry/instrumentation/pymysql/version.py
+++ b/instrumentation/opentelemetry-instrumentation-pymysql/src/opentelemetry/instrumentation/pymysql/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-pymysql/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-pymysql/test-requirements.txt
index 8338f79b65..b1496da4e6 100644
--- a/instrumentation/opentelemetry-instrumentation-pymysql/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-pymysql/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ py-cpuinfo==9.0.0
PyMySQL==1.1.1
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/pyproject.toml b/instrumentation/opentelemetry-instrumentation-pyramid/pyproject.toml
index 9da43f444c..2a559e6c60 100644
--- a/instrumentation/opentelemetry-instrumentation-pyramid/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-pyramid/pyproject.toml
@@ -26,10 +26,10 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-wsgi == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-wsgi == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/callbacks.py b/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/callbacks.py
index 09f1645384..6a526f2235 100644
--- a/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/callbacks.py
+++ b/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/callbacks.py
@@ -141,7 +141,7 @@ def trace_tween_factory(handler, registry):
duration_histogram = meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="Duration of HTTP server requests.",
+ description="Measures the duration of inbound HTTP requests.",
)
active_requests_counter = meter.create_up_down_counter(
name=MetricInstruments.HTTP_SERVER_ACTIVE_REQUESTS,
diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/version.py b/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/version.py
+++ b/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-pyramid/test-requirements.txt
index aa387f8177..423838f23e 100644
--- a/instrumentation/opentelemetry-instrumentation-pyramid/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-pyramid/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
hupper==1.12.1
importlib-metadata==6.11.0
@@ -13,7 +13,7 @@ pyramid==2.0.2
pytest==7.4.4
tomli==2.0.1
translationstring==1.4
-typing_extensions==4.9.0
+typing_extensions==4.12.2
venusian==3.1.0
WebOb==1.8.8
Werkzeug==3.0.3
diff --git a/instrumentation/opentelemetry-instrumentation-redis/pyproject.toml b/instrumentation/opentelemetry-instrumentation-redis/pyproject.toml
index d39bda20a5..c262363fab 100644
--- a/instrumentation/opentelemetry-instrumentation-redis/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-redis/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"wrapt >= 1.12.1",
]
diff --git a/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/version.py b/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/version.py
+++ b/instrumentation/opentelemetry-instrumentation-redis/src/opentelemetry/instrumentation/redis/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-redis/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-redis/test-requirements.txt
index 43d4bd9788..4690006ef1 100644
--- a/instrumentation/opentelemetry-instrumentation-redis/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-redis/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
async-timeout==4.0.3
Deprecated==1.2.14
fakeredis==2.23.3
@@ -10,7 +10,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
redis==5.0.1
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-remoulade/pyproject.toml b/instrumentation/opentelemetry-instrumentation-remoulade/pyproject.toml
index 8b2b3679a9..7f3041b887 100644
--- a/instrumentation/opentelemetry-instrumentation-remoulade/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-remoulade/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-remoulade/src/opentelemetry/instrumentation/remoulade/version.py b/instrumentation/opentelemetry-instrumentation-remoulade/src/opentelemetry/instrumentation/remoulade/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-remoulade/src/opentelemetry/instrumentation/remoulade/version.py
+++ b/instrumentation/opentelemetry-instrumentation-remoulade/src/opentelemetry/instrumentation/remoulade/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-remoulade/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-remoulade/test-requirements.txt
index 727c15ec4e..a299e145a1 100644
--- a/instrumentation/opentelemetry-instrumentation-remoulade/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-remoulade/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -12,7 +12,7 @@ pytz==2024.1
remoulade==3.2.0
six==1.16.0
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-requests/pyproject.toml b/instrumentation/opentelemetry-instrumentation-requests/pyproject.toml
index 88996d2540..dafe3b4d3a 100644
--- a/instrumentation/opentelemetry-instrumentation-requests/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-requests/pyproject.toml
@@ -26,9 +26,9 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
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 3aa1b476f5..db67d378d9 100644
--- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py
@@ -92,7 +92,7 @@ def response_hook(span, request_obj, response)
_OpenTelemetryStabilitySignalType,
_report_new,
_report_old,
- _set_http_host,
+ _set_http_host_client,
_set_http_method,
_set_http_net_peer_name_client,
_set_http_network_protocol_version,
@@ -212,14 +212,14 @@ def get_or_create_headers():
metric_labels, parsed_url.scheme, sem_conv_opt_in_mode
)
if parsed_url.hostname:
- _set_http_host(
+ _set_http_host_client(
metric_labels, parsed_url.hostname, sem_conv_opt_in_mode
)
_set_http_net_peer_name_client(
metric_labels, parsed_url.hostname, sem_conv_opt_in_mode
)
if _report_new(sem_conv_opt_in_mode):
- _set_http_host(
+ _set_http_host_client(
span_attributes,
parsed_url.hostname,
sem_conv_opt_in_mode,
diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/version.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/version.py
+++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-requests/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-requests/test-requirements.txt
index 03d0a793a6..a201206f0f 100644
--- a/instrumentation/opentelemetry-instrumentation-requests/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-requests/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
certifi==2024.7.4
charset-normalizer==3.3.2
Deprecated==1.2.14
@@ -12,7 +12,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
requests==2.32.3
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
urllib3==2.2.2
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/pyproject.toml b/instrumentation/opentelemetry-instrumentation-sqlalchemy/pyproject.toml
index 21021fb590..d6cc3f71d9 100644
--- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
"packaging >= 21.0",
"wrapt >= 1.11.2",
]
diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/version.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/version.py
+++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-0.txt
index 407222e8f6..cccdc3cb63 100644
--- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-0.txt
@@ -1,5 +1,5 @@
-asgiref==3.7.2
-cffi==1.15.1
+asgiref==3.8.1
+cffi==1.17.0
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -9,7 +9,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
SQLAlchemy==1.1.18
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt
index 9b1b15debc..b275f4e30e 100644
--- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/test-requirements-1.txt
@@ -1,5 +1,5 @@
aiosqlite==0.20.0
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
greenlet==3.0.3
importlib-metadata==6.11.0
@@ -10,7 +10,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
SQLAlchemy==1.4.51
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-sqlite3/pyproject.toml b/instrumentation/opentelemetry-instrumentation-sqlite3/pyproject.toml
index e86fb99235..60ec47b16e 100644
--- a/instrumentation/opentelemetry-instrumentation-sqlite3/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-sqlite3/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-dbapi == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/version.py b/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/version.py
index e0bef4b1e3..79e27849a4 100644
--- a/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/version.py
+++ b/instrumentation/opentelemetry-instrumentation-sqlite3/src/opentelemetry/instrumentation/sqlite3/version.py
@@ -12,6 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
_instruments = tuple()
diff --git a/instrumentation/opentelemetry-instrumentation-sqlite3/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-sqlite3/test-requirements.txt
index 8c98e702b4..2469d354d3 100644
--- a/instrumentation/opentelemetry-instrumentation-sqlite3/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-sqlite3/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml b/instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml
index 6e6d370b53..9cdd968ca0 100644
--- a/instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml
@@ -26,10 +26,10 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-instrumentation-asgi == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-instrumentation-asgi == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/version.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/version.py
+++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-starlette/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-starlette/test-requirements.txt
index 1d5b91e188..7f46b46981 100644
--- a/instrumentation/opentelemetry-instrumentation-starlette/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-starlette/test-requirements.txt
@@ -1,5 +1,5 @@
anyio==4.3.0
-asgiref==3.7.2
+asgiref==3.8.1
certifi==2024.7.4
charset-normalizer==3.3.2
Deprecated==1.2.14
@@ -18,7 +18,7 @@ requests==2.32.3
sniffio==1.3.0
starlette==0.13.8
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
urllib3==2.2.2
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/pyproject.toml b/instrumentation/opentelemetry-instrumentation-system-metrics/pyproject.toml
index 6a1e83912f..a405c668f7 100644
--- a/instrumentation/opentelemetry-instrumentation-system-metrics/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-system-metrics/pyproject.toml
@@ -25,7 +25,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
]
dependencies = [
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
"opentelemetry-api ~= 1.11",
"psutil >= 5.9.0, < 7",
]
diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/version.py b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/version.py
+++ b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-system-metrics/test-requirements.txt
index 506499ea13..710e4bdf7f 100644
--- a/instrumentation/opentelemetry-instrumentation-system-metrics/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-system-metrics/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ psutil==6.0.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-threading/pyproject.toml b/instrumentation/opentelemetry-instrumentation-threading/pyproject.toml
index 16088e7de3..43f92d2034 100644
--- a/instrumentation/opentelemetry-instrumentation-threading/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-threading/pyproject.toml
@@ -26,7 +26,7 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/instrumentation/opentelemetry-instrumentation-threading/src/opentelemetry/instrumentation/threading/version.py b/instrumentation/opentelemetry-instrumentation-threading/src/opentelemetry/instrumentation/threading/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-threading/src/opentelemetry/instrumentation/threading/version.py
+++ b/instrumentation/opentelemetry-instrumentation-threading/src/opentelemetry/instrumentation/threading/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-threading/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-threading/test-requirements.txt
index 45ee66cf01..84c3bb4d29 100644
--- a/instrumentation/opentelemetry-instrumentation-threading/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-threading/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-tornado/pyproject.toml b/instrumentation/opentelemetry-instrumentation-tornado/pyproject.toml
index 0096deb8fd..f3f9a4b4fc 100644
--- a/instrumentation/opentelemetry-instrumentation-tornado/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-tornado/pyproject.toml
@@ -25,9 +25,9 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/__init__.py b/instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/__init__.py
index 1b56db3876..0b5e06b526 100644
--- a/instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/__init__.py
@@ -296,7 +296,7 @@ def _create_server_histograms(meter) -> Dict[str, Histogram]:
MetricInstruments.HTTP_SERVER_DURATION: meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="Duration of HTTP server requests.",
+ description="Measures the duration of inbound HTTP requests.",
),
MetricInstruments.HTTP_SERVER_REQUEST_SIZE: meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_REQUEST_SIZE,
diff --git a/instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/version.py b/instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/version.py
+++ b/instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-tornado/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-tornado/test-requirements.txt
index fb542966de..209c07e523 100644
--- a/instrumentation/opentelemetry-instrumentation-tornado/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-tornado/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
blinker==1.7.0
certifi==2024.7.4
charset-normalizer==3.3.2
@@ -19,7 +19,7 @@ pytest==7.4.4
requests==2.32.3
tomli==2.0.1
tornado==6.4.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
urllib3==2.2.2
Werkzeug==3.0.3
wrapt==1.16.0
diff --git a/instrumentation/opentelemetry-instrumentation-tortoiseorm/pyproject.toml b/instrumentation/opentelemetry-instrumentation-tortoiseorm/pyproject.toml
index 04d81e1894..82ccbc6a79 100644
--- a/instrumentation/opentelemetry-instrumentation-tortoiseorm/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-tortoiseorm/pyproject.toml
@@ -26,8 +26,8 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-tortoiseorm/src/opentelemetry/instrumentation/tortoiseorm/version.py b/instrumentation/opentelemetry-instrumentation-tortoiseorm/src/opentelemetry/instrumentation/tortoiseorm/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-tortoiseorm/src/opentelemetry/instrumentation/tortoiseorm/version.py
+++ b/instrumentation/opentelemetry-instrumentation-tortoiseorm/src/opentelemetry/instrumentation/tortoiseorm/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-tortoiseorm/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-tortoiseorm/test-requirements.txt
index cb31845d66..4ec6d195bf 100644
--- a/instrumentation/opentelemetry-instrumentation-tortoiseorm/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-tortoiseorm/test-requirements.txt
@@ -1,6 +1,6 @@
aiosqlite==0.17.0
-annotated-types==0.6.0
-asgiref==3.7.2
+annotated-types==0.7.0
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,14 +8,14 @@ iso8601==1.1.0
packaging==24.0
pluggy==1.5.0
py-cpuinfo==9.0.0
-pydantic==2.6.2
-pydantic_core==2.16.3
+pydantic==2.8.2
+pydantic_core==2.20.1
pypika-tortoise==0.1.6
pytest==7.4.4
pytz==2024.1
tomli==2.0.1
tortoise-orm==0.20.0
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-urllib/README.rst b/instrumentation/opentelemetry-instrumentation-urllib/README.rst
index c78e092fb4..f673fb07f9 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib/README.rst
+++ b/instrumentation/opentelemetry-instrumentation-urllib/README.rst
@@ -29,6 +29,8 @@ The hooks can be configured as follows:
.. code:: python
+ from opentelemetry.instrumentation.urllib import URLLibInstrumentor
+
# `request_obj` is an instance of urllib.request.Request
def request_hook(span, request_obj):
pass
@@ -38,8 +40,8 @@ The hooks can be configured as follows:
def response_hook(span, request_obj, response)
pass
- URLLibInstrumentor.instrument(
- request_hook=request_hook, response_hook=response_hook)
+ URLLibInstrumentor().instrument(
+ request_hook=request_hook, response_hook=response_hook
)
Exclude lists
diff --git a/instrumentation/opentelemetry-instrumentation-urllib/pyproject.toml b/instrumentation/opentelemetry-instrumentation-urllib/pyproject.toml
index 4f0d2681f9..97b611b095 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-urllib/pyproject.toml
@@ -26,9 +26,9 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
diff --git a/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/version.py b/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/version.py
index e0bef4b1e3..79e27849a4 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/version.py
+++ b/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/version.py
@@ -12,6 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
_instruments = tuple()
diff --git a/instrumentation/opentelemetry-instrumentation-urllib/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-urllib/test-requirements.txt
index 9e11fb272f..998ca77f6a 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-urllib/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
httpretty==1.1.4
importlib-metadata==6.11.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/pyproject.toml b/instrumentation/opentelemetry-instrumentation-urllib3/pyproject.toml
index 03c9f26fbc..3c1eaaa6d0 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib3/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-urllib3/pyproject.toml
@@ -26,9 +26,9 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
]
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 4bcd0816fd..1c83f3f447 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py
@@ -103,7 +103,7 @@ def response_hook(
_OpenTelemetryStabilitySignalType,
_report_new,
_report_old,
- _set_http_host,
+ _set_http_host_client,
_set_http_method,
_set_http_net_peer_name_client,
_set_http_network_protocol_version,
@@ -491,7 +491,9 @@ def _set_metric_attributes(
sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT,
) -> None:
- _set_http_host(metric_attributes, instance.host, sem_conv_opt_in_mode)
+ _set_http_host_client(
+ metric_attributes, instance.host, sem_conv_opt_in_mode
+ )
_set_http_scheme(metric_attributes, instance.scheme, sem_conv_opt_in_mode)
_set_http_method(
metric_attributes,
diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/version.py b/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/version.py
+++ b/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-0.txt b/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-0.txt
index 1d6ebc18af..ad29eb1263 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-0.txt
+++ b/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-0.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
httpretty==1.1.4
importlib-metadata==6.11.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
urllib3==1.26.19
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-1.txt b/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-1.txt
index 06df34d16b..48406b222d 100644
--- a/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-1.txt
+++ b/instrumentation/opentelemetry-instrumentation-urllib3/test-requirements-1.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
httpretty==1.1.4
importlib-metadata==6.11.0
@@ -8,7 +8,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
urllib3==2.2.2
wrapt==1.16.0
zipp==3.19.2
diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-wsgi/pyproject.toml
index b38f1829aa..a5e81ee8e5 100644
--- a/instrumentation/opentelemetry-instrumentation-wsgi/pyproject.toml
+++ b/instrumentation/opentelemetry-instrumentation-wsgi/pyproject.toml
@@ -26,9 +26,9 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
- "opentelemetry-semantic-conventions == 0.48b0.dev",
- "opentelemetry-util-http == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
+ "opentelemetry-semantic-conventions == 0.49b0.dev",
+ "opentelemetry-util-http == 0.49b0.dev",
]
[project.optional-dependencies]
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 355b1d7458..c0384d594b 100644
--- a/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py
+++ b/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py
@@ -231,7 +231,7 @@ def response_hook(span: Span, environ: WSGIEnvironment, status: str, response_he
_set_http_net_host,
_set_http_net_host_port,
_set_http_net_peer_name_server,
- _set_http_peer_ip,
+ _set_http_peer_ip_server,
_set_http_peer_port_server,
_set_http_scheme,
_set_http_target,
@@ -360,7 +360,7 @@ def collect_request_attributes(
remote_addr = environ.get("REMOTE_ADDR")
if remote_addr:
- _set_http_peer_ip(result, remote_addr, sem_conv_opt_in_mode)
+ _set_http_peer_ip_server(result, remote_addr, sem_conv_opt_in_mode)
peer_port = environ.get("REMOTE_PORT")
if peer_port:
@@ -571,14 +571,14 @@ def __init__(
self.duration_histogram_old = self.meter.create_histogram(
name=MetricInstruments.HTTP_SERVER_DURATION,
unit="ms",
- description="measures the duration of the inbound HTTP request",
+ description="Measures the duration of inbound HTTP requests.",
)
self.duration_histogram_new = None
if _report_new(sem_conv_opt_in_mode):
self.duration_histogram_new = self.meter.create_histogram(
name=HTTP_SERVER_REQUEST_DURATION,
unit="s",
- description="measures the duration of the inbound HTTP request",
+ description="Duration of HTTP server requests.",
)
# We don't need a separate active request counter for old/new semantic conventions
# because the new attributes are a subset of the old attributes
diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/version.py b/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/version.py
+++ b/instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/test-requirements.txt b/instrumentation/opentelemetry-instrumentation-wsgi/test-requirements.txt
index 0f7c7ced73..acabba1abf 100644
--- a/instrumentation/opentelemetry-instrumentation-wsgi/test-requirements.txt
+++ b/instrumentation/opentelemetry-instrumentation-wsgi/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.9.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/opentelemetry-contrib-instrumentations/pyproject.toml b/opentelemetry-contrib-instrumentations/pyproject.toml
index 6c7716bad2..300895c1e0 100644
--- a/opentelemetry-contrib-instrumentations/pyproject.toml
+++ b/opentelemetry-contrib-instrumentations/pyproject.toml
@@ -29,53 +29,54 @@ classifiers = [
"Programming Language :: Python :: 3.12",
]
dependencies = [
- "opentelemetry-instrumentation-aio-pika==0.48b0.dev",
- "opentelemetry-instrumentation-aiohttp-client==0.48b0.dev",
- "opentelemetry-instrumentation-aiohttp-server==0.48b0.dev",
- "opentelemetry-instrumentation-aiopg==0.48b0.dev",
- "opentelemetry-instrumentation-asgi==0.48b0.dev",
- "opentelemetry-instrumentation-asyncio==0.48b0.dev",
- "opentelemetry-instrumentation-asyncpg==0.48b0.dev",
- "opentelemetry-instrumentation-aws-lambda==0.48b0.dev",
- "opentelemetry-instrumentation-boto==0.48b0.dev",
- "opentelemetry-instrumentation-boto3sqs==0.48b0.dev",
- "opentelemetry-instrumentation-botocore==0.48b0.dev",
- "opentelemetry-instrumentation-cassandra==0.48b0.dev",
- "opentelemetry-instrumentation-celery==0.48b0.dev",
- "opentelemetry-instrumentation-confluent-kafka==0.48b0.dev",
- "opentelemetry-instrumentation-dbapi==0.48b0.dev",
- "opentelemetry-instrumentation-django==0.48b0.dev",
- "opentelemetry-instrumentation-elasticsearch==0.48b0.dev",
- "opentelemetry-instrumentation-falcon==0.48b0.dev",
- "opentelemetry-instrumentation-fastapi==0.48b0.dev",
- "opentelemetry-instrumentation-flask==0.48b0.dev",
- "opentelemetry-instrumentation-grpc==0.48b0.dev",
- "opentelemetry-instrumentation-httpx==0.48b0.dev",
- "opentelemetry-instrumentation-jinja2==0.48b0.dev",
- "opentelemetry-instrumentation-kafka-python==0.48b0.dev",
- "opentelemetry-instrumentation-logging==0.48b0.dev",
- "opentelemetry-instrumentation-mysql==0.48b0.dev",
- "opentelemetry-instrumentation-mysqlclient==0.48b0.dev",
- "opentelemetry-instrumentation-pika==0.48b0.dev",
- "opentelemetry-instrumentation-psycopg==0.48b0.dev",
- "opentelemetry-instrumentation-psycopg2==0.48b0.dev",
- "opentelemetry-instrumentation-pymemcache==0.48b0.dev",
- "opentelemetry-instrumentation-pymongo==0.48b0.dev",
- "opentelemetry-instrumentation-pymysql==0.48b0.dev",
- "opentelemetry-instrumentation-pyramid==0.48b0.dev",
- "opentelemetry-instrumentation-redis==0.48b0.dev",
- "opentelemetry-instrumentation-remoulade==0.48b0.dev",
- "opentelemetry-instrumentation-requests==0.48b0.dev",
- "opentelemetry-instrumentation-sqlalchemy==0.48b0.dev",
- "opentelemetry-instrumentation-sqlite3==0.48b0.dev",
- "opentelemetry-instrumentation-starlette==0.48b0.dev",
- "opentelemetry-instrumentation-system-metrics==0.48b0.dev",
- "opentelemetry-instrumentation-threading==0.48b0.dev",
- "opentelemetry-instrumentation-tornado==0.48b0.dev",
- "opentelemetry-instrumentation-tortoiseorm==0.48b0.dev",
- "opentelemetry-instrumentation-urllib==0.48b0.dev",
- "opentelemetry-instrumentation-urllib3==0.48b0.dev",
- "opentelemetry-instrumentation-wsgi==0.48b0.dev",
+ "opentelemetry-instrumentation-aio-pika==0.49b0.dev",
+ "opentelemetry-instrumentation-aiohttp-client==0.49b0.dev",
+ "opentelemetry-instrumentation-aiohttp-server==0.49b0.dev",
+ "opentelemetry-instrumentation-aiokafka==0.49b0.dev",
+ "opentelemetry-instrumentation-aiopg==0.49b0.dev",
+ "opentelemetry-instrumentation-asgi==0.49b0.dev",
+ "opentelemetry-instrumentation-asyncio==0.49b0.dev",
+ "opentelemetry-instrumentation-asyncpg==0.49b0.dev",
+ "opentelemetry-instrumentation-aws-lambda==0.49b0.dev",
+ "opentelemetry-instrumentation-boto==0.49b0.dev",
+ "opentelemetry-instrumentation-boto3sqs==0.49b0.dev",
+ "opentelemetry-instrumentation-botocore==0.49b0.dev",
+ "opentelemetry-instrumentation-cassandra==0.49b0.dev",
+ "opentelemetry-instrumentation-celery==0.49b0.dev",
+ "opentelemetry-instrumentation-confluent-kafka==0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi==0.49b0.dev",
+ "opentelemetry-instrumentation-django==0.49b0.dev",
+ "opentelemetry-instrumentation-elasticsearch==0.49b0.dev",
+ "opentelemetry-instrumentation-falcon==0.49b0.dev",
+ "opentelemetry-instrumentation-fastapi==0.49b0.dev",
+ "opentelemetry-instrumentation-flask==0.49b0.dev",
+ "opentelemetry-instrumentation-grpc==0.49b0.dev",
+ "opentelemetry-instrumentation-httpx==0.49b0.dev",
+ "opentelemetry-instrumentation-jinja2==0.49b0.dev",
+ "opentelemetry-instrumentation-kafka-python==0.49b0.dev",
+ "opentelemetry-instrumentation-logging==0.49b0.dev",
+ "opentelemetry-instrumentation-mysql==0.49b0.dev",
+ "opentelemetry-instrumentation-mysqlclient==0.49b0.dev",
+ "opentelemetry-instrumentation-pika==0.49b0.dev",
+ "opentelemetry-instrumentation-psycopg==0.49b0.dev",
+ "opentelemetry-instrumentation-psycopg2==0.49b0.dev",
+ "opentelemetry-instrumentation-pymemcache==0.49b0.dev",
+ "opentelemetry-instrumentation-pymongo==0.49b0.dev",
+ "opentelemetry-instrumentation-pymysql==0.49b0.dev",
+ "opentelemetry-instrumentation-pyramid==0.49b0.dev",
+ "opentelemetry-instrumentation-redis==0.49b0.dev",
+ "opentelemetry-instrumentation-remoulade==0.49b0.dev",
+ "opentelemetry-instrumentation-requests==0.49b0.dev",
+ "opentelemetry-instrumentation-sqlalchemy==0.49b0.dev",
+ "opentelemetry-instrumentation-sqlite3==0.49b0.dev",
+ "opentelemetry-instrumentation-starlette==0.49b0.dev",
+ "opentelemetry-instrumentation-system-metrics==0.49b0.dev",
+ "opentelemetry-instrumentation-threading==0.49b0.dev",
+ "opentelemetry-instrumentation-tornado==0.49b0.dev",
+ "opentelemetry-instrumentation-tortoiseorm==0.49b0.dev",
+ "opentelemetry-instrumentation-urllib==0.49b0.dev",
+ "opentelemetry-instrumentation-urllib3==0.49b0.dev",
+ "opentelemetry-instrumentation-wsgi==0.49b0.dev",
]
[project.urls]
diff --git a/opentelemetry-contrib-instrumentations/src/opentelemetry/contrib-instrumentations/version.py b/opentelemetry-contrib-instrumentations/src/opentelemetry/contrib-instrumentations/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/opentelemetry-contrib-instrumentations/src/opentelemetry/contrib-instrumentations/version.py
+++ b/opentelemetry-contrib-instrumentations/src/opentelemetry/contrib-instrumentations/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/opentelemetry-distro/pyproject.toml b/opentelemetry-distro/pyproject.toml
index 2397e9182a..686eeaba95 100644
--- a/opentelemetry-distro/pyproject.toml
+++ b/opentelemetry-distro/pyproject.toml
@@ -27,13 +27,13 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.48b0.dev",
+ "opentelemetry-instrumentation == 0.49b0.dev",
"opentelemetry-sdk ~= 1.13",
]
[project.optional-dependencies]
otlp = [
- "opentelemetry-exporter-otlp == 1.27.0.dev",
+ "opentelemetry-exporter-otlp == 1.28.0.dev",
]
[project.entry-points.opentelemetry_configurator]
diff --git a/opentelemetry-distro/src/opentelemetry/distro/version.py b/opentelemetry-distro/src/opentelemetry/distro/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/opentelemetry-distro/src/opentelemetry/distro/version.py
+++ b/opentelemetry-distro/src/opentelemetry/distro/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/opentelemetry-distro/test-requirements.txt b/opentelemetry-distro/test-requirements.txt
index d9190daa26..4f63e9e7b6 100644
--- a/opentelemetry-distro/test-requirements.txt
+++ b/opentelemetry-distro/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/opentelemetry-instrumentation/README.rst b/opentelemetry-instrumentation/README.rst
index 6f66edb623..3ed88c213f 100644
--- a/opentelemetry-instrumentation/README.rst
+++ b/opentelemetry-instrumentation/README.rst
@@ -40,7 +40,7 @@ to figure out which instrumentation packages the user might want to install. By
prints out a list of the default and detected instrumentation packages that can be added to a
requirements.txt file. It also supports installing the packages when run with
:code:`--action=install` or :code:`-a install` flag. All default and detectable
-instrumentation packages are defined `here `.
+instrumentation packages are defined `here `.
opentelemetry-instrument
diff --git a/opentelemetry-instrumentation/pyproject.toml b/opentelemetry-instrumentation/pyproject.toml
index edaf400419..866b9b5008 100644
--- a/opentelemetry-instrumentation/pyproject.toml
+++ b/opentelemetry-instrumentation/pyproject.toml
@@ -26,6 +26,7 @@ classifiers = [
]
dependencies = [
"opentelemetry-api ~= 1.4",
+ "opentelemetry-semantic-conventions >= 0.48b0",
"setuptools >= 16.0",
"wrapt >= 1.0.0, < 2.0.0",
]
diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py
index 33668333ce..c4e720fd04 100644
--- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py
+++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py
@@ -252,16 +252,32 @@ def _set_http_scheme(result, scheme, sem_conv_opt_in_mode):
set_string_attribute(result, URL_SCHEME, scheme)
-def _set_http_host(result, host, sem_conv_opt_in_mode):
+def _set_http_flavor_version(result, version, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
- set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
+ set_string_attribute(result, SpanAttributes.HTTP_FLAVOR, version)
if _report_new(sem_conv_opt_in_mode):
- set_string_attribute(result, SERVER_ADDRESS, host)
+ set_string_attribute(result, NETWORK_PROTOCOL_VERSION, version)
+
+
+def _set_http_user_agent(result, user_agent, sem_conv_opt_in_mode):
+ if _report_old(sem_conv_opt_in_mode):
+ set_string_attribute(
+ result, SpanAttributes.HTTP_USER_AGENT, user_agent
+ )
+ if _report_new(sem_conv_opt_in_mode):
+ set_string_attribute(result, USER_AGENT_ORIGINAL, user_agent)
# Client
+def _set_http_host_client(result, host, sem_conv_opt_in_mode):
+ if _report_old(sem_conv_opt_in_mode):
+ set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
+ if _report_new(sem_conv_opt_in_mode):
+ set_string_attribute(result, SERVER_ADDRESS, host)
+
+
def _set_http_net_peer_name_client(result, peer_name, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.NET_PEER_NAME, peer_name)
@@ -310,27 +326,32 @@ def _set_http_target(result, target, path, query, sem_conv_opt_in_mode):
set_string_attribute(result, URL_QUERY, query)
-def _set_http_peer_ip(result, ip, sem_conv_opt_in_mode):
+def _set_http_host_server(result, host, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
- set_string_attribute(result, SpanAttributes.NET_PEER_IP, ip)
+ set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
if _report_new(sem_conv_opt_in_mode):
- set_string_attribute(result, CLIENT_ADDRESS, ip)
+ set_string_attribute(result, CLIENT_ADDRESS, host)
-def _set_http_peer_port_server(result, port, sem_conv_opt_in_mode):
+# net.peer.ip -> net.sock.peer.addr
+# https://github.com/open-telemetry/semantic-conventions/blob/40db676ca0e735aa84f242b5a0fb14e49438b69b/schemas/1.15.0#L18
+# net.sock.peer.addr -> client.socket.address for server spans (TODO) AND client.address if missing
+# https://github.com/open-telemetry/semantic-conventions/blob/v1.21.0/CHANGELOG.md#v1210-2023-07-13
+# https://github.com/open-telemetry/semantic-conventions/blob/main/docs/non-normative/http-migration.md#common-attributes-across-http-client-and-server-spans
+def _set_http_peer_ip_server(result, ip, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
- set_int_attribute(result, SpanAttributes.NET_PEER_PORT, port)
+ set_string_attribute(result, SpanAttributes.NET_PEER_IP, ip)
if _report_new(sem_conv_opt_in_mode):
- set_int_attribute(result, CLIENT_PORT, port)
+ # Only populate if not already populated
+ if not result.get(CLIENT_ADDRESS):
+ set_string_attribute(result, CLIENT_ADDRESS, ip)
-def _set_http_user_agent(result, user_agent, sem_conv_opt_in_mode):
+def _set_http_peer_port_server(result, port, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
- set_string_attribute(
- result, SpanAttributes.HTTP_USER_AGENT, user_agent
- )
+ set_int_attribute(result, SpanAttributes.NET_PEER_PORT, port)
if _report_new(sem_conv_opt_in_mode):
- set_string_attribute(result, USER_AGENT_ORIGINAL, user_agent)
+ set_int_attribute(result, CLIENT_PORT, port)
def _set_http_net_peer_name_server(result, name, sem_conv_opt_in_mode):
@@ -340,13 +361,6 @@ def _set_http_net_peer_name_server(result, name, sem_conv_opt_in_mode):
set_string_attribute(result, CLIENT_ADDRESS, name)
-def _set_http_flavor_version(result, version, sem_conv_opt_in_mode):
- if _report_old(sem_conv_opt_in_mode):
- set_string_attribute(result, SpanAttributes.HTTP_FLAVOR, version)
- if _report_new(sem_conv_opt_in_mode):
- set_string_attribute(result, NETWORK_PROTOCOL_VERSION, version)
-
-
def _set_status(
span,
metrics_attributes: dict,
diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap.py
index 6f86a539b2..1cc28abca4 100644
--- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap.py
+++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap.py
@@ -119,7 +119,7 @@ def _find_installed_libraries():
def _run_requirements():
logger.setLevel(logging.ERROR)
- print("\n".join(_find_installed_libraries()), end="")
+ print("\n".join(_find_installed_libraries()))
def _run_install():
diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py
index c31863bd31..cc9af1de80 100644
--- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py
+++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py
@@ -18,179 +18,183 @@
libraries = [
{
"library": "aio_pika >= 7.2.0, < 10.0.0",
- "instrumentation": "opentelemetry-instrumentation-aio-pika==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-aio-pika==0.49b0.dev",
},
{
"library": "aiohttp ~= 3.0",
- "instrumentation": "opentelemetry-instrumentation-aiohttp-client==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-aiohttp-client==0.49b0.dev",
},
{
"library": "aiohttp ~= 3.0",
- "instrumentation": "opentelemetry-instrumentation-aiohttp-server==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-aiohttp-server==0.49b0.dev",
+ },
+ {
+ "library": "aiokafka >= 0.8, < 1.0",
+ "instrumentation": "opentelemetry-instrumentation-aiokafka==0.49b0.dev",
},
{
"library": "aiopg >= 0.13.0, < 2.0.0",
- "instrumentation": "opentelemetry-instrumentation-aiopg==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-aiopg==0.49b0.dev",
},
{
"library": "asgiref ~= 3.0",
- "instrumentation": "opentelemetry-instrumentation-asgi==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-asgi==0.49b0.dev",
},
{
"library": "asyncpg >= 0.12.0",
- "instrumentation": "opentelemetry-instrumentation-asyncpg==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-asyncpg==0.49b0.dev",
},
{
"library": "boto~=2.0",
- "instrumentation": "opentelemetry-instrumentation-boto==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-boto==0.49b0.dev",
},
{
"library": "boto3 ~= 1.0",
- "instrumentation": "opentelemetry-instrumentation-boto3sqs==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-boto3sqs==0.49b0.dev",
},
{
"library": "botocore ~= 1.0",
- "instrumentation": "opentelemetry-instrumentation-botocore==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-botocore==0.49b0.dev",
},
{
"library": "cassandra-driver ~= 3.25",
- "instrumentation": "opentelemetry-instrumentation-cassandra==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-cassandra==0.49b0.dev",
},
{
"library": "scylla-driver ~= 3.25",
- "instrumentation": "opentelemetry-instrumentation-cassandra==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-cassandra==0.49b0.dev",
},
{
"library": "celery >= 4.0, < 6.0",
- "instrumentation": "opentelemetry-instrumentation-celery==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-celery==0.49b0.dev",
},
{
"library": "confluent-kafka >= 1.8.2, <= 2.4.0",
- "instrumentation": "opentelemetry-instrumentation-confluent-kafka==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-confluent-kafka==0.49b0.dev",
},
{
"library": "django >= 1.10",
- "instrumentation": "opentelemetry-instrumentation-django==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-django==0.49b0.dev",
},
{
"library": "elasticsearch >= 6.0",
- "instrumentation": "opentelemetry-instrumentation-elasticsearch==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-elasticsearch==0.49b0.dev",
},
{
"library": "falcon >= 1.4.1, < 3.1.2",
- "instrumentation": "opentelemetry-instrumentation-falcon==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-falcon==0.49b0.dev",
},
{
"library": "fastapi ~= 0.58",
- "instrumentation": "opentelemetry-instrumentation-fastapi==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-fastapi==0.49b0.dev",
},
{
"library": "flask >= 1.0",
- "instrumentation": "opentelemetry-instrumentation-flask==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-flask==0.49b0.dev",
},
{
- "library": "grpcio ~= 1.27",
- "instrumentation": "opentelemetry-instrumentation-grpc==0.48b0.dev",
+ "library": "grpcio >= 1.42.0",
+ "instrumentation": "opentelemetry-instrumentation-grpc==0.49b0.dev",
},
{
"library": "httpx >= 0.18.0",
- "instrumentation": "opentelemetry-instrumentation-httpx==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-httpx==0.49b0.dev",
},
{
"library": "jinja2 >= 2.7, < 4.0",
- "instrumentation": "opentelemetry-instrumentation-jinja2==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-jinja2==0.49b0.dev",
},
{
"library": "kafka-python >= 2.0, < 3.0",
- "instrumentation": "opentelemetry-instrumentation-kafka-python==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-kafka-python==0.49b0.dev",
},
{
"library": "kafka-python-ng >= 2.0, < 3.0",
- "instrumentation": "opentelemetry-instrumentation-kafka-python==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-kafka-python==0.49b0.dev",
},
{
"library": "mysql-connector-python >= 8.0, < 10.0",
- "instrumentation": "opentelemetry-instrumentation-mysql==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-mysql==0.49b0.dev",
},
{
"library": "mysqlclient < 3",
- "instrumentation": "opentelemetry-instrumentation-mysqlclient==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-mysqlclient==0.49b0.dev",
},
{
"library": "pika >= 0.12.0",
- "instrumentation": "opentelemetry-instrumentation-pika==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-pika==0.49b0.dev",
},
{
"library": "psycopg >= 3.1.0",
- "instrumentation": "opentelemetry-instrumentation-psycopg==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-psycopg==0.49b0.dev",
},
{
"library": "psycopg2 >= 2.7.3.1",
- "instrumentation": "opentelemetry-instrumentation-psycopg2==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-psycopg2==0.49b0.dev",
},
{
"library": "pymemcache >= 1.3.5, < 5",
- "instrumentation": "opentelemetry-instrumentation-pymemcache==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-pymemcache==0.49b0.dev",
},
{
"library": "pymongo >= 3.1, < 5.0",
- "instrumentation": "opentelemetry-instrumentation-pymongo==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-pymongo==0.49b0.dev",
},
{
"library": "PyMySQL < 2",
- "instrumentation": "opentelemetry-instrumentation-pymysql==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-pymysql==0.49b0.dev",
},
{
"library": "pyramid >= 1.7",
- "instrumentation": "opentelemetry-instrumentation-pyramid==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-pyramid==0.49b0.dev",
},
{
"library": "redis >= 2.6",
- "instrumentation": "opentelemetry-instrumentation-redis==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-redis==0.49b0.dev",
},
{
"library": "remoulade >= 0.50",
- "instrumentation": "opentelemetry-instrumentation-remoulade==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-remoulade==0.49b0.dev",
},
{
"library": "requests ~= 2.0",
- "instrumentation": "opentelemetry-instrumentation-requests==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-requests==0.49b0.dev",
},
{
"library": "sqlalchemy",
- "instrumentation": "opentelemetry-instrumentation-sqlalchemy==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-sqlalchemy==0.49b0.dev",
},
{
"library": "starlette ~= 0.13.0",
- "instrumentation": "opentelemetry-instrumentation-starlette==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-starlette==0.49b0.dev",
},
{
"library": "psutil >= 5",
- "instrumentation": "opentelemetry-instrumentation-system-metrics==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-system-metrics==0.49b0.dev",
},
{
"library": "tornado >= 5.1.1",
- "instrumentation": "opentelemetry-instrumentation-tornado==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-tornado==0.49b0.dev",
},
{
"library": "tortoise-orm >= 0.17.0",
- "instrumentation": "opentelemetry-instrumentation-tortoiseorm==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-tortoiseorm==0.49b0.dev",
},
{
"library": "pydantic >= 1.10.2",
- "instrumentation": "opentelemetry-instrumentation-tortoiseorm==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-tortoiseorm==0.49b0.dev",
},
{
"library": "urllib3 >= 1.0.0, < 3.0.0",
- "instrumentation": "opentelemetry-instrumentation-urllib3==0.48b0.dev",
+ "instrumentation": "opentelemetry-instrumentation-urllib3==0.49b0.dev",
},
]
default_instrumentations = [
- "opentelemetry-instrumentation-asyncio==0.48b0.dev",
- "opentelemetry-instrumentation-dbapi==0.48b0.dev",
- "opentelemetry-instrumentation-logging==0.48b0.dev",
- "opentelemetry-instrumentation-sqlite3==0.48b0.dev",
- "opentelemetry-instrumentation-threading==0.48b0.dev",
- "opentelemetry-instrumentation-urllib==0.48b0.dev",
- "opentelemetry-instrumentation-wsgi==0.48b0.dev",
+ "opentelemetry-instrumentation-asyncio==0.49b0.dev",
+ "opentelemetry-instrumentation-dbapi==0.49b0.dev",
+ "opentelemetry-instrumentation-logging==0.49b0.dev",
+ "opentelemetry-instrumentation-sqlite3==0.49b0.dev",
+ "opentelemetry-instrumentation-threading==0.49b0.dev",
+ "opentelemetry-instrumentation-urllib==0.49b0.dev",
+ "opentelemetry-instrumentation-wsgi==0.49b0.dev",
]
diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/version.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/version.py
+++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/opentelemetry-instrumentation/test-requirements.txt b/opentelemetry-instrumentation/test-requirements.txt
index 6cd12fad24..24a5a56daf 100644
--- a/opentelemetry-instrumentation/test-requirements.txt
+++ b/opentelemetry-instrumentation/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/opentelemetry-instrumentation/tests/test_bootstrap.py b/opentelemetry-instrumentation/tests/test_bootstrap.py
index bbe2f5623b..4807f0beb7 100644
--- a/opentelemetry-instrumentation/tests/test_bootstrap.py
+++ b/opentelemetry-instrumentation/tests/test_bootstrap.py
@@ -77,7 +77,7 @@ def test_run_cmd_print(self):
bootstrap.run()
self.assertEqual(
fake_out.getvalue(),
- "\n".join(self.installed_libraries),
+ "\n".join(self.installed_libraries) + "\n",
)
@patch("sys.argv", ["bootstrap", "-a", "install"])
diff --git a/processor/opentelemetry-processor-baggage/src/opentelemetry/processor/baggage/version.py b/processor/opentelemetry-processor-baggage/src/opentelemetry/processor/baggage/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/processor/opentelemetry-processor-baggage/src/opentelemetry/processor/baggage/version.py
+++ b/processor/opentelemetry-processor-baggage/src/opentelemetry/processor/baggage/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/propagator/opentelemetry-propagator-aws-xray/test-requirements.txt b/propagator/opentelemetry-propagator-aws-xray/test-requirements.txt
index 8589a794a4..8f5b428ba4 100644
--- a/propagator/opentelemetry-propagator-aws-xray/test-requirements.txt
+++ b/propagator/opentelemetry-propagator-aws-xray/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
certifi==2024.7.4
charset-normalizer==3.3.2
Deprecated==1.2.14
@@ -12,7 +12,7 @@ pytest==7.4.4
pytest-benchmark==4.0.0
requests==2.32.3
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
urllib3==2.2.2
wrapt==1.16.0
zipp==3.19.2
diff --git a/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/version.py b/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/version.py
+++ b/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/propagator/opentelemetry-propagator-ot-trace/test-requirements.txt b/propagator/opentelemetry-propagator-ot-trace/test-requirements.txt
index 0a72c3c823..4a97065065 100644
--- a/propagator/opentelemetry-propagator-ot-trace/test-requirements.txt
+++ b/propagator/opentelemetry-propagator-ot-trace/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e propagator/opentelemetry-propagator-ot-trace
diff --git a/resource/opentelemetry-resource-detector-azure/test-requirements.txt b/resource/opentelemetry-resource-detector-azure/test-requirements.txt
index 028c41e65d..fe04c99490 100644
--- a/resource/opentelemetry-resource-detector-azure/test-requirements.txt
+++ b/resource/opentelemetry-resource-detector-azure/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -6,7 +6,7 @@ packaging==24.0
pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e opentelemetry-instrumentation
diff --git a/resource/opentelemetry-resource-detector-container/src/opentelemetry/resource/detector/container/version.py b/resource/opentelemetry-resource-detector-container/src/opentelemetry/resource/detector/container/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/resource/opentelemetry-resource-detector-container/src/opentelemetry/resource/detector/container/version.py
+++ b/resource/opentelemetry-resource-detector-container/src/opentelemetry/resource/detector/container/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/resource/opentelemetry-resource-detector-container/test-requirements.txt b/resource/opentelemetry-resource-detector-container/test-requirements.txt
index 8a926fff71..7cf0d49001 100644
--- a/resource/opentelemetry-resource-detector-container/test-requirements.txt
+++ b/resource/opentelemetry-resource-detector-container/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,7 +7,7 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e resource/opentelemetry-resource-detector-container
diff --git a/scripts/update_sha.py b/scripts/update_sha.py
index 1c913249a2..c63b9eda9b 100644
--- a/scripts/update_sha.py
+++ b/scripts/update_sha.py
@@ -22,7 +22,12 @@
API_URL = (
"https://api.github.com/repos/open-telemetry/opentelemetry-python/commits/"
)
-WORKFLOW_FILE = ".github/workflows/test.yml"
+workflow_files = [
+ ".github/workflows/test_0.yml"
+ ".github/workflows/test_1.yml"
+ ".github/workflows/misc_0.yml"
+ ".github/workflows/lint_0.yml"
+]
def get_sha(branch):
@@ -35,11 +40,12 @@ def get_sha(branch):
def update_sha(sha):
yaml = YAML()
yaml.preserve_quotes = True
- with open(WORKFLOW_FILE, "r") as file:
- workflow = yaml.load(file)
- workflow["env"]["CORE_REPO_SHA"] = sha
- with open(WORKFLOW_FILE, "w") as file:
- yaml.dump(workflow, file)
+ for workflow_file in workflow_files:
+ with open(workflow_file, "r") as file:
+ workflow = yaml.load(file)
+ workflow["env"]["CORE_REPO_SHA"] = sha
+ with open(workflow_file, "w") as file:
+ yaml.dump(workflow, file)
def main():
diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements.txt b/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements.txt
index 27199627a1..3b44b54a61 100644
--- a/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements.txt
+++ b/sdk-extension/opentelemetry-sdk-extension-aws/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -8,7 +8,7 @@ py-cpuinfo==9.0.0
pytest==7.4.4
pytest-benchmark==4.0.0
tomli==2.0.1
-typing_extensions==4.10.0
+typing_extensions==4.12.2
wrapt==1.16.0
zipp==3.19.2
-e sdk-extension/opentelemetry-sdk-extension-aws
diff --git a/tests/opentelemetry-docker-tests/tests/docker-compose.yml b/tests/opentelemetry-docker-tests/tests/docker-compose.yml
index 2f89e3388e..59f0e42d3d 100644
--- a/tests/opentelemetry-docker-tests/tests/docker-compose.yml
+++ b/tests/opentelemetry-docker-tests/tests/docker-compose.yml
@@ -51,7 +51,7 @@ services:
- "14268:14268"
- "9411:9411"
otmssql:
- image: mcr.microsoft.com/mssql/server:2017-CU23-ubuntu-16.04
+ image: mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04
ports:
- "1433:1433"
environment:
diff --git a/tox.ini b/tox.ini
index 8552948b6b..2b0995d8fc 100644
--- a/tox.ini
+++ b/tox.ini
@@ -342,6 +342,11 @@ envlist =
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
+ 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
@@ -436,6 +441,12 @@ commands_pre =
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
@@ -930,6 +941,12 @@ commands =
lint-instrumentation-jinja2: flake8 --config {toxinidir}/.flake8 {toxinidir}/instrumentation/opentelemetry-instrumentation-jinja2
lint-instrumentation-jinja2: sh -c "cd instrumentation && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-jinja2"
+ test-instrumentation-aiokafka: pytest {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka/tests {posargs}
+ lint-instrumentation-aiokafka: black --diff --check --config {toxinidir}/pyproject.toml {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka
+ lint-instrumentation-aiokafka: isort --diff --check-only --settings-path {toxinidir}/.isort.cfg {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka
+ lint-instrumentation-aiokafka: flake8 --config {toxinidir}/.flake8 {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka
+ lint-instrumentation-aiokafka: sh -c "cd instrumentation && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-aiokafka"
+
test-instrumentation-kafka-python: pytest {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python/tests {posargs}
lint-instrumentation-kafka-python: black --diff --check --config {toxinidir}/pyproject.toml {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python
lint-instrumentation-kafka-python: isort --diff --check-only --settings-path {toxinidir}/.isort.cfg {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python
@@ -1190,7 +1207,7 @@ basepython: python3
deps =
aiopg==1.4.0
amqp==5.2.0
- asgiref==3.7.2
+ asgiref==3.8.1
async-timeout==4.0.3
asyncpg==0.29.0
attrs==23.2.0
@@ -1241,7 +1258,7 @@ deps =
PyMySQL==0.10.1
PyNaCl==1.5.0
# prerequisite: install unixodbc
- pyodbc==4.0.39
+ pyodbc==5.0.1
pyrsistent==0.20.0
pytest==8.0.2
pytest-celery==0.0.0
@@ -1256,7 +1273,7 @@ deps =
SQLAlchemy==1.4.52
texttable==1.7.0
tomli==2.0.1
- typing_extensions==4.10.0
+ typing_extensions==4.12.2
tzdata==2024.1
urllib3==1.26.19
vine==5.1.0
@@ -1277,6 +1294,7 @@ commands_pre =
-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 \
diff --git a/util/opentelemetry-util-http/src/opentelemetry/util/http/version.py b/util/opentelemetry-util-http/src/opentelemetry/util/http/version.py
index 4d21fcb843..ee5a6342e7 100644
--- a/util/opentelemetry-util-http/src/opentelemetry/util/http/version.py
+++ b/util/opentelemetry-util-http/src/opentelemetry/util/http/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "0.48b0.dev"
+__version__ = "0.49b0.dev"
diff --git a/util/opentelemetry-util-http/test-requirements.txt b/util/opentelemetry-util-http/test-requirements.txt
index cb1ffe135b..7c71ae2ef3 100644
--- a/util/opentelemetry-util-http/test-requirements.txt
+++ b/util/opentelemetry-util-http/test-requirements.txt
@@ -1,4 +1,4 @@
-asgiref==3.7.2
+asgiref==3.8.1
Deprecated==1.2.14
importlib-metadata==6.11.0
iniconfig==2.0.0
@@ -7,5 +7,5 @@ pluggy==1.5.0
py-cpuinfo==9.0.0
pytest==7.4.4
tomli==2.0.1
-typing_extensions==4.10.0
--e opentelemetry-instrumentation
\ No newline at end of file
+typing_extensions==4.12.2
+-e opentelemetry-instrumentation