DbLog Patch: Performance Logging, MYSQL crash fix

Begonnen von PatrickR, 25 Oktober 2015, 19:24:59

Vorheriges Thema - Nächstes Thema

Hausautomat

Ich greife das nochmal auf, weil das Problem der gerissenen MySQL-Verbindung gerade wieder mal kalt erwischt hat: Mysql wurde durchgestartet, fhem lief solange weiter (einschliesslich Schalten von Aktoren usw), bis ich eine erste "Datenabfrage" (Detailseite des Fritzbox-Devices aufgerufen). Damit crashte fhem hart aufgrund kaputter DB-Verbindung. In der Zwischenzeit (seit DB-Server-restart) erfolgte allerdings kein logging in der DB...

Darum habe ich jetzt mal diesen Teil in das aktuelle 93_DbLog.pm eingepatcht (aus rapsters .pm oben):

480,481d479
<
<   $dbh->begin_work();
482a481,500
>   if ($hash->{DBMODEL} eq "MYSQL") {
>     eval {
>       $dbh->begin_work();
>     };
>     if($@) {
>       Log3 $hash->{NAME}, 3, "DbLog (DbLog_Push): Error during begin_work(), reconnecting...";
>       $dbh->disconnect();
>       if(!DbLog_Connect($hash)) {
>         Log3 $hash->{NAME}, 3, "DBLog (DbLog_Push): reconnect failed.";
>         return 0;
>       }
>       $dbh = $hash->{DBH};
>       $dbh->{RaiseError} = 1;
>       $dbh->{PrintError} = 0;
>       $dbh->begin_work();
>     }
>   } else {

>     $dbh->begin_work();
>   }


Ergebnis: fhem hat den DB-Server-Restart überlebt und zeigte folgende Fehlermeldung:

2016.02.07 13:14:49 2: DbLog: Failed to insert new readings into database: DBD::mysql::st execute failed: MySQL server has gone away at /usr/share/fhem/FHEM/93_DbLog.pm line 510.


Blöde Frage dazu: wird mit dem Code oben "begin_work()" bei funktionierender DB-Verbindung dann nicht zweimal aufgerufen? Einmal beim eval oben und dann nochmal im else unten. Muss das so sein?

Und weitere Frage: geht der Patch ins Modul irgendwann rein?

ChrisD

Hallo,

Zitatwird mit dem Code oben "begin_work()" bei funktionierender DB-Verbindung dann nicht zweimal aufgerufen?

begin_work() wird bei funktionierender DB-Verbindung nur ein Mal aufgerufen. Wenn der Datenbanktyp MYSQL ist wird der Block mit
dem eval ausgeführt, bei allen anderen Datenbanken der Code im else. Die Abfrage auf den Datenbanktyp kommt daher dass ich den Patch für MYSQL geschrieben und nur damit getestet habe.

Grüße,

ChrisD

Hausautomat

*patsch*

Klar. Das kommt dabei raus, wenn man im Delirium versucht, Code zu lesen...

Danke.

JoeALLb

Was hindert die Aufnahme? Habe saß selbe Problem schon öfter erlebt....
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Gizmoh

Besteht die Möglichkeit das DbLog um ein "Value Exclude" erweitert zu bekommen?

Nach meinem Verständni müsste man analog zur
        #Je nach DBLogSelectionMode muss das vorgegebene Ergebnis der Include-, bzw. Exclude-Pruefung
        #entsprechend unterschiedlich vorbelegt sein.
        #keine Readings loggen die in DbLogExclude explizit ausgeschlossen sind
        my $DoIt = 0;
        $DoIt = 1 if($DbLogSelectionMode =~ m/Exclude/ );
        if($DbLogExclude && $DbLogSelectionMode =~ m/Exclude/) {
          # Bsp: "(temperature|humidity):300 battery:3600"
          my @v1 = split(/,/, $DbLogExclude);
          for (my $i=0; $i<int(@v1); $i++) {
            my @v2 = split(/:/, $v1[$i]);
            $DoIt = 0 if(!$v2[1] && $reading =~ m/^$v2[0]$/); #Reading matcht auf Regexp, kein MinIntervall angegeben
            if(($v2[1] && $reading =~ m/^$v2[0]$/) && ($v2[1] =~ m/^(\d+)$/)) {
              #Regexp matcht und MinIntervall ist angegeben
              my $lt = $defs{$dev->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME};
              my $lv = $defs{$dev->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE};
              $lt = 0 if(!$lt);
              $lv = "" if(!$lv);

              if(($now-$lt < $v2[1]) && ($lv eq $value)) {
                # innerhalb MinIntervall und LastValue=Value
                $DoIt = 0;
              }
            }
          }
        }


