Merge pull request #15794 from expruc/feat/otel_user_metrics

feat: open telemetry user metrics
This commit is contained in:
Tim Jaeryang Baek 2025-07-18 14:22:21 +04:00 committed by GitHub
commit a395abd5d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -34,6 +34,8 @@ from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from open_webui.env import OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_ENDPOINT from open_webui.env import OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_ENDPOINT
from open_webui.socket.main import get_active_user_ids
from open_webui.models.users import Users
_EXPORT_INTERVAL_MILLIS = 10_000 # 10 seconds _EXPORT_INTERVAL_MILLIS = 10_000 # 10 seconds
@ -59,6 +61,12 @@ def _build_meter_provider() -> MeterProvider:
instrument_name="http.server.requests", instrument_name="http.server.requests",
attribute_keys=["http.method", "http.route", "http.status_code"], attribute_keys=["http.method", "http.route", "http.status_code"],
), ),
View(
instrument_name="webui.users.total",
),
View(
instrument_name="webui.users.active",
),
] ]
provider = MeterProvider( provider = MeterProvider(
@ -87,6 +95,38 @@ def setup_metrics(app: FastAPI) -> None:
unit="ms", unit="ms",
) )
def observe_active_users(
options: metrics.CallbackOptions,
) -> Sequence[metrics.Observation]:
return [
metrics.Observation(
value=len(get_active_user_ids()),
)
]
def observe_total_registered_users(
options: metrics.CallbackOptions,
) -> Sequence[metrics.Observation]:
return [
metrics.Observation(
value=len(Users.get_users()["users"]),
)
]
meter.create_observable_gauge(
name="webui.users.total",
description="Total number of registered users",
unit="users",
callbacks=[observe_total_registered_users],
)
meter.create_observable_gauge(
name="webui.users.active",
description="Number of currently active users",
unit="users",
callbacks=[observe_active_users],
)
# FastAPI middleware # FastAPI middleware
@app.middleware("http") @app.middleware("http")
async def _metrics_middleware(request: Request, call_next): async def _metrics_middleware(request: Request, call_next):