From 9b78d65b1df7805f7913580090a732b3c123c4a1 Mon Sep 17 00:00:00 2001 From: William Valentin Date: Sat, 14 Mar 2026 11:01:40 -0700 Subject: [PATCH] feat: add stats summary and timeseries API endpoints --- cmd/query-api/main.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/cmd/query-api/main.go b/cmd/query-api/main.go index 8ff2bdf..0b58176 100644 --- a/cmd/query-api/main.go +++ b/cmd/query-api/main.go @@ -209,6 +209,33 @@ func main() { httpx.WriteJSON(w, http.StatusOK, map[string]any{"run": run, "spans": spans}) }) + r.Get("/v1/stats/summary", func(w http.ResponseWriter, r *http.Request) { + summary, err := db.GetSummary(r.Context()) + if err != nil { + httpx.WriteJSON(w, http.StatusInternalServerError, map[string]any{"error": "db_error"}) + return + } + httpx.WriteJSON(w, http.StatusOK, summary) + }) + + r.Get("/v1/stats/timeseries", func(w http.ResponseWriter, r *http.Request) { + window := r.URL.Query().Get("window") + switch window { + case "1h", "6h", "24h", "7d": + case "": + window = "1h" + default: + httpx.WriteJSON(w, http.StatusBadRequest, map[string]any{"error": "invalid_window"}) + return + } + timeseries, err := db.GetTimeseries(r.Context(), window) + if err != nil { + httpx.WriteJSON(w, http.StatusInternalServerError, map[string]any{"error": "db_error"}) + return + } + httpx.WriteJSON(w, http.StatusOK, timeseries) + }) + log.Printf("query-api listening on %s", addr) log.Fatal(http.ListenAndServe(addr, r)) }