CubicLouve

Spring_MTの技術ブログ

Cloud Traceを使ってGKE上で動いているモノリシックなRailsアプリのパフォーマンスを分析する

Cloud TraceはGCPが提供するマネージドな分散トレースシステムです。

cloud.google.com

Cloud Traceはマイクロサービスのような分散アーキテクチャで便利に使えるものですが、もちろんモノリシックなアプリケーションでも十分に使う価値があるサービスです。

どのように設定しているか自分の例も交えて紹介できればと思います。

GKEの設定

私達のアプリではWorkload Identityを利用して、KubernetesサービスアカウントとGCPサービスアカウントを紐付けています。

cloud.google.com

Railsアプリを動かすためのサービスアカウントに Cloud Trace エージェントのroleを含めてください。

cloud.google.com

Railsの設定

gemの追加

google-cloud-trace または stackdriver をinstallしてください。

github.com

github.com

これらのgemのインストールにはgrpc gemをビルドできる環境が必要です。

glibcが入っているOSであれば問題ないですが、alpineを使っているとビルドできない可能性があるのでご注意ください。

google-cloud-trace gemを使った場合は config/application.rbrequire "google/cloud/trace/rails" をしてください。

github.com

stackdriver gemを入れると、google-cloud-trace gemも合わせてインストールされます。

また、stackdriver gemは、require "google/cloud/trace/rails" のrequireが自動で行います。(RailsBundler.require の部分を削除していない限り)

便利なので自分は stackdriver gemを使っています。

RailsでのCloud Traceの設定

RAILS_ENVが production の場合であれば、gemをinstallさえすればもCloud Traceにデータが送信されます。

github.com

止める場合は下記でできます。

Google::Cloud.configure.use_trace = false

or

# config/environments/production.rbとかで
config.google_cloud.use_trace = false

google-cloud-trace はActive SupportのInstrumentationと連携したトレーススパンを出してくれます。

railsguides.jp

デフォルトだと、下記5つが設定されています。

"sql.active_record",
"render_template.action_view",
"send_file.action_controller",
"send_data.action_controller",
"deliver.action_mailer"

github.com

なので、GKE上でRailsアプリを普通に使っていれば、stackdriver gemを入れるだけで本番環境でCloud Traceにデータがでます!

自分の例

デフォルトの設定だけでは不足しているので、いくつかnotificationを追加しています。

config/environments/production.rb にこんな感じで設定しています。

  notifications = [
    "cache_read.active_support",
    "cache_generate.active_support",
    "cache_fetch_hit.active_support",
    "cache_write.active_support",
    "cache_delete.active_support",
    "cache_exist?.active_support",
    "request.faraday",
  ]
  # https://googleapis.dev/ruby/stackdriver/latest/file.INSTRUMENTATION_CONFIGURATION.html
  config.google_cloud.trace.notifications = Google::Cloud::Trace::Railtie::DEFAULT_NOTIFICATIONS + notifications

カスタムスパンの設定

RailsのInstrumentationだけではなくて、自分のアプリ独自のスパンを設定することもできます。

スパンを取得したいところを Google::Cloud::Trace.in_span のブロックで囲むだけで設定できます。

Google::Cloud::Trace.in_span "my_task" do |_span|
  # なんらかの処理

  Google::Cloud::Trace.in_span "my_subtask" do |_subspan|
      # ネストされたspanにも対応
  end
end

実際の例

検証環境での例ですが、こんな感じです。

f:id:Spring_MT:20200709105626p:plain

f:id:Spring_MT:20200709110622p:plain

f:id:Spring_MT:20200709110633p:plain

こんな感じでspanを出しています。

調査やパフォーマンスの把握はしやすくなり、開発効率の向上の一助になること間違いなしです。

ぜひ使ってみてください。