koudenpaのブログ

趣味のブログです。職業柄IT関連の記事が多いと思います。

.NET で動くアプリケーションを Mackerel で監視できるかな?

Mackerel Advent Calendar 2018 - Qiita の2日目の記事は以下のようなものでした。

qiita.com

かっこいい。Javaうらやましい。.NET向けに同様な物はないかな? とググったところ App Metrics というメトリック収集ライブラリがありました。

公式には GrafanaCloud, Prometheus, Elasticsearch, Graphite などがサポートされているようです。

サードパーティDatadog向けのフォーマッター もありました。

「こいつは面白そうだ」ということで、Mackerelにもメトリクスをレポートしてみました。

成果物

先人のようにパッケージ化や独立したリポジトリになっていないお試し中ですが、まだフォーマットなどを整理できていないので、後は未来の自分や他の方に任せます。

github.com

Mackerel向けのメトリクスレポーターとそれを試すためのASP.NET Coreアプリケーション、お試し用のメトリクス収集処理を公式のプロジェクトからコピーしてフィッティングしたものが入っています。

収集の仕込みと結果

公式に任意のHTTPリクエストでのレポーターが用意されているのですが、認証情報をヘッダに仕込むのが少し面倒くさかったので、その辺りをMackerel向けのレポーターとしてラップ、以下の様な形でレポートできるようにしました。

string mackerelApiKey = Configuration.GetValue<string>("Mackerel:ApiKey");
string mackerelHostId = Configuration.GetValue<string>("Mackerel:HostId");
var filter = new MetricsFilter();
var metrics = AppMetrics.CreateDefaultBuilder()
    .Report.ToMackerel(
        options =>
        {
            options.ApiKey = mackerelApiKey;
            options.HostId = mackerelHostId;

            options.HttpOptions.HttpPolicy.BackoffPeriod = TimeSpan.FromSeconds(30);
            options.HttpOptions.HttpPolicy.FailuresBeforeBackoff = 3;
            options.HttpOptions.HttpPolicy.Timeout = TimeSpan.FromSeconds(10);
            options.HttpOptions.Filter = filter;
            options.HttpOptions.FlushInterval = TimeSpan.FromSeconds(60);
        })
    .Build();

オプションの設定はいい加減なものですが FlushInterval が実際にレポートのリクエストを行う間隔なので、Mackerelの場合はそのメトリックの粒度である 60秒 以上を指定します。

f:id:koudenpa:20181209152700p:plain
収集したホストメトリック(メトリック形式のサンプルを全部収集しているのでメトリック数がすごいことになっている)

なんか収集できているので、初期目標は達成したと言えるかと思います。

感想

App Metrics自体が発展途上のプロジェクトな感じですが、定期的に任意のメトリックを収集して、任意の場所にレポートする、ということはしっかりできるので、.NETのアプリケーション固有のメトリック収集にはなかなか使い出がありそうでした。

レポート先としてのMackerelは見やすくてよいので、もう少し作りこんでレポーターをパッケージ化、自前のアプリに仕込んでみようかなぁ、という気になっています。

追記

一応この記事も Mackerel Advent Calendar 2018 - Qiita 10日目の記事でした。

前日は attakei - Qiita さんの Mackerelプラグイン vs WHOIS情報 - Qiita 次は id:nabeop さんの mackerel-agent-plugins に PR を送った話 - nabeo がピーしているブログ (仮) でした!