PrometheusとMetricatによるアプリケーション監視

はじめに

記事では、Prometheusで監視可能なアプリケーションの開発についてお話します。また、開発の便利ツールとして、業務外で自作しているMetricatもご紹介したいと思います。

オブザーバビリティ (可監視性)

オブザーバビリティは、モダンなソフトウェアシステムに欠かせない特徴の一つとなっています。これを実現する上で重要なのがモニタリング、トレース、ロギングの三つです。その中でモニタリングは、メンテや障害対応に関する判断材料を得るために、システムの様々なメトリクスをリアルタイムで確認したり、過去データを振り返ったりすることを指します。
モニタリング用のプラットフォームは多数ありますが、監視方法はPush型とPull型に分けられます。Push型の場合、監視対象となるアプリケーション側でメトリクスを渡すタイミングを設定します。そして、監視システム側がメトリクスを受け取り、記録していきます。一方、Pull型の場合、アプリケーション側は単にエンドポイントを公開しているだけなので、監視システムからリクエストを送り、都度、一連のメトリクスを指定フォーマットで受け取ります。

私のチームではPull型の監視システムを使っており、メトリクスの収集・可視化にはPrometheusとGrafanaのスタックを活用しています。どちらも人気のオープンソースで、以下のような特徴があります。

Prometheus: 独自のビルトイン時系列データベース(TSBD)を提供する監視システム。スケールがしやすく、数千のエンドポイントからメトリクスを収集可能。パワフルなクエリ言語であるPromQLに対応しており、他のシステムと様々な連携ができる。

Grafana: データ可視化用のアプリケーション。Prometheusに対してクエリを実行し、収集したデータを使って見やすいダッシュボードを作成できる。

Prometheusで監視する

PrometheusはPull型のアプローチを採用しており、定期的にスクレイピングするエンドポイントをリストで管理しています。このリストは静的にもできますし、サービスディスカバリ機能で自動的に更新することも可能です。なお、LINEがオープンソースプロジェクトとして開発したPromgenを使うと、ウェブインターフェイス上でPrometheus設定ファイルを生成できるので試してみて下さい。

このエンドポイントリストに従ってPrometheusがメトリクスを収集し、内部の時系列データベースに格納していきます。格納されたメトリクスは、APIで直接クエリを実行したり、Grafanaのダッシュボードで可視化したりできます。

Prometheusを使うメリットの一つは、データベース、イシュートラッカー、ネットワーキングソリューションなど、よく使うシステムに対応したエクスポータが数多く公開されていることです。エクスポータの中にはプラグインとして動くものもあれば、実際の監視対象の隣で実行するものもあります。公式に提供されているエクスポータの一覧は Prometheus公式ドキュメントの「EXPORTERS AND INTEGRATIONS」ページを参照して下さい。私たちのチームではホストに応じてJMXやNGINX、Nodeのエクスポータを使っていますが、システムレベルの問題はこれで十分に調査できます。

Prometheus のデータ出力フォーマット

Prometheusでは、非常に特徴的なデータ出力フォーマットが指定されており、エクスポータの種類にかかわらず、これに従う前提になっています。当初はProtobufベースのバイナリプロトコルに対応していましたが、現在では人間が読めるテキスト形式で返す必要があります。以下は、実行中のホストのメトリクスを公開するnode_exporterによる出力の一部です。

# HELP node_network_receive_bytes_total Network device statistic receive_bytes.
# TYPE node_network_receive_bytes_total counter
node_network_receive_bytes_total{device="awdl0"} 41984
node_network_receive_bytes_total{device="bridge0"} 0
node_network_receive_bytes_total{device="en0"} 1.6107387904e+10
node_network_receive_bytes_total{device="en1"} 0

出力フォーマットの詳細スペックは、Prometheus公式ドキュメントの「EXPOSITION FORMATS」ページを参照して下さい。 

人間が読めるテキスト形式で書かれており、単なるHTTP GETエンドポイント上にメトリクスが出力されるので、メトリクスの現在値のスナップショットを手動で確認するのも簡単です。

アプリケーションのインストルメンテーション

