こんにちは、SCSKの嶋谷です。
前回私の部署の先輩である谷さんがMackerelを使用してAWSのサーバレスサービスを監視する方法と結果についての記事を掲載しました。
ご覧になっていない方は是非ご覧ください。
Mackerel で AWS のサーバーレスサービスを監視してみた – TechHarmony
話は変わりますが、私が前回投稿した記事の中で紹介しているDify環境は複数のコンテナから構築されてます
(Mackerel で Docker を監視してみた – TechHarmony)。この環境全体の処理の流れや遅延原因を従来のサーバ監視で実現することは不可能です。近年では、このようなマイクロサービスを監視するためにオブザーバビリティフレームワークであるOpenTelemetryが注目を集めています。OpenTelemetryを使用すればDify環境の詳細な処理の流れや遅延場所の特定ができると思い、検証したいと思いました!
Dify環境のデータをOpenTelemetryで収集するためには、OpenTelemetryの設定をDify環境のプログラムに書き加える必要があります。この処理を1から実装するのは大変だと思いました。そこで今回は、手始めに公開されているデモ環境でデータを収集して、Mackerelで可視化してみました。
OpenTelemetryとは
OpenTelemetryとは、システムやサービスの状態を詳細に把握するために必要となるテレメトリーデータ(ログ・トレース・メトリクス)を生成・収集・送信するためのソフトウェアです。CNCF(Cloud Native Computing Foundation)のOpenTracingプロジェクトとOpenCensusプロジェクトが統合されて誕生したプロジェクトによって開発されたソフトウェアです。詳細は以下をご参照ください。
Cloud Native Computing Foundation
近年クラウドネイティブ等の普及により、アプリケーションをそれぞれ異なるコンテナやサーバで構築するシステムが一般的になっています(マイクロサービス)。その結果、情報が分散されシステム全体の状態を把握しづらくなり、迅速なトラブルシューティングが困難となっています。システム全体の状態を把握するためにはテレメトリーデータの収集が必要不可欠です。
旧来はテレメトリーデータは標準化されておらず、ベンダーによってフォーマットや取得方法などが異なっていました(ベンダー依存)。近年、テレメトリーデータのフォーマット・取得方法などを標準化しようとする動きが活発化しています。OpenTelemetryでは、ベンダー依存することなくテレメトリーデータを収集することができます。さまざまなプログラミング言語に対応可能なAPIやSDKが公開されており、システム構築の際に使用する言語を気にする必要はありません。
詳細については、以下をご参照ください。
MackerelとOpenTelemetryを連携している記事が数少ないため、実際に実装して記事を書いてみました。
今回の記事ではOpenTelemetryでデータを収集するための「デモ(マイクロサービス)環境の構築」と「Mackerelでデータの可視化」の2部構成になっています。
1.デモ(マイクロサービス)環境の構築
まずはデモ(マイクロサービス)環境の構築について説明します。
監視対象について
OpenTelemetryの公式サイトにデモ環境が公開されているため、こちらを今回の監視対象としました。具体的には、模擬のECサイトでの操作(商品閲覧・購入・会計など)からテレメトリーデータを収集しています。デモ環境の詳細は以下をご参照ください。
今回はAWSのEC2上にデモ環境を構築しました。構成図は以下の通りです。
デモ環境の構築
- Githubからデモ環境のレポジトリをクローン
git clone https://github.com/open-telemetry/opentelemetry-demo.git
- レポジトリをクローンしたディレクトリに移動
cd opentelemetry-demo
- docker composeコマンドで環境を作成
docker compose up --force-recreate --remove-orphans --detach
- 起動確認
各サービスごとのコンテナが作成され、起動できていることを確認しました。
- ECサイトへのアクセス
4の手順でコンテナが作成され起動できていることを確認したため、実際にアプリケーションが動作していることを確認します。ドキュメントでは、ECサイトに「http://localhost:8080」でアクセスすると記載されています。私はEC2上に環境を構築しているため、同じサブネットに配置した別のEC2からデモ環境が構築されているEC2のプライベートIPアドレスでアクセス(http://プライベートIP:8080)しました。上記の図のように、初期画面から商品を選択して購入するなどの一般的なECサイトを模倣した操作を行うことが可能となっています。
2.Mackerelへのデータ送信・可視化
前章で構築したECサイトを操作することでテレメトリーデータが生成されます。生成されたテレメトリーデータをMackerelに送信して可視化してみます。今回はトレースデータの可視化について説明します。
トレースデータとは分散システムにおけるリクエストの処理経路を表すデータです。詳細については下記サイトが参考になります。
トレースデータとは何か – その重要性を理解する
デモ環境での設定
OpenTelemetryで収集したデータをMackerelに送信するにはデモ環境の設定ファイルでデータの送信先(エンドポイント)にMackerelを設定する必要があります。手順は以下の通りです。
- デモ環境のsrc/otel-collectorの設定ファイル(otelcol-config.yml)に以下を追記
exporters: #途中省略 otlphttp/vaxila: endpoint: "https://otlp-vaxila.mackerelio.com" headers: Accept: "*/*" "Mackerel-Api-Key": ${env:MACKEREL_APIKEY}
- デモ環境直下の設定ファイル(docker-compose.yml)に以下を追記
>otel-collector: #途中省略 enviroment: #途中省略 - MACKEREL_APIKEY=xxxxxxxxxxxxxxxxxxxxxxxxx
この処理がとても重要です。当初は手順1のMACKEREL_APIKEYに直接APIキーを入力していました。この設定時に、APIキーを正しく設定していたのですが、APIキーが無効であるエラーに直面しました。デモ環境はdocker上で動作しており、docker composeコマンドで起動しているため設定ファイル(docker-compose.yml)に環境変数(APIキー)を記述しないと正しく動作しません。私のdocker composeコマンドの理解不足でこの問題を解決するのにとても苦労しました。
- 環境を再作成
docker compose up --force-recreate --remove-orphans --detach
Mackerel上でデータの閲覧
デモ環境での設定が完了すると、Mackerelの画面上でデータを可視化することができます。手順は以下の通りです。
- Mackerelのサイドメニューのトレースをクリック
クリックするとMackerelの画面がトレースを閲覧する画面に遷移します。
- トレース閲覧
トレース閲覧画面では、アプリケーションのサービスごとにトレースを閲覧することができます。
トレース一覧で閲覧したいサービスを選択してデータを可視化します。今回はcheckout(会計)サービスのデータを可視化してみました。
上記の図のようにデータはレイテンシーの分布として表示されています。グラフは横軸が時間で縦軸がレイテンシーとなっており、トレースをヒートマップで表示しています。時間帯・レイテンシーにおけるトレースの総数を可視化することができました!
- トレース詳細を閲覧
トレース閲覧画面の下部にはトレースの一覧が表示されています。閲覧したいトレースの行をクリックすることでトレースの詳細を閲覧することができます。
トレースデータはスパン(APIコールやストレージアクセスなどのさまざまなアクション)の集合体であるため 1つのトレースにさまざまな処理が含まれています。トレースの閲覧画面ではサービス毎にスパンが色分けされています。スパンの右端にはレイテンシが記載されており、どの処理に時間を要しているかを確認できます。1つのトレースデータを閲覧するだけでも各サービス間の連携や通信方法などさまざまな情報を理解することができます。 - スパンの詳細を閲覧
トレースの詳細画面で1つのスパンをクリックすることでスパンの詳細を閲覧することができます。
スパンの詳細からトレース・スパンのID、開始・終了時刻、ホストOSの情報やサービスで使用されているプログラミング言語など多くの情報を知ることができます。今回はLinux環境でデモ環境を構築したため、OS情報はLinuxが表示されています。今後はWindowとLinuxで表示内容にどのような差があるのかも調査していきたいです。
トレース画面からサービスの処理数(トレース数)や流れ、各処理の詳細を知ることができるためシステム全体を理解することが容易になるのではないかと感じました。また今後は複数の監視サービスとの違いなども調査してみたいと思います。
おわりに
OpenTelemetryで取得したデータをMackerelで可視化することができました。デモ環境の構築・Mackerelとの連携ともに詰まった点はありましたが、なんとか解決できたので自分自身の技術力が少し向上した気がしています。
1月~3月までMackerelに関するブログを投稿してきましたが、皆さんも少しMackerelに興味を持ったのではないでしょうか。2週間のトライアルなどもありますので、是非実際に触れてみてほしいと思います。
最後までお付き合いいただきありがとうございました。