add POST /logs installer log relay to VictoriaLogs
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful

A host being PXE-discovered or installed is not in Kubernetes, so vlagent
cannot collect its logs and a failed install leaves no record; the installer
environment has no internal-CA trust or credentials for the HTTPS log ingest,
and bootapi is already the plain-HTTP broker it can reach.

- add POST /logs, token-guarded like POST /provisioned, relaying ndjson to
  vlinsert's jsonline endpoint keyed on serial+phase
- stamp observed source IP and resolved NetBox device name into extra_fields
- return 202 on a sink failure so logs never block an install
- add BOOTAPI_VLINSERT_URL/_TIMEOUT and bootapi_log_relay metrics
This commit is contained in:
2026-10-03 19:44:27 +10:00
parent 0f0fb7fa8e
commit 3c77895788
9 changed files with 416 additions and 5 deletions
+11 -1
View File
@@ -28,6 +28,8 @@ type metrics struct {
netboxLookups *prometheus.CounterVec // by field,result
netboxDuration *prometheus.HistogramVec
provisioned *prometheus.CounterVec // by result
logRelay *prometheus.CounterVec // by result
logLines prometheus.Counter
ipxeGated prometheus.Counter
}
@@ -56,12 +58,20 @@ func newMetrics(cache cacheStats, git gitStats) *metrics {
Name: "bootapi_provisioned_total",
Help: "Provisioned callbacks, by result (ok|unauthorized|notfound|error|disabled).",
}, []string{"result"}),
logRelay: prometheus.NewCounterVec(prometheus.CounterOpts{
Name: "bootapi_log_relay_total",
Help: "Installer log batches relayed to VictoriaLogs, by result (ok|error|unauthorized|disabled).",
}, []string{"result"}),
logLines: prometheus.NewCounter(prometheus.CounterOpts{
Name: "bootapi_log_relay_lines_total",
Help: "Installer log lines successfully relayed to VictoriaLogs.",
}),
ipxeGated: prometheus.NewCounter(prometheus.CounterOpts{
Name: "bootapi_ipxe_gated_total",
Help: "Known hosts served the local-boot fallback because pxe_enabled=false.",
}),
}
reg.MustRegister(m.httpRequests, m.renders, m.netboxLookups, m.netboxDuration, m.provisioned, m.ipxeGated)
reg.MustRegister(m.httpRequests, m.renders, m.netboxLookups, m.netboxDuration, m.provisioned, m.logRelay, m.logLines, m.ipxeGated)
if cache != nil {
reg.MustRegister(newCacheCollector(cache))
}