既存のエクスポータも便利ですが、カスタムメトリクスを使った方がアプリケーションの状態やパフォーマンスを把握しやすい場合もあるので、ログ収集と同じように、アプリケーション側にコードを差し込むこと(いわゆるインストルメンテーション) を検討するのもよいと思います。
モダンな言語やフレームワークの多くが既にインストルメンテーションに対応しています。Javaであれば、お勧めのライブラリはMicrometerです。これを使うと、特定の監視システムに依存することなく抽象的な方法でメトリクスを送ることができます。最新のSpring Bootでは、デフォルトでMicrometerがインストルメンテーションライブラリとして使われています。その他のプラットフォームに関してはPrometheus公式ドキュメントの「CLIENT LIBRARIES」ページを参照して下さい。インストルメンテーションライブラリの公式リストが掲載されています。

ローカルで実行中のアプリケーションを監視する

ローカル環境で動いているアプリケーションのメトリクスを確認すると役に立つときがあります。例えば、アプリケーションのメトリクスエクスポータ自体をテストしたいときや、メトリクスさえあれば容易に監視できる機能に取り掛かっているときです。
上にも書いた通り、Prometheusサーバーではスクレイピング対象のエキスポータエンドポイントをリストで管理しています。また、スクレイピング間隔もサーバー設定で定義しています。しかし、Prometheusのセントラルサーバーを使ってローカルマシンのメトリクスをスクレイピングすることは通常できません。

ローカルで実行しているアプリケーションのメトリクスを収集・可視化するためには、以下のような方法をとる必要があります。
まず1つ目は、Prometheusサーバー1台とGrafanaをローカルで起動した上で、指定したアプリケーションのメトリクスをスクレイピングするように設定し、Grafanaのダッシュボードで可視化するやり方です。ただ、スクレイピングを開始するまでの準備が大変なので、本来の目的からすると大掛かりすぎるかなという印象です。
次の方法は、ブラウザから手動でエキスポータエンドポイントにアクセスし、メトリクスのスナップショットを確認するやり方です。直近の値だけ確認すれば十分なことも多いですが、経時的な変化を追いたい場合には、この方法だと不十分かもしれません。特にゲージタイプのメトリクスだと、通常、一連の値を確認することが必要なはずです。
最後に、ツールを利用して特定のエンドポイントからメトリクスを取集・可視化するやり方です。ここで活用できるツールとして、Metricatをご紹介します。

Metricatとは

Metricatはデスクトップアプリケーションで、指定したエンドポイントからのメトリクスを記録・可視化することができます。ローカルだけでなく、リモートのエクスポータからのメトリクスを記録することも可能です。

Metricatは以下のような場面での活用が考えられます。

ローカルで開発・デバッグを行う

Metricatはローカルで動くため、ローカルで実行中のアプリケーションのメトリクスを自由に記録できます。監視可能なアプリケーションを開発、テストする際に役立ちます。

高解像度メトリクスを記録する

Metricatではスクレイピング間隔を自由に設定できます。1秒間隔の収集も可能なので、本番サーバーからのメトリクスも高解像度で記録できます。本番システムに関して、他のツールでは収集間隔をここまで狭めて解像度を上げることはできないので、Grafanaだと確認できないようなメトリクスの変化も補足できるはずです。

スクレイピングしたメトリクスをエクスポートする

Metricatでスクレイピングしたメトリクスは、選択してCSVファイルにエクスポートできます。生成されたファイルを他の可視化ツールやデータ解析ツールに取り込めば、更に詳細な調査も可能です。

Metricat のUI

インストール後にアプリを実行すると、以下の接続画面が表示されます。エクスポータURLと希望のスクレイピング間隔を入力します。

レコーディング開始後に表示されるリストから監視対象の項目を選択して、モニタリングを始めます。

まとめ

ソフトウェア開発界隈では最近、サーバーアプリケーションを監視可能にすることが衛生管理の一部となっています。今回の記事では、監視システムとして特に人気が高い Prometheusを取り上げ、アプリケーションのメトリクスエクスポータをローカルでテストする方法やアプリケーションのデバッグに活用する方法をご紹介しました。

宜しければ、Metricatもここからダウンロードして使ってみて下さい。新機能をいくつか開発中で、まずはエクスポータの履歴を表示できるようにし、クエリ言語への対応も行っていく予定です。