überarbeitet SYSSTAT modul: non-blocking, remote kommandos, beliebige readings

Begonnen von justme1968, 23 Oktober 2015, 00:09:34

Vorheriges Thema - Nächstes Thema

justme1968

anbei eine erste test version des SYSTAT moduls mit den folgenden neuen möglichkeiten:


  • das überwachen entfernter hosts per ssh ist komplett auf non-blocking umgestellt.
    es wird pro host nur noch eine einzige ssh verbindung aufgemacht, offen gehalten und wiederverwendet. die alte version hat pro update mehrere ssh verbindungen auf und wieder zu gemacht. das kann je nach system und netzwerk insgesamt zu verzögerungen im sekunden bereich führen und erzeugt auch auf dem zu überwachenden system eine deutlich höhere last.


  • für systeme die per ssh überwacht werden ist es möglich kommandos an das entferntes system zu senden. z.b. shutdown zum runterfahren.
    beispiel: set <device> raw shutdown -h now


  • mit dem neuen attribut readings lassen sich beliebige zusätzliche readings konfigurieren deren inhalt die rückgabe eines kommandos sein kann.
    die readings werden als liste von reading:kommando paren angegeben die durch newline getrennt sein müssen. im folgenden beispiel werden die readings processes und temperature definiert. processes enthält die anzahl der gerade laufen prozesse und temperature die per snmp abgefragte systemperatur einer synology diskstation. im unterschied zum normalen snmp mode blockiert fhem durch die anfrage nicht da das komplette kommando im hintergrund und auf dem zu überwachenden system ausgeführt wird.
    attr <device> readings processes:ps ax | wc -l\                                   
                            temperature:snmpwalk -c public -v 1 10.0.1.21 .1.3.6.1.4.1.6574.1.2.0 | grep -oE ..$



  • mit dem attribut readingsFormat können die so erhaltenen werte für die readings noch aufbereitet werden.
    im folgenden beispiel werden die temperaturen aller on-board temperaturfahler und die frequenzen aller cpu kerne aus den entsprechenden files unter /sys/devices/system/cpu und /sys/class/thermal ausgelesen. die jeweils mehrzeilige ausgabe wird zum einen in einem temperatures reading zusammengefasst das das die einzelnen werte durch leerzeichen getrennt enthält und die einzel temperaturen werden zusätzlich in grad celsius umgerechnet und auf einzelne temppeatureX readings aufgeteilt. die frequenz werte werden ebenfalls aufgeteilt und zusäzlich noch gerundet.                 
    attr <device> readings temperature:cat /sys/class/thermal/thermal*/temp\                       
                            temperatures:cat /sys/class/thermal/thermal*/temp\                     
                            frequency:cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
     
    attr <device> readingsFormat { frequency => '{ $VALUE = [map {int($_ / 1000)} split("\n", $VALUE)] }',\
                            temperature => '{ $VALUE = [map {$_ / 1000} split("\n", $VALUE)] }',\
                            temperatures => '{ $VALUE =~ s/\n/ /g }' }


    das aufteilen auf mehrere durchnummerierte readings erfolg automatisch wenn $VALUE eine array ref ist. siehe screenshot.


  •  
  • auch lokal ausgeführte kommandos werden non-blocking im hintergrund ausgeführt. wenn sie sich nach 10 sekunden nicht beendet haben werden sie automatisch beendet. frage: timeout konfigurierbar machen?


  • Sys::Statistics::Linux ist nicht mehr nötig

die non-blocking änderungen betreffen zur zeit nur lokale und per ssh überwachte systeme und sind für snmp noch nicht umgesetzt. das soll vor dem einchecken aber noch passieren.

gruss
  andre

edit 03.12.2015: die snmp abfragen sind jetzt auch non-blocking

edit 10.12.2015: neues attribut noSSH.

edit 06.10.2015: readings und readingsFormat fix

edit 2016-06-15: automatische abfrage funktioniert auch ohne host angabe wieder, diverse warnungen behoben.

