Schlagwort-Archive: fehler

Plesk Onyx – ERROR: Zend_Db_Adapter_Exception: SQLSTATE[HY000] [2002] No such file or directory

Für die Entwicklung einiger eigener Plesk Extensions habe ich einen vServer gemietet auf dem ein Plesk Onyx läuft. Neulich gab es da 100 Paket-Updates und ich hab sie mal machen lassen. Kurz darauf der Schreck: Plesk funktionierte nicht mehr. Die Meldung: ERROR: Zend_Db_Adapter_Exception: SQLSTATE[HY000] [2002] No such file or directory. Und nun?

Ich habe im Internet gelesen und versucht. Nichts half. Etwa 10 Minuten nach dem „Update“-Klick wusste ich, das mysql nicht lief. Etwa 30 Minuten später wusste ich was los war:

Ergab:

Es gab also irgendwelche Probleme mit dem Pfad „/var/lib/mysql-files“. Ich habe geprüft was darin ist und wollte schauen ob die Berechtigungen passen… Der Ordner existierte nicht! OK, daran wird es wohl liegen, doch wo bekomme ich den Ordner her und was gehört da rein.

Die Lösung ist simpel

Ganz ehrlich, ich habe das folgende im Netz als Kommentar gelesen und wollte einfach nicht daran glauben dass es wirklich hilft:

Also: Einfach Ordner anlegen, Dateiberechtigungen setzen und schon startet MySQL wieder.

Im Plesk fand ich einen gelben Warnhinweis, dass ein update nicht lief wie geplant und ich doch bitte die Reperatur (link) starten solle. Geklickt, gewartet: Fertig.

Sentry – Warte nicht auf Fehlermeldungen von Anwendern

Eines der Tools, die Du nicht kennst, aber ab jetzt lieben wirst, ist Sentry. Denn Sentry übernimmt für dich einen wesentlichen Teil der Programmierung, über den du sicherlich noch nicht mal nachgedacht hast.

Mir zumindest ging es so. Auf der Suche nach einem Log-Sammel-System, sodass ich unterschiedliche Log-Dateien von verschiedenen Applikationen auf verschiedenen Servern zentral an einer Stelle abrufen und auswerten kann, bin ich auf die Webseite von Sentry gestoßen und kurz hängen geblieben.

Sentry’s real-time error tracking gives you insight into production deployments and information to reproduce and fix crashes.

Vorab-Info: Ich schreibe recht ausführlich. Es ist mir wichtig zu zeigen warum ich einen Mehrwert in dieser Technik sehe. Auf die Tool-Handhabung an sich gehe ich nicht großartig ein.

Worum geht es?

Wann genau bekommst du mit, dass eine deiner Anwendungen einen (schweren) Fehler hatte und ein User nicht wie gewohnt arbeiten konnte oder gar ein CronJob nicht funktionsfähig ist? Ich selbst bekomme das in zwei Momenten mit:

  1. Ich selbst merke, dass irgendwas nicht stimmt (bester Fall)
    1. Cron-Ergebnis fehlt oder
    2. Ich sehe einen Fehler beim benutzen der Anwendung
  2. Ein Anwender merkt, dass irgendwas nicht stimmt (schlechtester Fall)

Aus zwei Gründen ist der zweite Fall der schlechteste Fall.

  1. Der Anwender hats gemerkt und
  2. Anwender können nur sehr selten vollqualifizierte Fehlermeldungen abgeben

Und genau darum geht es: Gute Fehlermeldungen.

Sentry wird dich natürlich nicht darüber informieren, dass deine Webanwendung auf einem 1024*768px Monitor eines Windows XP basierten Systems mit FireFox 1 eine Textüberlagerung hat. Nein, darum geht es nicht. Aber dass eine JavaScript-Exception in dieser Konstellation fliegt oder auf einem deiner Server ein CronJob an Heilig Abend um fast Mitternacht eine PHP Exception geschmissen hat, dass wirst du dann in Echtzeit per E-Mail, SMS, Chat oder Slack usw. mitbekommen.

Und nein: Sentry unterstützt nicht nur JavaScript und PHP.

Wie kann ich diese Technik nutzen?

