115 votes

Quelles sont les meilleures bibliothèques Haskell pour opérationnaliser un programme?

Si je vais mettre un programme en production, il y a plusieurs choses que j'ai besoin de ce programme pour le faire afin de les examiner "opérationnaliser" – qui est, la course et maintenues dans un mesurables et vérifiables par les deux ingénieurs et du personnel d'exploitation. Pour ma part, un opérationnels de programme doit:

  • Être en mesure de se connecter à de multiples niveaux (ex: debug, avertissement, etc.).
  • Être en mesure de recueillir et de partager des indicateurs et des statistiques sur les types de travail le programme est en train de faire et combien de temps que le travail est prenant. Idéalement, le collectées mesures sont disponibles dans un format compatible avec couramment utilisé des outils de surveillance comme les Ganglions, ou peut-être si munged.
  • Être configurable, idéalement via un système qui permet de propriétés configurées dans les programmes en cours d'être mis à jour sans avoir à redémarrer dit de programmes.
  • D'être déployée sur les serveurs distants dans un moyen reproductible.

Dans le Scala monde, il y a des bonnes bibliothèques pour traiter au moins les trois premiers critères. Exemples:

Comme pour le déploiement, une approche adoptée dans le Scala monde est de réunir les bytecode et les bibliothèques qui composent un programme avec quelque chose comme de l'assemblée-sbt, puis poussez le résultant bundle ("fat JAR") à des serveurs distants avec un outil comme Capistrano qui exécute des commandes en parallèle sur SSH. Ce n'est pas un problème qui nécessite des outils linguistiques, mais je suis curieux de savoir si un tel outil existe dans le Haskell communauté.

Il y a probablement Haskell bibliothèques qui fournissent les traits de caractère que j'ai décrit ci-dessus. J'aimerais savoir laquelle de ces bibliothèques sont considérées comme "meilleur", c'est, qui sont les plus matures, bien entretenu, couramment utilisé dans le Haskell communauté, et exemplaire de Haskell meilleures pratiques.

Si il y a d'autres bibliothèques, des outils ou des pratiques autour de faire du code Haskell "prêt pour la production", j'aimerais savoir sur ceux aussi bien.

54voto

Don Stewart Points 94361

C'est une grande question! Voici une première coupe.

Être en mesure de se connecter à de multiples niveaux (ex: debug, avertissement, etc.).

hslogger est de loin le plus populaire de journalisation.

Être en mesure de recueillir et de partager des indicateurs et des statistiques sur les types de travail le programme est en train de faire et combien de temps que le travail est prenant. Idéalement, le collectées mesures sont disponibles dans un format compatible avec couramment utilisé des outils de surveillance comme les Ganglions, ou peut-être si munged.

Je ne suis pas au courant de tout établissement de rapports normalisés outils, cependant, l'extraction de rapports à partir d' +RTS -s flux (ou via le profilage de sortie des drapeaux) a été quelque chose que j'ai fait dans le passé.

$ ./A +RTS -s
64,952 bytes allocated in the heap
1 MB total memory in use
 %GC time       0.0%  (6.1% elapsed)
 Productivity 100.0% of total user, 0.0% of total elapsed

Vous pouvez l'obtenir en format lisible en machine trop:

$ ./A +RTS -t --machine-readable

 [("bytes allocated", "64952")
 ,("num_GCs", "1")
 ,("average_bytes_used", "43784")
 ,("max_bytes_used", "43784")
 ,("num_byte_usage_samples", "1")
 ,("peak_megabytes_allocated", "1")
 ,("init_cpu_seconds", "0.00")
 ,("init_wall_seconds", "0.00")
 ,("mutator_cpu_seconds", "0.00")
 ,("mutator_wall_seconds", "0.00")
 ,("GC_cpu_seconds", "0.00")
 ,("GC_wall_seconds", "0.00")
 ]

