分散トレースは、多層マイクロサービス アーキテクチャの分析情報とオブザーバビリティを取得するために重要です。サービス A からサービス B、サービス C へとサービス間の呼び出しが連鎖している場合、呼び出しが成功したかどうかと、各ステップでのレイテンシを把握することが重要です。
Spring Boot では、Spring Cloud Sleuth を使用して、分散トレース計測をアプリケーションにシームレスに追加できます。デフォルトでは、トレースデータを Zipkin に転送できます。
Google Cloud Platform には Stackdriver Trace があります。これは、独自の Zipkin インスタンスやストレージを管理することなく、トレースデータを保存できるマネージド サービスです。Stackdriver Trace では、レイテンシ分布レポートを生成し、パフォーマンスの回帰を自動的に検出することもできます。
Spring Boot アプリケーションから Stackdriver Trace を使用するには、次の 2 つの方法があります。
- Stackdriver Trace Zipkin プロキシを使用し、このプロキシを Zipkin エンドポイントとして使用するように Spring Cloud Sleuth を構成します。
- または、Spring Cloud Sleuth とシームレスに統合し、トレースデータを Stackdriver Trace に直接転送する Spring Cloud GCP Trace を使用します。
この Codelab では、新しい Spring Boot アプリケーションを構築し、分散トレースに Spring Cloud GCP Trace を使用する方法を学びます。
学習内容
- Spring Boot Java アプリケーションを作成して Stackdriver Trace を構成する方法。
必要なもの
- Google Cloud Platform プロジェクト
- Chrome や Firefox などのブラウザ
- Linux の標準的なテキスト エディタ(vim、emacs、nano など)を使い慣れていること
このチュートリアルをどのように使用されますか?
HTML/CSS ウェブアプリの作成経験についてお答えください。
Google Cloud Platform サービスのご利用経験についてどのように評価されますか?
セルフペース型の環境設定
Google アカウント(Gmail または Google Apps)をお持ちでない場合は、1 つ作成する必要があります。Google Cloud Platform のコンソール(console.cloud.google.com)にログインし、新しいプロジェクトを作成します。
プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID
と呼びます。
次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。
この Codelab の操作をすべて行っても、費用は数ドル程度です。ただし、その他のリソースを使いたい場合や、実行したままにしておきたいステップがある場合は、追加コストがかかる可能性があります(このドキュメントの最後にある「クリーンアップ」セクションをご覧ください)。
Google Cloud Platform の新規ユーザーは、300 ドル分の無料トライアルをご利用いただけます。
Google Cloud Shell
Google Cloud と Kubernetes はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud Shell の有効化
GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。
[Cloud Shell の起動] をクリックします。
プロビジョニングと環境への接続にはそれほど時間はかかりません。
この仮想マシンには、必要な開発ツールがすべて準備されています。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワーク パフォーマンスが充実しており認証もスムーズです。このラボでの作業のほとんどは、ブラウザまたは Google Chromebook から実行できます。
Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の PROJECT_ID が設定されています。
Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list
コマンド出力
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
コマンド出力
[core] project = <PROJECT_ID>
上記のようになっていない場合は、次のコマンドで設定できます。
gcloud config set project <PROJECT_ID>
コマンド出力
Updated property [core/project].
Cloud Shell の起動後に以下のコマンドラインを使用すると、Spring Initializr を使用して新しい Spring Boot アプリケーションを生成できます。
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
-d baseDir=trace-service-one | tar -xzvf - \
&& cd trace-service-one
新しいクラスを追加して、新しい REST コントローラを作成します。
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class WorkController {
Random r = new Random();
public void meeting() {
try {
log.info("meeting...");
// Delay for random number of milliseconds.
Thread.sleep(r.nextInt(500));
} catch (InterruptedException e) {
}
}
@GetMapping("/")
public String work() {
// What is work? Meetings!
// When you hit this URL, it'll call meetings() 5 times.
// Each time will have a random delay.
log.info("starting to work");
for (int i = 0; i < 5; i++) {
this.meeting();
}
log.info("finished!");
return "finished work!";
}
}
Spring Boot プラグインを使用して、Spring Boot アプリケーションを通常どおり起動できます。このラボのテストをスキップしましょう。
$ ./mvnw -DskipTests spring-boot:run
アプリケーションが開始したら、Cloud Shell ツールバーのウェブでプレビュー アイコン をクリックし、[プレビューのポート: 8080] を選択します。
しばらくすると、結果が表示されます。
Cloud Shell に、トレース ID とスパン ID を含むログメッセージも表示されます。
Stackdriver Trace API を有効にする
Stackdriver Trace を使用してトレースデータを保存するには、まず Stackdriver Trace API を有効にする必要があります。API を有効にするには、[API サービス] → [ライブラリ] に移動します。
Stackdriver Trace を検索します。
[Stackdriver Trace API] をクリックし、まだ有効になっていない場合は [有効にする] をクリックします。
アプリケーションのデフォルト認証情報を設定する
このラボでは、アプリケーションのデフォルト認証情報を構成する必要があります。この認証情報は、Spring Cloud GCP Trace スターターによって自動的に取得されます。
まず、ログインします。
$ gcloud auth application-default login
You are running on a Google Compute Engine virtual machine.
The service credentials associated with this virtual machine
will automatically be used by Application Default
Credentials, so it is not necessary to use this command.
If you decide to proceed anyway, your user credentials may be visible
to others with access to this virtual machine. Are you sure you want
to authenticate with your personal account?
Do you want to continue (Y/n)? Y
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth...
Enter verification code: ...
リンクをクリックして新しいブラウザタブを開き、[許可] をクリックします。
次に、確認コードをコピーして Cloud Shell に貼り付け、Enter キーを押します。以下のように表示されます。
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Spring Cloud GCP Trace を追加する
このサービスでは、トレースに Spring Cloud Sleuth をすでに使用しています。Spring Cloud GCP Trace スターターを追加して、データを Stackdriver Trace に転送しましょう。
Spring Cloud GCP Trace の依存関係を追加します。
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace Starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
デフォルトでは、Spring Cloud Sleuth はすべてのリクエストをサンプリングしません。テストを少し簡単にするために、application.properties
でサンプルレートを 100% に増やして、トレースデータを確認できるようにします。また、重要でない URL を無視します。
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
アプリケーションを再度実行し、Cloud Shell のウェブ プレビューを使用してアプリケーションを表示します。
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
デフォルトでは、Spring Cloud GCP Trace はトレースデータをバッチ処理し、10 秒ごと、または最小数のトレースデータを受信したときに送信します。これは構成可能です。詳細については、Spring Cloud GCP Trace リファレンス ドキュメントをご覧ください。
サービスにリクエストを送信します。
$ curl localhost:8080
Cloud コンソールで、[Stackdriver] → [トレース] → [トレースリスト] に移動します。
上部で、期間を 1 時間に絞り込みます。デフォルトでは、[自動再読み込み] はオンになっています。トレースデータが到着すると、コンソールに表示されます。
トレースデータは 30 秒ほどで表示されます。
青い点をクリックすると、トレースの詳細が表示されます。
とても簡単でした。
+ アイコンをクリックして、新しい Cloud Shell セッションを開きます。
新しいセッションで、2 つ目の Spring Boot アプリケーションを作成します。
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
-d baseDir=trace-service-two | tar -xzvf - \
&& cd trace-service-two
新しいクラスを追加して、新しい REST コントローラを作成します。
src/main/java/com/example/demo/MeetingController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class MeetingController {
Random r = new Random();
@GetMapping("/meet")
public String meeting() {
try {
log.info("meeting...");
Thread.sleep(r.nextInt(500 - 20 + 1) + 20);
} catch (InterruptedException e) {
}
return "finished meeting";
}
}
pom.xml に Spring Cloud GCP Trace を追加する
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
リクエストの 100% をサンプリングするように Sleuth を構成します。
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
最後に、Spring Boot プラグインを使用して、ポート 8081 で Spring Boot アプリケーションを起動できます。
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dserver.port=8081
trace-service-two
が実行されている間に、最初の Cloud Shell セッション ウィンドウに戻り、trace-service-one
を変更します。
まず、新しい RestTemplate
Bean を初期化します。
src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class DemoApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
WorkController.meeting()
で、Meeting サービスを呼び出します。
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
@RestController
@Slf4j
public class WorkController {
@Autowired
RestTemplate restTemplate;
public void meeting() {
String result = restTemplate.getForObject("http://localhost:8081/meet", String.class);
log.info(result);
}
...
}
サービスを再度開始し、[ウェブでプレビュー] からエンドポイントをトリガーします。
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
両方のセッション ウィンドウに、ログメッセージが表示されます。Trace ID は、あるサービスから別のサービスに伝播されます。
Stackdriver Trace のトレースリストに、2 番目のトレースが表示されます。
新しい青い点をクリックすると、トレースの詳細が表示されます。
この図の任意のスパンをクリックして、スパンの詳細を表示することもできます。
Stackdriver Trace をトレースデータ ストレージとして使用すると、Stackdriver Trace はデータを使用してレイテンシ分布レポートを作成できます。このようなレポートを作成するには、100 件以上のトレースが必要です。
また、Stackdriver Trace では、分析レポートで、2 つの異なる期間にわたる同じサービスのパフォーマンスの回帰を自動的に検出できます。
このラボでは、2 つのシンプルなサービスを作成し、Spring Cloud Sleuth を使用して分散トレースを追加しました。また、Spring Cloud GCP を使用してトレース情報を Stackdriver Trace に転送しました。
初めての App Engine ウェブ アプリケーションを作成する方法を学習しました。
詳細
- Stackdriver Trace: https://cloud.google.com/trace/
- GCP プロジェクトの Spring: http://cloud.spring.io/spring-cloud-gcp/
- Spring on GCP GitHub リポジトリ: https://github.com/spring-cloud/spring-cloud-gcp
- Google Cloud Platform での Java: https://cloud.google.com/java/
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。