Spring Cloud Sleuth と Stackdriver Trace による分散トレース

Spring Cloud Sleuth と Stackdriver Trace による分散トレース

この Codelab について

subject最終更新: 2月 10, 2020
account_circleGoogle 社員により作成

1. 概要

分散トレースは、多層マイクロサービスのアーキテクチャに対する分析情報とオブザーバビリティを得るために重要です。サービス間呼び出し(サービス A からサービス B まで)をサービス C につないで、呼び出しが成功したかどうかと、すべてのステップでレイテンシが発生していることを理解することが重要です。

Spring Boot では、Spring Cloud Sleuth を使用して分散トレース インストルメンテーションをアプリケーションにシームレスに追加できます。デフォルトでは、トレースデータを Zipkin に転送できます。

Google Cloud Platform には Stackdriver Trace があります。これは、独自の Zipkin インスタンスやストレージを管理することなくトレースデータを保存できるマネージド サービスです。Stackdriver Trace では、レイテンシの分布レポートを生成して、パフォーマンスの低下を自動的に検出することもできます。

Spring Boot アプリケーションから Stackdriver Trace を使用するには、次の 2 つの方法があります。

  1. Stackdriver Trace Zipkin プロキシを使用し、このプロキシを Zipkin エンドポイントとして使用するように Spring Cloud Sleuth を設定する
  2. または、Spring Cloud GCP Trace を使用すると、Spring Cloud Sleuth とシームレスに統合され、トレースデータを Stackdriver Trace に直接転送できます。

この Codelab では、新しい Spring Boot アプリケーションを作成し、Spring Cloud GCP Trace を使用して分散トレースを行う方法を学びます。

ラボの内容

  • Spring Boot Java アプリケーションを作成して Stackdriver Trace を構成する方法。

必要なもの

  • Google Cloud Platform プロジェクト
  • ChromeFirefox などのブラウザ
  • Linux の標準的なテキスト エディタ(vim、emacs、nano など)を使い慣れていること

このチュートリアルの利用方法をお選びください。

HTML/CSS ウェブアプリ作成のご経験についてお答えください。

Google Cloud Platform サービスのご利用経験についてどのように評価されますか?

2. 設定と要件

セルフペース型の環境設定

Google アカウント(Gmail または Google Apps)をまだお持ちでない場合は、アカウントを作成する必要があります。Google Cloud Platform Console(console.cloud.google.com)にログインして、新しいプロジェクトを作成します。

2016-02-10 12:45:26.png のスクリーンショット

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。

次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。

この Codelab を実施した場合、費用は数ドルを超えることはありませんが、より多くのリソースを使用する場合や、実行したままにしておくとさらにコストがかかる場合があります(このドキュメントの最後にある「クリーンアップ」セクションをご覧ください)。

Google Cloud Platform の新規ユーザーは 300 ドル分の無料トライアルをご利用いただけます。

Google Cloud Shell

Google Cloud と Kubernetes はノートパソコンからリモートで操作できますが、この Codelab では Cloud で実行されるコマンドライン環境である Google Cloud Shell を使用します。

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].

3. 新しい Spring Boot REST サービスを作成する

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 のログメッセージも表示されます。

4. Stackdriver Trace の使用

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 秒に 1 回、または最小数のトレースデータを受信したときに送信します。これは構成可能です。詳細については、Spring Cloud GCP Trace のリファレンス ドキュメントをご覧ください。

サービスにリクエストを送信します。

$ curl localhost:8080

Cloud Console で、[Stackdriver] > [トレース] > [トレースリスト] に移動します。

上部で、期間を 1 時間に絞り込みます。デフォルトでは、自動再読み込みはオンになっています。そのため、トレースデータが届くとコンソールに表示されます。

トレースデータは 30 秒ほどで表示されます。

青いドットをクリックすると、トレースの詳細が表示されます。

とてもシンプルな手順でした。

5. 2 つ目の Spring Boot ウェブ アプリケーションを作成する

+ アイコンをクリックして新しい 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";
 
}
}

Spring Cloud GCP Trace を pom.xml に追加する

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

6. 1 つ目のサービスを更新して 2 つ目のサービスを使用する

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() で、会議サービスを呼び出します。

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

両方のセッション ウィンドウにログメッセージが表示され、トレース ID がサービス間で伝播されています。

Stackdriver Trace のトレースリストに、2 番目のトレースが表示されます。

新しい青いドットをクリックすると、トレースの詳細が表示されます。

この図で任意のスパンをクリックすると、スパンの詳細が表示されます。

7. レイテンシの分布とパフォーマンス レポート

Stackdriver Trace をトレースデータ ストレージとして使用すると、Stackdriver Trace はデータを使用してレイテンシの分布レポートを作成できます。このレポートを作成するには、100 個を超えるトレースが必要です。

また、Stackdriver Trace では、分析レポートに基づいて、同じサービスのパフォーマンス低下を 2 つの異なる期間で自動的に検出できます。

8. まとめ

このラボでは、2 つのシンプルなサービスを作成し、Spring Cloud Sleuth を使用して分散トレースを追加し、Spring Cloud GCP を使用してトレース情報を Stackdriver Trace に転送します。

9. お疲れさまでした

初めての App Engine ウェブ アプリケーションの作成方法を学習しました。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。