Idéalement, vous pouvez le joindre à l'exécution d'un GHC d'exécution sur un socket et de regarder ces GC stats de manière interactive, mais actuellement ce n'est pas super facile (besoin d'un FFI liaisons vers la "rts/Stats.h" de l'interface). Vous pouvez joindre à un processus à l'aide d' ThreadScope et de surveiller GC et le filetage de comportement.

Similaire drapeaux sont disponibles pour les différentiels, connecté le temps et l'espace de profilage, qui peut être utilisé pour la surveillance (par exemple, ces graphiques peuvent être générés de façon incrémentielle).

hpc recueille beaucoup de statistiques sur l'exécution du programme, par l'intermédiaire de son Tix type, et les gens ont créé des outils pour se connecter par tranche de temps ce code est en cours d'exécution.

Être configurable, idéalement via un système qui permet de propriétés configurées dans les programmes en cours d'être mis à jour sans avoir à redémarrer dit de programmes.

Plusieurs outils sont disponibles pour cela, vous pouvez le faire xmonad de l'état de rechargement; ou se déplacer jusqu'à code hotswapping via plugins* emballages ou hint. Certaines de ces derniers sont de plus expérimental que les autres.

Reproductible déploiements

Galois a récemment publié cabal-dev, qui est un outil pour faire des reproductible construit (c'est à dire les dépendances sont définies et contrôlées).

9voto

Jason Dagit Points 5998

Je l'écho de tout ce qui Ne dit et ajouter quelques morceaux de conseils.

Par exemple, deux des outils et des bibliothèques que vous pourriez envisager:

  • QuickCheck pour les biens en fonction des tests
  • hlint comme une version étendue de l' -Wall

Ceux-ci sont destinées à la qualité du code.

En tant que pratique de codage, d'éviter les Paresseux IO. Si vous avez besoin d'streaming IO, puis aller avec l'un des iteratee bibliothèques comme agent recenseur. Si vous regardez sur Hackage vous verrez des bibliothèques comme http énumérateur qui utilisent un énumérateur de style pour les requêtes http.

Comme pour la cueillette des bibliothèques sur le hackage, il peut parfois aider à regarder combien de paquets dépendent de quelque chose. Facilement voir l'inverse des dépendances d'un paquet, vous pouvez utiliser ce site web, qui reflète hackage:

Si votre application finit par faire des boucles serrées, comme un serveur web de manutention à de nombreuses demandes, la paresse peut être un problème dans la forme de l'espace des fuites. C'est souvent une question d'ajouter de la rigueur des annotations dans les bons endroits. Profilage, de l'expérience et de la lecture de base sont les principales techniques que je connais de vue de lutter contre ce genre de chose. Le meilleur profilage de référence que je connaisse est le Chapitre 25 de du Monde Réel Haskell.

9voto

Christopher Done Points 2699
  • Concernant la configuration, j'ai trouvé ConfigFile être utile pour mes projets. Je l'utilise pour tous mes démons dans la production. Il ne met pas à jour automatiquement.
  • J'utilise de la cabale-dev pour la création reproductible construit à travers des environnements (local, dev, collègue local). Vraiment cabal-dev est indispensable, en particulier pour sa capacité à soutenir des versions corrigées de bibliothèques dans le répertoire du projet.
  • Pour ce que ça vaut, je voudrais aller avec xmonad de l'état de rechargement. La pureté de Haskell qui rend cette triviale; la migration est un problème, mais il est de toute façon. J'ai expérimenté avec hsplugins et de conseil pour mon IRCd et dans le premier cas, il y avait un GHC runtime problème, et dans le second une erreur de segmentation. J'ai quitté le branches sur Github pour plus tard, l'autopsie: https://github.com/chrisdone/hulk

Exemple de ConfigFile:

# Default options
[DEFAULT]
hostname: localhost
# Options for the first file
[file1]
location: /usr/local
user: Fred

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X