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

WasWert
EndpunktGET /api/metrics
FormatPrometheus-Textformat 0.0.4 (text/plain; version=0.0.4), nicht zwischengespeichert
AnmeldungAPI-Key als Bearer-Token (oder Browser-Sitzung)
InhaltKern und alle laufenden Module; ausgeschaltete Module liefern nur node64_module_running{module="…"} 0
Dauerwenige Millisekunden je Abfrage
Intervall15 bis 60 Sekunden sind passend

Einrichten

  1. Lege im Menüpunkt API (/api/docs, Abschnitt API-Keys) einen eigenen Key an, zum Beispiel mit dem Namen prometheus. Mehr dazu unter Lokale API.
  2. Speichere den Key auf dem Prometheus-Server in einer Datei, etwa /etc/prometheus/node64.key. Die Datei enthält nur den Key (node64_…).
  3. Trage einen Scrape-Job in die prometheus.yml ein und lade Prometheus neu.
prometheus.yml
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:

bash
curl -s -H "Authorization: Bearer $(cat node64.key)" http://node64.lan:8080/api/metrics | head

Anmeldung und Schutz

  • /api/metrics ist wie die übrige API geschützt: ohne Key kommt 401.
  • 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

MetrikTypLabelsBedeutung
node64_infoGaugeversion, node_id, node_name, hostnameimmer 1
node64_start_time_secondsGaugeStartzeit des Prozesses
node64_uptime_secondsGaugeLaufzeit seit dem Start
node64_database_bytesGaugeGröße der Datenbank inkl. WAL
node64_module_enabledGaugemodule1 = in den Einstellungen eingeschaltet
node64_module_runningGaugemodule1 = Modul läuft
node64_module_errorGaugemodule1 = Modul meldet einen Fehler
node64_module_infoGaugemodule, versionimmer 1, Version des Moduls
node64_link_linkedGauge1 = mit einem ipv64.net-Account verknüpft (Healthchecks-Sync)
node64_link_connectedGauge1 = Verbindung zu ipv64.net steht
node64_link_outboxGaugenoch nicht übertragene Einträge
node64_link_conflictsGaugeoffene Konflikte
node64_link_last_sync_secondsGaugeletzter erfolgreicher Abgleich
node64_link_online_checks_todayGaugeheute verbrauchte Online-Messungen (nur verknüpft)
node64_link_online_checks_limitGaugeTageslimit der Online-Messungen, 0 = keins (nur verknüpft)
node64_group_membersGaugeMitglieder des Clusters (ohne diese Node)
node64_group_members_onlineGaugedavon erreichbar
node64_group_member_upGaugenode_id, node_name1 = Mitglied erreichbar
node64_mcp_enabledGauge1 = KI-Schnittstelle (MCP) eingeschaltet
node64_mcp_calls_totalCountertool, resultWerkzeugaufrufe über MCP seit dem Start, result = ok oder error
go_goroutinesGaugeAnzahl Goroutinen
go_memstats_heap_alloc_bytesGaugebelegter Heap
go_memstats_sys_bytesGaugevom Betriebssystem bezogener Speicher
go_gc_cycles_totalCounterabgeschlossene Garbage-Collector-Läufe
node64_scrape_duration_secondsGaugeDauer dieser Abfrage

Healthchecks

Labels je Check: token (bleibt gleich, auch wenn sich der Name ändert), check (Name), type und group.

MetrikTypLabelsBedeutung
node64_hc_check_stateGaugeCheck, stateimmer 1, Zustand im Label: up, down, degraded, flapping, dependent, stabilizing, paused, pending, unchecked
node64_hc_check_upGaugeCheck1 = erreichbar (up, degraded), 0 = gestört; fehlt bei pausiert, wartend und nicht überwacht
node64_hc_check_maintenanceGaugeCheck1 = gerade in einer Wartung
node64_hc_check_last_secondsGaugeCheckZeitpunkt der letzten Messung
node64_hc_check_latency_secondsGaugeCheckAntwortzeit der letzten Messung
node64_hc_check_consecutive_failuresGaugeCheckFehlschläge in Folge
node64_hc_check_interval_secondsGaugeCheckPrüfintervall
node64_hc_check_cert_expiry_secondsGaugeCheckAblauf des TLS-Zertifikats (nur HTTPS-Checks)
node64_hc_checksGaugestateAnzahl Checks je Zustand; maintenance zählt zusätzlich
node64_hc_incidents_openGaugeoffene 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

