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

如果我打算将一个项目投入生产,我需要该项目需要做的几件事情,以便将其视为“可操作化” - 也就是说,工程师和运营人员都可以通过可衡量的和可验证的方式运行和维护。 为了我的目的,一个可操作的程序必须:

  • 能够在多个级别登录(例如:调试,警告等)。
  • 能够收集和分享有关该计划正在进行的工作类型以及该工作需要多长时间的指标/统计数据。 理想情况下,收集的度量标准可以采用与Ganglia等常用监控工具兼容的格式,也可以非常灵活。
  • 可配置,理想情况下通过一个系统,该系统允许在运行程序中配置的属性被更新而不重新启动所述程序。
  • 以可重复的方式部署到远程服务器。
  • 在Scala世界中,有至少处理前三个需求的好库。 例子:

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

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

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


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

    能够在多个级别登录(例如:调试,警告等)。

    hslogger很容易成为最流行的日志框架。

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

    我不知道任何标准化的报告工具,但是,从+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统计信息,但目前这并不容易(需要将FFI绑定到“rts / Stats.h”接口)。 您可以使用ThreadScope附加到进程并监视GC和线程行为。

    类似的标志可用于增量记录时间和空间剖析,可用于监视(例如,这些图可以逐步构建)。

    hpc通过它的Tix类型收集了很多关于程序执行的统计信息,而且人们已经编写了一些工具来按时间片记录执行的代码。

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

    有几种工具可用于此,您可以执行xmonad-style状态重装; 或通过plugins *软件包或hint升级到代码热插拔。 其中一些比其他更实验。

    可重复部署

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


  • 关于配置,我发现ConfigFile对我的项目很有用。 我用它来制作所有我的守护进程。 它不会自动更新。
  • 我使用cabal-dev在环境中创建可重复的构建(本地,开发人员,同事本地)。 真正的cabal-dev是必不可少的,特别是它能够在项目目录中支持本地修补版本的库。
  • 对于它的价值,我会用xmonad风格的状态重新加载。 Haskell的纯度使这个微不足道的; 迁移是一个问题,但无论如何。 我对hClugins和IRCd提示进行了实验,前者出现GHC运行时问题,后者出现分段错误。 我离开了Github上的分支机构以便后来进行postmortem:https://github.com/chrisdone/hulk
  • ConfigFile示例:

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

    我会回应唐的一切,并加入一些建议。

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

  • 快速检查基于属性的测试
  • hlint作为-Wall的扩展版本
  • 这些都是针对代码质量的。

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

    至于在hackage上挑选图书馆,它有时可以帮助查看有多少包依赖于某些东西。 轻松查看可以使用本网站的软件包的反向依赖关系,这反映了hackage:

  • http://bifunctor.homelinux.net/~roel/hackage/packages/archive/revdeps-list.html
  • 如果您的应用程序最终会执行严格的循环,就像处理许多请求的Web服务器一样,懒惰可能会成为空间泄漏形式的问题。 通常这是在正确的地方添加严格标注的问题。 分析,经验和阅读核心是我所知道的打击这类事情的主要技术。 我所知道的最好的剖析参考是真实世界Haskell的第25章。

    链接地址: http://www.djcxy.com/p/42863.html

    上一篇: What are the best Haskell libraries to operationalize a program?

    下一篇: What is an idiomatic way of representing enums in Go?