einen CodeBlock schreiben, der eine Variable (z.B. ValueExclude) ausließt und falls das aktuelle Value einem ValueExclude entspricht das loggen verhindern.
Der Code müsste dann so wie ich das sehe von "$reading" auf "$value" geändert werden.

Ich habe mich da schon selbst dran versucht aber bin kläglich gescheitert.
Der Hintergrund dazu: Bei den MAX! Heizkörperthermostaten gibt es die Möglichkeit die als desiredTemperature auf "eco" zu stellen. Da "eco" allerdings kein numerischer Wert ist verhunzt das dann die Plots und wirft Fehler im Log. Über ein ValueExclude könnte man die Werte (eco|auto|compfort|"leer") herausfiltern.

Wäre dies Möglich?

Danke und viele Grüße
Gizmoh

stromer-12

Dann filtere doch das diese Werte im Plot raus.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Tobias

Bitte schickt mal Rapster den Patch zur Aufnahme, aufgrund Haussanierung komme ich zZ aktuell leider überhaupt nicht zu solchen Sachen :(
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

JoeALLb

Zitat von: Hausautomat am 07 Februar 2016, 14:06:32
Ich greife das nochmal auf, weil das Problem der gerissenen MySQL-Verbindung gerade wieder mal kalt erwischt hat: Mysql wurde durchgestartet, fhem lief solange weiter (einschliesslich Schalten von Aktoren usw), bis ich eine erste "Datenabfrage" (Detailseite des Fritzbox-Devices aufgerufen). Damit crashte fhem hart aufgrund kaputter DB-Verbindung

Mir gerade auch. Ein Linux-Update hat den Mysql unbemerkt neu gestartet. FHEM lief eine Woche weiter bis gestern der Absturz kam. Keine Daten geloggt. Ärgerlich!
Wird Rapster der neue Maintainer dieses Moduls?
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

rapster

Zitat von: JoeALLb am 16 Februar 2016, 14:28:19
Wird Rapster der neue Maintainer dieses Moduls?
Nein!
Bin leider i.M. zeitlich auch sehr ausgebucht, sodass ich nicht mal zu Updates meiner Module komme die ich schon lange geplant habe.
Die letzten 2 Commits für das DbLog Modul vor paar Tagen gingen schnell, es war eine Funktion die ich geschrieben habe und wusste was die Auswirkungen sind.
Bei diesen Patches muss in fremden Code gebastelt werden, an Sachen die ich selbst nicht verwende und nicht direkt testen kann, allerdings viele Leute betrifft, das ist aufwändiger.

Evtl. möchte sich ja aber einer anbieten Tobias auszuhelfen während seiner Umbauarbeiten?

Gruß
Claudiu

Feuerdrache

Moin,
ich hoffe ich bin hier richtig, zumindest klingt es für mich nach meinem Problem.
Gestern hab ich mein FHEM von sqllite auf MySQL umgestellt. Seit dem hört FHEM auf in die Datenbank zu schreiben wenn im Webinterface in SVG mit Daten aus der Datenbank aufgerufen wird.
auf MySQL seine kann ich sehen, das dann auch keine offene Verbindung mehr vorhanden ist. Erst nach eine reopen der logdb in FHEM läuft es wieder, aber nur bis zum nächsten SVG das angezeigt werden soll.

Gehört das Thema zusammen, oder ist es ein eigenes Thema ?

Gruß FD
FHEM auf Raspberry PI B2
- CUL V3.4 mit culfw 1.65 für HM
- nanoCUL mit culfw 1.66 für KOPP FreeControl

DS_Starter

Hallo zusammen, hallo rapster,

in der Vergangenheit hatte ich immer wieder Crashs von FHEM wenn die MySQL, die ich remote auf einer Synology laufen habe, nicht erreichbar ist bzw. Verbindung unterbrochen  usw. Im Prinzip wie schon hier beschrieben.

Um dieses Problem zu eliminieren habe ich in der aktuellen Version 10796 2016-02-11 an etlichen Stellen Code wie diese eingefügt und andere kleine Änderungen gemacht:

  if ( !$dbh || not $dbh->ping ) {
      Log3($name, 1, "DbLog $name: DB Session dead, try to reopen now !");
      DbLog_Connect($hash);
  }

.....

       if ($dbh) {
            $dbh->commit() if(!$dbh->{AutoCommit});
            $dbh->disconnect();
        }


Damit habe ich nun keinerlei  Abstürze mehr.
Wie ich beim Lesen hier festgestellt habe ist Tobias, bzw. du selbst zeitlich sehr eingespannt.
Wäre es euch dennoch möglich die  gemachten Änderungen mal gegenzuchecken und nach Tests in anderen Umgebungen einzuchecken (wenn alles passt) ?

Das wäre echt Klasse  :) 

