1. 概要

この記事では、 Spring Cloud Sleuth を見て、Spring Bootでのトレースにどのように使用できるかを確認します。 ログに有用な追加情報を追加し、一意の識別子を追加することでアクションのデバッグを容易にします。 これらのアクションは、Sleuthの用語ではトレースと呼ばれます。 それらは、スパンと呼ばれるいくつかのステップで構成できます。

たとえば、トレースは、アプリケーションからデータをクエリしているGETリクエストである可能性があります。 アプリケーションがリクエストを処理するとき、リクエストは、ユーザー認証、データベースクエリの実行、レスポンスの変換など、より小さなステップに分割できます。 これらの各ステップは、同じトレースに属する一意のスパンです。

場合によっては、現在のトレースまたはスパンのIDを取得したいことがあります。 たとえば、インシデントが発生したときに、これらを開発チームに送信できます。 次に、これを使用して問題をデバッグおよび修正できます。

2. アプリケーションのセットアップ

まず、Spring Bootプロジェクトを作成し、spring-cloud-starter-sleuth依存関係を追加します。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <version>3.1.0</version>
</dependency>

このスターター依存関係はSpringBootとうまく統合され、SpringCloudSleuthの使用を開始するために必要な構成を提供します。

ただし、実行できる追加の手順が1つあります。 application.propertiesファイルでアプリケーションの名前を設定しましょう。こうすると、トレースIDとスパンIDとともにログにこれが表示されます:

spring.application.name=Baeldung Sleuth Tutorial

次に、アプリケーションへのエントリポイントが必要です。 単一のGETエンドポイントを持つRESTコントローラーを作成しましょう。

@RestController
public class SleuthTraceIdController {

    @GetMapping("/traceid")
    public String getSleuthTraceId() {
        return "Hello from Sleuth";
    }
}

http:// localhost:8080 /traceidにあるAPIエンドポイントにアクセスしてみましょう。 応答に「HellofromSleuth」が表示されます。

3. ロギング

getSleuthTraceIdメソッドにログステートメントを追加しましょう。 まず、クラスにLoggerが必要です。 次に、メッセージをログに記録できます。

private static final Logger logger = LoggerFactory.getLogger(SleuthTraceIdController.class);

@GetMapping("/traceid")
public String getSleuthTraceId() {
    logger.info("Hello with Sleuth");
    return "Hello from Sleuth";
}

APIエンドポイントをもう一度呼び出しましょう ログを確認してください。 これに似たものを見つける必要があります:

INFO [Baeldung Sleuth Tutorial,e48f140a63bb9fbb,e48f140a63bb9fbb] 9208 --- [nio-8080-exec-1] c.b.s.traceid.SleuthTraceIdController : Hello with Sleuth

アプリケーション名が最初の括弧内にあることに注意してください。 これらの括弧はSleuthによって追加されます。 これらは、アプリケーション名、トレースID、およびスパンIDを表します。

4. 現在のトレースとスパン

上記の例を使用してアプリケーションの問題をデバッグできますが、原因と追跡するトレースを特定するのは難しい場合があります。 そのため、現在のトレースをプログラムで取得し、それをさらに調査するために使用できます。

この実装では、このユースケースを単純化し、トレースIDをコンソールに記録するだけです。

まず、Tracerオブジェクトのインスタンスを取得する必要があります。 それをコントローラーに注入して、現在のスパンを取得しましょう。

@Autowired
private Tracer tracer;

@GetMapping("/traceid")
public String getSleuthTraceId() {
    logger.info("Hello with Sleuth");
    Span span = tracer.currentSpan();
    return "Hello from Sleuth";
}

現在アクティブなスパンがない場合、currentSpanメソッドがnullを返す可能性があることに注意してください。したがって、この Span オブジェクトを使用せずに続行して使用できるかどうかを確認するには、追加のチェックを実行する必要があります。 NullPointerExceptionを取得しています。 このチェックを実装して、現在のトレースIDとスパンIDをログに記録しましょう。

Span span = tracer.currentSpan();
if (span != null) {
    logger.info("Trace ID {}", span.context().traceIdString());
    logger.info("Span ID {}", span.context().spanIdString());
}

アプリケーションを実行して、APIエンドポイントにアクセスしたときにこれらのメッセージを探しましょう。 これらには、Sleuthによって追加された角かっこと同じIDが含まれている必要があります。

5. 10進数としてのトレースとスパンID

spanIdStringの代わりにspanIdメソッドを使用してスパンIDを取得する別の方法があります。 両者の違いは、後者は値の16進表現を返し、最初の表現は10進数を返すことです。実際にそれらを比較し、10進数値もログに記録しましょう。

Span span = tracer.currentSpan();
if (span != null) {
    logger.info("Span ID hex {}", span.context().spanIdString());
    logger.info("Span ID decimal {}", span.context().spanId());
}

2つの値は同じ数値を表し、出力は次のようになります。

INFO [Baeldung Sleuth Tutorial,0de46b6fcbc8da83,0de46b6fcbc8da83] 8648 --- [nio-8080-exec-3] c.b.s.traceid.SleuthTraceIdController    : Span ID hex 0de46b6fcbc8da83
INFO [Baeldung Sleuth Tutorial,0de46b6fcbc8da83,0de46b6fcbc8da83] 8648 --- [nio-8080-exec-3] c.b.s.traceid.SleuthTraceIdController    : Span ID decimal 1001043145087572611

同様に、これはトレースIDにも当てはまります。 traceIdStringの代わりに、traceIdメソッドを使用できます。 traceIdStringは16進値を返し、traceIdは10進値を返します。

logger.info("Trace ID hex {}", span.context().traceIdString());
logger.info("Trace ID decimal {}", span.context().traceId());

出力は前のものと非常に似ています。 トレースIDは、最初に16進数で、次に10進数で含まれます。

INFO [Baeldung Sleuth Tutorial,34ec0b8ac9d65e91,34ec0b8ac9d65e91] 7384 --- [nio-8080-exec-1] c.b.s.traceid.SleuthTraceIdController    : Trace ID hex 34ec0b8ac9d65e91
INFO [Baeldung Sleuth Tutorial,34ec0b8ac9d65e91,34ec0b8ac9d65e91] 7384 --- [nio-8080-exec-1] c.b.s.traceid.SleuthTraceIdController    : Trace ID decimal 3813435675195629201

6. 結論

この記事では、SpringCloudSleuthがSpringBootのイベントのデバッグとトレースにどのように役立つかについて説明しました。 まず、 Tracerオブジェクトを使用して、現在のスパンとTraceContextを参照しました。 その後、現在のトレースとスパンのIDを取得することができました。 さらに、さまざまなメソッドがさまざまな番号システムでIDを返す方法を確認しました。

いつものように、これらの例のソースコードは、GitHubから入手できます。