Mackerel Advent Calendar 2018 - Qiita の2日目の記事は以下のようなものでした。
かっこいい。Javaうらやましい。.NET向けに同様な物はないかな? とググったところ App Metrics というメトリック収集ライブラリがありました。
公式には GrafanaCloud, Prometheus, Elasticsearch, Graphite などがサポートされているようです。
サードパーティで Datadog向けのフォーマッター もありました。
「こいつは面白そうだ」ということで、Mackerelにもメトリクスをレポートしてみました。
成果物
先人のようにパッケージ化や独立したリポジトリになっていないお試し中ですが、まだフォーマットなどを整理できていないので、後は未来の自分や他の方に任せます。
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秒 以上を指定します。
なんか収集できているので、初期目標は達成したと言えるかと思います。
感想
App Metrics自体が発展途上のプロジェクトな感じですが、定期的に任意のメトリックを収集して、任意の場所にレポートする、ということはしっかりできるので、.NETのアプリケーション固有のメトリック収集にはなかなか使い出がありそうでした。
レポート先としてのMackerelは見やすくてよいので、もう少し作りこんでレポーターをパッケージ化、自前のアプリに仕込んでみようかなぁ、という気になっています。
追記
一応この記事も Mackerel Advent Calendar 2018 - Qiita 10日目の記事でした。
前日は attakei - Qiita さんの Mackerelプラグイン vs WHOIS情報 - Qiita 次は id:nabeop さんの mackerel-agent-plugins に PR を送った話 - nabeo がピーしているブログ (仮) でした!