知識庫 / Spring / Spring Cloud RSS 訂閱

獲取 Spring Cloud Sleuth 中的當前追蹤 ID

Spring Cloud
HongKong
8
12:21 PM · Dec 06 ,2025

1. 概述

本文將介紹 Spring Cloud Sleuth 以及如何在 Spring Boot 中利用它進行追蹤。它通過為我們的日誌添加有用的額外信息,併為它們添加唯一的標識符,從而使調試操作更加容易。在 Sleuth 術語中,這些操作被稱為“追蹤”(traces)。這些追蹤可以由多個步驟組成,稱為“跨度”(spans)。

例如,一個追蹤可以是一個向我們的應用程序查詢數據的 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>

這個啓動依賴與 Spring Boot 集成良好,並提供啓動 Spring Cloud Sleuth 所需的配置。

然而,我們可以採取一個額外的步驟。 讓我們在 application.properties 文件中設置應用程序的名稱,這樣我們就能在日誌中看到與 trace 和 span ID 相關的記錄:

spring.application.name=Baeldung Sleuth Tutorial

現在我們需要一個應用程序的入口點。讓我們創建一個帶有單個 GET 端點的 REST 控制器:

@RestController
public class SleuthTraceIdController {

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

讓我們訪問我們的 API 端點:http://localhost:8080/traceid。 我們應該在響應中看到“Hello from Sleuth”。

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方法在當前沒有活動 span 時可能會返回 null。因此,我們需要進行額外的檢查,以確定我們是否可以繼續使用此 Span對象,而不會導致 NullPointerException。 讓我們實現此檢查,並記錄當前跟蹤 ID 和 span 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. Trace 和 Span ID 作為十進制數

除了使用 spanIdString 方法獲取 Span ID 之外,還可以使用 spanId 方法。 兩者之間的區別在於,前者返回十六進制表示的值,而後者返回十進制數。 讓我們在實際操作中進行比較並記錄十進制值:

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

這兩個值代表相同的數字,輸出結果應類似於以下內容:

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 返回一個十六進制值,而 traceId 返回一個十進制值。

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

這段輸出與上一段非常相似。它首先以十六進制形式,然後以十進制形式包含跟蹤 ID:

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. 結論

在本文中,我們探討了 Spring Cloud Sleuth 如何幫助在 Spring Boot 中調試和跟蹤事件。首先,我們 使用 Tracer 對象引用當前 span 和 TraceContext。之後,我們能夠獲取當前 trace 和 span 的 ID。此外,我們還觀察了不同方法返回 ID 時所使用的不同數字系統。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.