From 2871b11cbcc246c277a9edd28bf2942671f21ab3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jul 2026 15:25:53 +0000 Subject: [PATCH 1/2] build(deps): bump the observability group with 2 updates Bumps the observability group with 2 updates: [posthog](https://github.com/posthog/posthog-python) and [prometheus-fastapi-instrumentator](https://github.com/trallnag/prometheus-fastapi-instrumentator). Updates `posthog` from 3.25.0 to 7.34.0 - [Release notes](https://github.com/posthog/posthog-python/releases) - [Changelog](https://github.com/PostHog/posthog-python/blob/main/CHANGELOG.md) - [Commits](https://github.com/posthog/posthog-python/compare/v3.25.0...posthog-v7.34.0) Updates `prometheus-fastapi-instrumentator` from 8.0.2 to 8.1.0 - [Release notes](https://github.com/trallnag/prometheus-fastapi-instrumentator/releases) - [Changelog](https://github.com/trallnag/prometheus-fastapi-instrumentator/blob/master/CHANGELOG.md) - [Commits](https://github.com/trallnag/prometheus-fastapi-instrumentator/compare/v8.0.2...v8.1.0) --- updated-dependencies: - dependency-name: posthog dependency-version: 7.34.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: observability - dependency-name: prometheus-fastapi-instrumentator dependency-version: 8.1.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: observability ... Signed-off-by: dependabot[bot] --- pyproject.toml | 4 ++-- uv.lock | 29 +++++++++-------------------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e5361b01..58c5dea8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,8 +27,8 @@ server = [ "asyncpg>=0.25.0,<1.0.0", "alembic>=1.18.5,<2.0.0", "sentry-sdk[fastapi]>=2.66.0,<3.0.0", - "posthog>=3.0.0,<4.0.0", - "prometheus-fastapi-instrumentator>=8.0.2,<9.0.0", + "posthog>=7.34.0,<8.0.0", + "prometheus-fastapi-instrumentator>=8.1.0,<9.0.0", "python-multipart==0.0.32", "python-magic>=0.4.17,<0.5.0", "boto3>=1.43.9,<1.44.0", # https://github.com/boto/boto3/issues/4435 diff --git a/uv.lock b/uv.lock index afe0ccdb..72405678 100644 --- a/uv.lock +++ b/uv.lock @@ -1070,15 +1070,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] -[[package]] -name = "monotonic" -version = "1.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ea/ca/8e91948b782ddfbd194f323e7e7d9ba12e5877addf04fb2bf8fca38e86ac/monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7", size = 7615, upload-time = "2021-08-11T14:37:28.79Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/67/7e8406a29b6c45be7af7740456f7f37025f0506ae2e05fb9009a53946860/monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c", size = 8154, upload-time = "2021-04-09T21:58:05.122Z" }, -] - [[package]] name = "mypy" version = "2.1.0" @@ -1401,19 +1392,17 @@ wheels = [ [[package]] name = "posthog" -version = "3.25.0" +version = "7.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backoff" }, { name = "distro" }, - { name = "monotonic" }, - { name = "python-dateutil" }, { name = "requests" }, - { name = "six" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/a9/ec3bbc23b6f3c23c52e0b5795b1357cca74aa5cfb254213f1e471fef9b4d/posthog-3.25.0.tar.gz", hash = "sha256:9168f3e7a0a5571b6b1065c41b3c171fbc68bfe72c3ac0bfd6e3d2fcdb7df2ca", size = 75968, upload-time = "2025-04-15T21:15:45.552Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/c1/a51567ea78c5e9c77abbc863088f82e79f908e500d3441292a11abe8ad6a/posthog-7.34.0.tar.gz", hash = "sha256:c5f0e9a07536867bea3b5a233378b1a3f7c69ec36c5770581147f7be4fd91005", size = 390645, upload-time = "2026-07-30T09:50:07.221Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/e2/c158366e621562ef224f132e75c1d1c1fce6b078a19f7d8060451a12d4b9/posthog-3.25.0-py2.py3-none-any.whl", hash = "sha256:85db78c13d1ecb11aed06fad53759c4e8fb3633442c2f3d0336bc0ce8a585d30", size = 89115, upload-time = "2025-04-15T21:15:43.934Z" }, + { url = "https://files.pythonhosted.org/packages/9d/de/a4209376d58d7d4081dff754c3bf4f99186d0d07aaca33d19e52d2a50fdf/posthog-7.34.0-py3-none-any.whl", hash = "sha256:6a277de901c240fc66926d64b4ba4a04d0212653ae616c0219168bf6addc36fb", size = 463553, upload-time = "2026-07-30T09:50:05.068Z" }, ] [[package]] @@ -1451,15 +1440,15 @@ wheels = [ [[package]] name = "prometheus-fastapi-instrumentator" -version = "8.0.2" +version = "8.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "prometheus-client" }, { name = "starlette" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1b/e9/2065686d1dfa62296fdc158b6e8fd25b0cb3dca09b0632cabeb5ae81fe4d/prometheus_fastapi_instrumentator-8.0.2.tar.gz", hash = "sha256:3c252e748151768a7aefd66824a04a870144f71de48a67aed211749a9ca2a548", size = 21342, upload-time = "2026-06-23T09:39:31.611Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/f4/cdcebf7094b03b99fba71ac8f56bd6f227973642662f49d272332d8419b3/prometheus_fastapi_instrumentator-8.1.0.tar.gz", hash = "sha256:b77f3043665e8d28e2bbd21017506195a43d9adf1d402d01bf95b494b7e560e1", size = 20492, upload-time = "2026-07-26T11:12:44.202Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/c7/fa2b3f469a2e6001b829e0d6bc8680755349aa1329a87bf48731e9d5d30a/prometheus_fastapi_instrumentator-8.0.2-py3-none-any.whl", hash = "sha256:746002ec1e2c58b93f61444e1d104de959a9463a6a3f1c8909ac3757e16c3866", size = 20549, upload-time = "2026-06-23T09:39:32.616Z" }, + { url = "https://files.pythonhosted.org/packages/44/b9/91a2246e6cf01b7ccb14479803c8a50f9c258ae5c6a0f16ba3294820632b/prometheus_fastapi_instrumentator-8.1.0-py3-none-any.whl", hash = "sha256:b9f40b2cff3f7891ca0610b3ae4fc6ec723fd326b04bb659819aaeb821a0fc7d", size = 19649, upload-time = "2026-07-26T11:12:45.168Z" }, ] [[package]] @@ -1782,8 +1771,8 @@ server = [ { name = "networkx", specifier = ">=3.2.0,<4.0.0" }, { name = "numpy", specifier = ">=2.4.6,<3.0.0" }, { name = "pandas", specifier = ">=3.0.3,<4.0.0" }, - { name = "posthog", specifier = ">=3.0.0,<4.0.0" }, - { name = "prometheus-fastapi-instrumentator", specifier = ">=8.0.2,<9.0.0" }, + { name = "posthog", specifier = ">=7.34.0,<8.0.0" }, + { name = "prometheus-fastapi-instrumentator", specifier = ">=8.1.0,<9.0.0" }, { name = "pydantic", specifier = ">=2.0.0,<3.0.0" }, { name = "pydantic-settings", specifier = ">=2.14.2,<3.0.0" }, { name = "pyjwt", specifier = ">=2.12.0,<3.0.0" }, From 1540c890d71a764101f2c90b6f4a974d7fef3809 Mon Sep 17 00:00:00 2001 From: F-G Fernandez <26927750+frgfm@users.noreply.github.com> Date: Thu, 30 Jul 2026 18:09:16 +0200 Subject: [PATCH 2/2] fix(telemetry): adapt to PostHog 7 --- src/app/services/telemetry.py | 18 +++++++++--------- src/tests/services/test_telemetry.py | 21 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 src/tests/services/test_telemetry.py diff --git a/src/app/services/telemetry.py b/src/app/services/telemetry.py index 85b9f891..3992a196 100644 --- a/src/app/services/telemetry.py +++ b/src/app/services/telemetry.py @@ -4,7 +4,7 @@ # See LICENSE or go to for full license details. import logging -from typing import Union +from typing import Any from posthog import Posthog @@ -16,23 +16,23 @@ class TelemetryClient: - def __init__(self, api_key: Union[str, None] = None) -> None: + def __init__(self, api_key: str | None = None) -> None: self.is_enabled = isinstance(api_key, str) if isinstance(api_key, str): - self.ph_client = Posthog(project_api_key=api_key, host="https://eu.posthog.com") + self.ph_client = Posthog(project_api_key=api_key, host=settings.POSTHOG_HOST) logger.info("PostHog enabled") - def capture(self, *args, **kwargs) -> None: + def capture(self, distinct_id: str | int, *, event: str, properties: dict[str, Any] | None = None) -> None: if self.is_enabled: - self.ph_client.capture(*args, **kwargs) + self.ph_client.capture(event, distinct_id=distinct_id, properties=properties) - def identify(self, *args, **kwargs) -> None: + def identify(self, distinct_id: str | int, properties: dict[str, Any] | None = None) -> None: if self.is_enabled: - self.ph_client.identify(*args, **kwargs) + self.ph_client.set(distinct_id=distinct_id, properties=properties) - def alias(self, *args, **kwargs) -> None: + def alias(self, previous_id: str | int, distinct_id: str | int) -> None: if self.is_enabled: - self.ph_client.alias(*args, **kwargs) + self.ph_client.alias(previous_id=str(previous_id), distinct_id=str(distinct_id)) telemetry_client = TelemetryClient(api_key=settings.POSTHOG_KEY) diff --git a/src/tests/services/test_telemetry.py b/src/tests/services/test_telemetry.py new file mode 100644 index 00000000..35c39eea --- /dev/null +++ b/src/tests/services/test_telemetry.py @@ -0,0 +1,21 @@ +from unittest.mock import Mock, patch + +from app.core.config import settings +from app.services.telemetry import TelemetryClient + + +def test_posthog_v7_adapter() -> None: + posthog_client = Mock() + with patch("app.services.telemetry.Posthog", return_value=posthog_client) as posthog: + client = TelemetryClient(api_key="project-key") + + posthog.assert_called_once_with(project_api_key="project-key", host=settings.POSTHOG_HOST) + + client.capture(42, event="user-login", properties={"method": "credentials"}) + posthog_client.capture.assert_called_once_with("user-login", distinct_id=42, properties={"method": "credentials"}) + + client.identify(42, {"name": "Alice"}) + posthog_client.set.assert_called_once_with(distinct_id=42, properties={"name": "Alice"}) + + client.alias(42, "alice") + posthog_client.alias.assert_called_once_with(previous_id="42", distinct_id="alice")