Wenn ich ein Programm in Produktion nehmen will, muss dieses Programm einige Dinge tun, um es als "operationalisiert" zu betrachten - das heißt, es kann sowohl von Ingenieuren als auch von Betriebspersonal messbar und überprüfbar ausgeführt und gewartet werden. Für meine Zwecke muss ein operationalisiertes Programm:
- Sie können auf mehreren Ebenen protokollieren (z. B. Debugging, Warnung usw.).
- Sie können Metriken / Statistiken über die Art der Arbeit des Programms und die Dauer dieser Arbeit sammeln und austauschen. Im Idealfall sind die gesammelten Metriken in einem Format verfügbar, das mit häufig verwendeten Überwachungstools wie Ganglia kompatibel ist oder so munged werden kann.
- Konfigurierbar sein, idealerweise über ein System, mit dem konfigurierte Eigenschaften in laufenden Programmen aktualisiert werden können, ohne die Programme neu zu starten.
- Bereitstellbar auf Remote-Servern auf wiederholbare Weise.
In der Scala-Welt gibt es gute Bibliotheken, um mindestens die ersten drei Anforderungen zu erfüllen. Beispiele:
- Logula für die Protokollierung.
- Metriken oder Strauß zum Sammeln und Berichten von Metriken.
- Configgy oder Fig zur Konfiguration.
Bei der Bereitstellung besteht ein Ansatz in der Scala-Welt darin, den Bytecode und die Bibliotheken, aus denen das Programm besteht, mit Assembly-sbt zu bündeln und das resultierende Bundle (eine "fette JAR") mit einem Tool wie Capistrano auf Remote-Server zu übertragen das führt Befehle parallel über SSH aus. Dies ist kein Problem, das sprachspezifische Tools erfordert, aber ich bin gespannt, ob es ein solches Tool in der Haskell-Community gibt.
Es gibt wahrscheinlich Haskell-Bibliotheken, die die oben beschriebenen Merkmale aufweisen. Ich würde gerne wissen, welche der verfügbaren Bibliotheken als "am besten" gelten. Das heißt, diese sind am ausgereiftesten, am besten gepflegt, werden häufig in der Haskell-Community verwendet und sind beispielhaft für die Best Practices von Haskell.
Wenn es andere Bibliotheken, Tools oder Methoden gibt, mit denen Haskell-Code "produktionsbereit" gemacht werden kann, würde ich gerne auch davon erfahren.
Antworten:
Das ist eine gute Frage! Hier ist ein erster Schnitt.
hslogger ist mit Abstand das beliebteste Protokollierungsframework.
Mir sind keine standardisierten Berichterstellungstools bekannt, aber das Extrahieren von Berichten aus
+RTS -s
Streams (oder über Profiling-Ausgabeflags) war etwas, was ich in der Vergangenheit getan habe.Sie können dies auch in maschinenlesbarem Format erhalten:
Idealerweise können Sie über einen Socket eine Verbindung zu einer laufenden GHC-Laufzeit herstellen und diese GC-Statistiken interaktiv anzeigen. Derzeit ist dies jedoch nicht ganz einfach (erfordert eine FFI-Bindung an die Schnittstelle "rts / Stats.h"). Sie können mithilfe von
ThreadScope
GC- und Threading-Verhalten eine Verbindung zu einem Prozess herstellen .Ähnliche Flags sind für inkrementelle, protokollierte Zeit und Raum verfügbar Profilerstellung , die für die Überwachung verwendet werden können (zB diese Diagramme können schrittweise aufgebaut werden).
hpc
sammelt eine Menge Statistiken über die Programmausführung, über ihrenTix
Typ und die Leute haben Tools geschrieben , um nach Zeitscheiben zu protokollieren, welcher Code ausgeführt wird.Hierfür stehen verschiedene Tools zur Verfügung. Sie können das Status-Reload im Xmonad-Stil durchführen. oder wechseln Sie zum Code-Hotswapping über
plugins
* Pakete oderhint
. Einige davon sind experimenteller als andere.Galois wurde kürzlich veröffentlicht
cabal-dev
, ein Tool zum Erstellen reproduzierbarer Builds (dh Abhängigkeiten werden festgelegt und kontrolliert).quelle
EventLog
Protokollierungsframework von GHC (+RTS -l
zur Laufzeit) überträgt die Ausgabe in eine Datei, die mit jedem Tool visualisiert werden kann, das das Ereignisprotokollformat liest.Beispiel für ConfigFile:
quelle
Ich würde alles wiederholen, was Don gesagt hat, und ein paar allgemeine Ratschläge hinzufügen.
Zum Beispiel zwei zusätzliche Tools und Bibliotheken, die Sie möglicherweise in Betracht ziehen sollten:
-Wall
Beide zielen auf die Codequalität ab.
Vermeiden Sie als Codierungspraxis Lazy IO. Wenn Sie Streaming-E / A benötigen, verwenden Sie eine der iterierten Bibliotheken wie Enumerator . Wenn Sie sich Hackage ansehen, sehen Sie Bibliotheken wie http-enumerator, die einen Enumerator-Stil für http-Anforderungen verwenden.
Bei der Auswahl von Bibliotheken bei Hackage kann es manchmal hilfreich sein, zu prüfen, wie viele Pakete von etwas abhängen. Sehen Sie leicht die umgekehrten Abhängigkeiten eines Pakets, das Sie auf dieser Website verwenden können, die Hackage widerspiegelt:
Wenn Ihre Anwendung enge Schleifen aufweist, wie ein Webserver, der viele Anforderungen verarbeitet, kann Faulheit ein Problem in Form von Speicherplatzlecks sein. Oft geht es darum, an den richtigen Stellen strenge Anmerkungen hinzuzufügen. Profiling, Erfahrung und Lesekern sind die wichtigsten Techniken, die ich kenne, um solche Dinge zu bekämpfen. Die beste mir bekannte Profilreferenz ist Kapitel 25 von Real-World Haskell .
quelle