什么是最好的Haskell库来操作一个程序?

如果我要把一个项目投入生产,那么我需要这个项目来考虑这个项目的“可操作性”,也就是说,工程师和操作人员都要以可测量和可validation的方式运行和维护。 为了我的目的,一个可操作的程序必须:

  • 能够在多个级别login(例如:debugging,警告等)。
  • 能够收集和分享有关该计划正在进行的工作types的指标/统计数据以及该工作正在进行多长时间。 理想情况下,收集的度量标准可以采用与Ganglia等常用监控工具兼容的格式,也可以如此。
  • 可configuration,理想情况下通过一个系统,允许在运行程序中configuration的属性更新,而无需重新启动上述程序。
  • 可以以可重复的方式部署到远程服务器。

在Scala的世界里,至less有前三个要求是有很好的库。 例子:

  • Logulalogging。
  • 用于收集和报告指标的指标或鸵鸟 。
  • configuration或图configuration。

至于部署方面,Scala世界采取的一种方法是将组成一个程序的字节码和库与像assembly-sbt这样的东西捆绑在一起,然后用Capistrano这样的工具将产生的bundle(一个“胖JAR”)推送到远程服务器通过SSH并行执行命令。 这不是一个需要特定于语言的工具的问题,但是我很好奇Haskell社区是否存在这样一个工具。

可能有Haskell库提供了我上面描述的特征。 我想知道哪些可用的库被认为是“最好的”; 也就是说,最成熟,维护性最好的,在Haskell社区中常用的,也是Haskell最佳实践的典范。

如果还有围绕着让Haskell代码“生产就绪”的其他库,工具或做法,我也很想知道这些。

这是一个很好的问题! 这是第一个剪辑。

能够在多个级别login(例如:debugging,警告等)。

hslogger是最stream行的日志框架。

能够收集和分享有关该计划正在进行的工作types的指标/统计数据,以及该工作正在进行多长时间。 理想情况下,收集的度量标准可以采用与Ganglia等常用监控工具兼容的格式,也可以如此。

我不知道任何标准化的报告工具,但是从+RTS -sstream(或通过分析输出标志)提取报告是我过去所做的。

 $ ./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 

你也可以用机器可读的格式得到它:

 $ ./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") ] 

理想情况下,您可以通过套接字连接到正在运行的GHC运行时,并以交互方式查看这些GC统计信息,但目前这并不是很容易(需要将FFI绑定到“rts / Stats.h”接口)。 您可以使用ThreadScope附加到进程,并监视GC和线程行为。

类似的标志可用于增量,日志logging的时间和空间分析,可用于监测(例如,这些图可以增量式构build)。

hpc通过它的Tixtypes收集了很多有关程序执行的统计信息,而且人们已经编写了一些工具来按时间片logging代码执行的情况。

可以configuration,理想情况下通过一个系统,允许在运行程序中configuration的属性被更新而不重新启动所述程序。

有几个工具可用于此,您可以执行xmonad-style状态重装; 或通过plugins *包或hint移动到代码热点。 其中一些比其他更实验。

可重复部署

Galois最近发布了cabal-dev ,这是一个可重复构build的工具(即依赖关系被限制和控制)。

  • 关于configuration,我发现ConfigFile对我的项目很有用。 我用它来制作所有的守护进程。 它不会自动更新。
  • 我使用cabal-dev来创build跨环境(local,dev,colleague-local)的可重复构build。 真正的cabal-dev是必不可less的,特别是它能够在项目目录中支持本地修补版本的库。
  • 对于什么是值得的,我会去与xmonad风格的状态重新加载。 Haskell的纯度使这个微不足道的; 迁移是一个问题,但无论如何。 我尝试了hsplugins和提示我的IRCd,在前一种情况下,有一个GHC运行时问题,后者是一个分段错误。 我离开了Github的分支机构,以便事后进行处理: https : //github.com/chrisdone/hulk

ConfigFile示例:

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

我会回应唐的一切,并添加一些build议。

例如,您可能需要考虑另外两个工具和库:

  • 快速检查基于属性的testing
  • hlint作为-Wall的扩展版本

这些都是针对代码质量的。

作为一种编码习惯,避免懒惰IO。 如果你需要stream式IO,那么使用一个迭代器库(例如枚举器) 。 如果你看看Hackage,你会看到像http-enumerator这样的库,它为http请求使用枚举器样式。

至于在hackage上挑选图书馆有时可以帮助看看有多less包依赖于某些东西。 轻松看到一个包的反向依赖关系,你可以使用这个网站,这反映了hackage:

如果您的应用程序结束了严格的循环,就像处理许多请求的Web服务器一样,懒惰可能成为空间泄漏forms的问题。 通常这是在正确的地方添加严格注释的问题。 分析,经验和阅读核心是我所知道的打击这种事情的主要技术。 我所知道的最好的分析参考是真实世界Haskell的 第25章 。