虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

GCPのCloud Traceでアプリケーションのパフォーマンスを可視化する

こんにちは、虎の穴ラボの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のサービスです。主に以下の機能があります。

  1. トレース収集:アプリケーションが行う各リクエストの経路をトラッキングし、それらのトレースデータを収集します。
  2. パフォーマンス分析情報:各エンドポイントのトレース結果を自動的に評価し、パフォーマンスのボトルネックを検出します。
  3. 自動分析:トレース対象のアプリケーションごとに、日々のパフォーマンスレポートが自動的に作成されます。必要に応じて、任意のカスタムレポートも作成することができます。
  4. レイテンシの変化の検出:アプリケーションのパフォーマンスレポートを時系列で評価し、アプリケーションのレイテンシの悪化を特定します。

また、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_recordrender_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