edit 2016-06-30: readingsFormat kann auch für mibs verwendet werden.

edit 2016-12-22: perl 5.24 inkompatibilitäten repariert 

edit 2021-03-11: diese version ist. jetzt eingecheckt.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

pipp37

Hallo.
Thanks for update.


Ich habe das Modul installiert und da ich meinen Mikrotik Router nur per SNMP abfrage, bekomme ich diese Logs.
Auch werden dann leider keine SNMP Abfragen mehr gemacht,
Es scheint so, als ob immer ssh Requests gemacht werden obwohl kein SSH konfiguriert ist.




2015.10.25 10:46:29 2: MTMainRouterStat: starting: /usr/bin/ssh -q 192.168.27.254
2015.10.25 10:46:30 3: MTMainRouterStat: read: end of file reached while sysread
2015.10.25 10:46:30 3: MTMainRouterStat: Disconnected


list <device>


Internals:
   CONNECTS   49
   DEF        300 600 192.168.27.254
   HAS_Net::SNMP 1
   HOST       192.168.27.254
   INTERVAL   300
   INTERVAL_FS 600
   LAST_DISCONNECT 2015-10-25 10:49:48
   NAME       MTMainRouterStat
   NR         571
   NTFY_ORDER 50-MTMainRouterStat
   PARSED     0
   PARTIAL
   SENT       1
   STARTED    0
   STATE      Disconnected
   SystemDescription RouterOS RB2011UAS-2HnD
   SystemName FirewallPipp
   TYPE       SYSSTAT
   USE_SNMP   1
   interval_fs 600
   snmpCommunity public
   snmpVersion 2
   QUEUE:
     HASH(0xa4130d0)
   Readings:
     2015-10-25 10:49:48   connection      disconnected
     2015-10-25 10:39:17   entPhysicalDescr RouterOS 6.32.3 on RB2011UAS-2HnD
     2015-10-25 10:39:17   load            0.03
     2015-10-25 10:39:17   lteBytesIN      950158506
     2015-10-25 10:39:17   lteBytesOUT     622815630
     2015-10-25 10:39:17   redBytesIN      95117103
     2015-10-25 10:39:17   redBytesOUT     55270818
     2015-10-25 10:39:17   state           3
     2015-10-14 20:08:08   sysDescr        RouterOS RB2011UAS-2HnD
     2015-10-25 10:39:17   uptime          2 days, 00:17:37.00
   Helper:
Attributes:
   mibs       .1.3.6.1.2.1.47.1.1.1.1.2.65536:entPhysicalDescr
.1.3.6.1.2.1.2.2.1.10.2:redBytesIN
.1.3.6.1.2.1.2.2.1.16.2:redBytesOUT
.1.3.6.1.2.1.2.2.1.10.3:lteBytesIN
.1.3.6.1.2.1.2.2.1.16.3:lteBytesOUT
   room       System
   snmp       1
   snmpCommunity public
   snmpVersion 2
   uptime     1




Vmware-ESX-VM-Ubuntu 16.04 Docker Main-FHEM -> Raspberry Pi-B ser2net
HMLAN mit HomeMatic, Busware SCC433 stacked SCC868 (culfw), Jeelink, MAX Heizkörperthermostate, Enigma2 (Vudo2/DM800SE), Philips 55" Ambilight PHTV - WMBUS EnergyCam+Engelmann FAW, Intertechno-Komponenten, Ubiquiti mPower

justme1968

ja. das stimmt. diese version bevorzugt die abfrage über ssh.

mal sehen wie ich das rückwärtskompatibel hin bekomme.

wenn ich die snmp abfragen non-blocking hin bekomme kann ich aber sowieso wieder auf die alte reihenfolge schalten.

stay tuned...

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

pipp37

