Metrikoms: influxDB + Grafana

Vienintelės mano renkamos metrikos yra temperatūra apie kuria rašiau Protingas namas. 1 Dalis. Temperatūra.. Tiesa nuo tada termometrų padaugėjo ir dabar jų aštuoni. Ir duomenys jau senokai saugomi ne mariadb/mysql, o influxDB. O duomenims peržiūrėti ir analizuoti naudoju Grafana.

Oficealaus influxdb paketo nėra, tad teks susikompiluoti iš AUR:

yaourt -S influxdb

Pirmuosius influxdb žinksnius galima rasti čia. Tikrai nėra nieko sudėtingo.

Mano duomenų bazė vadinasi termometrai, o lentelė temperaturos.

Duomenys atrodo taip (stulpelių yra daugiau, apkirpau, kad tilptu į puslapį):

> select * from temperaturos limit 20 
name: temperaturos
time                28-0000052D4E36 28-0000052DC554 28-0000052DCA4A
----                --------------- --------------- ---------------
1491421622470175617                                 20.6875
1491421622933431847 5.6875
1491421624775957066                 20.1875
1491421683164960608                                 20.6875
1491421683725053335 5.6875
1491421685386914026                 20.1875
1491421743393921182                                 20.6875
1491421743956469988 5.6875
1491421745634864667                 20.1875
1491421802759609752                                 20.6875
1491421803239163911 5.6875
1491421804969827574                 20.1875

Duomenys taip pabire, nes kiekvienas termometras įrašomas atskirai (skiriasi įrašymo laikas). Viso to išvengti galima surinkus visus duomenis ir įrašinėjant viską vienu metu, viena užklausa. Taip užklausa, nes duomenis įrašinėjami kreipiantis tam tikru portu CURL‘u, WGET‘u ar kita programine įranga darant GET užklausą. Galima tiesiog į naršyklės URL’ą suvesti atitinkama adresą.

Aš duomenis rašau su PHP paCURL‘inant URL‘ą. Kodas žemiau:

        //Post to influxDB
        $ch = curl_init("http://localhost:8086/write?db=termometrai");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS,"temperaturos ".$daviklioHWID."=".$tempvalue);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_exec($ch);
        curl_close($ch);

daviklioHWID yra termometro DS1820 adresas.
time (laiko) reikšmės paduoti nereikia.

Tame viskas ir paprasta, tiesiog aklai padavinėju termometro adresą ir jo reikšmę. Jei sistemoje atsiranda naujas termometras (naujas adresas) nieko daryt papildomai nereikia, stulpelis influxDB atsiranda automatiškai.

Dabar apie duomenų atvaizdavimą. Duomenis grafiškai atvaizduoti naudoju grafana.

sudo pacman -Sy grafana

Kai pradėjau naudoti Grafana tada dar ji nemokėjo skaityti iš mariadb/mysql. Dabar paskutinėse versijose ji tai gali daryti. Bet influxdb veikia akivaizdžiai greičiau, ypač kai db serveris paleistas ant Raspberry Pi model B.

Pirmą kartą prisijungus prie Grafana reikia prisidėti Data source t.y. duomenų šaltinį. Šiuo atveju tai indluxdb.

Turint duomenų šaltinį galima bandyti susikonfiguruoti Dash board t.y. langas kuriame bus grafikas/grafikai.

Maniškis atrodo taip (paspaudus pasididina):

Vienos metrikos (vienos linijos grafike) užklausa atrodo taip:

Visos keturios užklausos:

Atkreipiam dėmesį į GROUP BY. Grupuoju dėl dviejų priežasčių. Pirmoji, tai kaip minėjau aukščiau, duomenis įrašomi ne tuo pačiu momentu (skiriasi keliomis sekundėmis). Panaudojus grupavimą tiesiog skaičiuojamas, šiuo atveju trijų minučių vidurkis (tam ir naudojamas mean()) nesvarbu kiek matavimu per tas tris minutes buvo padaryta. Taip visi grafikai laiko atžvilgiu tampa lygus.

Antroji priežastis, kad termometrai nėra super tikslūs ir esant tomis pačiomis sąlygomis jie atiduota kažkiek kintamus (po kablelio) duomenis. Tad šiuo atveju grafikas kiek sulyginamas ir panaikinami 0.xxx nuokrypiai.

Leave a Comment

  Wordpress Theme Protected By Wp Spam Blocker

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close