StatusUpdates: Unterschied zwischen den Versionen

Aus Freifunk Potsdam | Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „=== Freifunk Potsdam Accesspoints Update installieren === * auf dem Accesspoint einloggen * mit einem Editor folgende Datei anlegen /etc/init.d/ffp-apdb * Dat…“)
 
(https ging bei mir nicht...)
 
(27 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=== Freifunk Potsdam Accesspoints Update installieren ===
==auf den Routern==
===Grafana - Node Overview===
Grafana ist eine grafische [https://monitor.freifunk-potsdam.de/grafana/ Übersichtsseite] einzelner Nodes.
* Systemlast
* Arbeitsspeicher
* CPU Auslastung
* Netzwerkverbindungen
* Verbunde Clients
* DHCP Leases
* Traffic


* auf dem Accesspoint einloggen
Um das Skript auf deinem Router zu installieren, verbinde dich via SSH mit deinem Router.
* mit einem Editor folgende Datei anlegen /etc/init.d/ffp-apdb
ssh root@Router-IP
* Datei öffnen und den Inhalt (siehe unten) reinkopieren
Und führe folgenden Befehl aus (copy & paste).
* es müssen keine Änderungen vorgeneommen werden
<pre>wget -q -O /tmp/ffp-collect https://monitor.freifunk-potsdam.de/ffp-collect && chmod +x /tmp/ffp-collect && /tmp/ffp-collect install</pre>
* script ausführbar machen mit: chmod 755 /etc/init.d/ffp-apdb
'''Troubleshooting:''' bei Routern mit wenig Flash ist möglicherweise keine HTTPS-Unterstützung gegeben. In diesem Falle kannst du das Script von https://monitor.freifunk-potsdam.de/ffp-collect kopieren und mit
* bootbar machen: /etc/init.d/ffp-apdb enable
<pre>cat > /tmp/ffp-collect && chmod +x /tmp/ffp-collect && /tmp/ffp-collect install</pre>
* starten: /etc/init.d/ffp-apdb start
zum laufen bringen, indem du es dann in die Konsole einfügst und am Ende Strg + D drückst.
* fertig!


==== ffp-apdb Script ====
Beim ersten Start werden alle Schnittstellen aufgelistet, unter denen gewählt werden kann, welche '''nicht''' mitgeschnitten werden sollen (z.B. private APs, normalerwise keine).
<code>
<br>
#!/bin/sh /etc/rc.common
Beim Start des Scriptes werden drei CronJobs hinzugefügt:
# this version only works with "Backfire"!
* collect: sammelt Daten (jede Minute)
# /etc/init.d/ffp-apdb enable
* upload: läd Daten hoch (alle 10 Minuten)
* upgrade: läd die aktuelle Version dieses Scriptes herunter und installiert sie (zum 1. jeden Monat zu einer zufälligen Uhrzeit)


START=99
'''Achtung:''' Ein sysupgrade löscht Grafana und dannach muss es neu installiert werden, [https://github.com/seth0r/ffp-monitor/issues/1 Issue 1].
EXTRA_COMMANDS="update status"


INTERVAL=30 # run cron every x minutes (max 59?)
====Weitere Befehle:====
URL='http://freifunk-potsdam.de/apdb/' # with / at the end!
Skript updaten:
SCRIPTVERSION='120801-bf3'
/etc/init.d/ffp-collect upgrade
Skript neu konfigurieren:
/etc/init.d/ffp-collect install
Skript stoppen (CronJobs werden entfernt):
/etc/init.d/ffp-collect stop
Skript starten (CronJobs werden hinzugefügt):
/etc/init.d/ffp-collect start
Skript aus Autostart entfernen:
/etc/init.d/ffp-collect disable
Skript in Autostart eintragen:
/etc/init.d/ffp-collect enable
Alle verbleibenden Daten manuell hochladen:
/etc/init.d/ffp-collect upload


HOSTNAME=$(cat /etc/config/system| awk '/hostname/ {print $3}'|sed 's/ /%20/g')
====Details====
IP=$(ifconfig wlan0|grep 'inet addr'|awk '{print $2}'| sed 's/addr://'|sed 's/ /%20/g')
* Das Script sammelt die Daten jede Minute in /tmp/collstat
GWIP=$(ip route | awk '/default via/ {print $3}') # awk nicht installiert :(
* Einmal alle 10 Minuten werden die Daten zum Server übertragen
LATITUDE=$(grep 'latitude' /etc/config/system| awk '{$1=$2="";print}'|sed 's/ /%20/g')
LONGITUDE=$(grep 'longitude' /etc/config/system| awk '{$1=$2="";print}'|sed 's/ /%20/g')
GEOLOC="${LATITUDE};${LONGITUDE}"
LOCATION=$(grep 'location' /etc/config/system|awk '{$1=$2="";print}'|sed 's/ /%20/g')
#LOCATION=$(uci show system.system.location|sed 's/system.system.location=//'|sed 's/ /%20/g')
CONTACT=$(grep 'mail' /etc/config/freifunk|awk '{$1=$2="";print}'|sed 's/ /%20/g'|sed 's/#/%23/g')
UPTIME=$(cat /proc/uptime|sed 's/ /%20/g')
FIRMWARE=$(cat /etc/openwrt_version|sed 's/ /%20/g')
MACHINE=$(grep 'machine' /proc/cpuinfo|awk '{$1=$2=""; print}'| sed 's/\ \ //'|sed 's/ /%20/g')
SYSTEMTYPE=$(grep 'system type' /proc/cpuinfo|awk '{$1=$2=""; print}'| sed 's/  : //'|sed 's/ /%20/g')


start() {
[[Kategorie:Freifunk_Potsdam_e.V.]]
update="*/$INTERVAL * * * * /etc/init.d/ffp-apdb update # every $INTERVAL minutes"
[[Kategorie:Projekte]]
sed -ie '/\/etc\/init.d\/ffp-apdb/d' /var/spool/cron/crontabs/root
echo "$update" >> /var/spool/cron/crontabs/root
echo "root" > /var/spool/cron/crontabs/cron.update
logger -t 'ffp-apdb' "cron job added (/etc/init.d/ffp-apdb start)"
update
}


stop() {
==auf dem Server==
if grep -q /etc/init.d/ffp-apdb /var/spool/cron/crontabs/root;then
===Quellcode===
sed -ie '/\/etc\/init.d\/ffp-apdb/d' /var/spool/cron/crontabs/root
Quellcode für den Server gibts auf [https://github.com/seth0r/ffp-monitor GitHub]
echo "root" > /var/spool/cron/crontabs/cron.update
===Doku?===
logger -t 'ffp-apdb' "cron job removed (/etc/init.d/ffp-apdb stop)"
Die Serversoftware fürs Parsen ist in Python geschrieben. InfluxDb wird für alles benutzt, das in Grafana angezeigt wird, für die Daten, die sicht nicht so oft ändern, und eher Statusinfos darstellen, wird eine MongoDb benutzt. Anlaufstelle für die Clients ist fffeed.wsgi, das über das Apache WSGI plugin auf die Webadresse /fff gemappt ist. fffeed.wsgi speichert die hochgeladenen Daten erst mal nur ab, das parsen übernehmen dann ein paar CronJobs:
fi
* parseff1.py: parst alle hochgeladenen Dateien, füllt Daten in die InfluxDb und speichert den aktuelle Status in einer temporären Collection in der MongoDB
}
* parseff2.py: sammelt die Änderungen zusammen, aktualisiert die Statusinfos in der MongoDb und vermerkt die tatsächlichen Änderungen in einer extra Collection.
Damit wären alle Daten zusammen, die für Grafana und die APDB-Tabelle nötig sind.
<br>
Die Infos zu den Links für die Karte sind in der InfluxDB, die Abfrage daraus würde aber zu lange dauern, dafür gibt es:
* lperf.py: aggregiert aus der InfluxDb die Daten der Link Performance und speichert diese in der MongoDb zwischen.
Für die kompletten Pfade innerhalb den Netzwerks, die auf den ApInfo-Seiten angezeigt werden:
* routes.py: ermittelt die kürzesten Routen durch das Netzwerk für alle Router
Dann gibt es noch
* sendtweets.py: liest die Collection mit den Veränderungen und schickt Tweets, außerdem kann es Tagesstatistiken tweeten
===InfluxDb===
In der InfluxDb sind die folgenden Continuous Queries definiert:
<pre>
router_count_archive    CREATE CONTINUOUS QUERY router_count_archive ON freifunk
    RESAMPLE EVERY 1h FOR 1d
BEGIN
    SELECT max(count)
    INTO ffarchive."default".router_count
    FROM freifunk.twodays.router_count
    GROUP BY time(1h) fill(none)
END
router_count            CREATE CONTINUOUS QUERY router_count ON freifunk
    RESAMPLE EVERY 15m FOR 6h
BEGIN
    SELECT count(conn_tcp)
    INTO freifunk.twodays.router_count
    FROM freifunk."default".conn
    GROUP BY time(1m) fill(none)
END
last_dhcp              CREATE CONTINUOUS QUERY last_dhcp ON freifunk
    RESAMPLE EVERY 5m FOR 6h
BEGIN
    SELECT last(leases), max(leases), min(leases), mean(leases), median(leases)
    INTO freifunk.twodays.dhcp
    FROM freifunk."default".dhcp
    GROUP BY time(1h), network fill(none)
END
</pre>
Außerdem gibt es ein paar Queries, die regelmäßig via Cron ausgeführt werden, weil sie als CQ zu lange brauchen oder nicht funktionieren:
<br>
Täglich:
<pre>
# TRAFFIC TX, freifunk.network -> ffarchive.traffic_tx (5m von -48h)
SELECT non_negative_derivative(last(tx_bytes)) AS tx_bytes
INTO ffarchive."default".traffic_tx
FROM freifunk."default".network
WHERE time > NOW() - 48h
GROUP BY time(5m), device, hostname fill(none)


status() {
# TRAFFIC RX, freifunk.network -> ffarchive.traffic_rx (5m von -48h)
echo "check status of the Freifunk Potsdam AP database"
SELECT non_negative_derivative(last(rx_bytes)) AS rx_bytes
echo ""
INTO ffarchive."default".traffic_rx
IFS=\;\,\:
FROM freifunk."default".network
set - $(nvram get ff_adm_latlon)
WHERE time > NOW() - 48h
unset IFS
GROUP BY time(5m), device, hostname fill(none)
if [ -z "$1" ] || [ -z "$2" ]; then
echo "ERROR no coordinates configured, ff_adm_latlon is empty"
elif [ -z "$(nvram get ff_map_server)" ]; then
echo "ERROR no map server configured, ff_map_server is empty"
else
echo "STATUS everything fine: ff_map_server is $(nvram get ff_map_server), coords are $1, $2"
COORDS_ON_SERVER="$1, $2"
UPDATERUN=`wget "$(nvram get ff_map_server)?dumpdatabase" -qO - 2> /tmp/freifunkmap_status | cut -f3 | grep "${COORDS_ON_SERVER}" | wc -l`
CONNERROR=`cat /tmp/freifunkmap_status`
if [ ! -z "$CONNERROR" ]; then
echo "ERROR could not connect map server: ${CONNERROR}"
else
if [ ${UPDATERUN} -eq 0 ]; then
echo "STATUS connection to map server seems to be ok, but no update run so far"
elif [ ${UPDATERUN} -eq 1 ]; then
echo "STATUS connection to map server seems to be ok, and your node should be visible in the map"
else
echo "ERROR something unexpected happend, your node should be more then one time visible in the map??? But this can't be"
fi
fi
rm /tmp/freifunkmap_status
fi
CRONTABENTRY=$(grep -c "/etc/init.d/S70freifunkmap update" /var/spool/cron/crontabs/root)
if [ $CRONTABENTRY -eq 0 ]; then
echo "ERROR no crontab entry for freifunkmap found, the update with the server will not run, try /etc/init.d/S70freifunkmap start"
elif [ $CRONTABENTRY -eq 1 ]; then
echo "STATUS everything fine: found one entry for freifunkmap in the crontab"
else [ $CRONTABENTRY -gt 1 ]
echo "WARN found more then one entry for freifunkmap in crontab, but the update should work anyway"
fi
}


update() {
# LQ NLQ, freifunk.links -> ffarchive.links (5m von -48h bis -23h)
# only one instance should be running at time
SELECT
# if exists an other one kill them and all wgets
    min(linkQuality) AS lq_min,
PID_FILE="/tmp/run/ffp-apdb.pid"
    max(linkQuality) AS lq_max,
if [ -f $PID_FILE ]; then
    mean(linkQuality) AS lq_mean,
PID="$(cat ${PID_FILE} 2> /dev/null)"
    median(linkQuality) AS lq_median,
if [ ! -z $PID ]; then
    min(neighborLinkQuality) AS nlq_min,
kill $PID >/dev/null 2> /dev/null
    max(neighborLinkQuality) AS nlq_max,
fi
    mean(neighborLinkQuality) AS nlq_mean,
fi
    median(neighborLinkQuality) AS nlq_median
INTO ffarchive."default".links
# get rid of wget-s hanging arround
FROM freifunk."default".links
for f in /proc/[0-9]*/cmdline; do
WHERE time < now() - 23h and time > NOW() - 48h
if grep -sq 'ap.php' "$f"; then
GROUP BY time(5m), localIP, remoteIP, remoteHostname, hostname fill(none)
WGET_PID="${f#/proc/}";
WGET_PID="${WGET_PID%%/*}"
kill "${WGET_PID}" 2>/dev/null
fi
done


echo "$$" > $PID_FILE
# LEASES, freifunk.dhcp -> ffarchive.dhcp (5m von -48h bis -23h)
SELECT min(leases) AS min, max(leases) AS max, mean(leases) AS mean, median(leases) AS median
KEY=$(wget -q -O - ${URL}ap.php?mode=get)
INTO ffarchive."default".dhcp
PARAM="&key=${KEY}&ip=%22${IP}%22&host=%22${HOSTNAME}%22&geoloc=%22${GEOLOC}%22&location=%22${LOCATION}%22&contact=%22${CONTACT}%22&gw_ip=%22${GWIP}%22&uptime=%22${UPTIME}%22&machine=%22${MACHINE}%22&systemtype=%22${SYSTEMTYPE}%22&scriptversion=%22${SCRIPTVERSION}%22&firmware=%22${FIRMWARE}%22"
FROM freifunk."default".dhcp
wget -q -O - ${URL}ap.php?mode=put"${PARAM}"
WHERE time < now() - 23h and time > NOW() - 48h
#echo ${URL}ap.php?mode=put"${PARAM}"
GROUP BY time(5m), network, hostname fill(none)
logger -t 'ffp-apdb' "AP information transfered to AP database (/etc/init.d/ffp-apdb update)"
# everything looks fine
rm $PID_FILE
}


</code>
# ASSOC, freifunk.wireless -> ffarchive.wireless (5m von -3h)
SELECT min(assoc) AS min, max(assoc) AS max, mean(assoc) AS mean, median(assoc) AS median
INTO ffarchive."default".wireless
FROM freifunk."default".wireless
WHERE time < now() - 23h and time > NOW() - 48h
GROUP BY time(5m), device, essid, hostname fill(none)
 
# ETX, ffarchive.links -> ffarchive.link_etx (5m von -48h bis -23h)
SELECT
    1 / (max(lq_max) * max(nlq_max)) AS etx_max,
    1 / (min(lq_min) * min(nlq_min)) AS etx_min,
    1 / (mean(lq_mean) * mean(nlq_mean)) AS etx_mean,
    1 / (median(lq_median) * median(nlq_median)) AS etx_median
INTO ffarchive."default".link_etx
FROM ffarchive."default".links
WHERE time < now() - 23h and time > NOW() - 48h
GROUP BY time(5m), localIP, remoteIP, remoteHostname, hostname fill(none)
</pre>
Stündlich:
<pre>
# TRAFFIC TX, freifunk.network -> ffarchive.traffic_tx (5m von -3h)
SELECT non_negative_derivative(last(tx_bytes)) AS tx_bytes
INTO ffarchive."default".traffic_tx
FROM freifunk."default".network
WHERE time > NOW() - 3h
GROUP BY time(5m), device, hostname fill(none)
 
# TRAFFIC RX, freifunk.network -> ffarchive.traffic_rx (5m von -3h)
SELECT non_negative_derivative(last(rx_bytes)) AS rx_bytes
INTO ffarchive."default".traffic_rx
FROM freifunk."default".network
WHERE time > NOW() - 3h
GROUP BY time(5m), device, hostname fill(none)'
 
# LEASES, freifunk.dhcp -> ffarchive.dhcp (5m von -3h)
SELECT min(leases) AS min, max(leases) AS max, mean(leases) AS mean, median(leases) AS median
INTO ffarchive."default".dhcp
FROM freifunk."default".dhcp
WHERE time > now() - 3h
GROUP BY time(5m), network, hostname fill(none)
 
# ASSOC, freifunk.wireless -> ffarchive.wireless (5m von -3h)
SELECT min(assoc) AS min, max(assoc) AS max, mean(assoc) AS mean, median(assoc) AS median
INTO ffarchive."default".wireless
FROM freifunk."default".wireless
WHERE time > now() - 3h
GROUP BY time(5m), device, essid, hostname fill(none)
 
# ETX, freifunk.links -> freifunk.link_etx (1m von -3h bis -1h)
SELECT 1 / (mean(linkQuality) * mean(neighborLinkQuality)) AS etx
INTO freifunk."default".link_etx
FROM freifunk."default".links
WHERE time > now() - 3h AND time < now() - 1h
GROUP BY time(1m), localIP, remoteIP, remoteHostname, hostname fill(none)
</pre>
===Crontab===
Alles, was in der Crontab mit dem Parsen zu tun hat:
<pre>
# parsing
# 0,5,10,...
*/5  *  * * *  www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/parseff1.py /var/ffdata/ >> /var/ffdata/ffdata.log
# 4,9,14,...
4-59/5 *  * * * www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/parseff2.py
59  *  * * *  root        cat /var/ffdata/ffdata.log && rm /var/ffdata/ffdata.log
1    3  * * *  www-data    find /var/ffdata/mv/ -type f -ctime +1 -delete
 
*/15 *  * * *  www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/lperf.py
8    *  * * *  www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/routes.py > /dev/null
#*    *  * * *  www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/sendmsg.py
*    *  * * *  www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/sendtweet.py routermsg
0    8  * * *  www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/sendtweet.py netstate
 
# Influx stuff
3    *  * * *  root        /root/influxdb_cq.sh hour > /dev/null 2>&1
13  1  * * *  root        /root/influxdb_cq.sh day > /dev/null 2>&1
 
27  4  7 * *  freifunk    /home/freifunk/influxdump.sh
</pre>
 
 
=== Dashboards ===
==== eine Location (Verbund aus mehreren Knoten) anlegen ====
 
Beispiel: ich möchte folgende Knoten gruppieren:
* 254-142-ph-werkstatt
* 254-54-ph-up
* 254-119-ph-buero
* 254-86-ph-seminar
* 254-155-ph-heizraum
 
Vorgehensweise
* bei Grafana einloggen
* im HOME Dashboard am besten ein Dashboard wählen (einer Location) und dieses dann klonen (Einstellungen -> save as)
* die Templating variable $host editieren (Einstellungen -> Templating)
* also z.B. für die oberen Knoten folgenden Regex angeben: /254-142-|254-54-|254-119-|254-86-|254-155-/
* nach Klick auf ''update'' sieht mensch auch, ob der Regex die richtigen Knoten getroffen hat
* für Zusatzinfos auf das Dashboard gehen, dann Settings, im Reiter ''Links'' können Infos, wie z.B. die Webseite vom Verein der Location verändert/hinzugefügt werden
* die Hosts List aktualisieren: neben hosts auf die Nodes klicken und die aufgelisteten alle anklicken
* nun eventuell noch das Zeitintervall ändern (oben rechts)
* am Ende Dashboard abspeichern & fertig

Aktuelle Version vom 7. Februar 2021, 23:23 Uhr

auf den Routern

Grafana - Node Overview

Grafana ist eine grafische Übersichtsseite einzelner Nodes.

  • Systemlast
  • Arbeitsspeicher
  • CPU Auslastung
  • Netzwerkverbindungen
  • Verbunde Clients
  • DHCP Leases
  • Traffic

Um das Skript auf deinem Router zu installieren, verbinde dich via SSH mit deinem Router.

ssh root@Router-IP

Und führe folgenden Befehl aus (copy & paste).

wget -q -O /tmp/ffp-collect https://monitor.freifunk-potsdam.de/ffp-collect && chmod +x /tmp/ffp-collect && /tmp/ffp-collect install

Troubleshooting: bei Routern mit wenig Flash ist möglicherweise keine HTTPS-Unterstützung gegeben. In diesem Falle kannst du das Script von https://monitor.freifunk-potsdam.de/ffp-collect kopieren und mit

cat > /tmp/ffp-collect && chmod +x /tmp/ffp-collect && /tmp/ffp-collect install

zum laufen bringen, indem du es dann in die Konsole einfügst und am Ende Strg + D drückst.

Beim ersten Start werden alle Schnittstellen aufgelistet, unter denen gewählt werden kann, welche nicht mitgeschnitten werden sollen (z.B. private APs, normalerwise keine).
Beim Start des Scriptes werden drei CronJobs hinzugefügt:

  • collect: sammelt Daten (jede Minute)
  • upload: läd Daten hoch (alle 10 Minuten)
  • upgrade: läd die aktuelle Version dieses Scriptes herunter und installiert sie (zum 1. jeden Monat zu einer zufälligen Uhrzeit)

Achtung: Ein sysupgrade löscht Grafana und dannach muss es neu installiert werden, Issue 1.

Weitere Befehle:

Skript updaten:

/etc/init.d/ffp-collect upgrade

Skript neu konfigurieren:

/etc/init.d/ffp-collect install

Skript stoppen (CronJobs werden entfernt):

/etc/init.d/ffp-collect stop

Skript starten (CronJobs werden hinzugefügt):

/etc/init.d/ffp-collect start

Skript aus Autostart entfernen:

/etc/init.d/ffp-collect disable

Skript in Autostart eintragen:

/etc/init.d/ffp-collect enable

Alle verbleibenden Daten manuell hochladen:

/etc/init.d/ffp-collect upload

Details

  • Das Script sammelt die Daten jede Minute in /tmp/collstat
  • Einmal alle 10 Minuten werden die Daten zum Server übertragen

auf dem Server

Quellcode

Quellcode für den Server gibts auf GitHub

Doku?

Die Serversoftware fürs Parsen ist in Python geschrieben. InfluxDb wird für alles benutzt, das in Grafana angezeigt wird, für die Daten, die sicht nicht so oft ändern, und eher Statusinfos darstellen, wird eine MongoDb benutzt. Anlaufstelle für die Clients ist fffeed.wsgi, das über das Apache WSGI plugin auf die Webadresse /fff gemappt ist. fffeed.wsgi speichert die hochgeladenen Daten erst mal nur ab, das parsen übernehmen dann ein paar CronJobs:

  • parseff1.py: parst alle hochgeladenen Dateien, füllt Daten in die InfluxDb und speichert den aktuelle Status in einer temporären Collection in der MongoDB
  • parseff2.py: sammelt die Änderungen zusammen, aktualisiert die Statusinfos in der MongoDb und vermerkt die tatsächlichen Änderungen in einer extra Collection.

Damit wären alle Daten zusammen, die für Grafana und die APDB-Tabelle nötig sind.
Die Infos zu den Links für die Karte sind in der InfluxDB, die Abfrage daraus würde aber zu lange dauern, dafür gibt es:

  • lperf.py: aggregiert aus der InfluxDb die Daten der Link Performance und speichert diese in der MongoDb zwischen.

Für die kompletten Pfade innerhalb den Netzwerks, die auf den ApInfo-Seiten angezeigt werden:

  • routes.py: ermittelt die kürzesten Routen durch das Netzwerk für alle Router

Dann gibt es noch

  • sendtweets.py: liest die Collection mit den Veränderungen und schickt Tweets, außerdem kann es Tagesstatistiken tweeten

InfluxDb

In der InfluxDb sind die folgenden Continuous Queries definiert:

router_count_archive    CREATE CONTINUOUS QUERY router_count_archive ON freifunk 
    RESAMPLE EVERY 1h FOR 1d 
BEGIN
    SELECT max(count) 
    INTO ffarchive."default".router_count 
    FROM freifunk.twodays.router_count 
    GROUP BY time(1h) fill(none)
END
router_count            CREATE CONTINUOUS QUERY router_count ON freifunk 
    RESAMPLE EVERY 15m FOR 6h 
BEGIN
    SELECT count(conn_tcp)
    INTO freifunk.twodays.router_count 
    FROM freifunk."default".conn 
    GROUP BY time(1m) fill(none)
END
last_dhcp               CREATE CONTINUOUS QUERY last_dhcp ON freifunk 
    RESAMPLE EVERY 5m FOR 6h 
BEGIN
    SELECT last(leases), max(leases), min(leases), mean(leases), median(leases) 
    INTO freifunk.twodays.dhcp 
    FROM freifunk."default".dhcp 
    GROUP BY time(1h), network fill(none)
END

Außerdem gibt es ein paar Queries, die regelmäßig via Cron ausgeführt werden, weil sie als CQ zu lange brauchen oder nicht funktionieren:
Täglich:

# TRAFFIC TX, freifunk.network -> ffarchive.traffic_tx (5m von -48h)
SELECT non_negative_derivative(last(tx_bytes)) AS tx_bytes 
INTO ffarchive."default".traffic_tx 
FROM freifunk."default".network 
WHERE time > NOW() - 48h 
GROUP BY time(5m), device, hostname fill(none)

# TRAFFIC RX, freifunk.network -> ffarchive.traffic_rx (5m von -48h)
SELECT non_negative_derivative(last(rx_bytes)) AS rx_bytes 
INTO ffarchive."default".traffic_rx 
FROM freifunk."default".network 
WHERE time > NOW() - 48h 
GROUP BY time(5m), device, hostname fill(none)

# LQ NLQ, freifunk.links -> ffarchive.links (5m von -48h bis -23h)
SELECT 
    min(linkQuality) AS lq_min, 
    max(linkQuality) AS lq_max, 
    mean(linkQuality) AS lq_mean, 
    median(linkQuality) AS lq_median, 
    min(neighborLinkQuality) AS nlq_min, 
    max(neighborLinkQuality) AS nlq_max, 
    mean(neighborLinkQuality) AS nlq_mean, 
    median(neighborLinkQuality) AS nlq_median 
INTO ffarchive."default".links 
FROM freifunk."default".links 
WHERE time < now() - 23h and time > NOW() - 48h 
GROUP BY time(5m), localIP, remoteIP, remoteHostname, hostname fill(none)

# LEASES, freifunk.dhcp -> ffarchive.dhcp (5m von -48h bis -23h)
SELECT min(leases) AS min, max(leases) AS max, mean(leases) AS mean, median(leases) AS median 
INTO ffarchive."default".dhcp 
FROM freifunk."default".dhcp 
WHERE time < now() - 23h and time > NOW() - 48h 
GROUP BY time(5m), network, hostname fill(none)

# ASSOC, freifunk.wireless -> ffarchive.wireless (5m von -3h)
SELECT min(assoc) AS min, max(assoc) AS max, mean(assoc) AS mean, median(assoc) AS median 
INTO ffarchive."default".wireless 
FROM freifunk."default".wireless 
WHERE time < now() - 23h and time > NOW() - 48h 
GROUP BY time(5m), device, essid, hostname fill(none)

# ETX, ffarchive.links -> ffarchive.link_etx (5m von -48h bis -23h)
SELECT 
    1 / (max(lq_max) * max(nlq_max)) AS etx_max, 
    1 / (min(lq_min) * min(nlq_min)) AS etx_min, 
    1 / (mean(lq_mean) * mean(nlq_mean)) AS etx_mean, 
    1 / (median(lq_median) * median(nlq_median)) AS etx_median
INTO ffarchive."default".link_etx 
FROM ffarchive."default".links 
WHERE time < now() - 23h and time > NOW() - 48h 
GROUP BY time(5m), localIP, remoteIP, remoteHostname, hostname fill(none)

Stündlich:

# TRAFFIC TX, freifunk.network -> ffarchive.traffic_tx (5m von -3h)
SELECT non_negative_derivative(last(tx_bytes)) AS tx_bytes 
INTO ffarchive."default".traffic_tx 
FROM freifunk."default".network 
WHERE time > NOW() - 3h 
GROUP BY time(5m), device, hostname fill(none)

# TRAFFIC RX, freifunk.network -> ffarchive.traffic_rx (5m von -3h)
SELECT non_negative_derivative(last(rx_bytes)) AS rx_bytes 
INTO ffarchive."default".traffic_rx 
FROM freifunk."default".network 
WHERE time > NOW() - 3h 
GROUP BY time(5m), device, hostname fill(none)'

# LEASES, freifunk.dhcp -> ffarchive.dhcp (5m von -3h)
SELECT min(leases) AS min, max(leases) AS max, mean(leases) AS mean, median(leases) AS median 
INTO ffarchive."default".dhcp 
FROM freifunk."default".dhcp 
WHERE time > now() - 3h 
GROUP BY time(5m), network, hostname fill(none)

# ASSOC, freifunk.wireless -> ffarchive.wireless (5m von -3h)
SELECT min(assoc) AS min, max(assoc) AS max, mean(assoc) AS mean, median(assoc) AS median 
INTO ffarchive."default".wireless 
FROM freifunk."default".wireless 
WHERE time > now() - 3h 
GROUP BY time(5m), device, essid, hostname fill(none)

# ETX, freifunk.links -> freifunk.link_etx (1m von -3h bis -1h)
SELECT 1 / (mean(linkQuality) * mean(neighborLinkQuality)) AS etx 
INTO freifunk."default".link_etx 
FROM freifunk."default".links 
WHERE time > now() - 3h AND time < now() - 1h 
GROUP BY time(1m), localIP, remoteIP, remoteHostname, hostname fill(none)

Crontab

Alles, was in der Crontab mit dem Parsen zu tun hat:

# parsing
# 0,5,10,...
*/5  *  * * *   www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/parseff1.py /var/ffdata/ >> /var/ffdata/ffdata.log
# 4,9,14,...
4-59/5 *  * * * www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/parseff2.py
59   *  * * *   root        cat /var/ffdata/ffdata.log && rm /var/ffdata/ffdata.log
1    3  * * *   www-data    find /var/ffdata/mv/ -type f -ctime +1 -delete

*/15 *  * * *   www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/lperf.py
8    *  * * *   www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/routes.py > /dev/null
#*    *  * * *   www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/sendmsg.py
*    *  * * *   www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/sendtweet.py routermsg
0    8  * * *   www-data    /var/www/monitor.freifunk-potsdam.de/wsgi/ff/sendtweet.py netstate

# Influx stuff
3    *  * * *   root        /root/influxdb_cq.sh hour > /dev/null 2>&1
13   1  * * *   root        /root/influxdb_cq.sh day > /dev/null 2>&1

27   4  7 * *   freifunk    /home/freifunk/influxdump.sh


Dashboards

eine Location (Verbund aus mehreren Knoten) anlegen

Beispiel: ich möchte folgende Knoten gruppieren:

  • 254-142-ph-werkstatt
  • 254-54-ph-up
  • 254-119-ph-buero
  • 254-86-ph-seminar
  • 254-155-ph-heizraum

Vorgehensweise

  • bei Grafana einloggen
  • im HOME Dashboard am besten ein Dashboard wählen (einer Location) und dieses dann klonen (Einstellungen -> save as)
  • die Templating variable $host editieren (Einstellungen -> Templating)
  • also z.B. für die oberen Knoten folgenden Regex angeben: /254-142-|254-54-|254-119-|254-86-|254-155-/
  • nach Klick auf update sieht mensch auch, ob der Regex die richtigen Knoten getroffen hat
  • für Zusatzinfos auf das Dashboard gehen, dann Settings, im Reiter Links können Infos, wie z.B. die Webseite vom Verein der Location verändert/hinzugefügt werden
  • die Hosts List aktualisieren: neben hosts auf die Nodes klicken und die aufgelisteten alle anklicken
  • nun eventuell noch das Zeitintervall ändern (oben rechts)
  • am Ende Dashboard abspeichern & fertig