Thanks.
Dann warte ich darauf und teste es dann. Leider musste ich wieder das originale Modul installieren weil sonst gar keine SNMP Abfragen  gemacht wurden.
Gruss Armin
Vmware-ESX-VM-Ubuntu 16.04 Docker Main-FHEM -> Raspberry Pi-B ser2net
HMLAN mit HomeMatic, Busware SCC433 stacked SCC868 (culfw), Jeelink, MAX Heizkörperthermostate, Enigma2 (Vudo2/DM800SE), Philips 55" Ambilight PHTV - WMBUS EnergyCam+Engelmann FAW, Intertechno-Komponenten, Ubiquiti mPower

mrbreil

Ist die per update beziehbare Version jetzt schon die nonblocking version?

Grüße Christian

justme1968

nein. noch nicht. ich möchte erst noch ein paar kleinigkeiten aufräumen und snmp non-blocking machen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968


mrbreil

Als erstes möchte ich mich für deine super Arbeit bedanken.
Nutze das "alte" SYSSTAT und jetzt bevorzugter auch das neue.
Nachdem fhem bei mir immer blockiert hatte, weil ich eine Synology Diskstation bei meiner Mutter überwache.
Ihr Router hatte einen Hardware Defekt, erst deswegen fiel mir auf das das "alte" SYSSTAT blockierte.
Abgefragt wurden die Daten per ssh.
Als ich den neuen Router heute in betrieb genommen habe, habe ich auch gleichzeitig die Portweiterleitung des ssh Port auf einen weniger auffälligen Port gelegt.
Per Konsole daheim funktioniert auch alles.
Wenn ich aber die Definition meines SYSSTAT Devices ändere define [Device] SYSSTAT 3600 3600 [url]:[port] bekomme ich keine Verbindung.
Mache ich etwas falsch oder unterstütz dein Modul keine Portangabe?
Falls zweiteres der Fall ist, wäre es von dir machbar das irgendwie zu unterstützen?
Das wäre wirklich super.

Grüße Christian     

justme1968

im define kannst du nur den host angeben. keinen port.

einen anderen port (und vieles andere) kannst du aber pro gegenstelle über ssh.config auf ssh ebene konfigurieren.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

mrbreil

Vielen Dank für die super schnelle Antwort.
Musste erst noch ein bisschen googeln, bin wirklich ein Newbie in Sachen Linux.
Aber "DIESES LINUX" ist echt schon ne spitze Sache  ;).
Vielen Dank nochmal jetzt funktioniert es.

mrbreil

Ich wollte das neue SYSSTAT nur auch lokal nutzen und denke ich habe einen Bug gefunden
Internals:
   DEF        60 600
   HAS_Net::SNMP 1
   INTERVAL   60
   INTERVAL_FS 600
   NAME       sysstat_Server
   NR         222
   NTFY_ORDER 50-sysstat_Server
   STATE      1.45. 1.16. 1.15
   SystemDescription Linux Server-9000 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u6 x86_64
   SystemName Server-9000
   TYPE       SYSSTAT
   interval_fs 480
   CHANGETIME:
   Readings:
     2015-12-03 20:38:15   /               4
     2015-12-02 08:59:28   /media/daten    57
     2015-12-03 20:38:15   load            1.45.
     2015-12-03 20:38:15   state           1.45. 1.16. 1.15
     2015-12-03 20:38:15   uptime          8 days, 21:05
   filesystems:
     /media/daten
     /dev/disk/by-uuid/ebe2ea73-3aaf-4a8f-8f3a-7a0d00d2b5b9
   Helper:
     Filesystems:
       /dev/disk/by-uuid/ebe2ea73-3aaf-4a8f-8f3a-7a0d00d2b5b9:
         free       431971476
         mountpoint /
         total      473625808
         usageper   4
         used       17595452
       /dev/sdb1:
         free       575635468
         mountpoint /media/daten
         total      1442145340
         usageper   58
         used       793253068
       /dev/sdc1:
         free       594968116
         mountpoint /media/daten_backup
         total      1442146708
         usageper   57
         used       773921720
       Rootfs:
         free       431971476
         mountpoint /
         total      473625808
         usageper   4
         used       17595452
       Tmpfs:
         free       2214960
         mountpoint /run/shm
         total      2214960
         usageper   0
         used       0
       Udev:
         free       10240
         mountpoint /dev
         total      10240
         usageper   0
         used       0
