64 lines
1.4 KiB
Go

package report
import (
"context"
"encoding/json"
"io"
"net/http"
"time"
)
// collectGateway checks the main gateway health endpoint and parses subsystem status.
func collectGateway() *GatewayReport {
r := &GatewayReport{}
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:6001/v1/health", nil)
if err != nil {
return r
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
r.Responsive = false
return r
}
defer resp.Body.Close()
r.Responsive = true
r.HTTPStatus = resp.StatusCode
body, err := io.ReadAll(resp.Body)
if err != nil {
return r
}
// Try to parse the health response JSON.
// Expected: {"status":"ok","version":"...","subsystems":{"rqlite":{"status":"ok","latency":"2ms"},...}}
var health struct {
Status string `json:"status"`
Version string `json:"version"`
Subsystems map[string]json.RawMessage `json:"subsystems"`
}
if err := json.Unmarshal(body, &health); err != nil {
return r
}
r.Version = health.Version
if len(health.Subsystems) > 0 {
r.Subsystems = make(map[string]SubsystemHealth, len(health.Subsystems))
for name, raw := range health.Subsystems {
var sub SubsystemHealth
if err := json.Unmarshal(raw, &sub); err == nil {
r.Subsystems[name] = sub
}
}
}
return r
}