If I'm going to put a program into production, there are several things I need that program to do in order to consider it "operationalized" – that is, running and maintainable in a measurable and verifiable way by both engineers and operations staff. For my purposes, an operationalized program must:
- Be able to log at multiple levels (ex: debug, warning, etc.).
- Be able to collect and share metrics/statistics about the types of work the program is doing and how long that work is taking. Ideally, the collected metrics are available in a format that's compatible with commonly-used monitoring tools like Ganglia, or can be so munged.
- Be configurable, ideally via a system that allows configured properties in running programs to be updated without restarting said programs.
- Be deployable to remote servers in a repeatable way.
In the Scala world, there are good libraries for dealing with at least the first three requirements. Examples:
- Logula for logging.
- Metrics or Ostrich for collecting and reporting metrics.
- Configgy or Fig for configuration.
As for deployment, one approach taken in the Scala world is to bundle together the bytecode and libraries that comprise one's program with something like assembly-sbt, then push the resulting bundle (a "fat JAR") to remote servers with a tool like Capistrano that executes commands in parallel over SSH. This isn't a problem that necessitates language-specific tools, but I'm curious if such a tool exists in the Haskell community.
There are probably Haskell libraries that provide the traits I've described above. I'd like to know which of the available libraries are considered "best"; that is, which are most mature, well-maintained, commonly used in the Haskell community, and exemplary of Haskell best practices.
If there are any other libraries, tools, or practices around making Haskell code "production-ready", I'd love to know about those as well.