Attributes:
   filesystems /media/daten,/dev/disk/by-uuid/ebe2ea73-3aaf-4a8f-8f3a-7a0d00d2b5b9
   room       IT
   showpercent 1
   stat       1
   uptime     1


in dem load reading ist doch ein Punkt zuviel, oder?

2015-12-03 20:38:15   load            1.45.

Gruß Christian

justme1968

ich habe die version im ersten post aktualisiert.

die änderungen sind:

- die snmp abfragen sind jetzt auch non-blocking

- auf manchen systemen konnten zu viele punkte in den load und state readings auftauchen. das ist behoben.

wenn es keine (negativen) rückmeldungen gibt checke ich diese Version demnächst ein.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

mrbreil

Mh! Irgendwie habe ich es nicht angezeigt bekommen das du geantwortet hast.
Habe es jetzt ausprobiert und es funktioniert.

Vielen Dank, schönes WE.

hoods

Hallo zusammen,

erst einmal vielen Dank für das Modul!
Ich habe heute auf die hier verlinkte Modul Version aktualisiert und hatte bisher die offizielle version im Einsatz um mein Synology ds214play zu überwachen.

Leider bekomme ich im fhem Log die Meldung "snmp filesystems error", vermutlich wegen dem "@" Zeichen im Filesystem Namen (?)
2015.12.26 22:44:06 2: ds214play: unanswered query in queue, reconnecting
2015.12.26 22:44:06 2: ds214play: starting: /usr/bin/ssh -q 192.168.178.30
2015.12.26 22:44:06 2: ds214play: unanswered query in queue, reconnecting
2015.12.26 22:44:06 2: ds214play: starting: /usr/bin/ssh -q 192.168.178.30
2015.12.26 22:44:11 2: ds214play: snmp filesystems error


Was muss ich tun damit das Filesystem richtig erkannt wird und die Fehlermeldung verschwindet?

Des weiteren verzweifle ich gerade an den MIBs. Die wollen einfach nicht in der Liste der Readings auftauchen ...

Hier meine Config:
Internals:
   CONNECTS   12
   DEF        300 600 192.168.178.30
   FD         4
   HAS_Net::SNMP 1
   HOST       192.168.178.30
   INTERVAL   300
   INTERVAL_FS 600
   NAME       ds214play
   NR         471
   NTFY_ORDER 50-ds214play
   PARSED     5
   PARTIAL
   PID        19306
   SENT       6
   STARTED    1
   STATE      5.38 5.51 5.61
   SystemDescription Linux diskstation 3.2.40 #5644 SMP PREEMPT Wed Oct 28 12:35:52 CST 2015 i686
   SystemName diskstation
   TYPE       SYSSTAT
   USE_SNMP   1
   interval_fs 300
   snmpCommunity public
   snmpVersion 1
   uname      Linux diskstation 3.2.40 #5644 SMP PREEMPT Wed Oct 28 12:35:52 CST 2015 i686 GNU/Linux synology_evansport_214play
   QUEUE:
     HASH(0x3499060)
     HASH(0x2eb65b8)
   Readings:
     2015-12-26 22:44:09   /opt            74
     2015-12-26 22:44:09   /volumeUSB1/usbshare 93
     2015-12-26 22:49:12   connection      connected
     2015-12-26 22:49:16   load            5.38
     2015-12-26 22:49:16   state           5.38 5.51 5.61
     2015-12-26 22:49:16   temperature     35
   filesystems:
     /dev/sdq1
     /volume1/@optware
   Helper:
     has_proc_loadavg 1
     has_proc_stat 1
     has_proc_uptime 1
     Filesystems:
       /dev/sdq1:
         free       148961280
         mountpoint /volumeUSB1/usbshare
         total      1922828180
         usageper   93
         used       1773764500
       /dev/shm:
         free       358080
         mountpoint /dev/shm
         total      358080
         usageper   0
         used       0
       /run:
         free       355376
         mountpoint /run
         total      358080
         usageper   1
         used       2704
       /tmp:
         free       357856
         mountpoint /tmp
         total      358080
         usageper   1
         used       224
       /var:
         free       1304876
         mountpoint /usr/local/zarafa-licensed/var
         total      2451064
         usageper   45
         used       1043788
       /volume1/@optware:
         free       761216560
         mountpoint /opt
         total      2879527424
         usageper   74
         used       2118208464