Entweder Du beziehst den SaaS (es gibt auch ein Free-Packet) oder hostest selbst eine Instanz. Letzteres war mir anfangs gar nicht bewusst und so habe ich den SaaS derzeit in zwei Projekten im Einsatz, mit dem etwas mulmigen Gefühl was ich immer habe, wenn ich irgendwo einen Gratis-Service ziehe und externe Sachen in meine Tools einbinde. Vergangene Woche habe ich dann mitbekommen dass Sentry Open Source ist und habe mir freudig am Wochenende einen eigenen Server aufgesetzt.

Für welche Sprachen / Techniken kann ich Sentry einsetzen?

Hier eine Liste der Sprachen, die Sentry unterstützt bzw. bestehende Integrationen hat (Stand 10.10.2016):

  • C#
  • Coca
  • Elixir
  • Go
  • Java
  • JavaScript
  • Node.js
  • Objective-C
  • PHP
  • Python
  • Ruby

Noch besser lesen sich die Frameworks in denen Sentry ganz einfach eingebunden werden kann:

  • net/http
  • App Engine
  • Log4j
  • Log4j 2
  • Logback
  • Angular 1
  • Angular 2
  • Backbone
  • Ember
  • React
  • Vue
  • Connect
  • Express
  • Koa
  • Laravel
  • Monolog
  • Symfony2
  • Bottle
  • Django
  • Flask
  • Pylons
  • Pyramid
  • RQ
  • Tornado
  • Rack
  • Rails

Kurzgesagt: Sentry könnt ihr in fast jedem Projekt einsetzen. Und diese Liste ist nur der aktuelle Stand. Andauernd kommen neue Integrationen dazu.

Wie funktioniert es?

Ich selbst habe die Technik nun seid einigen Wochen in zwei Projekten im Einsatz. Ein Laravel-Projekt (in Entwicklung und auch schon Produktiv) und ein nw.js-Projekt (in Entwicklung).

Bei Laravel bspw. sind es einige wenige Handgriffe, schon ist der passende Server verbunden.

  1. Laravel-Abhängigkeit über einen composer-Befehl installieren
  2. einen Provider und einen Alias in der config/app.php Eintragen
  3. Sentry als zusätzliches Reporting in der Datei App/Exceptions/Handler.php erfassen
  4. Abschließend kann nun pro Instnaz der Applikation über die .env-Datei der Sentry DSN konfiguriert werden

Die ersten drei Schritte gelten für alle Instanzen der Applikation der vierte Schritt wird pro Instanz ausgeführt, also quasi beim Setup.

Wie die verschiedenen Sentry SKDs in den verschiedenen Programmiersprachen / Frameworks eingesetzt werden, wird in der Dokumentation sehr übersichtlich beschrieben.

Und wie schaut das jetzt aus?

So weit so gut. Vielleicht sagst Du jetzt auch: „Wow, viel zu kompliziert“. Ich habe beim ersten Projekt auch gut überlegt ob ich mir so einen „Klotz“ ans Bein binden will. Nun werde ich es nahezu immer einsetzen.

Ich zeige dir jetzt auch ein paar Eindrücke, anhand derer du erkennst, warum Exception-Tracking wichtig ist. Die Anwendungsfälle entsprechen realen Szenarien die ich in den vergangenen Wochen hatte, daher sind es nicht so viele.

Anwendungsfall 1: Exception während AJAX Request

Ich habe ein Formular programmiert, es hat genau drei Felder. In dem ersten Feld wird eine Bestell-ID eingegeben. In dem zweiten Feld wird ein Zahlbetrag eingegeben und im dritten Feld kann eine Bemerkung angefügt werden. Der Handhabung halber lade ich nach Eingabe der Bestell-ID lädt ein JavaScript per AJAX den zu zahlenden Betrag und fügt diesen in das zweite Feld ein. Das funktionierte in den Testfällen alles gut.

Eines Morgens rufe ich E-Mails ab und bekomme eine Meldung über Sentry. Eine Exception wurde in der PHP-Funktion, die den Zahlbetrag für den AJAX-Request ermittelt, geschmissen. Die Bestellung für die der Zahlbetrag ermittelt werden soll, wurde nicht gefunden. Das hatte ich so nicht abgefangen.

Dem Anwender ist dies nicht aufgefallen. Er schaut nicht in die Browser-Konsole. In dem Feld für den Zahlbetrag steht immer 0, außer der AJAX-Request ermittelt halt einen anderen Wert. In diesem Falle wurde gar kein Wert ermittelt (ERR 500) und so blieb es „0“. Der Anwender hat einfach den passenden Betrag eingegeben und weitergemacht.

