コンテンツにスキップ

監視ツール@可観測性

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. 監視ツールの比較

メトリクスの場合

▼ 種類

メトリクス収集ツールを比較した。

プル型またはプッシュ型でメトリクスのデータポイントを収集するツールに分類できる。

プッシュ型の場合、メトリクスを送信できるエージェントが必要である。

AWS CloudWatchベース Datadogベース Istioベース
連携しない状態
Istioベース
ビルトインPrometheusと連携した状態
OpenTelemetryベース Prometheusベース
メトリクスのデータポイントの作成 cloudwatchエージェント datadogエージェント Envoyによるリクエスト系メトリクスの作成 Envoyによるリクエスト系メトリクスの作成 クライアントパッケージ Exporter
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
メトリクスのデータポイントを収集
プル型またはプッシュ型
cloudwatchエージェント datadogエージェント Istiodコントロールプレーンによる収集 Istiodコントロールプレーンによる収集 OpenTelemetry Collector Exporter
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視バックエンドによるビルトインローカルストレージへの保管 AWS CloudWatch Metrics Datadogダッシュボード - Istiodコントロールプレーンを経由したprometheusサーバーによる収集 - prometheusサーバー
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視フロントエンドによる可視化 AWS CloudWatch Metrics Datadogダッシュボード - Grafanaダッシュボード - Grafanaダッシュボード
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
分析とレポートの作成 AWS CloudWatch Contributor Insights Datadogダッシュボード - - - -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
アラートの作成 AWS CloudWatchアラーム Datadogダッシュボード - prometheusサーバー - prometheusサーバー

▼ 組み合わせの例

AWS CloudWatchベース Datadogベース Istioベース Prometheusベース
メトリクスのデータポイントの作成 AWS CloudWatchエージェント datadogエージェント Exporter
+
Envoyによるリクエスト系メトリクスの作成
Exporter
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
メトリクスのデータポイントを収集
(プル型またはプッシュ型)
AWS CloudWatchエージェント datadogエージェント Exporter
+
Istiodコントロールプレーンによる収集
Exporter
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視バックエンドによるビルトインローカルストレージへの保管 AWS CloudWatch Metrics Datadogダッシュボード prometheusサーバー prometheusサーバー
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視フロントエンドによる可視化 AWS CloudWatch Metrics Datadogダッシュボード Grafanaダッシュボード Grafanaダッシュボード
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
分析とレポートの作成 AWS CloudWatch Metrics Datadogダッシュボード - -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
アラートの作成 AWS CloudWatchアラーム Datadogダッシュボード prometheusサーバー prometheusサーバー


ログの場合

▼ 種類

ログ収集ツールを比較した。

いずれもプッシュ型でログを収集し、ログを監視バックエンドに送信できるエージェントが必要である。

AWS CloudWatchベース Elasticsearchベース Fluentd/Fluentbit
ベース
Grafana Lokiベース Istioベース
(連携しない状態)
Istioベース
(ビルトインOpenTelemetryと連携した状態)
OpenTelemetryベース
実行ログの作成 - - - - - - -
アクセスログの作成 - - - - (Envoyによるアクセスログ作成) (Envoyによるアクセスログ作成) -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
ログの収集
(いずれもプッシュ型による送信方式)
(cloudwatchエージェント) (Logstach) Fluentd/Fluentbit (Grafana Alloy) - (EnvoyからOpenTelemetry Collectorへの送信) (OpenTelemetry Collector)
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視バックエンドによるビルトインローカルストレージへの保管 (AWS CloudWatch Logs) - - (BoltDB) - - -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ - ⬇️
監視フロントエンドによる可視化 (AWS CloudWatch Logsダッシュボード) Elasticsearchダッシュボード - - - - -
⬇️ ⬇️ ⬇️ ⬇️
分析とレポートの作成 (AWS CloudWatch Contributor Insights) - - - - - -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
アラートの作成 (AWS CloudWatchアラーム) - - - - - -

▼ 組み合わせの例

AWS CloudWatchベース Datadogベース Istioベース Prometheusベース
実行ログの作成 - - - -
アクセスログの作成 - - Envoyによるアクセスログ作成 -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
ログの収集
(いずれもプッシュ型による送信方式)
Fluentd
Fluentbit
Fluentd
Fluentbit
Fluentd
Fluentbit
(OpenTelemetry Collectorでも可)
Grafana Alloy
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視バックエンドによるビルトインローカルストレージへの保管 AWS CloudWatch Logs Datadogダッシュボード Grafana Loki Grafana Loki
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視フロントエンドによる可視化 AWS CloudWatch Logsダッシュボード Datadogダッシュボード Grafanaダッシュボード Grafanaダッシュボード
⬇️ ⬇️ ⬇️ ⬇️
分析とレポートの作成 AWS CloudWatch Logsインサイト Datadogダッシュボード Grafanaダッシュボード Grafanaダッシュボード
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
アラートの作成 AWS CloudWatchアラーム Datadogダッシュボード prometheusサーバー prometheusサーバー


分散トレースの場合

▼ 種類

分散トレース収集ツールを比較した。

いずれもプッシュ型で分散トレースを収集し、分散トレースを監視バックエンドに送信できるエージェントが必要である。

