feat: labels map en config (role) → extra_label en métricas + stream labels en logs
This commit is contained in:
@@ -16,6 +16,9 @@ type Config struct {
|
|||||||
User string `json:"user"` // basic-auth user, shared by metrics and logs (empty disables auth)
|
User string `json:"user"` // basic-auth user, shared by metrics and logs (empty disables auth)
|
||||||
Pass string `json:"pass"` // basic-auth password
|
Pass string `json:"pass"` // basic-auth password
|
||||||
IntervalSec int `json:"interval_sec"` // metrics push period in seconds (default 15)
|
IntervalSec int `json:"interval_sec"` // metrics push period in seconds (default 15)
|
||||||
|
// Extra labels attached to every metric series and log stream of this node,
|
||||||
|
// e.g. {"role": "vps"}. Enables filtering in Grafana (per-role dashboards).
|
||||||
|
Labels map[string]string `json:"labels"`
|
||||||
// Android/Termux exec workaround: the standard Go binary cannot exec
|
// Android/Termux exec workaround: the standard Go binary cannot exec
|
||||||
// subprocesses there (seccomp blocks pidfd_open with SIGSYS). When set, the
|
// subprocesses there (seccomp blocks pidfd_open with SIGSYS). When set, the
|
||||||
// agent reads battery JSON from this file (written by a shell helper) instead
|
// agent reads battery JSON from this file (written by a shell helper) instead
|
||||||
@@ -81,3 +84,17 @@ func loadConfig(path string) (Config, error) {
|
|||||||
}
|
}
|
||||||
return cfg, nil
|
return cfg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extraLabels returns the labels attached to every series/stream: the node's
|
||||||
|
// instance plus any custom labels (e.g. role). The optional extra map is merged
|
||||||
|
// last (used to add per-stream labels like job/unit for logs).
|
||||||
|
func (cfg Config) extraLabels(extra map[string]string) map[string]string {
|
||||||
|
m := map[string]string{"instance": cfg.Node}
|
||||||
|
for k, v := range cfg.Labels {
|
||||||
|
m[k] = v
|
||||||
|
}
|
||||||
|
for k, v := range extra {
|
||||||
|
m[k] = v
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ func shipJournald(ctx context.Context, cfg Config, binPath string) {
|
|||||||
ts[i] = it.ts
|
ts[i] = it.ts
|
||||||
ln[i] = it.line
|
ln[i] = it.line
|
||||||
}
|
}
|
||||||
labels := map[string]string{"instance": cfg.Node, "job": "journald", "unit": unit}
|
labels := cfg.extraLabels(map[string]string{"job": "journald", "unit": unit})
|
||||||
if err := infra.PushLokiStream(cfg.LokiURL, cfg.User, cfg.Pass, labels, ts, ln); err != nil {
|
if err := infra.PushLokiStream(cfg.LokiURL, cfg.User, cfg.Pass, labels, ts, ln); err != nil {
|
||||||
log.Printf("logs: push error (unit=%s, %d lines): %v", unit, len(items), err)
|
log.Printf("logs: push error (unit=%s, %d lines): %v", unit, len(items), err)
|
||||||
}
|
}
|
||||||
@@ -195,7 +195,7 @@ func shipFileTail(ctx context.Context, cfg Config, path, job string) {
|
|||||||
if fi, err := os.Stat(path); err == nil {
|
if fi, err := os.Stat(path); err == nil {
|
||||||
offset = fi.Size() // skip pre-existing history on first start
|
offset = fi.Size() // skip pre-existing history on first start
|
||||||
}
|
}
|
||||||
labels := map[string]string{"instance": cfg.Node, "job": job}
|
labels := cfg.extraLabels(map[string]string{"job": job})
|
||||||
|
|
||||||
ticker := time.NewTicker(3 * time.Second)
|
ticker := time.NewTicker(3 * time.Second)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ func pushOnce(cfg Config) error {
|
|||||||
// cfg.BatteryFile and we parse that here; elsewhere we collect directly.
|
// cfg.BatteryFile and we parse that here; elsewhere we collect directly.
|
||||||
samples = append(samples, batterySamples(cfg)...)
|
samples = append(samples, batterySamples(cfg)...)
|
||||||
body := infra.FormatPromExposition(samples, time.Now().UnixMilli())
|
body := infra.FormatPromExposition(samples, time.Now().UnixMilli())
|
||||||
if err := infra.PushPromRemote(cfg.HubURL, cfg.User, cfg.Pass, body, map[string]string{"instance": cfg.Node}); err != nil {
|
if err := infra.PushPromRemote(cfg.HubURL, cfg.User, cfg.Pass, body, cfg.extraLabels(nil)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Printf("pushed %d samples", len(samples))
|
log.Printf("pushed %d samples", len(samples))
|
||||||
|
|||||||
Reference in New Issue
Block a user