|
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()}) |
|
), |
|
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", |
|
}, |
|
) |
|
|
|
@gr.on( |
|
[demo.load, timer.tick, start.change, end.change, selected_fn.change], |
|
inputs=[start, end, selected_fn], |
|
outputs=[plot, unique_users, total_requests, process_time], |
|
) |
|
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()) |
|
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"]) |
|
assert isinstance(df, pd.DataFrame) |
|
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() |
|
|