Mit dem nächsten Update habe ich den Fehler, von dem der Anwender nichts wusste, behoben und die Anwendung somit stabiler gemacht.

Wichtigste Informationen: Browser, Gerät, Level, …

Direkte Anzeige des Quellcode und der Zeile, in der die Exception geflogen ist.

Zusätzliche Informationen über den Kontext.

Und in diesem Moment war mir dann auch klar, was genau der Fehler war. Die Bestell-ID wurde kopiert, inkl. einem Leerzeichen am Ende (siehe das „verrückte“ Komma). Nun war klar was ich zu tun hatte.

Anwendungsbeispiel 2: Offensichtliche Störung – nicht gemeldet

Dieses Beispiel kommt dann dem Punkt nahe, dass der User sehr wohl mitbekommt, dass etwas nicht läuft, aber auch nichts weiter meldet. Genau das wird wahrscheinlich oft vorkommen: Keiner Meldet einen Fehler und schmunzelt über das instabile System.

Gleiches Projekt wie Anwendungsfall 1. Was genau der Fehler ist weiß ich selbst noch nicht, habe im Internet nachgelesen und eine Idee was ich ändern kann. Muss es halt nur noch mal prüfen. Na jedenfalls fliegt eine TokenMismatchException von Laravel und so sieht dass dann aus:

Grundlegende Informationen zum System

Grundlegende Informationen zum System

Quellcode-Informationen - Wo fliegt der Fehler?

Quellcode-Informationen – Wo fliegt der Fehler?

Kontext der Anfrage - Stark maskiert - Datenschutz

Kontext der Anfrage – Stark maskiert – Datenschutz

Interessant hierbei für mich: Der Token stimmt angeblich nicht, ist aber gesetzt. Nun weiß ich zumindest genau, dass alle erwarteten Inputs vorhanden sind und es eine „echte“ Anfrage war.

Meldungs-SPAM durch Bots?

Nein. In Sentry kann man Anfragen rausfiltern. Und die Liste bekannter Bots ist standardmäßig komplett rausgefiltert. Filtern kann man:

  • Errors von localhost / 127.0.0.1
  • Errors bei denen bekannt ist, dass sie durch gewisse Browser-Erweiterungen entstehen
  • Errors bei denen bekannt ist, dass sie durch das verwenden von Legacy-Browsern entstehen
  • Errors von Bots / Web-Crawlern

Fazit

Sentry wird mir helfen, meine Software besser im Blick zu behalten, ohne auch nur eine Sekunde lang Logfiles kontrollieren zu müssen. Sobald etwas dramatisches passiert, kann ich mich -in meinem Fall- per Mail benachrichtigen lassen. Dann weiß ich, dass ich aktiv werden sollte.

Auf diesem Weg sammle ich als Entwickler noch mehr Erfahrung für meine künftigen Projekte.

Minecraft 1.8.1 MainScreen

Auf Minecraft 1.8.1 Bukkit Server updaten

Wer nicht abwarten will, bis es einen Empfohlenen Release von Bukkit gibt, um Minecraft 1.8.1 auf seinem Server zum Laufen zu bringen, kann gerne schon upgraden.

Ich habe inzwischen die zweite dev-Version von Bukkit auf zwei Minecraft-Servern laufen (einmal ca. 220 MB Spielwelt einmal ca. 80 MB) und es gibt keine Abstürze.

Mit einigen Fehlern ist dennoch zu rechnen.

Ich habe CraftBukkit #1139 am laufen (glaube ich, habe gestern nicht so genau drauf geachtet), eigetnlich nehme ich aber beim Update immer die aktuellste, die nicht gerade einen roten Bubbel hat.

