Spaces:
Paused
Paused
| import random | |
| import time | |
| import pandas as pd | |
| import gradio as gr | |
| data = {"data": {}} | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Monitoring Dashboard") | |
| timer = gr.Timer(5) | |
| with gr.Row(): | |
| start = gr.DateTime("now - 24h", label="Start Time") | |
| end = gr.DateTime("now", label="End Time") | |
| selected_fn = gr.Dropdown( | |
| ["All"], | |
| value="All", | |
| label="Endpoint", | |
| info="Select the function to see analytics for, or 'All' for aggregate.", | |
| ) | |
| demo.load( | |
| lambda: gr.Dropdown( | |
| choices=["All"] | |
| + list({row["function"] for row in data["data"].values()}) # type: ignore | |
| ), | |
| None, | |
| selected_fn, | |
| ) | |
| with gr.Group(): | |
| with gr.Row(): | |
| unique_users = gr.Label(label="Unique Users") | |
| total_requests = gr.Label(label="Total Requests") | |
| process_time = gr.Label(label="Avg Process Time") | |
| plot = gr.BarPlot( | |
| x="time", | |
| y="function", | |
| color="status", | |
| title="Requests over Time", | |
| y_title="Requests", | |
| x_bin="1m", | |
| y_aggregate="count", | |
| color_map={ | |
| "success": "#22c55e", | |
| "failure": "#ef4444", | |
| "pending": "#eab308", | |
| "queued": "#3b82f6", | |
| }, | |
| ) | |
| def gen_plot(start, end, selected_fn): | |
| df = pd.DataFrame(list(data["data"].values())) | |
| if selected_fn != "All": | |
| df = df[df["function"] == selected_fn] | |
| df = df[(df["time"] >= start) & (df["time"] <= end)] | |
| df["time"] = pd.to_datetime(df["time"], unit="s") | |
| unique_users = len(df["session_hash"].unique()) # type: ignore | |
| total_requests = len(df) | |
| process_time = round(df["process_time"].mean(), 2) | |
| duration = end - start | |
| x_bin = ( | |
| "1h" | |
| if duration >= 60 * 60 * 24 | |
| else "15m" | |
| if duration >= 60 * 60 * 3 | |
| else "1m" | |
| ) | |
| df = df.drop(columns=["session_hash"]) # type: ignore | |
| assert isinstance(df, pd.DataFrame) # noqa: S101 | |
| return ( | |
| gr.BarPlot(value=df, x_bin=x_bin, x_lim=[start, end]), | |
| unique_users, | |
| total_requests, | |
| process_time, | |
| ) | |
| if __name__ == "__main__": | |
| data["data"] = {} | |
| for _ in range(random.randint(300, 500)): | |
| timedelta = random.randint(0, 60 * 60 * 24 * 3) | |
| data["data"][random.randint(1, 100000)] = { | |
| "time": time.time() - timedelta, | |
| "status": random.choice( | |
| ["success", "success", "failure"] | |
| if timedelta > 30 * 60 | |
| else ["queued", "pending"] | |
| ), | |
| "function": random.choice(["predict", "chat", "chat"]), | |
| "process_time": random.randint(0, 10), | |
| "session_hash": str(random.randint(0, 4)), | |
| } | |
| demo.launch() | |