feat(instance): метрики всей машины вторым рядом дашборда

Дашборд показывал только контейнер (лимиты профиля), поэтому не было видно,
сколько ресурсов у хоста всего.

- `sysinfo.NewHostSampler` и `ReadHostMemory` всегда читают `/proc/stat` и
  `/proc/meminfo`, игнорируя cgroup;
- в ответе метрик появились `host_cpu` и `host_memory` (`source: host`);
- недоступные источники попадают в проверку `metrics`, а не ломают ручку.
This commit is contained in:
2026-09-20 22:10:09 +03:00
parent 3cfab89965
commit 5668d779df
5 changed files with 118 additions and 6 deletions
+23
View File
@@ -24,6 +24,17 @@ type metricsBody struct {
Percent float64 `json:"percent"`
Source string `json:"source"`
} `json:"memory"`
HostCPU struct {
Percent float64 `json:"percent"`
Cores float64 `json:"cores"`
Source string `json:"source"`
} `json:"host_cpu"`
HostMemory struct {
UsedBytes int64 `json:"used_bytes"`
TotalBytes int64 `json:"total_bytes"`
Percent float64 `json:"percent"`
Source string `json:"source"`
} `json:"host_memory"`
Disk struct {
UsedBytes int64 `json:"used_bytes"`
TotalBytes int64 `json:"total_bytes"`
@@ -105,6 +116,18 @@ func TestInstanceMetricsPayload(t *testing.T) {
} else if payload.Memory.UsedBytes <= 0 || payload.Memory.Percent <= 0 || payload.Memory.Percent > 100 {
t.Fatalf("память = %+v", payload.Memory)
}
// Второй ряд дашборда — вся машина.
if payload.HostCPU.Source == "" {
t.Log("источники процессора хоста недоступны (не Linux) — проверка пропущена")
} else if payload.HostCPU.Source != "host" || payload.HostCPU.Cores <= 0 {
t.Fatalf("процессор хоста = %+v", payload.HostCPU)
}
if payload.HostMemory.TotalBytes == 0 {
t.Log("память хоста недоступна (не Linux) — проверка пропущена")
} else if payload.HostMemory.Source != "host" || payload.HostMemory.Percent <= 0 {
t.Fatalf("память хоста = %+v", payload.HostMemory)
}
if payload.Disk.TotalBytes <= 0 || payload.Disk.UsedBytes <= 0 || payload.Disk.FreeBytes <= 0 {
t.Fatalf("диск = %+v", payload.Disk)
}