Openwrt può monitorare e raccogliere dei dati quindi mostrarceli sotto forma di grafici , un pò come ho fatto nel grafico qui sotto dove viene mostrato l' andamento del segnale LTE
realizzare una cosa del genere non è molto difficile, basta aver chiaro il processo, e purtroppo mi son reso conto che su internet non c'e' molto , o se c'e' non è facilmente rintracciabile o sono documenti non più aggiornati
per realizzare questi grafici dovremo installare un pò di roba , ma prima d' installare qualcosa iniziamo a definire gli ambit per meglio comprendere il processoi
per ottenere il grafico di sopra faremo uso di due componenti :
collectd che si occupa di raccogliere e memorizzare i valori da mostrare
rrdtool che si occupa di tracciare i grafici usando i valori memorizzati da collectd
quindi :
opkg update
opkg install luci-app-statistics
ed abilitiamo collectd e rrdtool
/etc/init.d/luci_statistics enable /etc/init.d/collectd enable
cosi' avremo installato ed abilitato il motore, ma non abbiamo ancora niente da mostrare , questo perchè dobbiamo raccogliere i dati per poterli visualizzare.
cosa possiamo raccogliere e visualizzare?
openwrt ha gia una lista di sensori e grafici installabili ,
opkg list | grep collectd-mod
collectd-mod-apache - 5.8.0-6 - apache status input plugin
collectd-mod-apcups - 5.8.0-6 - apcups status input plugin
collectd-mod-ascent - 5.8.0-6 - ascent status input plugin
collectd-mod-bind - 5.8.0-6 - BIND server/zone input plugin
collectd-mod-chrony - 5.8.0-6 - chrony status input plugin
collectd-mod-conntrack - 5.8.0-6 - connection tracking table size input plugin
collectd-mod-contextswitch - 5.8.0-6 - context switch input plugin
collectd-mod-cpu - 5.8.0-6 - CPU input plugin
collectd-mod-csv - 5.8.0-6 - CSV output plugin
collectd-mod-curl - 5.8.0-6 - cURL input plugin
collectd-mod-df - 5.8.0-6 - disk space input plugin
collectd-mod-disk - 5.8.0-6 - disk usage/timing input plugin
collectd-mod-dns - 5.8.0-6 - DNS traffic input plugin
collectd-mod-email - 5.8.0-6 - email output plugin
collectd-mod-entropy - 5.8.0-6 - Entropy amount input plugin
collectd-mod-exec - 5.8.0-6 - process exec input plugin
collectd-mod-filecount - 5.8.0-6 - file count input plugin
collectd-mod-fscache - 5.8.0-6 - file-system based caching framework input plugin
collectd-mod-interface - 5.8.0-6 - network interfaces input plugin
collectd-mod-iptables - 5.8.0-6 - iptables status input plugin
collectd-mod-irq - 5.8.0-6 - interrupt usage input plugin
collectd-mod-iwinfo - 5.8.0-6 - libiwinfo wireless statistics plugin
collectd-mod-load - 5.8.0-6 - system load input plugin
collectd-mod-logfile - 5.8.0-6 - log files output plugin
collectd-mod-match-empty-counter - 5.8.0-6 - empty-counter match plugin
collectd-mod-match-hashed - 5.8.0-6 - hashed match plugin
collectd-mod-match-regex - 5.8.0-6 - regex match plugin
collectd-mod-match-timediff - 5.8.0-6 - timediff match plugin
collectd-mod-match-value - 5.8.0-6 - value match plugin
collectd-mod-memory - 5.8.0-6 - physical memory usage input plugin
collectd-mod-modbus - 5.8.0-6 - read variables through libmodbus plugin
collectd-mod-mqtt - 5.8.0-6 - transmit data with MQTT plugin
collectd-mod-mysql - 5.8.0-6 - MySQL status input plugin
collectd-mod-netlink - 5.8.0-6 - netlink input plugin
collectd-mod-network - 5.8.0-6 - network input/output plugin
collectd-mod-nginx - 5.8.0-6 - nginx status input plugin
collectd-mod-ntpd - 5.8.0-6 - NTP daemon status input plugin
collectd-mod-nut - 5.8.0-6 - UPS monitoring input plugin
collectd-mod-olsrd - 5.8.0-6 - OLSRd status input plugin
collectd-mod-openvpn - 5.8.0-6 - OpenVPN traffic/compression input plugin
collectd-mod-ping - 5.8.0-6 - ping status input plugin
collectd-mod-postgresql - 5.8.0-6 - PostgreSQL status input plugin
collectd-mod-powerdns - 5.8.0-6 - PowerDNS server status input plugin
collectd-mod-processes - 5.8.0-6 - process status input plugin
collectd-mod-protocols - 5.8.0-6 - network protocols input plugin
collectd-mod-rrdtool - 5.8.0-6 - RRDtool output plugin
collectd-mod-sensors - 5.8.0-6 - lm_sensors input plugin
collectd-mod-snmp - 5.8.0-6 - SNMP input plugin
collectd-mod-syslog - 5.8.0-6 - syslog output plugin
collectd-mod-table - 5.8.0-6 - table-like structured file input plugin
collectd-mod-tail - 5.8.0-6 - tail input plugin
collectd-mod-tail-csv - 5.8.0-6 - tail CSV input plugin
collectd-mod-tcpconns - 5.8.0-6 - TCP connection tracking input plugin
collectd-mod-teamspeak2 - 5.8.0-6 - TeamSpeak2 input plugin
collectd-mod-ted - 5.8.0-6 - The Energy Detective input plugin
collectd-mod-thermal - 5.8.0-6 - system temperatures input plugin
collectd-mod-unixsock - 5.8.0-6 - unix socket output plugin
collectd-mod-uptime - 5.8.0-6 - uptime status input plugin
collectd-mod-users - 5.8.0-6 - user logged in status input plugin
collectd-mod-vmem - 5.8.0-6 - virtual memory usage input plugin
collectd-mod-wireless - 5.8.0-6 - wireless status input plugin
collectd-mod-write-graphite - 5.8.0-6 - Carbon/Graphite output plugin
collectd-mod-write-http - 5.8.0-6 - HTTP POST output plugin
personalmente mi sono interessato a questa parte di openwrt in quanto volevo monitorare l' andamento del segnale LTE del mio router
ma come potete vedere non c'e' niente relativo alla rilevazione e alla visualizzazione del segnale LTE ,
ma non mi sono dato per vinto, nell' informatica c'e' sempre una via .... in questo caso si chiama
collectd-mod-exec - 5.8.0-6 - process exec input plugin
installiamolo con
opkg install collectd-mod-exec
questo plugin consente di utilizzare un programma generico lanciato ogni tot secondi per rilevare i valori che ci servono
inoltre ci consente di disegnare la nostra pagina da visualizzare , rendendo possibile il grafico iniziale di sopra
come funziona ? entriamo nel setup da qui ....
nella schermata generale dobbiamo notare la riga :
che altro non è che un elenco dei valori gia riconosciuti da collectd per memorizzarli nel database.
possiamo utilizzare uno di questi tipi di valori o realizzarne di nostri , io ho scelto la seconda via , ho aggiunto in fondo all' elenco i miei tipi :
lte_rssi value:GAUGE:U:U
lte_rsrp value:GAUGE:U:U
lte_sinr value:GAUGE:U:U
lte_rsrq value:GAUGE:U:U
lte_sum rssi:GAUGE:U:U, rsrp:GAUGE:U:U, sinr:GAUGE:U:U, rsrq:GAUGE:U:U
ecco una spiegazione dei vari nomi e parametri indicati
lte_rssi è il nome che abbiamo dato al database che verrà creato per memorizzare i valori
value è il nome del valore che andremo a memorizzare, possiamo usarne uno generico quando memorizziamo un solo dato dentro al database , ma nel caso passiamo piu' dati diversi allo stesso database, dovremo dichiarare il nome di ogni dato , nell' ultima riga verrà creato il database lte_sum che conterra i valori rssi , rsrp , sinr e rsrq
le due U:U indicano che non stiamo limitando in valore max e min il dato
(dopo varie prove per le mie esigenze ho eliminato l' uso dei 4 valori separati e ho configurato tutto per l' uso di un database solo con i 4 valori dentro)
accediamo al tab - general plugin - > Exec
come possiamo vedere da qui sopra, possiamo scegliere il programma o script da lanciare per leggere i valori da memorizzare , e indicare con che utente lo vogliamo lanciare ..... possiamo anche cliccare su Add e aggiungerne piu' di uno
qui' c'e' da notare che collectd si rifiuta di lanciare script come root , quindi il nostro script che di solito su openwrt è eseguito come root deve avere i permessi per esser eseguito come other , e non solo lo script, ma anche tutti i file/directory/device a cui deve accedere, pena come è successo a me stare due giorni a tentare di capire perchè non funzionava niente ....anzi, perchè se lo lancio a mano funziona ma collectd non legge i dati ???
se abbiamo di bisogno di debuggare collectd , possiamo o aggiungere il plugin logfile , strada che mi ha dato più di un problema (mi veniva rimossa la sezione logfile dal file di configurazione collectd.conf ogni volta che usavo la gui per modificare qualcosa)
oppure stoppare il demone e lanciare collectd a mano con
collectd -f
tornando al nostro script , segnale.sh lanciato ogni 10 secondi da collectd , per esser memorizzati i valori devono essere nel formato :
PUTVAL "OpenWrt/exec-test/lte_rssi" N:-78.0
PUTVAL "OpenWrt/exec-test/lte_rsrp" N:-99.0
PUTVAL "OpenWrt/exec-test/lte_sinr" N:15.2
PUTVAL "OpenWrt/exec-test/lte_rsrq" N:-7.5
oppure
PUTVAL "OpenWrt/exec-lte/lte_sum" N:-74.0:-95.0:16.2:-3.5
dove
PUTVAL indica che deve essere elaborato da collectd
OpenWrt deve essere l' hostname , da collectd viene passata allo script la variabile d' ambiente $COLLECTD_HOSTNAME , in ogni caso indica la directory dentro a /tmp/ dove verranno salvati i dati
exec- indica che i dati sono per il plugin exec
test è un nome di mia scelta , cosi come lte nell' altra riga , entrambi i valori comporranno il nome della directory dove verranno salvati i file del database , quindi
/tmp/OpenWrt/exec-test/
/tmp/OpenWrt/exec-lte/
lte_rssi indica il nome del database che andremo a creare , quindi dentro exec-test avremo 4 file del tipo lte_rssi.rrd , dentro exec-lte avremo un solo file lte_sum.rrd contenente tutti e quattro i valori
N che la lettura è riferita all' istante attuale, potremmo metterci un valore riferito ad esempio a mezzora fa .....
-78 è il nostro valore , se abbiamo definito che possiamo passare piu' dati dovranno esser separati dai :
questi valori saranno memorizzati in un database dentro la directory in /tmp/rrd/HOSTNAME/exec-test/ sotto forma di file lte_rssi.rrd ad esempio
la directory radice dove memorizzarli è indicata nella schermata output plugin -> rrdtool ed è indicata come tmp per evitare di scrivere sulla flash (di conseguenza essendo in ram allo spegnimento del router perderemo tutti i dati)
un piccolo accenno però a cosa siano i database rrd bisogna pur farlo, sono dei database dove verranno memorizzati alcuni e non tutti i valori che abbiamo passato a collectd ...
questi database possono esser creati e manipolati con rrdtools , openwrt li crea in automatico secondo un suo set preimpostato
sono dei database contenenti piu' tabelle con un numero massimo di campi preimpostato, di queste tabelle noi riempiamo (con andamento circolare) con i nostri valori passati a collectd dalle stringhe PUTVAL solo la prima
tutte le altre tabelle vengono popolate in automatico da collectd secondo lo schema che gli è stato indicato durante la creazione , e vengono popolate in cascata ossia una tabella popola la successiva
quando la tabella successiva viene popolata e con che valori ?
a seconda di quello che è stato detto duante la creazione potremmo avere che la tabella successiva viene ad esempio popolata ogni 6 valori di quella principale , e viene popolata con il valore medio di quei 6 (o col massimo ad esempio)
a cascata la terza tabella potrebbe esser popolata ogni 10 valori della seconda (60 della prima) e cosi via
cio' serve per evitare di memorizzare centinaia o milioni di valori che magari per i nostri grafici non hanno senso , nel mio caso se scelgo una visualizzazione dell' andamento del segnale su un periodo di un mese , non me ne faccio niente dei valori con granularità 10 secondi , non potrei mai vederli sul grafico ....
e quando abbiamo rienpito tutte le righe di una tabella? reiniziaeremo dalla prima riga in modo circolare, sovrascrivendo il valore presente
in questo modo garantiamo di non far crescere a dismisura il database e di avere dei valori rappresentativi per il grafico che andremo a tracciare
arrivati qui' siamo solo a metà del lavoro, avremo solo memorizzato i dati ma ancora li dobbiamo visualizzare ...
ps. se vogliamo vedere cosa ci sia dentro il file lte_sum.rrd basta dare il comando :
rrdtool dump lte_sum.rrd | less
potremo vedere come si chiamano i valori che memorizziamo nel database e tutte le entry per ogni tabella , e come viene composta la tabella successiva (media, massimo, somma etc etc)
per qualsiasi approfondimento non posso che rimandarvi al sito
https://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html
dove c'e' un tutoria a mio avviso abbastanza chiaro e completo
qui' la seconda parte openwrt-rileviamo-l-andamento-di-alcuni-dati-e-visualizziamoli-come-grafici-seconda-parte