From 58cff5e4828c56d6ce566c0248f238efdbf21e25 Mon Sep 17 00:00:00 2001 From: FlorentMair80 <138573185+FlorentMair80@users.noreply.github.com> Date: Mon, 17 Nov 2025 21:31:24 +0100 Subject: [PATCH] feat: add a metric to monitor daily unique users (#19236) #19234 --- backend/open_webui/models/users.py | 7 +++++++ backend/open_webui/utils/telemetry/metrics.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/backend/open_webui/models/users.py b/backend/open_webui/models/users.py index c80e8f645a..66aa1d8163 100644 --- a/backend/open_webui/models/users.py +++ b/backend/open_webui/models/users.py @@ -325,6 +325,13 @@ class UsersTable: except Exception: return None + def get_num_users_active_today(self) -> Optional[int]: + with get_db() as db: + current_timestamp = int(datetime.datetime.now().timestamp()) + today_midnight_timestamp = current_timestamp - (current_timestamp % 86400) + query = db.query(User).filter(User.last_active_at > today_midnight_timestamp) + return query.count() + def update_user_role_by_id(self, id: str, role: str) -> Optional[UserModel]: try: with get_db() as db: diff --git a/backend/open_webui/utils/telemetry/metrics.py b/backend/open_webui/utils/telemetry/metrics.py index c7b47c0231..85bd418844 100644 --- a/backend/open_webui/utils/telemetry/metrics.py +++ b/backend/open_webui/utils/telemetry/metrics.py @@ -99,6 +99,9 @@ def _build_meter_provider(resource: Resource) -> MeterProvider: View( instrument_name="webui.users.active", ), + View( + instrument_name="webui.users.active.today", + ), ] provider = MeterProvider( @@ -159,6 +162,18 @@ def setup_metrics(app: FastAPI, resource: Resource) -> None: callbacks=[observe_active_users], ) + def observe_users_active_today( + options: metrics.CallbackOptions, + ) -> Sequence[metrics.Observation]: + return [metrics.Observation(value=Users.get_num_users_active_today())] + + meter.create_observable_gauge( + name="webui.users.active.today", + description="Number of users active since midnight today", + unit="users", + callbacks=[observe_users_active_today], + ) + # FastAPI middleware @app.middleware("http") async def _metrics_middleware(request: Request, call_next):