40af073d9c
Embeds node_exporter inside Alloy alongside Loki shipping; pushes metrics via remote_write to observe Prom with job=node_lxc_canary to run side-by-side with the existing node_exporter scrape until cutover. See homelab-docs/docs/audit/alloy-consolidation-2026-05-21.md.
88 lines
2.4 KiB
Django/Jinja
88 lines
2.4 KiB
Django/Jinja
// Alloy — journald-only on this host (no Docker — Meridian + LiteLLM run
|
|
// as systemd services). Ships to Loki on observe.lan.balders.ca.
|
|
|
|
loki.source.journal "host" {
|
|
path = "/var/log/journal"
|
|
max_age = "1m"
|
|
forward_to = [loki.process.journal.receiver]
|
|
|
|
relabel_rules = loki.relabel.journal.rules
|
|
labels = {
|
|
job = "journald",
|
|
host = "{{ alloy_host_label }}",
|
|
}
|
|
}
|
|
|
|
loki.relabel "journal" {
|
|
forward_to = []
|
|
|
|
rule {
|
|
source_labels = ["__journal__systemd_unit"]
|
|
target_label = "unit"
|
|
}
|
|
rule {
|
|
source_labels = ["__journal__hostname"]
|
|
target_label = "instance"
|
|
}
|
|
rule {
|
|
source_labels = ["__journal_priority_keyword"]
|
|
target_label = "severity"
|
|
}
|
|
}
|
|
|
|
loki.process "journal" {
|
|
forward_to = [loki.write.default.receiver]
|
|
}
|
|
|
|
loki.write "default" {
|
|
endpoint {
|
|
url = "{{ alloy_loki_url }}"
|
|
}
|
|
}
|
|
|
|
// ============================================================
|
|
// Prometheus — embedded node_exporter (replaces standalone).
|
|
// Bare-metal Alloy on systemd; reads /proc, /sys, / natively
|
|
// (no /host/* bind mounts; no pid:host needed).
|
|
// ============================================================
|
|
|
|
prometheus.exporter.unix "node" {
|
|
// Defaults: rootfs_path=/, procfs_path=/proc, sysfs_path=/sys
|
|
}
|
|
|
|
prometheus.scrape "node" {
|
|
targets = prometheus.exporter.unix.node.targets
|
|
forward_to = [prometheus.relabel.node.receiver]
|
|
scrape_interval = "15s"
|
|
job_name = "{{ alloy_prom_job | default('node_lxc') }}"
|
|
}
|
|
|
|
// Alloy's exporter sets job=integrations/unix and the targets carry no
|
|
// instance label by default. Rewrite to match the historical Prometheus
|
|
// scrape labels so existing dashboards keep working.
|
|
prometheus.relabel "node" {
|
|
forward_to = [prometheus.remote_write.observe.receiver]
|
|
rule {
|
|
target_label = "instance"
|
|
replacement = "{{ alloy_prom_instance | default(ansible_default_ipv4.address + ':9100') }}"
|
|
}
|
|
rule {
|
|
target_label = "job"
|
|
replacement = "{{ alloy_prom_job | default('node_lxc') }}"
|
|
}
|
|
rule {
|
|
target_label = "group"
|
|
replacement = "{{ alloy_prom_group | default('lxc') }}"
|
|
}
|
|
rule {
|
|
target_label = "hostname"
|
|
replacement = "{{ alloy_prom_hostname | default(alloy_host_label) }}"
|
|
}
|
|
}
|
|
|
|
prometheus.remote_write "observe" {
|
|
endpoint {
|
|
url = "{{ alloy_prom_remote_write | default('http://observe.lan.balders.ca:9090/api/v1/write') }}"
|
|
}
|
|
}
|