Attributes:
   filesystems /dev/sdq1,/volume1/@optware
   mibs       .1.3.6.1.4.1.6574.4.2.12.1:upsInfoLoadValue0
.1.3.6.1.4.1.6574.1.2:temperature0

   room       Monitoring
   showpercent 1
   snmp       1
   snmpCommunity public
   snmpVersion 1
   stat       1
   synologytemperature 1
   uptime     1



Ist das Format für die MIBs korrekt? Also MIB:Reading <NL> MIB:Reading ? Oder muss hier noch ein Komma dazwischen?
Direkt auf der Synology als auch auf dem Pi2 (FHEM Server) liefert snmpwalk das gewünscht Ergebnis.

root@raspberrypi2:/opt/fhem# snmpwalk -c public -v 1 192.168.178.30 .1.3.6.1.4.1.6574.4.2.12.1
iso.3.6.1.4.1.6574.4.2.12.1.0 = Opaque: Float: 7.000000


Gruss Sven
Odroid C2, FHEM 5.8, HMUSB, Jeelink, Rademacher DuoFern Stick, Benning WR über HTTPMOD

hoods

Anbei ein paar learnings und Updates:

1. die beiden relevanten Filesysteme konnte ich bisher nicht erfolgreich einbinden wegen besagter Fehlermeldung.
Habt versucht mit:
"/volume1/@optware"
'/volume1/@optware'
/volume1/\@optware


@andre: wie sollte ich den FS übergeben damit das Modul damit umgehen kann?

2a. Meine learnings zum Thema snmp und mibs
snmpwalk ist gut zur Identifizierung der gewünschten OIDs, mit snmpget ist zu prüfen ob die OID auch wirklich das gewünschte Resultat liefert. Der Teufel steckt im Detail, siehe Beispiel Output ...
root@raspberrypi2:~# snmpwalk -c public -v 2c 192.168.178.30 iso.3.6.1.4.1.6574.1.2
iso.3.6.1.4.1.6574.1.2.0 = INTEGER: 35
root@raspberrypi2:~# snmpget -c public -v 2c 192.168.178.30 iso.3.6.1.4.1.6574.1.2
iso.3.6.1.4.1.6574.1.2 = No Such Instance currently exists at this OID                   
root@raspberrypi2:~# snmpget -c public -v 2c 192.168.178.30 iso.3.6.1.4.1.6574.1.2.0        <= die vollständige OID enthält .0 am Ende
iso.3.6.1.4.1.6574.1.2.0 = INTEGER: 35


Am besten die Hersteller Doku konsultieren und die passenden OIDs raussuchen und prüfen. Für Synology gibts die hier:
http://global.download.synology.com/download/Document/MIBGuide/Synology_DiskStation_MIB_Guide.pdf

2b. Verarbeitung von OIDs vom Datentyp "float"

Die Auslastung der USV zeigt aktuell 7% (übers Webinterface).

Via snmpget sieht das so aus:
root@raspberrypi2:~# snmpget -c public -v 2c 192.168.178.30 .1.3.6.1.4.1.6574.4.2.12.1.0
iso.3.6.1.4.1.6574.4.2.12.1.0 = Opaque: Float: 7.000000

Und in FHEM wird der Datentyp nun anders dargestellt oder sogar konvertiert? Leider bin ich noch blutiger Anfänger, daher hänge ich hier nun. Wie kann ich den Wert weiterverarbeiten?
     2015-12-29 16:39:19   upsBatteryChargeValue 0x9f780442c80000
     2015-12-29 16:39:19   upsInfoLoadValue0 0x9f780440e00000