MetrikTypLabelsBedeutung
node64_dyndns_target_statusGaugetarget, statusimmer 1, Zustand im Label: ok, cdn, pending, dns, error, paused, off, new
node64_dyndns_target_okGaugetarget1 = letzte Aktualisierung erfolgreich, 0 = Fehler; fehlt bei aus, pausiert und neu
node64_dyndns_target_last_ok_secondsGaugetargetletzte erfolgreiche Aktualisierung
node64_dyndns_target_last_error_secondsGaugetargetletzter Fehler
node64_dyndns_targetsGaugestatusAnzahl Ziele je Zustand
node64_dyndns_updates_24hGaugeAufrufe 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.

MetrikTypLabelsBedeutung
node64_dns64_upGauge1 = DNS-Server läuft
node64_dns64_start_time_secondsGaugeStart des DNS-Servers
node64_dns64_blocking_pausedGauge1 = Blockieren pausiert
node64_dns64_queries_totalCounterstatus, protoAnfragen; status: allowed, cached, blocked, local, error, custom; proto: udp, tcp, doh, dot, doq
node64_dns64_query_duration_seconds_sum, …_countCounterSumme und Anzahl der Antwortzeiten (Mittelwert über rate(sum)/rate(count))
node64_dns64_querylog_dropped_totalCounternicht ins Abfrage-Log geschriebene Einträge
node64_dns64_refused_totalCounterabgewiesen, weil von außerhalb der erlaubten Netze
node64_dns64_blocklist_domainsGaugeDomains in den Blocklisten
node64_dns64_cache_entries, node64_dns64_cache_max_entriesGaugeEinträge im Cache und dessen Größe
node64_dns64_cache_hits_total, …_misses_total, …_stale_served_totalCounterCache-Treffer, Fehlgriffe und abgelaufen ausgelieferte Antworten
node64_dns64_upstream_upGaugeupstream, proto1 = Upstream gesund
node64_dns64_upstream_requests_total, node64_dns64_upstream_errors_totalCounterupstream, protoAnfragen an den Upstream und Fehler
node64_dns64_upstream_latency_secondsGaugeupstream, protomittlere Antwortzeit des Upstreams
node64_dns64_group_queries_totalCountergroup, statusAnfragen je Gerätegruppe und Ergebnis
node64_dns64_group_internet_offGaugegroup1 = Internet aus für die Gruppe (Knopf oder Zeitplan)
node64_dns64_group_freeGaugegroup1 = Knopf „Frei“ aktiv (Zeitpläne und Kategorien ausgesetzt)
node64_dns64_group_membersGaugegroupEinträge (MAC, IP, Netz) der Gruppe
node64_dns64_forward_upGaugedomain, serverServer der Weiterleitung gesund (1/0)
node64_dns64_forward_requests_totalCounterdomain, serverAnfragen an den Server der Weiterleitung
node64_dns64_forward_errors_totalCounterdomain, serverFehler des Servers der Weiterleitung

PROXY64 und CDN64

Labels je Host: host_id (bleibt gleich), host (erster Name) und kind (proxy, redirect, dead, passthrough).

MetrikTypLabelsBedeutung
node64_cdn64_hostsGaugeAnzahl Hosts
node64_cdn64_host_enabledGaugeHost1 = eingeschaltet
node64_cdn64_host_requests_totalCounterHostAnfragen seit dem Start der Node
node64_cdn64_host_errors_totalCounterHostFehler (5xx, Ziel nicht erreichbar) seit dem Start
node64_cdn64_host_blocked_totalCounterHostabgewiesene Anfragen seit dem Start
node64_cdn64_host_requests_24hGaugeHost, status (2xx … 5xx)Anfragen der letzten 24 Stunden je Statusklasse
node64_cdn64_host_bytes_24hGaugeHostgesendete Bytes der letzten 24 Stunden
node64_cdn64_host_blocked_24hGaugeHostAbgewiesene der letzten 24 Stunden
node64_cdn64_host_target_upGaugeHost1 = Ziel bei der letzten Prüfung erreichbar (nur Proxy und TLS-Durchreichung)
node64_cdn64_host_target_latency_secondsGaugeHostVerbindungszeit zum Ziel
node64_cdn64_honeypot_blocks, …_blocks_total, …_rejected_total, …_decoy_total, …_reported_totalGauge, CounterZusammenarbeit 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):

MetrikTypLabelsBedeutung
node64_cdn64_online_nameGaugehost_id, name, modeimmer 1: Name ist online eingeschaltet (mode 1 = durchreichen, 2 = terminieren)
node64_cdn64_online_edge_connectedGaugeedge1 = Tunnel zu diesem Edge-Server verbunden
node64_cdn64_online_edge_rtt_secondsGaugeedge, transport (quic, tcp)Laufzeit des Tunnels
node64_cdn64_online_edge_streamsGaugeedgeoffene Besucher-Streams
node64_cdn64_online_edge_streams_total, …_reconnects_totalCounteredgeStreams und Neuverbindungen seit dem Start der Node
node64_cdn64_online_host_statusGaugename, mode, statusimmer 1, Zustand bei ipv64: active, pending, blocked
node64_cdn64_online_host_traffic_month_bytesGaugenameTraffic dieses Namens im laufenden Monat
node64_cdn64_online_domains_used, …_domains_limitGaugeCDN-Domains des Accounts (das klassische ipv64-CDN zählt mit)
node64_cdn64_online_traffic_used_bytes, …_traffic_limit_bytesGaugeCDN-Traffic des Accounts im Monat und Kontingent
node64_cdn64_online_last_sync_secondsGaugeletzter Abgleich mit ipv64
node64_cdn64_online_sync_okGauge1 = 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).

