Prometheus & Grafana
Node64 liefert unter /api/metrics Kennzahlen im Textformat von Prometheus – vom Kern über Healthchecks, DynDNS, DNS64, PROXY64 und CDN64 bis zu den Zertifikaten. So bindest du deine Node in ein bestehendes Monitoring ein, baust Grafana-Dashboards und schreibst eigene Alarmregeln.
Überblick
| Was | Wert |
|---|---|
| Endpunkt | GET /api/metrics |
| Format | Prometheus-Textformat 0.0.4 (text/plain; version=0.0.4), nicht zwischengespeichert |
| Anmeldung | API-Key als Bearer-Token (oder Browser-Sitzung) |
| Inhalt | Kern und alle laufenden Module; ausgeschaltete Module liefern nur node64_module_running{module="…"} 0 |
| Dauer | wenige Millisekunden je Abfrage |
| Intervall | 15 bis 60 Sekunden sind passend |
Einrichten
- Lege im Menüpunkt API (
/api/docs, Abschnitt API-Keys) einen eigenen Key an, zum Beispiel mit dem Namenprometheus. Mehr dazu unter Lokale API. - Speichere den Key auf dem Prometheus-Server in einer Datei, etwa
/etc/prometheus/node64.key. Die Datei enthält nur den Key (node64_…). - Trage einen Scrape-Job in die
prometheus.ymlein und lade Prometheus neu.
scrape_configs:
- job_name: node64
scheme: https # oder http, je nach Aufruf der Oberfläche
metrics_path: /api/metrics
authorization:
type: Bearer
credentials_file: /etc/prometheus/node64.key # Inhalt: node64_...
tls_config:
insecure_skip_verify: true # nur bei selbstsigniertem Zertifikat der Oberfläche
static_configs:
- targets: ["node64.lan:8080"]Node64 spricht HTTP und HTTPS auf demselben Port. Hat die Oberfläche ein richtiges Zertifikat (siehe Zertifikate), lässt du insecure_skip_verify weg. Jede Node hat ihre eigenen API-Keys. Für mehrere Nodes legst du daher je Node einen eigenen Scrape-Job mit eigener Key-Datei an.
Test von Hand:
curl -s -H "Authorization: Bearer $(cat node64.key)" http://node64.lan:8080/api/metrics | headAnmeldung und Schutz
/api/metricsist wie die übrige API geschützt: ohne Key kommt401.- Jede Abfrage setzt beim API-Key „zuletzt benutzt“ – du siehst also in der Key-Liste, ob Prometheus noch abfragt.
- Falsche Keys bremst Node64 wie bei der übrigen API aus (nach 5 Fehlversuchen nur noch ein Versuch alle 30 Sekunden).
- Nutze einen eigenen Key nur für Prometheus. Brauchst du ihn nicht mehr, löschst du ihn – ohne andere Skripte zu stören.
Alle Metriken
Zeitpunkte sind Unix-Zeit in Sekunden (Endung _seconds), Dauern in Sekunden, Datenmengen in Bytes. Werte mit „immer 1“ tragen ihre Information im Label – zählen lässt sich das mit count oder sum.
Kern
| Metrik | Typ | Labels | Bedeutung |
|---|---|---|---|
node64_info | Gauge | version, node_id, node_name, hostname | immer 1 |
node64_start_time_seconds | Gauge | Startzeit des Prozesses | |
node64_uptime_seconds | Gauge | Laufzeit seit dem Start | |
node64_database_bytes | Gauge | Größe der Datenbank inkl. WAL | |
node64_module_enabled | Gauge | module | 1 = in den Einstellungen eingeschaltet |
node64_module_running | Gauge | module | 1 = Modul läuft |
node64_module_error | Gauge | module | 1 = Modul meldet einen Fehler |
node64_module_info | Gauge | module, version | immer 1, Version des Moduls |
node64_link_linked | Gauge | 1 = mit einem ipv64.net-Account verknüpft (Healthchecks-Sync) | |
node64_link_connected | Gauge | 1 = Verbindung zu ipv64.net steht | |
node64_link_outbox | Gauge | noch nicht übertragene Einträge | |
node64_link_conflicts | Gauge | offene Konflikte | |
node64_link_last_sync_seconds | Gauge | letzter erfolgreicher Abgleich | |
node64_link_online_checks_today | Gauge | heute verbrauchte Online-Messungen (nur verknüpft) | |
node64_link_online_checks_limit | Gauge | Tageslimit der Online-Messungen, 0 = keins (nur verknüpft) | |
node64_group_members | Gauge | Mitglieder des Clusters (ohne diese Node) | |
node64_group_members_online | Gauge | davon erreichbar | |
node64_group_member_up | Gauge | node_id, node_name | 1 = Mitglied erreichbar |
node64_mcp_enabled | Gauge | 1 = KI-Schnittstelle (MCP) eingeschaltet | |
node64_mcp_calls_total | Counter | tool, result | Werkzeugaufrufe über MCP seit dem Start, result = ok oder error |
go_goroutines | Gauge | Anzahl Goroutinen | |
go_memstats_heap_alloc_bytes | Gauge | belegter Heap | |
go_memstats_sys_bytes | Gauge | vom Betriebssystem bezogener Speicher | |
go_gc_cycles_total | Counter | abgeschlossene Garbage-Collector-Läufe | |
node64_scrape_duration_seconds | Gauge | Dauer dieser Abfrage |
Healthchecks
Labels je Check: token (bleibt gleich, auch wenn sich der Name ändert), check (Name), type und group.
| Metrik | Typ | Labels | Bedeutung |
|---|---|---|---|
node64_hc_check_state | Gauge | Check, state | immer 1, Zustand im Label: up, down, degraded, flapping, dependent, stabilizing, paused, pending, unchecked |
node64_hc_check_up | Gauge | Check | 1 = erreichbar (up, degraded), 0 = gestört; fehlt bei pausiert, wartend und nicht überwacht |
node64_hc_check_maintenance | Gauge | Check | 1 = gerade in einer Wartung |
node64_hc_check_last_seconds | Gauge | Check | Zeitpunkt der letzten Messung |
node64_hc_check_latency_seconds | Gauge | Check | Antwortzeit der letzten Messung |
node64_hc_check_consecutive_failures | Gauge | Check | Fehlschläge in Folge |
node64_hc_check_interval_seconds | Gauge | Check | Prüfintervall |
node64_hc_check_cert_expiry_seconds | Gauge | Check | Ablauf des TLS-Zertifikats (nur HTTPS-Checks) |
node64_hc_checks | Gauge | state | Anzahl Checks je Zustand; maintenance zählt zusätzlich |
node64_hc_incidents_open | Gauge | offene Störungen |
Proxmox VE
Je System (system), Node und Gast: node64_pve_up, node64_pve_error, node64_pve_poll_failures_total, node64_pve_quorate, node64_pve_guests_running, node64_pve_guests_bad, node64_pve_node_up, node64_pve_guest_state, node64_pve_guest_up sowie CPU, RAM und Disk als Anteil 0..1 (node64_pve_node_*_ratio, node64_pve_guest_*_ratio), je Gast dazu Netz und Disk-I/O in Byte/s (node64_pve_guest_net_*_bytes, node64_pve_guest_disk_*_bytes), RAM in Byte und CPUs (node64_pve_guest_memory_bytes, node64_pve_guest_cpus). Die vollständige Liste steht unter Proxmox VE.
Docker
Für die Docker-Überwachung. Je Host: node64_docker_up, node64_docker_enabled, node64_docker_poll_failures_total, node64_docker_last_poll_seconds, node64_docker_containers_running, node64_docker_containers_bad. Je Container: node64_docker_container_state{state,detail}, …_container_up, …_container_restarts, …_container_cpu_ratio, …_container_cpus, …_container_memory_ratio, …_container_memory_bytes, …_container_memory_limit_bytes, …_container_uptime_seconds, …_container_net_in_bytes, …_container_net_out_bytes, …_container_disk_read_bytes und …_container_disk_write_bytes.
DynDNS
| Metrik | Typ | Labels | Bedeutung |
|---|---|---|---|
node64_dyndns_target_status | Gauge | target, status | immer 1, Zustand im Label: ok, cdn, pending, dns, error, paused, off, new |
node64_dyndns_target_ok | Gauge | target | 1 = letzte Aktualisierung erfolgreich, 0 = Fehler; fehlt bei aus, pausiert und neu |
node64_dyndns_target_last_ok_seconds | Gauge | target | letzte erfolgreiche Aktualisierung |
node64_dyndns_target_last_error_seconds | Gauge | target | letzter Fehler |
node64_dyndns_targets | Gauge | status | Anzahl Ziele je Zustand |
node64_dyndns_updates_24h | Gauge | Aufrufe bei ipv64.net in den letzten 24 Stunden |
DNS64
Die Zähler laufen seit dem letzten Start des DNS-Servers. Eine Änderung der Einstellungen startet ihn neu – rate() und increase() kommen damit zurecht.
| Metrik | Typ | Labels | Bedeutung |
|---|---|---|---|
node64_dns64_up | Gauge | 1 = DNS-Server läuft | |
node64_dns64_start_time_seconds | Gauge | Start des DNS-Servers | |
node64_dns64_blocking_paused | Gauge | 1 = Blockieren pausiert | |
node64_dns64_queries_total | Counter | status, proto | Anfragen; status: allowed, cached, blocked, local, error, custom; proto: udp, tcp, doh, dot, doq |
node64_dns64_query_duration_seconds_sum, …_count | Counter | Summe und Anzahl der Antwortzeiten (Mittelwert über rate(sum)/rate(count)) | |
node64_dns64_querylog_dropped_total | Counter | nicht ins Abfrage-Log geschriebene Einträge | |
node64_dns64_refused_total | Counter | abgewiesen, weil von außerhalb der erlaubten Netze | |
node64_dns64_blocklist_domains | Gauge | Domains in den Blocklisten | |
node64_dns64_cache_entries, node64_dns64_cache_max_entries | Gauge | Einträge im Cache und dessen Größe | |
node64_dns64_cache_hits_total, …_misses_total, …_stale_served_total | Counter | Cache-Treffer, Fehlgriffe und abgelaufen ausgelieferte Antworten | |
node64_dns64_upstream_up | Gauge | upstream, proto | 1 = Upstream gesund |
node64_dns64_upstream_requests_total, node64_dns64_upstream_errors_total | Counter | upstream, proto | Anfragen an den Upstream und Fehler |
node64_dns64_upstream_latency_seconds | Gauge | upstream, proto | mittlere Antwortzeit des Upstreams |
node64_dns64_group_queries_total | Counter | group, status | Anfragen je Gerätegruppe und Ergebnis |
node64_dns64_group_internet_off | Gauge | group | 1 = Internet aus für die Gruppe (Knopf oder Zeitplan) |
node64_dns64_group_free | Gauge | group | 1 = Knopf „Frei“ aktiv (Zeitpläne und Kategorien ausgesetzt) |
node64_dns64_group_members | Gauge | group | Einträge (MAC, IP, Netz) der Gruppe |
node64_dns64_forward_up | Gauge | domain, server | Server der Weiterleitung gesund (1/0) |
node64_dns64_forward_requests_total | Counter | domain, server | Anfragen an den Server der Weiterleitung |
node64_dns64_forward_errors_total | Counter | domain, server | Fehler des Servers der Weiterleitung |
PROXY64 und CDN64
Labels je Host: host_id (bleibt gleich), host (erster Name) und kind (proxy, redirect, dead, passthrough).
| Metrik | Typ | Labels | Bedeutung |
|---|---|---|---|
node64_cdn64_hosts | Gauge | Anzahl Hosts | |
node64_cdn64_host_enabled | Gauge | Host | 1 = eingeschaltet |
node64_cdn64_host_requests_total | Counter | Host | Anfragen seit dem Start der Node |
node64_cdn64_host_errors_total | Counter | Host | Fehler (5xx, Ziel nicht erreichbar) seit dem Start |
node64_cdn64_host_blocked_total | Counter | Host | abgewiesene Anfragen seit dem Start |
node64_cdn64_host_requests_24h | Gauge | Host, status (2xx … 5xx) | Anfragen der letzten 24 Stunden je Statusklasse |
node64_cdn64_host_bytes_24h | Gauge | Host | gesendete Bytes der letzten 24 Stunden |
node64_cdn64_host_blocked_24h | Gauge | Host | Abgewiesene der letzten 24 Stunden |
node64_cdn64_host_target_up | Gauge | Host | 1 = Ziel bei der letzten Prüfung erreichbar (nur Proxy und TLS-Durchreichung) |
node64_cdn64_host_target_latency_seconds | Gauge | Host | Verbindungszeit zum Ziel |
node64_cdn64_honeypot_blocks, …_blocks_total, …_rejected_total, …_decoy_total, …_reported_total | Gauge, Counter | Zusammenarbeit mit Honeypot64: aktive Sofort-Sperren, Sperren, Abweisungen, an den Köder gegebene und gemeldete Anfragen (nur, wenn ein Schalter an ist) |
CDN64 – die Werte stammen aus dem letzten Abgleich der Node mit ipv64 (jede Minute):
| Metrik | Typ | Labels | Bedeutung |
|---|---|---|---|
node64_cdn64_online_name | Gauge | host_id, name, mode | immer 1: Name ist online eingeschaltet (mode 1 = durchreichen, 2 = terminieren) |
node64_cdn64_online_edge_connected | Gauge | edge | 1 = Tunnel zu diesem Edge-Server verbunden |
node64_cdn64_online_edge_rtt_seconds | Gauge | edge, transport (quic, tcp) | Laufzeit des Tunnels |
node64_cdn64_online_edge_streams | Gauge | edge | offene Besucher-Streams |
node64_cdn64_online_edge_streams_total, …_reconnects_total | Counter | edge | Streams und Neuverbindungen seit dem Start der Node |
node64_cdn64_online_host_status | Gauge | name, mode, status | immer 1, Zustand bei ipv64: active, pending, blocked |
node64_cdn64_online_host_traffic_month_bytes | Gauge | name | Traffic dieses Namens im laufenden Monat |
node64_cdn64_online_domains_used, …_domains_limit | Gauge | CDN-Domains des Accounts (das klassische ipv64-CDN zählt mit) | |
node64_cdn64_online_traffic_used_bytes, …_traffic_limit_bytes | Gauge | CDN-Traffic des Accounts im Monat und Kontingent | |
node64_cdn64_online_last_sync_seconds | Gauge | letzter Abgleich mit ipv64 | |
node64_cdn64_online_sync_ok | Gauge | 1 = letzter Abgleich hat geklappt |
Zertifikate
Die Werte der zentralen Zertifikatsverwaltung gehören zum Kern und sind immer dabei. Labels je Zertifikat: cert_id, name (erster Name) und source (ipv64, alias, http, dns, ca, self, upload).
| Metrik | Typ | Labels | Bedeutung |
|---|---|---|---|
node64_certs | Gauge | Anzahl Zertifikate | |
node64_cert_expiry_seconds | Gauge | Zertifikat | Ablaufzeitpunkt |
node64_cert_status | Gauge | Zertifikat, status | immer 1, Zustand im Label: pending, valid, error, expired |
node64_cert_error | Gauge | Zertifikat | 1 = letzter Abruf bzw. letzte Erneuerung gescheitert |
node64_cert_auto_renew | Gauge | Zertifikat | 1 = wird automatisch erneuert |
Honeypot64
Nur bei eingeschaltetem Modul; Einzelheiten unter Honeypot64.
| Metrik | Typ | Labels | Bedeutung |
|---|---|---|---|
node64_honeypot_connections_total | Counter | service, port | Verbindungen zu den Fallen-Diensten |
node64_honeypot_logins_total | Counter | service | Login-Versuche |
node64_honeypot_events_total | Counter | kind, source | Ereignisse je Art |
node64_honeypot_unique_sources | Gauge | verschiedene Quell-IPs der letzten 24 Stunden | |
node64_honeypot_listen_errors | Gauge | port | Port konnte nicht geöffnet werden |
node64_honeypot_buffer_events, node64_honeypot_dropped_total | Gauge, Counter | Ereignisse im Puffer, wegen Überlast verworfen | |
node64_honeypot_report_last_success_timestamp | Gauge | letzte erfolgreiche Meldung an ipv64 (Unix-Zeit, 0 = noch keine) | |
node64_honeypot_report_errors_total, node64_honeypot_report_sources_total | Counter | fehlgeschlagene Meldungen, gemeldete Quell-IPs | |
node64_honeypot_log_lines_total, node64_honeypot_log_file_ok | Counter, Gauge | path | gelesene Log-Zeilen; Datei wird gelesen (1) oder Fehler (0) |
node64_honeypot_syslog_messages_total, node64_honeypot_syslog_denied_total | Counter | angenommene und abgewiesene Syslog-Nachrichten | |
node64_firewall_active, node64_firewall_entries, node64_firewall_list_entries | Gauge | family bzw. list, edition | Firewall-Helfer im Modus ohne Oberfläche: aktiv, Einträge je Adressfamilie und Liste |
node64_firewall_last_update_timestamp, node64_firewall_errors_total | Gauge, Counter | letzte Aktualisierung, Fehler | |
node64_honeypot_proxy_decoy_total, …_proxy_access_total, …_proxy_access_dropped_total, …_proxy_blocks_total | Counter | Zusammenarbeit mit PROXY64: Köder-Anfragen, ausgewertete und verworfene Zugriffe, Sofort-Sperren | |
node64_honeypot_events_by_country_total | Counter | country | Ereignisse je Herkunftsland |
Beispiele für Alarmregeln
Diese Regeln kannst du direkt in eine Regeldatei von Prometheus übernehmen und an Alertmanager weiterleiten. Passe Schwellen und Wartezeiten (for) an deine Umgebung an.
groups:
- name: node64
rules:
- alert: Node64Down
expr: up{job="node64"} == 0
for: 5m
annotations:
summary: "Node64 {{ $labels.instance }} antwortet nicht"
- alert: Node64ModuleError
expr: node64_module_error == 1
for: 10m
annotations:
summary: "Modul {{ $labels.module }} meldet einen Fehler"
- alert: Node64CheckDown
expr: node64_hc_check_up == 0 and on(token) node64_hc_check_maintenance == 0
for: 2m
annotations:
summary: "{{ $labels.check }} ist gestört"
- alert: Node64CertExpiresSoon
expr: node64_hc_check_cert_expiry_seconds - time() < 14 * 86400
annotations:
summary: "Zertifikat von {{ $labels.check }} läuft in unter 14 Tagen ab"
- alert: Node64DynDNSError
expr: node64_dyndns_target_ok == 0
for: 15m
- alert: Node64DNSUpstreamDown
expr: node64_dns64_upstream_up == 0
for: 5m
- alert: Node64CertExpires
expr: node64_cert_expiry_seconds - time() < 14 * 86400 and on(cert_id) node64_cert_auto_renew == 1
annotations:
summary: "Zertifikat {{ $labels.name }} läuft in unter 14 Tagen ab (Erneuerung klappt nicht?)"
- alert: Node64CDN64TargetDown
expr: node64_cdn64_host_target_up == 0 and on(host_id) node64_cdn64_host_enabled == 1
for: 5m
- alert: Node64CDN64TunnelDown
expr: node64_cdn64_online_edge_connected == 0
for: 3m
- alert: Node64IPv64Disconnected
expr: node64_link_linked == 1 and node64_link_connected == 0
for: 10mNode64 benachrichtigt bei Störungen schon selbst über seine Benachrichtigungskanäle. Alarme aus Prometheus eignen sich vor allem, wenn du alles an einer Stelle bündeln willst – oder als zweite, unabhängige Sicht auf die Node selbst (etwa Node64Down).
Grafana
Für Grafana brauchst du keine eigene Schnittstelle: Grafana liest die Werte aus Prometheus.
- In Grafana unter Connections → Data sources eine Datenquelle vom Typ Prometheus anlegen und die Adresse deines Prometheus-Servers eintragen.
- Ein neues Dashboard anlegen und Panels mit den Abfragen unten hinzufügen.
- Optional eine Variable für mehrere Nodes anlegen, zum Beispiel mit
label_values(node64_info, node_name).
Eine fertige Dashboard-Vorlage gibt es nicht – mit diesen Abfragen ist ein eigenes Dashboard aber schnell gebaut:
| Panel | PromQL |
|---|---|
| Gestörte Checks (Stat) | sum(node64_hc_checks{state="down"}) |
| Antwortzeit je Check in ms | node64_hc_check_latency_seconds * 1000 |
| Offene Störungen | node64_hc_incidents_open |
| Tage bis Zertifikatsablauf | (node64_cert_expiry_seconds - time()) / 86400 |
| DNS-Anfragen pro Sekunde nach Status | sum by (status) (rate(node64_dns64_queries_total[5m])) |
| Anteil blockierter DNS-Anfragen (1 h) | sum(increase(node64_dns64_queries_total{status="blocked"}[1h])) / sum(increase(node64_dns64_queries_total[1h])) |
| Mittlere DNS-Antwortzeit | rate(node64_dns64_query_duration_seconds_sum[5m]) / rate(node64_dns64_query_duration_seconds_count[5m]) |
| DNS-Cache-Trefferquote | rate(node64_dns64_cache_hits_total[5m]) / (rate(node64_dns64_cache_hits_total[5m]) + rate(node64_dns64_cache_misses_total[5m])) |
| Reverse-Proxy: Anfragen pro Sekunde je Host | sum by (host) (rate(node64_cdn64_host_requests_total[5m])) |
| Reverse-Proxy: Fehlerquote je Host | sum by (host) (rate(node64_cdn64_host_errors_total[5m])) / sum by (host) (rate(node64_cdn64_host_requests_total[5m])) |
| Laufzeit der Node in Tagen | node64_uptime_seconds / 86400 |
| Speicher der Node | go_memstats_sys_bytes |
Messwerte zu Online-Checks aus Nürnberg und Falkenstein siehst du zusätzlich im Portal von ipv64.net, wenn deine Node verknüpft ist.
Etwas unklar, fehlt etwas oder hast du eine Frage zu Node64? Frag im offiziellen Forum v64.tech.