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を出しています。
調査やパフォーマンスの把握はしやすくなり、開発効率の向上の一助になること間違いなしです。
ぜひ使ってみてください。