Freifunkknoten mit Prometheus überwachen

de en

Aktualisiert 2020-03-07: Wir erfassen inzwischen, zusätzlich zur Verfügbarkeit der Node, wieviele aktuell verbunden sind.

Wir haben in unserem Hackerspace neulich einen Freifunk-Knoten von Freifunk Dreiländereck (FF3L) in Betrieb genommen. Dieser ist uns in der Probephase mehrfach bei Änderungen der Netzwerkkonfiguration offline gegangen, ohne das wir es gemerkt hatten. Da wir in unserem Space Prometheus zur Überwachung unserer Infrastruktur einsetzen, habe ich kurzerhand eine entsprechende Lösung gebastelt, die ich hier kurz vorstellen will:

Idee

Anstatt den Knoten direkt zu überwachen, habe ich mich dazu entschieden, die von der Freifunk-Community gesammelten Statusinformationen anzuzapfen. Dort fallen einige interessante Statistiken heraus, aber für uns war ein einziger Wert relevant: Ist der Freifunkknoten laut FF3L momentan online und erreichbar?

Die Statusinformationen lassen sich bei FF3L über den folgenden Endpoint abfragen:

https://map.freifunk-3laendereck.net/data/nodes.json

Viele (vielleicht sogar alle?) Freifunk-Communities haben einen solchen Endpoint, bei manchen muss man eventuell aber etwas suchen, bevor man die API findet.

Umsetzung

Der nodes-Endpoint liefert auf einen Schlag die Informationen zu allen Knoten. Ich habe leider keinen Weg gefunden, die Anfrage direkt auf einzelne Knoten zu reduzieren; wenn hier jemand mehr weiss, würde ich mich über Infos dazu freuen. (Soweit ich das sehen kann, gibt es verschiedene Implementationen, manche scheinen Filter zu unterstützen.)

Für einen einzelnen Knoten sieht diese API-Response etwa so aus:

{
  "nodeinfo": {
    "software": {
      "firmware": {
        "base": "gluon-v2019.1",
        "release": "v2019.1.0+001"
      },
      ...
    },
    "network": {
      ...
    },
    "location": {
      "latitude": ...,
      "longitude": ...
    },
    "system": {
      "role": "node",
      "site_code": "ff3l",
      "domain_code": "3land"
    },
    "node_id": "...",
    "hostname": "...",
    ...
  },
  "flags": {
    "online": true
  },
  "statistics": {
    "uptime": 626614.08,
    "clients": 2,
    ...
  },
  "lastseen": "...",
  "firstseen": "..."
}

Für uns waren hier vor allem die Felder .flags.online und .statistics.clients interessant; mehr lesen wir in unserer Implementation gar nicht aus. Die Felder .nodeinfo.node_id und .nodeinfo.hostname eignen sich, um nach den eigenen Knoten zu filtern.

Mit ein bisschen "curl|jq-Magie" lässt sich das ganze recht einfach in einem Shellscript parsen und in ein Format bringen, mit dem Prometheus etwas anfangen kann. Wir haben das ganze als Textfile Collector an einen Prometheus Node Exporter angebunden. Der Output sieht dann etwa so aus:

# HELP freifunk_node_online 1 if the Freifunk node is online, 0 otherwise
# TYPE freifunk_node_online gauge
# HELP ff3l_node_clients Number of clients connected to the node
# TYPE ff3l_node_clients gauge
freifunk_node_online{node="<node0_id>",hostname="<node0_hostname>"} 1
freifunk_node_clients{node="<node0_id>",hostname="<node0_hostname>"} 2
freifunk_node_online{node="<node1_id>",hostname="<node1_hostname>"} 0
freifunk_node_clients{node="<node1_id>",hostname="<node1_hostname>"} 0

Das Ergebnis gibt es als fertiges Script auf Gitlab.