Cloud Traceを使ってGKE上で動いているモノリシックなRailsアプリのパフォーマンスを分析する
Cloud TraceはGCPが提供するマネージドな分散トレースシステムです。
Cloud Traceはマイクロサービスのような分散アーキテクチャで便利に使えるものですが、もちろんモノリシックなアプリケーションでも十分に使う価値があるサービスです。
どのように設定しているか自分の例も交えて紹介できればと思います。
GKEの設定
私達のアプリではWorkload Identityを利用して、KubernetesサービスアカウントとGCPサービスアカウントを紐付けています。
Railsアプリを動かすためのサービスアカウントに Cloud Trace エージェントのroleを含めてください。
Railsの設定
gemの追加
google-cloud-trace
または stackdriver
をinstallしてください。
これらのgemのインストールにはgrpc gemをビルドできる環境が必要です。
glibcが入っているOSであれば問題ないですが、alpineを使っているとビルドできない可能性があるのでご注意ください。
google-cloud-trace
gemを使った場合は config/application.rb
で require "google/cloud/trace/rails"
をしてください。
stackdriver
gemを入れると、google-cloud-trace
gemも合わせてインストールされます。
また、stackdriver
gemは、require "google/cloud/trace/rails"
のrequireが自動で行います。(Railsで Bundler.require
の部分を削除していない限り)
便利なので自分は stackdriver
gemを使っています。
RailsでのCloud Traceの設定
RAILS_ENVが production
の場合であれば、gemをinstallさえすればもCloud Traceにデータが送信されます。
止める場合は下記でできます。
Google::Cloud.configure.use_trace = false
or
# config/environments/production.rbとかで config.google_cloud.use_trace = false
google-cloud-trace
はActive SupportのInstrumentationと連携したトレーススパンを出してくれます。
デフォルトだと、下記5つが設定されています。
"sql.active_record", "render_template.action_view", "send_file.action_controller", "send_data.action_controller", "deliver.action_mailer"
なので、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
実際の例
検証環境での例ですが、こんな感じです。
こんな感じでspanを出しています。
調査やパフォーマンスの把握はしやすくなり、開発効率の向上の一助になること間違いなしです。
ぜひ使ってみてください。