こんにちは、虎の穴ラボのA.M.です。 今回は、Google Cloud Platform(以降、GCP)の機能である「Cloud Trace」を使ってみましたので、その紹介をしたいと思います。
目次
前提
開発環境:
- MacOS
- 開発言語: ruby 3.0.5
- フレームワーク: Ruby on Rails 6.1.7.3
- 実行環境: ローカル(Docker)
- 使用するライブラリ:
stackdriver
Rubyは OpenTelemetry が推奨されていますが、今回は手っ取り早く動作を確認したいので、stackdriver
を使用します。
Cloud Trace とは
Cloud Traceとは、アプリケーションのパフォーマンスを監視し、ボトルネックを検出するためのGCPのサービスです。主に以下の機能があります。
- トレース収集:アプリケーションが行う各リクエストの経路をトラッキングし、それらのトレースデータを収集します。
- パフォーマンス分析情報:各エンドポイントのトレース結果を自動的に評価し、パフォーマンスのボトルネックを検出します。
- 自動分析:トレース対象のアプリケーションごとに、日々のパフォーマンスレポートが自動的に作成されます。必要に応じて、任意のカスタムレポートも作成することができます。
- レイテンシの変化の検出:アプリケーションのパフォーマンスレポートを時系列で評価し、アプリケーションのレイテンシの悪化を特定します。
また、App Engine スタンダード、Cloud Functions、Cloud Run でアプリケーションを実行している場合は、自動的にトレースされるので、特に設定することなく利用できます。
対応言語
公式のライブラリだけでなく、OpenTelemetryもサポートしているので、以下の開発言語で利用可能です。
- C#
- Go
- Java
- Node.js
- PHP
- Python
- Ruby
各言語ごとの推奨ライブラリなどについては、公式ドキュメントをご参照ください。
Cloud Trace 用の計測 | Google Cloud
設定方法
サービスアカウントの作成
今回のように、Cloud TraceをGCP上の環境以外で使うには、サービスアカウントを作成する必要があります。 サービスアカウントの作成方法については、公式ドキュメントを参照してください。
サービス アカウントを作成する | IAM のドキュメント | Google Cloud
サービスアカウントを作成したら、JSON形式のキーを作成してダウンロードしておきます。
ライブラリのインストール
Cloud Traceを使うには、まずCloud Trace ライブラリをインストールする必要があります。
Gemfileに以下の記述を追加し、bundle install
を実行します。
gem "stackdriver"
なお、Docker環境でAlpine Linuxを使用している場合、以下のようなエラーが出てRailsがクラッシュすることがあります。
/var/www/app/vendor/bundle/ruby/3.0.0/gems/grpc-1.58.0-x86_64-linux/src/ruby/lib/grpc/generic/client_stub.rb:49: [BUG] Segmentation fault at 0x00000000000941e6 (省略)
gemのバグのようなので、以下のように発生しないバージョンを指定すれば回避できます。
gem "grpc", "1.56.2"
環境変数の追加
以下の環境変数を追加します。
export GOOGLE_CLOUD_PROJECT=your-project-id export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json
ローカル環境でトレースを有効にする
ローカル環境でトレースを有効にするには、以下のようにします。
# Add this to config/environments/development.rb Rails.application.configure do |config| config.google_cloud.use_trace = true end
以上で設定完了です。 ローカル環境でアプリケーションを起動して動かしてみると、Cloud Traceにトレースデータが送信されます。
bundle exec rails s
Traceの確認方法
Trace エクスプローラ
GCPのコンソールからTrace エクスプローラを開きます。
https://console.cloud.google.com/traces/list?hl=ja
以下のように、水色の点が表示されていれば、トレースデータが正しく送信されています。
青い点がトレースなので、任意のトレースをクリックすると、トレースの詳細が表示されます。
sql.active_record
を選択すると、実行されているSQLが確認できます。
render_template.action_view
を選択すると、表示している画面のテンプレートファイルが確認できます。
パフォーマンスが悪いクエリが場合は、以下のように視覚的にも分かりやすいですね。
分析レポート
GCPのコンソールから分析レポートを開きます。
https://console.cloud.google.com/traces/tasks?hl=ja
以下のように、日次レポートが自動で作成されています。 比較期間でレイテンシに大きな変化があった場合は、レイテンシのシフトに「大きな変化」と表示されます。
レポートの詳細を表示すると、分布グラフやレイテンシの増加率等も確認できます。
また、今回は使っていませんが、カスタムレポートの作成もできます。
費用について
Cloud Traceの費用は以下の通りです。
機能 | 料金 | 毎月の無料割り当て量 |
---|---|---|
Traceの取り込み | 100万スパンごとに $0.20 | 最初の250万スパン |
補足:
- トレース: システム内の一連の関連する操作のパスを追跡したもの。(≒リクエスト)
- スパン: トレース内の单一の操作。スパンは親子関係を持つことができ、処理の階層構造を形成します。前項目で紹介している
sql.active_record
やrender_template.action_view
などがスパンにあたります。 - App Engine スタンダード、Cloud Functions、Cloud Run で自動生成されるスパンは課金対象外です。
参考: https://cloud.google.com/trace/pricing?hl=ja
毎月250万スパンまでは無料で利用できるので、余程の大規模なサービスでない限り、無料で利用できると思います。
仮に、以下のような条件で利用したとした場合でも、月額140円程度で利用できます。
- アクティブユーザー数: 100人/時間(平均)
- 1日の稼働時間: 24時間
- アクティブユーザー1人あたりの表示画面数: 10画面
- 1画面(≒トレース)当たりのスパン数: 10スパン
1ヶ月あたりのスパン数:
100人 * 10画面/人 * 10スパン/画面 * 24時間 * 30日 = 720万スパン
1ヶ月あたりの費用:
(720万スパン - 250万スパン) / 100万スパン * $0.20 = $0.94/月 ≒ 140円/月
導入する際の注意事項
大規模なサービスに導入する場合、トレースデータの送信によって、サービスのパフォーマンスが低下する可能性があるので、事前に検証を行うことをおすすめします。
パフォーマンスが低下する場合は、トレースデータのサンプリングレートを調整することで、トレースデータの送信量を減らすことができます。
まとめ
Cloud Traceを使うと、アプリケーションのパフォーマンスや、ボトルネックが視覚的に見えるので、とても便利です。 設定も比較的簡単で、特にGCP上でアプリケーションを実行している場合はgemをインストールするだけで使えるので、ぜひ使ってみてください。
採用情報
虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
yumenosora.co.jp