Adatsorok és grafikonok

Réges-régen kezdődött egy Raspberry Pi Model A-ra kötött DS18B20 hőmérséklet szenzorral. Cron futtatta meg 5 percenként a kis Python scriptet, ami lekérte a szenzor adatait és letárolta egy SQLite adatbázisban. Egy másik script óránként generált az adatokból gyönyörű SVG grafikonokat Pygal segítségével.

Egy a régi grafikonok közül

Telt-múlt az idő, a szenzor lecserélődött egy HTU21D-F modellre, ami egy kicsit pontosabb volt és már páratartalmat is tudott mérni. Aztán egy BME680-ra, ami légnyomás és levegőminőség adatokat hozott magával. A Raspberry Pi sem ragadt le a múltban, két szenzor csere között frissült Zero W-re.

A grafikon generáló script valahol menet közben elromlott, de senkinek sem hiányzott annyira, hogy megjavítsa. A mérési adatok viszont továbbra is rendületlenül érkeztek az adatbázisba. Egészen 2017 novemberéig, amikor is elkezdtek 5 percenként jönni a levelek a gépről, hogy valami miatt nem fut le a script. Gyors megoldásként ki lett véve a megfelelő sor a crontab-ból, hogy majd ha hazaérek, megjavítom.

Ugrás 2018 augusztusára, ahol történetünk lényegében elkezdődik. Ekkor realizáltam, hogy már lassan egy éve nem jönnek az adatok, rendbe kellene rakni. Ez gyakorlatban egy újraindítást jelentett, amitől varázslatos módon megjavult, de amit érdemes megcsinálni, azt érdemes túlbonyolítani is. Elérkezett az idő, hogy a régi cron-os, SQLite-os, nem működő grafikonos megoldás helyét valami modernebb dolog vegye át.

Tárolás

Manapság az ilyen jellegű adatokat time series adatbázisban trendi tárolni, úgyhogy kerestem is egy szimpatikusat. A választás az InfluxDB-re esett, de senki se emlékszik már pontosan, hogy miért. Annyi biztos, hogy ARM és Pi kompatibilis, egyszerűen telepíthető és használható.

# wget https://dl.influxdata.com/influxdb/releases/influxdb_1.6.1_armhf.deb
# dpkg -i influxdb_1.6.1_armhf.deb
# service influxdb start

A letöltési oldalon megtalálható a legfrissebb verzió, annyi csak a trükk, hogy nincs listázva az ARM-es deb csomag, de ha az "Ubuntu & Debian" résznél szereplő URL-ben átírjuk az amd64-et armhf-re, akkor simán működik. Első körben a kis Python script lett kibővítve, hogy az adatbázis mellett az InfluxDB-be is küldje be az adatokat.

import requests

url = 'http://127.0.0.1:8086/write?db=metrics&precision=s'
data = 'environment temperature={},humidity={} {}'.format(temp, hum, int(timestamp))

requests.post(url, data=data, headers={'Content-Type': 'application/octet-stream'})

Ez után készült egy migrációs script is, amivel a korábbi adatok is átkerültek InfluxDB-be. A select query-ből jól látszik, hogy az első szenzor csak hőmérsékletet tudott mérni, a páratartalom csak később lett hozzáragasztva.

import sqlite3
import os
import requests

conn = sqlite3.connect('data.sq3')
c = conn.cursor()

rows = []
for row in c.execute('select date, value, humidity from temp_logs order by id'):
    if row[2]:
        rows.append('environment temperature={},humidity={} {}'.format(row[1], row[2], int(row[0])))
    else:
        rows.append('environment temperature={} {}'.format(row[1], int(row[0])))

url = 'http://127.0.0.1:8086/write?db=metrics&precision=s'
headers = {'Content-Type': 'application/octet-stream'}
batch_size = 10000

for i in xrange(0, len(rows), batch_size):
    data = '\n'.join(rows[i:i + batch_size])
    requests.post(url, data=data, headers=headers)

Megjelenítés

Az InfluxDB fejlesztői egy egész TICK (Telegraf, InfluxDB, Chronograf, Kapacitor) stack-nek nevezett megoldást szállítanak, amiből a Chronograf képes a tárolt adatok böngészésére és dashboard-okon való megjelenítésére. Ezzel mit sem törődve a Grafana-t választottam az adatbázisom frontendjeként. Hasonlóan egyszerűen telepíthető jószágról van szó, a gyárilag jövő konfigurációval se kell sokat babrálni és még a letöltés sem igényel a korábbihoz hasonló trükközést.

# wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_5.2.2_armhf.deb
# dpkg -i grafana_5.2.2_armhf.deb
# service grafana-server start

Az új Grafana dashboard

Boldogan böngészhettem az adataimat, de azért négy idősor nem ad okot túl sok boldogságra. Még több metrikát kell szerezni! Szerencsére ennek a TICK-nek az egyik tagját, nevezetesen a Telegraf-ot pont erre találták ki. Csak feltelepítjük egy (vagy több) gépre, beállítjuk az InfluxDB elérhetőségét és már özönlenek is az adatok a CPU terheltségéről, a partíciók állapotáról vagy éppen a memória kihasználtságról, hogy csak néhányat említsek.

[[outputs.influxdb]]
  urls = ["http://127.0.0.1:8086"]

A legjobb, hogy még csak a grafikonokat sem kell kézzel legyártanunk, a Grafana oldaláról néhány kattintással beimportálhatóak a Telegraf által generált adatokat vizualizáló dashboard-ok (mint például ez vagy ez).

Telegraf dashboard

Ütemezés

Az utolsó lépés a cron kiváltása volt. Micsoda véletlen, hogy pont feltelepült egy Telegraf, ami jeleskedik a metrikák ütemezett gyűjtésében. Csak rá kell bírni, hogy a szenzor adatait is elvigye.

Szerencsére nem igényelt sok győzködést, egy meghívható parancsra van szüksége, ami megfelelő formátumban adja vissza az adatokat.

[[inputs.exec]]
  commands = ["/usr/local/bin/query_sensor.sh"]
  timeout = "5s"
  data_format = "influx"

A script is átesett még egy utolsó módosításon, hogy a közvetlen adatbázis kapcsolat helyett inkább csak a kimenetre írja ki az adatokat és ezzel a régi megoldás utolsó eleme is felszámolásra került. Az új rendszer pedig azóta is problémák nélkül gyűjti a különböző információkat.