执行程序的最佳 Haskell 库是什么?

如果我要把一个程序投入生产,我需要这个程序做几件事情来使它“可操作化”——也就是说,由工程师和操作人员以一种可测量和可验证的方式运行和维护。在我看来,一个可操作的程序必须:

  • 能够在多个级别进行日志记录(例如: 调试、警告等)。
  • 能够收集和共享关于程序正在进行的工作类型和工作时间的度量/统计数据。理想情况下,收集的指标可以采用与常用监视工具(如 神经节)兼容的格式,或者可以这样进行修改。
  • 是可配置的,理想情况下是通过一个系统,该系统允许在运行程序时更新已配置的属性,而无需重新启动所述程序。
  • 以可重复的方式部署到远程服务器。

在 Scala 的世界里,有很多很好的库可以处理至少前三个需求。例子:

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.

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

If there are any other libraries, tools, or practices around making Haskell code "production-ready", I'd love to know about those as well.

6856 次浏览

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

能够在多个级别进行日志记录(例如: 调试、警告等)。

很容易就可以看出,hlogger 是最流行的日志框架。

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.

我不知道有什么标准化的报告工具,但是,从 +RTS -s流中提取报告(或者通过分析输出标志)是我以前做过的事情。

$ ./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 统计信息,但是目前这并不太容易(需要对“ rts/Stats.h”接口进行 FFI 绑定)。您可以使用 ThreadScope附加到进程,并监视 GC 和线程行为。

类似的标志可用于增量的、记录日志的 时间空间分析,这些分析可用于监视(例如,可以增量构建这些 图表)。

hpc 通过它的 Tix类型收集了大量关于程序执行的统计数据,人们有 书写工具来按时间片记录代码正在执行的内容。

是可配置的,理想情况下是通过一个系统,该系统允许在运行程序时更新已配置的属性,而无需重新启动所述程序。

有几个工具可用于这一点,你可以做 xmonad 风格的状态重载; 或移动到代码热交换通过 plugins * 包或 hint。其中一些比另一些更具实验性。

可重复部署

Galois 最近发布了 cabal-dev,这是一个用于进行可重现构建的工具(例如,依赖关系的范围和控制)。

我会重复唐说过的每一句话,并给他一些建议。

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

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

作为一种编码实践,避免惰性 IO。如果您需要流式 IO,那么使用其中一个迭代库,如 枚举数。如果您查看 黑客入侵,您将看到类似 http-枚举器这样的库,它们对 http 请求使用枚举器样式。

至于在黑客攻击中选择库,有时可以帮助了解有多少包依赖于某些东西。很容易看到反向依赖的软件包,你可以使用这个网站,镜像黑客:

如果您的应用程序最终执行紧密循环,比如 Web 服务器处理许多请求,那么惰性可能会以空间泄漏的形式成为一个问题。这通常是在正确的地方添加严格注释的问题。侧写、经验和阅读核心是我所知道的对抗这类事情的主要技巧。我所知道的最好的分析参考是 真实世界的 Haskell第25章

  • 关于配置,我发现 ConfigFile 对我的项目很有用。我在生产中对所有守护进程使用它。它不会自动更新。
  • 我使用 cabal-dev 创建跨环境(本地、开发人员、同事-本地)的可重复构建。Cabal-dev 确实是不可或缺的,特别是它能够支持项目目录中本地的、打了补丁的库版本。
  • 无论如何,我都会选择 xmonad 风格的状态重载。Haskell 的纯度使这一点变得微不足道; 迁移是一个问题,但无论如何都是。我试验了 hsplugins 和我的 IRcd 提示,在前一种情况下有一个 GHC 运行时问题,在后一种情况下有一个内存区段错误。我把树枝留在 Github 上,等待尸检结果 https://github.com/chrisdone/hulk

配置文件示例:

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