Im Moment habe ich mir damit beholfen ein reading einzurichten, dass einfach den snmpget Befehl absetzt und hier wird das Resultat 1:1 in FHEM übernommen. Allerdings laufe ich hier in das nächste Problem :).

Readings halten sich scheinbar nicht an die konfigurierten Intervalle (INTERVAL, INTERVAL_FS).
Test1 und UpsLoadInPct sollten eigentlich regelmäßig aktualisiert werden (alle 5 bzw. 10min) aber lt. list wurden sie das letzte Mal von 3 Std. aktualisiert. Beim reading Test0 handelt es sich um einen Fehlversuch.

Internals:
   CONNECTS   335
   DEF        300 600 192.168.178.30
   FD         61
   HAS_Net::SNMP 1
   HOST       192.168.178.30
   INTERVAL   300
   INTERVAL_FS 600
   LAST_DISCONNECT 2015-12-28 16:29:00
   NAME       ds214play
   NR         462
   NTFY_ORDER 50-ds214play
   PARSED     5
   PARTIAL
   PID        28832
   SENT       6
   STARTED    1
   STATE      5.75 5.63 5.56
   SystemDescription Linux diskstation 3.2.40 #5644 SMP PREEMPT Wed Oct 28 12:35:52 CST 2015 i686
   SystemName diskstation
   TYPE       SYSSTAT
   USE_SNMP   1
   interval_fs 600
   snmpCommunity public
   snmpVersion 2
   uname      Linux diskstation 3.2.40 #5644 SMP PREEMPT Wed Oct 28 12:35:52 CST 2015 i686 GNU/Linux synology_evansport_214play
   QUEUE:
     HASH(0x49a7680)
     HASH(0x42b85b8)
     HASH(0x42c0840)
     HASH(0x485b038)
   Readings:
     2015-12-28 11:29:18   Test0           SNMPv2-SMI::enterprises.6574.4.2.12.1.0 = Opaque: Float: 7.000000
     2015-12-29 14:00:36   Test1           Linux diskstation 3.2.40 #5644 SMP PREEMPT Wed Oct 28 12:35:52 CST 2015 i686 GNU/Linux synology_evansport_214play
     2015-12-29 14:00:36   UpsLoadInPct    7.000000
     2015-12-29 17:04:40   connection      connected
     2015-12-29 17:04:44   load            5.75
     2015-12-29 17:04:44   state           5.75 5.63 5.56
     2015-12-29 17:04:44   temperature     35
     2015-12-29 17:04:44   temperature0    35
     2015-12-29 17:04:44   upsBatteryChargeValue 0x9f780442c80000
     2015-12-29 17:04:44   upsInfoLoadValue0 0x9f780440e00000
     2015-12-28 11:29:17   uptime          1 days, 14:21
   filesystems:
   Helper:
     has_proc_loadavg 1
     has_proc_stat 1
     has_proc_uptime 1
     proc_stat_old:
       691555
       1582
       667758
       90242674
       1751979
       0
       83925
       0
       0
       0
Attributes:
   mibs       .1.3.6.1.4.1.6574.4.2.12.1.0:upsInfoLoadValue0,.1.3.6.1.4.1.6574.1.2.0:temperature0,.1.3.6.1.4.1.6574.4.3.1.1.0:upsBatteryChargeValue
   readings   UpsLoadInPct:snmpget -c public -v 2c -Oqv 192.168.178.30 .1.3.6.1.4.1.6574.4.2.12.1.0
Test1:uname -a
   room       Monitoring
   showpercent 1
   snmp       1
   snmpCommunity public
   snmpVersion 2
   stat       1
   synologytemperature 1
   uptime     1
   verbose    5


Wie kann ich einen Interval setzen für readings?

Vielen Dank im Voraus.
Gruß Sven
Odroid C2, FHEM 5.8, HMUSB, Jeelink, Rademacher DuoFern Stick, Benning WR über HTTPMOD