MetrikTypLabelsBedeutung
node64_certsGaugeAnzahl Zertifikate
node64_cert_expiry_secondsGaugeZertifikatAblaufzeitpunkt
node64_cert_statusGaugeZertifikat, statusimmer 1, Zustand im Label: pending, valid, error, expired
node64_cert_errorGaugeZertifikat1 = letzter Abruf bzw. letzte Erneuerung gescheitert
node64_cert_auto_renewGaugeZertifikat1 = wird automatisch erneuert

Honeypot64

Nur bei eingeschaltetem Modul; Einzelheiten unter Honeypot64.

MetrikTypLabelsBedeutung
node64_honeypot_connections_totalCounterservice, portVerbindungen zu den Fallen-Diensten
node64_honeypot_logins_totalCounterserviceLogin-Versuche
node64_honeypot_events_totalCounterkind, sourceEreignisse je Art
node64_honeypot_unique_sourcesGaugeverschiedene Quell-IPs der letzten 24 Stunden
node64_honeypot_listen_errorsGaugeportPort konnte nicht geöffnet werden
node64_honeypot_buffer_events, node64_honeypot_dropped_totalGauge, CounterEreignisse im Puffer, wegen Überlast verworfen
node64_honeypot_report_last_success_timestampGaugeletzte erfolgreiche Meldung an ipv64 (Unix-Zeit, 0 = noch keine)
node64_honeypot_report_errors_total, node64_honeypot_report_sources_totalCounterfehlgeschlagene Meldungen, gemeldete Quell-IPs
node64_honeypot_log_lines_total, node64_honeypot_log_file_okCounter, Gaugepathgelesene Log-Zeilen; Datei wird gelesen (1) oder Fehler (0)
node64_honeypot_syslog_messages_total, node64_honeypot_syslog_denied_totalCounterangenommene und abgewiesene Syslog-Nachrichten
node64_firewall_active, node64_firewall_entries, node64_firewall_list_entriesGaugefamily bzw. list, editionFirewall-Helfer im Modus ohne Oberfläche: aktiv, Einträge je Adressfamilie und Liste
node64_firewall_last_update_timestamp, node64_firewall_errors_totalGauge, Counterletzte Aktualisierung, Fehler
node64_honeypot_proxy_decoy_total, …_proxy_access_total, …_proxy_access_dropped_total, …_proxy_blocks_totalCounterZusammenarbeit mit PROXY64: Köder-Anfragen, ausgewertete und verworfene Zugriffe, Sofort-Sperren
node64_honeypot_events_by_country_totalCountercountryEreignisse 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.

node64-rules.yml
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: 10m
Doppelte Alarme vermeiden

Node64 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.

  1. In Grafana unter Connections → Data sources eine Datenquelle vom Typ Prometheus anlegen und die Adresse deines Prometheus-Servers eintragen.
  2. Ein neues Dashboard anlegen und Panels mit den Abfragen unten hinzufügen.
  3. 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:

PanelPromQL
Gestörte Checks (Stat)sum(node64_hc_checks{state="down"})
Antwortzeit je Check in msnode64_hc_check_latency_seconds * 1000
Offene Störungennode64_hc_incidents_open
Tage bis Zertifikatsablauf(node64_cert_expiry_seconds - time()) / 86400
DNS-Anfragen pro Sekunde nach Statussum 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-Antwortzeitrate(node64_dns64_query_duration_seconds_sum[5m]) / rate(node64_dns64_query_duration_seconds_count[5m])
DNS-Cache-Trefferquoterate(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 Hostsum by (host) (rate(node64_cdn64_host_requests_total[5m]))
Reverse-Proxy: Fehlerquote je Hostsum by (host) (rate(node64_cdn64_host_errors_total[5m])) / sum by (host) (rate(node64_cdn64_host_requests_total[5m]))
Laufzeit der Node in Tagennode64_uptime_seconds / 86400
Speicher der Nodego_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.

Fragen zu Node64?
Für alle Fragen zum Produkt gibt es das offizielle Forum: Einrichtung, Fehlersuche, Ideen und Austausch mit der Community und dem ipv64.net-Team.
Zum Forum v64.tech