client.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package api
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "sort"
  6. "time"
  7. "fbtop/internal/shared"
  8. )
  9. func Fetch(url string) (shared.State, error) {
  10. resp, err := (&http.Client{Timeout: 3 * time.Second}).Get(url + "/api/v1/metrics")
  11. if err != nil {
  12. return shared.State{}, err
  13. }
  14. defer resp.Body.Close()
  15. var raw map[string]map[string]map[string]int64
  16. if err := json.NewDecoder(resp.Body).Decode(&raw); err != nil {
  17. return shared.State{}, err
  18. }
  19. kinds := map[string]shared.Kind{
  20. "input": shared.KindInput,
  21. "filter": shared.KindFilter,
  22. "output": shared.KindOutput,
  23. }
  24. now := time.Now()
  25. var cs []shared.ComponentMetrics
  26. for section, comps := range raw {
  27. k, ok := kinds[section]
  28. if !ok {
  29. continue
  30. }
  31. for id, fields := range comps {
  32. cs = append(cs, shared.ComponentMetrics{ID: id, Kind: k, Fields: fields, Stamp: now})
  33. }
  34. }
  35. // Stable sort by kind for consistent display order
  36. sort.SliceStable(cs, func(i, j int) bool { return cs[i].Kind < cs[j].Kind })
  37. return shared.State{Comps: cs, Connected: true, UpdatedAt: now}, nil
  38. }