Files
fn_registry/functions/infra/parse_unibus_health.md
T
egutierrez 82f1f1bd58 feat(infra): parse_unibus_health — healthz del cluster unibus → []PromSample
Función del grupo fleet-metrics que convierte la respuesta JSON del endpoint /healthz
de un nodo unibus (membershipd) en series Prometheus (unibus_up, unibus_status_ok,
unibus_posture_enforce/acl/tls/cluster, unibus_store_kv) con labels node/instance.
Pura de transformación (impure solo por el error de unmarshal). La consume el daemon
unibus_exporter del project fleet_monitoring. Con tests golden/edge/error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:26:15 +02:00

4.0 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, test_file_path, tests
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested test_file_path tests
parse_unibus_health function go infra 1.0.0 impure func ParseUnibusHealth(node string, body []byte) ([]PromSample, error) Convierte la respuesta JSON del endpoint /healthz de un nodo del cluster de mensajería unibus (membershipd) en una serie de PromSample lista para empujar a VictoriaMetrics, sin instrumentar el bus: solo lee su endpoint de salud. Adjunta a cada serie las labels node e instance (= nombre lógico del nodo) para distinguir los nodos cuando un único exporter scrapea varios. Emite siete series por nodo: unibus_up, unibus_status_ok, unibus_posture_enforce/acl/tls/cluster y unibus_store_kv. Devuelve error si el body no es JSON válido con la forma esperada.
prometheus
metrics
unibus
nats
healthz
posture
fleet-metrics
infra
monitoring
PromSample_go_infra
false error_go_core
encoding/json
fmt
name desc
node nombre lógico del nodo (p.ej. "magnus"); se adjunta como labels node e instance a cada serie
name desc
body cuerpo JSON crudo devuelto por GET https://<nodo>:8470/healthz, forma {"posture":{enforce,acl,tls,cluster bool; store string},"status":string}
slice de 7 PromSample con labels {node,instance}: unibus_up=1, unibus_status_ok (1 si status==ok), unibus_posture_enforce/acl/tls/cluster (1/0), unibus_store_kv (1 si posture.store==kv). Error si el body no es JSON válido. true functions/infra/parse_unibus_health_test.go
TestParseUnibusHealthGolden
TestParseUnibusHealthDegraded
TestParseUnibusHealthInvalid

parse_unibus_health

Función pura de transformación (clasificada impure solo porque devuelve error al fallar el unmarshal; no hace I/O ni red) que traduce la salud de un nodo del bus de mensajería unibus a métricas Prometheus. Pertenece al grupo de capacidad fleet-metrics: se compone con format_prom_exposition_go_infra (serializar) y push_prom_remote_go_infra (empujar a VictoriaMetrics).

El endpoint /healthz de cada nodo (membershipd) responde, verificado en producción:

{"posture":{"enforce":true,"acl":true,"tls":true,"cluster":true,"store":"kv"},"status":"ok"}

Ejemplo

package main

import (
	"fmt"
	"time"

	"fn-registry/functions/infra"
)

func main() {
	body := []byte(`{"posture":{"enforce":true,"acl":true,"tls":true,"cluster":true,"store":"kv"},"status":"ok"}`)
	samples, err := infra.ParseUnibusHealth("magnus", body)
	if err != nil {
		panic(err)
	}
	// Serializa y (en un exporter real) empuja a VictoriaMetrics.
	fmt.Print(infra.FormatPromExposition(samples, time.Now().UnixMilli()))
	// unibus_up{instance="magnus",node="magnus"} 1 ...
	// unibus_posture_enforce{instance="magnus",node="magnus"} 1 ...
}

Cuando usarla

Úsala dentro de un exporter que monitoriza el cluster unibus: tras hacer GET https://<nodo>:8470/healthz con la CA del cluster, pasa el cuerpo a esta función para obtener las series del nodo. Llámala solo cuando el nodo respondió; si el GET falla (timeout, TLS, no-2xx), emite tú unibus_up=0 para ese nodo, porque sin cuerpo no hay nada que parsear.

Gotchas

  • No emite unibus_up=0: ese caso (nodo caído) es responsabilidad del llamador, que sabe si el GET falló. Esta función siempre emite unibus_up=1 porque solo se la llama con un cuerpo recibido.
  • Las labels node e instance toman el mismo valor (el nombre lógico del nodo). El push_prom_remote_go_infra añadiría instance vía extra_label por igual a todas las series del body; por eso aquí ya se fija instance por-serie, para que cada nodo unibus conserve su identidad cuando un solo exporter empuja los de varios nodos en un único POST.
  • Solo lee la posture y el status que hoy expone /healthz. Métricas profundas de NATS/JetStream (msgs/s, conexiones, RAFT leader por stream) NO salen de aquí: requieren el monitoring embebido de NATS (puerto 8222), que en producción está cerrado.