diff --git a/backend/open_webui/models/chats.py b/backend/open_webui/models/chats.py index 56f992806ad..83d71ead9a0 100644 --- a/backend/open_webui/models/chats.py +++ b/backend/open_webui/models/chats.py @@ -1033,5 +1033,9 @@ def delete_shared_chats_by_user_id(self, user_id: str) -> bool: except Exception: return False + def get_chat_count(self) -> int: + """Get total number of chats.""" + with get_db() as db: + return db.query(Chat).count() Chats = ChatTable() diff --git a/backend/open_webui/utils/telemetry/metrics.py b/backend/open_webui/utils/telemetry/metrics.py index 75c13ccc0aa..de5fa13a734 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.chats.total", + ), ] provider = MeterProvider( @@ -145,6 +148,24 @@ def observe_total_registered_users( ) ] + def observe_total_chats( + options: metrics.CallbackOptions, + ) -> Sequence[metrics.Observation]: + from open_webui.models.chats import Chats # Import here to avoid circular imports + + try: + # Query the database for total chat count + total_chats = Chats.get_chat_count() # You'd need to implement this method + return [ + metrics.Observation( + value=total_chats, + ) + ] + except Exception as e: + from pprint import pprint + pprint(e) + return [metrics.Observation(value=0)] + meter.create_observable_gauge( name="webui.users.total", description="Total number of registered users", @@ -159,6 +180,13 @@ def observe_total_registered_users( callbacks=[observe_active_users], ) + meter.create_observable_gauge( + name="webui.chats.total", + description="Total number of chat conversations", + unit="chats", + callbacks=[observe_total_chats], + ) + # FastAPI middleware @app.middleware("http") async def _metrics_middleware(request: Request, call_next):