コンテンツにスキップ

テレメトリー収集ツール@可観測性

はじめに

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


01. テレメトリー収集ツールの比較

メトリクスの場合

▼ 種類

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

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

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

()内では、各ツールのコンポーネント名を表す。

アクション AWS CloudWatch Datadog Istio
(連携しない状態)
Istio
(ビルトインPrometheusと連携した状態)
OpenTelemetry Prometheus
メトリクスのデータポイントの作成
(cloudwatchエージェント)

(datadogエージェント)

(Envoyによるリクエスト系メトリクスの作成)

(Envoyによるリクエスト系メトリクスの作成)

(クライアントパッケージ)

(Exporter)
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
メトリクスのデータポイントを収集
(プル型またはプッシュ型)

(cloudwatchエージェント)

(datadogエージェント)

(Istiodコントロールプレーンによる収集)

(Istiodコントロールプレーンによる収集)

(OpenTelemetry Collector)

(Exporter)
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
ビルトインローカルストレージへの保管
(AWS CloudWatchメトリクス)
- - - -
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
監視バックエンドとして可視化
(AWS CloudWatchメトリクス)
-
(Istiodコントロールプレーンを経由したprometheusサーバーによる収集)
-
(prometheusサーバー)
分析
(AWS CloudWatchメトリクス)
- - - -
レポートの作成
(AWS CloudWatch Contributor Insights)
- - - -
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
アラートの作成
(AWS CloudWatchアラーム)
-
(prometheusサーバー)
-
(prometheusサーバー)

▼ 組み合わせの例

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


ログの場合

▼ 種類

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

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

()内では、各ツールのコンポーネント名を表す。

アクション AWS CloudWatch Elasticsearch Fluentd
Fluentbit
Grafana Loki Istio
(連携しない状態)
Istio
(ビルトインOpenTelemetryと連携した状態)
OpenTelemetry
実行ログの作成 - - - - - - -
アクセスログの作成 - - - -
(Envoyによるアクセスログ作成)

(Envoyによるアクセスログ作成)
-
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
ログの収集
(いずれもプッシュ型による送信方式)

(cloudwatchエージェント)

(Logstach)

(Promtail)
-
(EnvoyからOpenTelemetry Collectorへの送信)

(OpenTelemetry Collector)
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
ビルトインローカルストレージへの保管
(AWS CloudWatchログ)
- -
(BoltDB)
- - -
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ - ⬇︎
監視バックエンドとして可視化
(AWS CloudWatchログ)
- - - - -
分析
(AWS CloudWatchメトリクスのログメトリクス)
- - - - -
レポートの作成
(AWS CloudWatch Contributor Insights)
- - - - - -
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
アラートの作成
(AWS CloudWatchアラーム)
- - - - - -

▼ 組み合わせの例

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


分散トレースの場合

▼ 種類

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

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

()内では、各ツールのコンポーネント名を表す。

アクション AWS X-Ray Datadog Grafana Tempo 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)
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
ビルトインローカルストレージへの保管 - -
(JaegerのビルトインのApache Cassandra、Elasticsearch)

(Cassandra、Elasticsearch)
- -
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
監視バックエンドとして可視化 - -
分析 - -
レポートの作成 - - - - - - - -
⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎ ⬇︎
アラートの作成 - - - - - - - -

▼ 組み合わせの例

アクション 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ログに要保管)

(ログは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) ミドルウェア/アプリのその他の問題