Si je veux mettre un programme en production, il y a plusieurs choses que je dois faire pour que ce programme le considère comme "opérationnalisé" - c'est-à-dire qu'il est opérationnel et maintenable de manière mesurable et vérifiable par les ingénieurs et le personnel d'exploitation. À mes fins, un programme opérationnel doit:
- Être capable de se connecter à plusieurs niveaux (ex: débogage, avertissement, etc.).
- Être en mesure de collecter et de partager des mesures / statistiques sur les types de travail effectué par le programme et la durée de ce travail. Idéalement, les métriques collectées sont disponibles dans un format compatible avec les outils de surveillance couramment utilisés tels que Ganglia , ou peuvent être ainsi intégrées.
- Être configurable, idéalement via un système qui permet de mettre à jour les propriétés configurées dans les programmes en cours d'exécution sans redémarrer lesdits programmes.
- Être déployable sur des serveurs distants de manière répétable.
Dans le monde Scala, il existe de bonnes bibliothèques pour traiter au moins les trois premières exigences. Exemples:
- Logula pour la journalisation.
- Métriques ou autruche pour collecter et rapporter des métriques.
- Configgy ou Fig pour la configuration.
En ce qui concerne le déploiement, une approche adoptée dans le monde Scala est de regrouper le bytecode et les bibliothèques qui composent son programme avec quelque chose comme assembly-sbt , puis de pousser le bundle résultant (un "fat JAR") vers 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 spécifiques au langage, mais je suis curieux de savoir si un tel outil existe dans la communauté Haskell.
Il existe probablement des bibliothèques Haskell qui fournissent les caractéristiques que j'ai décrites ci-dessus. J'aimerais savoir lesquelles des bibliothèques disponibles sont considérées comme «les meilleures»; c'est-à-dire qui sont les plus matures, bien entretenues, couramment utilisées dans la communauté Haskell et exemplaires des meilleures pratiques Haskell.
S'il y a d'autres bibliothèques, outils ou pratiques pour rendre le code Haskell "prêt pour la production", j'aimerais aussi les connaître.
Réponses:
C'est une excellente question! Voici une première coupe.
hslogger est de loin le cadre de journalisation le plus populaire.
Je ne connais aucun outil de reporting standardisé, cependant, l'extraction de rapports à partir de
+RTS -s
flux (ou via le profilage des indicateurs de sortie) a été quelque chose que j'ai fait dans le passé.Vous pouvez également l'obtenir dans un format lisible par machine:
Idéalement, vous pourriez vous connecter à un runtime GHC en cours d'exécution sur une socket et regarder ces statistiques GC de manière interactive, mais actuellement ce n'est pas super facile (nécessite une liaison FFI à l'interface "rts / Stats.h"). Vous pouvez vous attacher à un processus en utilisant
ThreadScope
et surveiller le GC et le comportement des threads.Des indicateurs similaires sont disponibles pour le profilage incrémentiel, de temps et d' espace consigné , qui peuvent être utilisés pour la surveillance (par exemple, ces graphiques peuvent être construits de manière incrémentielle).
hpc
recueille beaucoup de statistiques sur l'exécution du programme, via sonTix
type, et les gens ont écrit des outils pour enregistrer par tranche de temps le code en cours d'exécution.Plusieurs outils sont disponibles pour cela, vous pouvez effectuer un rechargement d'état de style xmonad; ou passez au code hotswapping via
plugins
* packages ouhint
. Certains d'entre eux sont plus expérimentaux que d'autres.Galois a récemment publié
cabal-dev
, qui est un outil pour faire des constructions reproductibles (c'est-à-dire que les dépendances sont étendues et contrôlées).la source
EventLog
cadre de journalisation de GHC (utilisé+RTS -l
au moment de l'exécution) diffuse la sortie dans un fichier, qui peut être visualisé avec n'importe quel outil lisant le format du journal des événements.Exemple de ConfigFile:
la source
Je ferais écho à tout ce que Don a dit et ajouterais quelques conseils d'ordre général.
Par exemple, deux outils et bibliothèques supplémentaires que vous voudrez peut-être envisager:
-Wall
Ceux-ci visent tous deux la qualité du code.
Comme pratique de codage, évitez Lazy IO. Si vous avez besoin d'E / S en streaming, utilisez l'une des bibliothèques iteratee telles que l' énumérateur . Si vous regardez sur Hackage, vous verrez des bibliothèques comme http-enumerator qui utilisent un style énumérateur pour les requêtes http.
En ce qui concerne la sélection de bibliothèques sur le piratage, il peut parfois être utile de voir combien de paquets dépendent de quelque chose. Visualisez facilement les dépendances inverses d'un package que vous pouvez utiliser ce site Web, qui reflète le piratage:
Si votre application finit par faire des boucles serrées, comme un serveur Web traitant de nombreuses demandes, la paresse peut être un problème sous la forme de fuites d'espace. Il s'agit souvent d'ajouter des annotations de rigueur aux bons endroits. Le profilage, l'expérience et le noyau de lecture sont les principales techniques que je connais pour lutter contre ce genre de choses. La meilleure référence de profilage que je connaisse est le chapitre 25 de Real-World Haskell .
la source