Files
Assistant/cmd/work-graph-runtime/status.go
m 2353f1f3bb
CI / test (push) Successful in 48s
CI / test (pull_request) Successful in 46s
feat(work-graph): expose runtime status
2026-08-23 19:57:32 +03:00

46 lines
1.4 KiB
Go

package main
import (
"context"
"encoding/json"
"net/http"
"git.cin.su/m/Assistant/adapters/postgres"
)
type workGraphStatusReader interface {
RuntimeStatus(context.Context) (postgres.WorkGraphRuntimeStatus, error)
}
type workGraphStatusResponse struct {
Runtime string `json:"runtime"`
Status string `json:"status"`
GraphsByState map[string]int64 `json:"graphs_by_state"`
NodesByState map[string]int64 `json:"nodes_by_state"`
QueueByState map[string]int64 `json:"queue_by_state"`
ObservedAtUnixMillis int64 `json:"observed_at_unix_millis"`
}
func workGraphStatusHandler(reader workGraphStatusReader) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet || r.URL.Path != "/v1/work-graphs/status" {
http.NotFound(w, r)
return
}
status, err := reader.RuntimeStatus(r.Context())
if err != nil {
http.Error(w, "work graph status unavailable", http.StatusServiceUnavailable)
return
}
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(workGraphStatusResponse{
Runtime: "work-graph-runtime",
Status: "ready",
GraphsByState: status.GraphsByState,
NodesByState: status.NodesByState,
QueueByState: status.QueueByState,
ObservedAtUnixMillis: status.ObservedAtUnixMillis,
})
})
}