From 4eb21af18966f05cf658decc009489002d10810c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 18:09:23 +0000 Subject: [PATCH 01/10] chore(deps): bump ruff from 0.14.0 to 0.14.1 in the pip group Bumps the pip group with 1 update: [ruff](https://github.com/astral-sh/ruff). Updates `ruff` from 0.14.0 to 0.14.1 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.14.0...0.14.1) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.14.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: pip ... Signed-off-by: dependabot[bot] --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b99c4f2..4ba4061 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,7 +81,7 @@ test = [ dev = [ {include-group = "test"}, "mypy==1.18.2", - "ruff==0.14.0", + "ruff==0.14.1", "pre-commit >=3.6.0,<5.0.0", ] From 10885ba30606571965b020d8ceb6eed3d88d5798 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 18:32:59 +0000 Subject: [PATCH 02/10] chore(deps): bump the github-actions group with 2 updates Bumps the github-actions group with 2 updates: [actions/upload-artifact](https://github.com/actions/upload-artifact) and [actions/download-artifact](https://github.com/actions/download-artifact). Updates `actions/upload-artifact` from 4 to 5 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v5) Updates `actions/download-artifact` from 5 to 6 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/download-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a585fad..b59f3c2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -64,7 +64,7 @@ jobs: COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}-${{ matrix.pydantic-version }} CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}-${{ matrix.pydantic-version }} - name: Store coverage files - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: .coverage.${{ runner.os }}-py${{ matrix.python-version }}-${{ matrix.pydantic-version }} path: coverage @@ -87,7 +87,7 @@ jobs: version: "latest" - name: Get coverage files - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: pattern: .coverage* path: coverage @@ -101,7 +101,7 @@ jobs: - run: coverage html --show-contexts --title "taskiq-faststream coverage for ${{ github.sha }}" - name: Store coverage html - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: coverage-html path: htmlcov From 448b98a9fb4364eeafdfafb2741544df36d6bf30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 18:07:42 +0000 Subject: [PATCH 03/10] chore(deps): bump the github-actions group across 1 directory with 3 updates Bumps the github-actions group with 3 updates in the / directory: [actions/checkout](https://github.com/actions/checkout), [actions/upload-artifact](https://github.com/actions/upload-artifact) and [actions/download-artifact](https://github.com/actions/download-artifact). Updates `actions/checkout` from 5 to 6 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) Updates `actions/upload-artifact` from 5 to 6 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v5...v6) Updates `actions/download-artifact` from 6 to 7 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/download-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index da0d4c6..a203bed 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Python uses: actions/setup-python@v6 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b59f3c2..a059cc1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: 3.13 @@ -45,7 +45,7 @@ jobs: fail-fast: false steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Python uses: actions/setup-python@v6 with: @@ -64,7 +64,7 @@ jobs: COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}-${{ matrix.pydantic-version }} CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}-${{ matrix.pydantic-version }} - name: Store coverage files - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: .coverage.${{ runner.os }}-py${{ matrix.python-version }}-${{ matrix.pydantic-version }} path: coverage @@ -76,7 +76,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: @@ -87,7 +87,7 @@ jobs: version: "latest" - name: Get coverage files - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: .coverage* path: coverage @@ -101,7 +101,7 @@ jobs: - run: coverage html --show-contexts --title "taskiq-faststream coverage for ${{ github.sha }}" - name: Store coverage html - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: coverage-html path: htmlcov From 93619faccec35e9239f067f4ee0efb09bada0a6b Mon Sep 17 00:00:00 2001 From: yann-combarnous <39089766+yann-combarnous@users.noreply.github.com> Date: Wed, 24 Dec 2025 11:25:24 +0100 Subject: [PATCH 04/10] Update pyproject --- pyproject.toml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4ba4061..65aab82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "taskiq-faststream" -version = "0.3.2" +version = "0.4.0" description = "FastStream - taskiq integration to schedule FastStream tasks" readme = "README.md" license = "MIT" @@ -40,7 +40,7 @@ classifiers = [ dependencies = [ - "taskiq>=0.11.0,<0.12.0", + "taskiq>=0.12.1,<0.13.0", "faststream>=0.3.14,<0.7", ] @@ -65,6 +65,10 @@ redis = [ "faststream[redis]" ] +otel = [ + "taskiq[otel]>=0.12.1,<0.13.0" +] + [dependency-groups] test = [ "taskiq-faststream[nats]", From 5574e57763ab9f2acfde979321551b6b0cb0bbbe Mon Sep 17 00:00:00 2001 From: yann-combarnous <39089766+yann-combarnous@users.noreply.github.com> Date: Wed, 24 Dec 2025 11:25:58 +0100 Subject: [PATCH 05/10] Update broker.py --- taskiq_faststream/broker.py | 51 +++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/taskiq_faststream/broker.py b/taskiq_faststream/broker.py index f5a6009..bb7739a 100644 --- a/taskiq_faststream/broker.py +++ b/taskiq_faststream/broker.py @@ -13,6 +13,11 @@ from taskiq_faststream.types import ScheduledTask from taskiq_faststream.utils import resolve_msg +try: + from taskiq.middlewares.otel_middleware import OpenTelemetryMiddleware +except ImportError: + OpenTelemetryMiddleware = None # type: ignore[assignment,misc] + PublishParameters: TypeAlias = typing.Any @@ -30,11 +35,32 @@ class BrokerWrapper(AsyncBroker): task : Register FastStream scheduled task. """ - def __init__(self, broker: Any) -> None: + def __init__( + self, + broker: Any, + *, + enable_otel: bool = False, + ) -> None: + """Initialize BrokerWrapper. + + Args: + broker: FastStream broker instance to wrap. + enable_otel: Enable OpenTelemetry middleware for distributed tracing. + Requires taskiq[otel] to be installed. + """ super().__init__() self.formatter = PatchedFormatter() self.broker = broker + if enable_otel: + if OpenTelemetryMiddleware is None: + msg = ( + "OpenTelemetry middleware requires taskiq[otel] to be installed. " + "Install it with: pip install taskiq-faststream[otel]" + ) + raise ImportError(msg) + self.middlewares.append(OpenTelemetryMiddleware()) + async def startup(self) -> None: """Startup wrapped FastStream broker.""" await super().startup() @@ -105,11 +131,32 @@ class AppWrapper(BrokerWrapper): task : Register FastStream scheduled task. """ - def __init__(self, app: Application) -> None: + def __init__( + self, + app: Application, + *, + enable_otel: bool = False, + ) -> None: + """Initialize AppWrapper. + + Args: + app: FastStream application instance to wrap. + enable_otel: Enable OpenTelemetry middleware for distributed tracing. + Requires taskiq[otel] to be installed. + """ super(BrokerWrapper, self).__init__() self.formatter = PatchedFormatter() self.app = app + if enable_otel: + if OpenTelemetryMiddleware is None: + msg = ( + "OpenTelemetry middleware requires taskiq[otel] to be installed. " + "Install it with: pip install taskiq-faststream[otel]" + ) + raise ImportError(msg) + self.middlewares.append(OpenTelemetryMiddleware()) + async def startup(self) -> None: """Startup wrapped FastStream.""" await super(BrokerWrapper, self).startup() From c70d755a87198f0c2c62b7c12c60ceb14b0b03c8 Mon Sep 17 00:00:00 2001 From: yann-combarnous <39089766+yann-combarnous@users.noreply.github.com> Date: Wed, 24 Dec 2025 11:28:34 +0100 Subject: [PATCH 06/10] Update pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 65aab82..2407514 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ redis = [ ] otel = [ - "taskiq[otel]>=0.12.1,<0.13.0" + "taskiq[opentelemetry]>=0.12.1,<0.13.0" ] [dependency-groups] From 3b492c3d09ae2480bda20409e60d279098ae6dcb Mon Sep 17 00:00:00 2001 From: yann-combarnous <39089766+yann-combarnous@users.noreply.github.com> Date: Wed, 24 Dec 2025 11:31:03 +0100 Subject: [PATCH 07/10] Update README.md --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/README.md b/README.md index ecf9bc9..9d5804f 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,12 @@ pip install taskiq-faststream[nats] pip install taskiq-faststream[redis] ``` +For **OpenTelemetry** distributed tracing support: + +```bash +pip install taskiq-faststream[otel] +``` + ## Usage The package gives you two classes: `AppWrapper` and `BrokerWrapper` @@ -141,3 +147,37 @@ taskiq_broker.task( ..., ) ``` + +## OpenTelemetry Support + +**taskiq-faststream** supports distributed tracing with OpenTelemetry. To enable it, install the `otel` extra and pass `enable_otel=True` when creating the broker wrapper: + +```python +from faststream.nats import NatsBroker +from taskiq_faststream import BrokerWrapper + +broker = NatsBroker() + +# Enable OpenTelemetry middleware +taskiq_broker = BrokerWrapper(broker, enable_otel=True) +``` + +This will automatically add OpenTelemetry middleware to track task execution, providing insights into: +- Task execution spans +- Task dependencies and call chains +- Performance metrics +- Error tracking + +Make sure to configure your OpenTelemetry exporter (e.g., Jaeger, Zipkin) according to your monitoring setup. + +The same applies to `AppWrapper`: + +```python +from faststream import FastStream +from taskiq_faststream import AppWrapper + +app = FastStream(broker) + +# Enable OpenTelemetry middleware +taskiq_broker = AppWrapper(app, enable_otel=True) +``` From d486f109399a9287e6d39a681faed0cff51138b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Dec 2025 18:19:02 +0000 Subject: [PATCH 08/10] chore(deps-dev): bump the pip group across 1 directory with 3 updates Updates the requirements on [pytest](https://github.com/pytest-dev/pytest), [mypy](https://github.com/python/mypy) and [ruff](https://github.com/astral-sh/ruff) to permit the latest version. Updates `pytest` to 9.0.2 - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.4.0...9.0.2) Updates `mypy` from 1.18.2 to 1.19.1 - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.18.2...v1.19.1) Updates `ruff` from 0.14.1 to 0.14.10 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.14.1...0.14.10) --- updated-dependencies: - dependency-name: pytest dependency-version: 9.0.2 dependency-type: direct:development dependency-group: pip - dependency-name: mypy dependency-version: 1.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: pip - dependency-name: ruff dependency-version: 0.14.10 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: pip ... Signed-off-by: dependabot[bot] --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2407514..41d0824 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,14 +78,14 @@ test = [ "taskiq-faststream[redis]", "coverage[toml]>=7.2.0,<8.0.0", - "pytest>=7.4.0,<9", + "pytest>=7.4.0,<10", "freezegun>=1.2.2" ] dev = [ {include-group = "test"}, - "mypy==1.18.2", - "ruff==0.14.1", + "mypy==1.19.1", + "ruff==0.14.10", "pre-commit >=3.6.0,<5.0.0", ] From 4381e273a8882c80d0ccf74bc79708dcbb27d1b3 Mon Sep 17 00:00:00 2001 From: Nikita Pastukhov Date: Thu, 25 Dec 2025 22:07:41 +0300 Subject: [PATCH 09/10] refactor: remove OTEL explicit integration --- README.md | 8 +++++--- taskiq_faststream/broker.py | 37 ++++++++----------------------------- 2 files changed, 13 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 9d5804f..e1c52e0 100644 --- a/README.md +++ b/README.md @@ -150,16 +150,17 @@ taskiq_broker.task( ## OpenTelemetry Support -**taskiq-faststream** supports distributed tracing with OpenTelemetry. To enable it, install the `otel` extra and pass `enable_otel=True` when creating the broker wrapper: +**taskiq-faststream** supports taskiq's OpenTelemetry middleware. To enable it, pass `OpenTelemetryMiddleware` when creating the broker wrapper: ```python from faststream.nats import NatsBroker from taskiq_faststream import BrokerWrapper +from taskiq.middlewares.otel_middleware import OpenTelemetryMiddleware broker = NatsBroker() # Enable OpenTelemetry middleware -taskiq_broker = BrokerWrapper(broker, enable_otel=True) +taskiq_broker = BrokerWrapper(broker, middlewares=[OpenTelemetryMiddleware()]) ``` This will automatically add OpenTelemetry middleware to track task execution, providing insights into: @@ -175,9 +176,10 @@ The same applies to `AppWrapper`: ```python from faststream import FastStream from taskiq_faststream import AppWrapper +from taskiq.middlewares.otel_middleware import OpenTelemetryMiddleware app = FastStream(broker) # Enable OpenTelemetry middleware -taskiq_broker = AppWrapper(app, enable_otel=True) +taskiq_broker = AppWrapper(app, middlewares=[OpenTelemetryMiddleware()]) ``` diff --git a/taskiq_faststream/broker.py b/taskiq_faststream/broker.py index bb7739a..6ed7d97 100644 --- a/taskiq_faststream/broker.py +++ b/taskiq_faststream/broker.py @@ -1,11 +1,13 @@ import typing import warnings +from collections.abc import Iterable from typing import Any, TypeAlias import anyio from faststream._internal.application import Application from faststream.types import SendableMessage from taskiq import AsyncBroker +from taskiq.abc.middleware import TaskiqMiddleware from taskiq.acks import AckableMessage from taskiq.decor import AsyncTaskiqDecoratedTask @@ -13,11 +15,6 @@ from taskiq_faststream.types import ScheduledTask from taskiq_faststream.utils import resolve_msg -try: - from taskiq.middlewares.otel_middleware import OpenTelemetryMiddleware -except ImportError: - OpenTelemetryMiddleware = None # type: ignore[assignment,misc] - PublishParameters: TypeAlias = typing.Any @@ -39,27 +36,18 @@ def __init__( self, broker: Any, *, - enable_otel: bool = False, + middlewares: Iterable[TaskiqMiddleware] = (), ) -> None: """Initialize BrokerWrapper. Args: broker: FastStream broker instance to wrap. - enable_otel: Enable OpenTelemetry middleware for distributed tracing. - Requires taskiq[otel] to be installed. + middlewares: Middlewares to add to the broker. """ super().__init__() self.formatter = PatchedFormatter() self.broker = broker - - if enable_otel: - if OpenTelemetryMiddleware is None: - msg = ( - "OpenTelemetry middleware requires taskiq[otel] to be installed. " - "Install it with: pip install taskiq-faststream[otel]" - ) - raise ImportError(msg) - self.middlewares.append(OpenTelemetryMiddleware()) + self.add_middlewares(*middlewares) async def startup(self) -> None: """Startup wrapped FastStream broker.""" @@ -135,27 +123,18 @@ def __init__( self, app: Application, *, - enable_otel: bool = False, + middlewares: Iterable[TaskiqMiddleware] = (), ) -> None: """Initialize AppWrapper. Args: app: FastStream application instance to wrap. - enable_otel: Enable OpenTelemetry middleware for distributed tracing. - Requires taskiq[otel] to be installed. + middlewares: Middlewares to add to the broker. """ super(BrokerWrapper, self).__init__() self.formatter = PatchedFormatter() self.app = app - - if enable_otel: - if OpenTelemetryMiddleware is None: - msg = ( - "OpenTelemetry middleware requires taskiq[otel] to be installed. " - "Install it with: pip install taskiq-faststream[otel]" - ) - raise ImportError(msg) - self.middlewares.append(OpenTelemetryMiddleware()) + self.add_middlewares(*middlewares) async def startup(self) -> None: """Startup wrapped FastStream.""" From bee7af48e45ef88b85a376328942ce69fb16b13e Mon Sep 17 00:00:00 2001 From: Nikita Pastukhov Date: Thu, 25 Dec 2025 22:10:39 +0300 Subject: [PATCH 10/10] ci: add 3.14 tests --- .github/workflows/test.yml | 2 +- pyproject.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a059cc1..97eb930 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] fail-fast: false steps: diff --git a/pyproject.toml b/pyproject.toml index 41d0824..180253f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ license = "MIT" license-files = ["LICENSE"] authors = [ { name = "Taskiq team", email = "taskiq@no-reply.com" }, - { name = "Nikita Pastukhov", email = "nikita@pastukhov-dev.com" }, + { name = "Nikita Pastukhov", email = "nikita@pastukhov-dev.ru" }, ] keywords = ["taskiq", "tasks", "distributed", "async", "FastStream"] @@ -66,7 +66,7 @@ redis = [ ] otel = [ - "taskiq[opentelemetry]>=0.12.1,<0.13.0" + "taskiq[opentelemetry]" ] [dependency-groups] @@ -76,7 +76,7 @@ test = [ "taskiq-faststream[kafka]", "taskiq-faststream[confluent]", "taskiq-faststream[redis]", - + "taskiq-faststream[otel]", "coverage[toml]>=7.2.0,<8.0.0", "pytest>=7.4.0,<10", "freezegun>=1.2.2"