1. ホーム
  2. logging

[解決済み] プログラムの運用に最適なHaskellのライブラリは?[クローズド]

2022-09-05 08:30:27

質問

もし私がプログラムを本番稼動させるなら、そのプログラムを「運用可能なもの」と見なすために、いくつかの事柄が必要です。私の目的では、運用可能なプログラムは以下のものでなければなりません。

  • 複数のレベル (例: デバッグ、警告など) でログを記録することができる。
  • プログラムが行っている作業の種類と、その作業にかかる時間についてのメトリクス/統計を収集し、共有できること。収集したメトリクスは、次のような一般的に使用されている監視ツールと互換性のあるフォーマットで利用できることが理想的です。 ガングリオ のような一般的に使用される監視ツールと互換性があるか、またはそうすることができる形式で利用可能であることが理想的です。
  • 設定可能であること。理想的には、実行中のプログラムの設定されたプロパティを、そのプログラムを再起動することなく更新できるシステムを介すること。
  • 繰り返し可能な方法でリモート サーバーに配備可能であること。

Scalaの世界では、少なくとも最初の3つの要件に対処するための良いライブラリがあります。例を挙げます。

デプロイに関しては、Scalaの世界では、自分のプログラムを構成するバイトコードとライブラリを、以下のような形でバンドルすることが一つの方法です。 アセンブリ-sbt のようなツールでリモートサーバーにプッシュします。 Capistrano のような SSH 経由でコマンドを並列実行するツールを使ってリモート サーバーにプッシュします。これは言語固有のツールが必要な問題ではありませんが、Haskell コミュニティにそのようなツールが存在するかどうかは気になるところです。

私が上で説明したような特徴を提供する Haskell ライブラリはおそらくあります。つまり、最も成熟し、よくメンテナンスされ、Haskell コミュニティで一般的に使用され、Haskell のベスト プラクティスの模範となっているものです。

Haskell コードを "production-ready" にするための他のライブラリ、ツール、またはプラクティスがあれば、それらについてもぜひ知っておきたいと思います。

どのように解決するのですか?

これは素晴らしい質問ですね。最初の切り口はこちらです。

複数のレベル(例:デバッグ、警告など)でログを取れるようにする。

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統計情報を対話的に見ることができますが、現在のところそれは超簡単ではありません("rts/Stats.h"インタフェースへのFFIバインディングが必要です)。プロセスへのアタッチには ThreadScope で、GCとスレッドの挙動を監視します。

同様のフラグは、インクリメンタル、ロギング 時間 スペース のプロファイリングで、モニタリングに使用することができます(例えば、これらの グラフ はインクリメンタルに構築することができます)。

hpc は、プログラムの実行に関する多くの統計情報を、その Tix タイプで、人々は ツールを書きました。 を作成し、どのコードが実行されているかをタイムスライスでログに記録しています。

<ブロッククオート

設定可能であること。理想的には、実行中のプログラムの設定されたプロパティを、そのプログラムを再起動することなく更新できるようなシステムであること。

xmonad スタイルのステートリローディングを行うこともできますし、次のような方法でコードホットスワップを行うこともできます。 plugins * パッケージや hint . この中には、より実験的なものもあります。

再現性のあるデプロイメント

Galoisが最近リリースした cabal-dev をリリースしました。これは、再現可能なビルドを行うためのツールです(すなわち、依存関係がスコープされ、制御されます)。