Ich habe mal ein DIFF zur Version 10796 und meine gegenwärtig verwendete komplette Version hier angehängt.

viele Grüße und einen schönen Restsonntag,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

rapster

Hi Heiko,

ich habe in deiner angehangenden 93_DbLog.pm noch eine Änderung von FileLog nachgezogen ( https://forum.fhem.de/index.php/topic,52031.msg440573.html#msg440573 ).
Allerdings werden die Werte bei DbLog nicht durch 999999/-999999 wie in FileLog ersetzt sondern durch (~0 >> 1) / -(~0 >> 1), also die höchstmöglichen Zahlen auf 32 bzw. 64 bit Systemen.

Würden bitte mal noch ein paar mehr Leute testen ob mit angehangener Datei alles Problemlos unter SQLITE/MYSQL/POSTGRES funktioniert?

Gruß
Claudiu

franky08

Zitat von: franky08 am 24 April 2016, 13:17:15
Bringt bei mir einen Fehler mit sqlite:
2016.04.24 13:15:23 1: DbLog myDbLog: DB Session dead, try to reopen now !
2016.04.24 13:15:42 1: DbLog myDbLog: DB Session dead, try to reopen now !
2016.04.24 13:15:58 1: DbLog myDbLog: DB Session dead, try to reopen now !
2016.04.24 13:16:23 1: DbLog myDbLog: DB Session dead, try to reopen now !
2016.04.24 13:16:25 1: DbLog myDbLog: DB Session dead, try to reopen now !


DB wird nicht geöffnet.

Hatte es in dem anderen Tread schon gepostet

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

rapster

Hi Frank,

funktioniert "nichts" mit der angehängten Datei, oder nur spezielle Sachen nicht?
Da ich ebenfalls sqlite verwende und dieses Verhalten bei mir nicht auftritt.

Bitte probier es nochmal mit angehängter Version, hier wird zusätzlich noch die DbLog Funktion geloggt in der das Problem aufgetreten ist.
Evtl. auch nochmal mit höherem Loglevel probieren.

Gruß
Claudiu

DS_Starter

#29
Hi Claudiu, hi Frank,

habe mir eine SQLite schnell mal installiert und auf meiner Testinstanz auch mit dieser DB probiert.
Läuft bei mir mit deinen Dateien aus #26/#28.

EDIT: mit MySQL läuft es auch ...

2016.04.24 14:14:14.581 3: Connecting to database SQLite:dbname=/opt/fhem/fhem.db with user
2016.04.24 14:14:14.581 3: Connection to db SQLite:dbname=/opt/fhem/fhem.db established for pid 25390
2016.04.24 14:14:14.585 3: Connection to db SQLite:dbname=/opt/fhem/fhem.db established
2016.04.24 14:40:51.468 3: Connecting to database SQLite:dbname=/opt/fhem/fhem.db with user
2016.04.24 14:40:51.469 3: Connection to db SQLite:dbname=/opt/fhem/fhem.db established for pid 25390
2016.04.24 14:40:51.473 3: Connection to db SQLite:dbname=/opt/fhem/fhem.db established
2016.04.24 14:42:57.280 3: Connecting to database mysql:database=fhemtest;host=192.168.2.10;port=3306 with user fhemtest
2016.04.24 14:42:57.461 3: Connection to db mysql:database=fhemtest;host=192.168.2.10;port=3306 established for pid 25390
2016.04.24 14:42:57.464 3: Connection to db mysql:database=fhemtest;host=192.168.2.10;port=3306 established
2016.04.24 14:43:15.304 3: Connecting to database mysql:database=fhemtest;host=192.168.2.10;port=3306 with user fhemtest
2016.04.24 14:43:15.307 3: Connection to db mysql:database=fhemtest;host=192.168.2.10;port=3306 established for pid 25390
2016.04.24 14:43:15.309 3: Connection to db mysql:database=fhemtest;host=192.168.2.10;port=3306 established


Gruß
Heiko

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter