サーバーから収集するパフォーマンス系の情報は3種類あるということをまとめてみました。
勘違い
私は Web 系のアプリケーションエンジニアなのでインフラ系には疎いのですが1この記事の内容もちょっと自信ないです。間違っていたら教えてください・・・、 AWS を触る機会があったので色々調べていました。
その途中で、「サーバーの状態」をグラフでいい感じに表示してくれるらしい、ということで AWS CloudWatch の説明を読んでいたのですが、メトリクスという聞きなれない単語が何回も出てくることに気が付きました。AWS のドキュメントには
メトリクスとは、システムのパフォーマンスに関するデータです
Amazon CloudWatch メトリクスを使用する – Amazon CloudWatch
と書いてあったので、なんとなく「サーバーの状態」をすべて記録してくれるすごいツールなんだなーと思っていたのですがそれは勘違いでした。
「サーバーの状態」は3種類
確かにメトリクスも「サーバーの状態」のデータの一種ではあるのですが、一種という事はほかにもあるという事です。具体的には下記の3種類があります。
- メトリクス
- ログ
- トレーシング
余談ですが、これらの情報を管理すること・管理する製品のことを APM と呼んだりするようです。
メトリクス
メトリクス (Metrics) はサーバーの状態を定量化して記録するタイプの情報です。これもいくつか種類があります。
- ゲージ系: 時間によって増えたり減ったりするもの。CPU 使用率、メモリ使用率など。
- カウント系:回数を計測するもの。アクセス数など。
- サマリー系:発生した時間と計測値を記録するタイプの情報。応答バイト数、応答にかかった時間(レイテンシー)など。
上記は Micrometer の解説記事から分類しました。
これらは横軸を時間としたグラフとして表現できます。時間経過でどのように CPU 使用率が変化したか、1分ごとのアクセス数はどのように変化したか、またはレイテンシーを散布図形式で出力することもできます。
ログ
ログ (Logging) はアプリケーションで何かしらの「イベント」が発生した時にいつ何が起きたかを記録する情報です。
ログはその「イベント」によって記録する項目が変わりますが、一般的には時間とログレベルとメッセージの3つが記録されます。アプリケーションエンジニアとしては、障害発生時の貴重な情報源となるので設計・実装時に結構気を使う部分です。
ログを可視化する場合は表形式となります。開発時は全部読んだりすることもありますが、本番環境においては大量に記録されるので検索で絞り込みながら確認する情報です。
トレーシング
トレーシング (Tracing) は各処理がどういう順で処理されて、それぞれの処理でどれくらいの時間がかかったかを記録する情報です。リクエスト毎にグループ化して記録します。
システムがいくつか分かれている場合、1回のリクエストで複数のシステムを呼び出すことがあると思います。ログやメトリクスではシステム別でしか確認できないのですが、トレーシングは各システムの情報を集約して表示できるので非常に有用なデータとなります。特に、システムをまたいだ情報を収集する場合は分散トレーシングと呼ぶようです。
可視化するとタイムラインチャートになります。
仕組みとしては最初にリクエストを受けたシステムがトレース用の ID を採番し、他のシステムを呼び出すときにその ID を渡すようです。各システムはその ID とシステム内で計測した情報を紐づけてトレース情報集計用のサーバーに送ります。
データが違えば保存先も違う
メトリクスもログもトレースもデータの性質が異なります。性質が異なればデータの形式も変わり、形式が違えば保存先のデータベースも異なるという事になります。
AWS 学びたての時には CloudWatch で全部まとめて管理してくれるのかなと勘違いしていましたが、メトリクスは CloudWatch、ログは CloudWatch Logs、トレーシングは X-ray とそれぞれ別々になっていることが分かりました。OSS で自分で環境を作る場合も同様です。
種類 | AWS | OSS |
---|---|---|
メトリクス | CloudWatch | Prometheus |
ログ | CloudWatch Logs | Elasticsearch, Grafana Loki |
トレーシング | X-ray | Jaeger |
可視化ツール
AWS の場合はグラフ表示のような機能も付いてきますが、上記 OSS の場合はデータ保存が主目的のため、グラフ化のためのツールを別途入れる必要があります。代表的なところでは下記のようなものがあります。
- Grafana
- Kibana
収集方法
これらの情報を収集する方法は軽く調べた感じだと下記の3パターンがあるようです。
- プッシュ型
- プル型
- エージェント型
プッシュ型はアプリケーションから情報を送る形式、プル型はアプリケーションが返却する情報(HTTP など)を収集する形式、エージェント型はアプリケーションサーバーにデータ収集用のプログラムを入れる形式です。
収集方法が3種類あって、収集する情報も3種類あり、それぞれいろいろな製品があるので選択肢は多いです。今回はまとめきれませんでした。。。
ツールごとに仕様もばらばらのようですが、最近は Open Telemetry という標準化プロジェクトが動いています。トレース、メトリクス、ログの3つすべての収集プロトコルを標準化しているようです。
まだプレビュー段階、ドラフト段階の仕様もありますが、トレーシングに関しては去年 1.0 が公開されました。仕様だけではなく実装もたくさん用意されています。現時点では C++, .NET, Erlang/Elixir, Go, Java, JavaScript (Browser / node.js 両方), PHP, Python, Ruby, Rust, Swift の名前があります(一部ベータ版)。
トレーシングは OpenTelemetry, ログやメトリクスはその他のツールで構成するのがよさそうです。