Files
fn_registry/functions/infra/collect_host_metrics.md
T

3.7 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
collect_host_metrics function go infra 1.0.0 impure func CollectHostMetrics() ([]PromSample, error) Recolecta metricas del host actual (uptime, load, CPU global y por nucleo, memoria, swap, disco por particion fisica e I/O por dispositivo, red por interfaz, temperaturas best-effort y procesos: total + top 5 por CPU) y las devuelve como slice de PromSample con nombres estilo node_exporter simplificados. Robusta: cada grupo de colector tiene manejo de error local; si un colector secundario falla se omite ese grupo sin abortar. Funciona en Linux amd64 y Android/Termux (linux arm64).
prometheus
metrics
node-exporter
gopsutil
fleet-metrics
infra
monitoring
host
PromSample_go_infra
false error_go_core
fmt
sort
strconv
time
github.com/shirou/gopsutil/v4/cpu
github.com/shirou/gopsutil/v4/disk
github.com/shirou/gopsutil/v4/host
github.com/shirou/gopsutil/v4/load
github.com/shirou/gopsutil/v4/mem
github.com/shirou/gopsutil/v4/net
github.com/shirou/gopsutil/v4/process
github.com/shirou/gopsutil/v4/sensors
slice de PromSample con las metricas del host. Cada sample lleva nombre estilo node_exporter (node_cpu_percent, node_disk_used_bytes{mount}, etc.) y sus labels. Error solo si falla el uptime de host (informacion basica imprescindible). true
TestCollectHostMetrics_ReturnsBasics
TestCollectHostMetrics_SamplesWellFormed
functions/infra/collect_host_metrics_test.go functions/infra/collect_host_metrics.go

Ejemplo

samples, err := CollectHostMetrics()
if err != nil {
    log.Fatal(err)
}
// Formatear a exposition Prometheus y enviar a VictoriaMetrics:
body := FormatPromExposition(samples, time.Now().UnixMilli())
err = PushPromRemote(
    "https://metrics-xxxx.organic-machine.com/api/v1/import/prometheus",
    "user", "pass",
    body,
    map[string]string{"instance": "lucas-pc"},
)

Cuando usarla

Cuando necesites un snapshot completo de salud del host en formato Prometheus para hacer push a un backend remoto (VictoriaMetrics, Mimir, etc.) en lugar de exponer un endpoint /metrics para scraping. Es el colector base del capability group fleet-metrics: combinala con format_prom_exposition_go_infra y push_prom_remote_go_infra para un agente de monitorizacion push estilo node_exporter. Llamala periodicamente (cron, timer, loop) en cada nodo de la flota.

Gotchas

  • Bloquea ~400ms: hace dos llamadas a cpu.Percent con intervalo de 200ms cada una (global + por nucleo). No la llames en hot paths ni con periodo < 1s.
  • Temperaturas best-effort: usa sensors.SensorsTemperatures (movido del paquete host al paquete sensors en gopsutil v4). Si no hay sensores (tipico en Android/Termux y muchos VPS) el grupo node_temp_celsius se omite sin error.
  • Particiones pseudo ignoradas: tmpfs, devtmpfs, overlay, squashfs, proc, sysfs y similares se filtran. Solo reporta particiones de almacenamiento real.
  • Loopback excluido: la interfaz lo no genera metricas de red.
  • CPU por proceso necesita dos lecturas: CPUPercent() de gopsutil sobre un proceso recien obtenido puede devolver un valor calculado desde el arranque del proceso, no un delta. Util para ranking relativo del top 5, no como medida instantanea precisa.
  • No incluye la label instance: los samples no llevan instance; esa la añade push_prom_remote_go_infra via extra_label en el push.
  • Permisos: algunos contadores (procesos de otros usuarios, ciertos sensores) pueden requerir privilegios; los fallos parciales se omiten silenciosamente.