AWS X-Ray Datadog Istio
連携しない状態
Istio
ビルトインJaegerと連携した状態
Jaeger OpenTelemetry Zipkin
トレースIDとスパンIDの作成 x-rayクライアントパッケージ datadogクライアントパッケージ Envoyによる各種IDの作成 Envoyによる各種IDの作成 jaegerエージェント otelクライアントパッケージ -
各種IDのアプリ間の伝播 - - - - - - -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
分散トレースの収集
いずれもプッシュ型による送信方式
x-rayエージェント datadogエージェント - EnvoyからJaeger Collectorへの送信 Jaeger Collector OpenTelemetry Collector zipkin collector
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視バックエンドによるビルトインローカルストレージへの保管 AWS X-Rayダッシュボード Datadogダッシュボード - JaegerのビルトインのApache Cassandra、Elasticsearch Apache Cassandra、Elasticsearch - -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
監視フロントエンドによる可視化 AWS X-Rayダッシュボード Datadogダッシュボード Grafanaダッシュボード -
⬇️ ⬇️ ⬇️
分析とレポートの作成 - - - - - - -
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
アラートの作成 - - - - - - -

▼ 組み合わせの例

Datadogベース Istioベース OpenTelemetryベース
トレースIDとスパンIDの作成 クライアントパッケージ Envoyによる各種IDの作成 クライアントパッケージ
各種IDのアプリ間の伝播 - - -
⬇️ ⬇️ ⬇️ ⬇️
分散トレースの収集
(いずれもプッシュ型による送信方式)
datadogエージェント EnvoyからJaeger Collectorへの送信 OpenTelemtry Collectorへの送信
⬇️ ⬇️ ⬇️ ⬇️
監視バックエンドによるビルトインローカルストレージへの保管 Datadogダッシュボード JaegerのビルトインのApache Cassandra、Elasticsearch -
⬇️ ⬇️ ⬇️ ⬇️
監視フロントエンドによる可視化 Datadogダッシュボード Jaeger Grafana Tempo
⬇️ ⬇️ ⬇️ ⬇️
分析とレポートの作成 Datadogダッシュボード Jaeger Grafana Tempo
⬇️ ⬇️ ⬇️ ⬇️
アラートの作成 - - -


テレメトリー間の紐付け

テレメトリー間の紐付けツールを比較した。

トレースIDとスパンIDを付与したログ、スパンメトリクス、分散トレースの間を紐付けられる。

各種ツールで、テレメトリーを保管しておく場所 (データソース) に制限がある。

アクション AWS CloudWatch Datadog Grafana
ログと分散トレース間の紐付け (ログはAWS CloudWatch Logsに要保管) (ログはDatadogに要保管) (ログの保管ツールの種類に制限あり)
メトリクスと分散トレース間の紐付け (一部の言語のx-rayクライアントパッケージのみ対応) (ログはDatadogに要保管) (ログの保管ツールの種類に制限あり)


02. テレメトリーを利用したデバッグ

前提

マイクロサービスなシステムにおいて、REDメトリクスに問題があったとする。

ここでいうREDメトリクスとは、Rate (秒当たりのリクエスト数)、Errors (リクエストの失敗数)、Duration (レイテンシー)のことである。

この時、可観測性を使用してデバッグしていく。


原因の場所の切り分け

(1) メッシュトポロジー

メッシュトポロジー (例:Kiali) を使用して、いずれのマイクロサービス間の通信がボトルネックになっているのかを見つける。

(2) メトリクス

メトリクス (例:PrometheusとGrafana) を使用して、いずれのコンポーネント (例:Node、Deployment、Pod、コンテナ) がボトルネックになっているのかを見つける。

コンポーネント単位でフィルタリングできるようなメトリクスダッシュボードがあると、原因を特定しやすい。

(3) ログ

ログ (例:Fluentd) を使用して、いずれのマイクロサービスがボトルネックになっているのかを見つける。

ログにレスポンスタイムやエラーメッセージを出力していると、原因を特定しやすい。


原因の種類の切り分け

(4) ハードウェアリソース系メトリクス

ハードウェアリソース系のメトリクスから、いずれのコンポーネント (例:Node、Deployment、Pod、コンテナ) がボトルネックになっているのかを見つける。

ハードウェアリソース系のメトリクスを監視できるようなメトリクスダッシュボードがあると、原因を特定しやすい。

(5) 状態系メトリクス

ステータス系のメトリクスから、いずれのコンポーネント (例:Node、Deployment、Pod、コンテナ) がボトルネックになっているのかを見つける。

(6) ネットワーク系メトリクス

ネットワーク系のメトリクスから、いずれのコンポーネント (例:Node、Deployment、Pod、コンテナ) がボトルネックになっているのかを見つける。


原因の特定

(7) Podのハードウェアリソース不足

(8) Nodeのハードウェアリソース不足

(9) ミドルウェア/アプリケーションのロジックの問題

(10) Nodeの障害

(11) Resource Quotaの問題

(12) Evictionの発生 (Podの予期せぬ退避)

(13) コンテナイメージのPullエラー

(14) Liveness Probeの失敗

(15) ミドルウェア/アプリケーションのその他の問題