Wie Update ich meinen Server auf Minecraft 1.8.1

  1. WICHTIG: Karten-Backup machen. Bei Nitrade einfach über die Web-Konsole, bei eigenem Server die entsprechenden World-Ordner kopieren, bei einer normalen Welt also „world“ und „world_nether“ (vorher Server runterfahren)
  2. Server herunterfahren (also nur den Gameserver)
  3. Das „neue“ CraftBukkit herunterladen
  4. Das auf dem Server vorhandene CraftBukkit umbenennen (bspw in „org.crafftbukkit[…]“)
  5. Das heruntergeladene CraftBukkit auf den Server laden
  6. Den Server Starten
  7. Per Minecraft einloggen und durch die Welt laufen (i.d.R. gilt: Welt noch da, Update OK)
  8. Truen öffnen, Türen passieren, Redstone-Schaltungen testen, Items sammeln und ablegen, was eben so an Funktionalität vorhanden ist austesten
  9. Plugins auf Funktionalität prüfen (bspw. durch Kommandoeingabe)
  10. Wenn alles OK:
    1. alles OK
  11. Wenn alles Putt:
    1. Auf den Server gehen (per SSH oder Web-Interface)
    2. Server Stoppen
    3. Backup wiederherstellen (bei Nitrado über WebInterface, bei SSH den „world“ und „world_nether“ löschen und die Kopie (das Backup) demenetsprechend wieder umbenennen/verschieben)
    4. CraftBukkit löschen
    5. Die umbenannte CraftBukkit-Version wieder zurückbenennen (in meinem Fall das „org.“ am Anfang entfernen)
    6. Server Starten
    7. Erneut alles Testen

Mit welchen Fehlern muss ich rechnen?

Aktuell ist damit zu rechnen, dass

  • Truen falschrum stehen
  • manche Truen „schwarz“ sind, bis sie geöffnet werden
  • Truen offen bleiben, auch wenn kein Spieler sie benutzt
  • Redstone-Repeater schwarz sind (ohne Textur)
  • 1.8.1 Clients (also unabhängig von Bukkit) teilweise ganz oft „Out of Memory“ bekommen (auch bei nem Windows 7 64bit mit 4 GB, wo noch 2 GB ungenutzt sind)

Wer das hinnehmen mag, um 1.8.1 zu testen sollte definitiv updaten, ich habe es nicht bereut und freue mich über das Update. Was alles mit 1.8.1 kam, könnt ihr anderstwo lesen, da muss ich nicht aktiv werden 🙂

Minecraft Update 1.6.2 – nichts geht mehr

Nach dem Update auf Minecraft 1.6 geht nichts mehr? Er updated also noch, aber dann kann nichts mehr geklickt werden, da ein schwarzer Hintergrund angezeigt wird?

Eigentlich gar nicht so schwer, es liegt an dem nicht kompatiblen Texture-Pack.

Geh (Windows XP) einfach in den Ordner C:Dokumente und EinstellungenDEIN_BENUTZERAnwendungsdaten.minecrafttexturepacks und packe alle Dateien in ein Archiv. Dann lösche alle Dateien bis auf das Archiv und starte Minecraft. Du kannst Spielen.

Du kannst irgendwann das Archiv wieder entpacken und in deinen Textures-Ordner einfügen, wenn Du magst, aber dann wird Minecraft wahrscheinlich wieder nicht funktionieren.

Unter Windows 7 musst Du den Ordner C:BenutzerDEIN_BENUTZERAppDataRoaming.minecrafttexturepacks aufsuchen.

Das Archiv ist lediglich eine Sicherung, sodass Du weißt, welche Packs Du nochmal herunterladen musst, wenn Sie mit Minecraft 1.6 Kompatibel sind.

artikelimg

HELP: Ordner auf USB-Stick leer, Dateien verschwunden

Tjoa und jetzt seid ihr mal dran.

Ich wollte gerade meinen Artikel über meinen neuen USB-Stick (inzwischen ist der Stick ca. 1 Monat alt) rausbringen, da musste ich feststellen: der Artikel-Ordner, in den ich die Artikel als .docx schreibe, ist leer.

Ich mache mir also nen Kopf und denke mir, dass ich die Artikel keinesfalls gelöscht habe.

Jetzt kommt das absolut geile:

USB Eigenschaften

USB Eigenschaften

Ordnereigenschaften

Ordnereigenschaften

Man bemerke: 1,2 TB Daten auf einem 4GB-Stick.

Die ca. 15.000 Dateien kommen schon hin (Portabler Webserver, viele Web-Systeme).

Genau mein Artikelordner ist dann 1,19 TB groß und leer, über die Kommandozeile lese ich dann folgendes


06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
06.03.2031  12:51     1.717.986.918 ffffffff.fff
128 Datei(en) 219.902.325.504 Bytes
0 Verzeichnis(se),  3.731.189.760 Bytes frei

Ich würde jetzt ja lachen und das ganze herzlich komisch finden (Dateien aus dem Jahre 2031), aber in den Artikeln steckten bereits mehrere Stunden Arbeit, ich bitte also allgemein um Hilfe!!!