2.9 KiB
2.9 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 | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| format_prom_exposition | function | go | infra | 1.0.0 | pure | func FormatPromExposition(samples []PromSample, timestampMs int64) string | Convierte un slice de PromSample en texto con formato Prometheus exposition (una linea por sample: name{k="v"} value timestampMs). Ordena labels por clave (salida determinista), escapa backslash/comilla/newline en valores de label, sanitiza el nombre de metrica a [a-zA-Z0-9_:], formatea el valor con FormatFloat 'g'. Si timestampMs<=0 omite el timestamp; sin labels omite las llaves. Funcion pura. |
|
|
false |
|
|
string con el texto exposition Prometheus, una linea por sample terminada en \n. String vacio si samples esta vacio. | true |
|
functions/infra/format_prom_exposition_test.go | functions/infra/format_prom_exposition.go |
Ejemplo
samples := []PromSample{
{Name: "node_load1", Value: 0.42},
{Name: "node_cpu_core_percent", Labels: map[string]string{"core": "0"}, Value: 12.5},
{Name: "node_disk_used_bytes", Labels: map[string]string{"mount": "/"}, Value: 1024},
}
text := FormatPromExposition(samples, 1700000000000)
// node_load1 0.42 1700000000000
// node_cpu_core_percent{core="0"} 12.5 1700000000000
// node_disk_used_bytes{mount="/"} 1024 1700000000000
Cuando usarla
Cuando tengas un slice de PromSample (tipicamente de collect_host_metrics) y
necesites serializarlo al formato de texto que entienden los endpoints de
ingestion Prometheus (/api/v1/import/prometheus de VictoriaMetrics, pushgateway,
etc.). Es el paso intermedio del capability group fleet-metrics: colecta ->
formatea -> empuja. Al ser pura y determinista, tambien sirve para snapshots
reproducibles y golden tests.
Gotchas
- El timestamp es milisegundos epoch (Prometheus exposition usa ms), no
segundos. Pasa
time.Now().UnixMilli(). timestampMs <= 0(incluido 0) omite el campo timestamp por completo.- La label
instanceNO se gestiona aqui: si esta enLabelsse serializa tal cual, pero la convencion del grupo es dejarla fuera y añadirla en el push via extra_label. - No agrupa por nombre ni emite lineas
# HELP/# TYPE: salida cruda de series, suficiente para ingestion pero no para un endpoint /metrics canonico. - El nombre de metrica se sanitiza de forma destructiva:
node.cpu-percent!se convierte ennode_cpu_percent_. Nombra bien los samples en origen.