はじめに
Stackdriver Trace を使ってGAE/FEで動くSpringbootのトレースを試してみたのでまとめます。
ところでStackdriver Traceってなんだっけ?
Stackdriver Trace は、主に Google Cloud Platform 向けの 分散トレース システム です。
アプリからレイテンシデータを収集し、図表にしてくれます。
これを使うことでパフォーマンスのボトルネックになっている箇所の確認や、
アプリ更新前後のパフォーマンス変化の確認などが容易になります。
導入する意義や用語についてもう少し詳しくは Stackdriver Traceの公式 に書いてあります。
Stackdriver Traceを使う
Stackdriver Traceを使うためには、計測対象がレイテンシを送信する必要があります。
逆に言うと取り合えずこれだけやってあげればOKです。
タイトルに記載の構成の場合、Spring Cloud GCP の Spring Cloud Sleuth ほかをpomに追記すれば
自動でStackdriver Trace宛にレイテンシを送信してくれます。 (これになかなか気付かなかった・・)
この具体的なセットアップ手順について参考になるのは こちらのチュートリアル です。
Spring Cloud Sleuth のリファレンスはこちら。
Spring Cloud Sleuthのオプション
オプションはこちら に記載されています。
主なところを抜粋すると次の通り。
spring.cloud.gcp.trace.enabled=true # トレースするか否か
spring.sleuth.sampler.probability=1 # リクエストの何割をトレースするか (0.0~1.0)
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*) # トレースから除外するURL
試してみる
そんなわけでチュートリアルをお手本に試してみました。
前提は次のような感じ。
試してみる前提
- レイテンシ収集対象はGAE/FE上のSpringbootのWebアプリ。
- レイテンシ収集は本番稼働している時のみ行います。
- 収集するか否かはactive profileで切り替えます。 本番profileを prod にしました。
事前準備
まず下記が無ければ用意します。
- JDK
- Maven
- 適当なGCPプロジェクト
- Cloud SDK
- 適当なSpringbootサンプルソース
Cloud SDKは 使用するアカウントとプロジェクトを指定してログイン しておきます。
また適当なSpringbootサンプルソースは上記リンク先にあげました。
Stackdriver Trace APIを有効にする
ウェブUIの APIとサービス でStackdriver Trace APIを探し、無効であれば有効にします。
適当なSpringbootサンプルソースを用意する
適当なサンプルを GitHubにあげました。
以下サンプルの補足です。
サンプル画面
ソースは こちらです 。
ダミーの待ち時間を入れている他は特に何もしていません。
pom.xml
ソースは こちらです 。
下記コマンドで雛形を作り、spring-cloud-gcp-starter-trace
を追加しています。
> curl https://start.spring.io/starter.tgz -d packaging=jar -d dependencies=web,cloud-gcp --output springboot-trace.tgz
またGAEにデプロイするため appengine-maven-plugin
も追加しています。
application.yml
ローカルはトレースせず、本番はすべてトレースするよう指定しました。
ソースは次の通り。
application.yml
application-prod.yml
app.yaml
app.yaml では特別な対応はしていません。
素のアプリと比較して修正した箇所まとめ
トレース対応で手を入れた箇所は次の二箇所です。
ファイル | 補足 |
---|---|
pom.xml | 依存関係追記 |
application(-prod).yml | トレース向けオプションを指定 |
デプロイ
appengine-maven-plugin を入れたので次のコマンドでデプロイします。
> mvn appengine:deploy
動作テスト
デプロイが終わったら該当のURLを適当に叩き、少し待ってから
Stackdriverトレースのトレースタブを見てみると次のような感じに。
APIのレイテンシはわかった。 内訳をもっと細かく見たい。
最初のテストではAPI全体のレイテンシが見れました。
今度はAPI内の任意の範囲のレイテンシを確認してみます。
これは brave.Span で任意の範囲を指定することで出来ます。
サンプルソースは こちら 通り。
上記のほか アノテーションでも指定 出来るっぽいけど、まだいまいちわかってない・・
複数サービスを串刺しでトレースしたい
分散トレーシングが本来の力を発揮するのはこの用途です。
リファレンスのここ に従い RestTemplate
のbeanを作成して他サービスの呼出に使用します。
サンプルソースは こちら と こちら 。
本サンプルでは /c から /c2 を呼び出しています。
トレース結果は次の通り。
以上です。