$lang['tuto'] = "hướng dẫn"; ?> Cách sử dụng Spring Boot 3.4 để truyền dấu vết

Cách sử dụng Spring Boot 3.4 để truyền dấu vết từ tiêu đề tùy chỉnh

Temp mail SuperHeros
Cách sử dụng Spring Boot 3.4 để truyền dấu vết từ tiêu đề tùy chỉnh
Cách sử dụng Spring Boot 3.4 để truyền dấu vết từ tiêu đề tùy chỉnh

Xử lý dấu vết tiêu đề tùy chỉnh trong Spring Boot 3.4

Hãy tưởng tượng bạn có một dịch vụ web Spring Boot 3.4 hoạt động liền mạch với hai máy khách. Khách hàng đầu tiên sử dụng Spring Boot 3+, giúp việc truyền dấu vết trở nên dễ dàng. Không cần nỗ lực thêm, bạn sẽ có được sự liên tục theo dõi từ đầu đến cuối 🪄 tuyệt đẹp. Các nhật ký trông sạch sẽ và được kết nối, như thể có phép thuật.

Tuy nhiên, mọi thứ thay đổi khi khách hàng hai phát huy tác dụng. Thay vì tiêu đề theo dõi tiêu chuẩn, họ gửi tiêu đề tùy chỉnh như `ot-custom-traceid` và `ot-custom-spanid`. Mặc dù các tiêu đề tùy chỉnh này chứa thông tin theo dõi hợp lệ nhưng Spring Boot không truyền được các dấu vết này. Kết quả? Bạn mất khả năng kết nối dấu vết máy khách với nhật ký phía máy chủ.

Điều này tạo ra một khoảng cách về khả năng quan sát. Đối với ứng dụng khách thứ nhất, bạn sẽ thấy đường dẫn đầy đủ của yêu cầu trên các dịch vụ. Đối với ứng dụng khách thứ hai, bạn chỉ thấy nhật ký phía máy chủ, thiếu dấu vết ứng dụng khách quan trọng. Nó giống như nhìn thấy một nửa câu đố - bạn biết thiếu thứ gì đó nhưng không thể ghép các mảnh lại với nhau. 😓

Trong bài viết này, chúng ta sẽ khám phá cách giải quyết vấn đề này không cần dựa vào Spring Cloud Sleuth, tuân thủ hệ sinh thái Spring Boot 3.4. Cuối cùng, bạn sẽ biết cách truyền và tiếp tục dấu vết từ các tiêu đề tùy chỉnh, đảm bảo khả năng quan sát liền mạch trên hệ thống của bạn.

Yêu cầu Ví dụ về sử dụng
MDC.put Lệnh này thêm các cặp khóa-giá trị vào Bối cảnh chẩn đoán được ánh xạ (MDC), cho phép đưa ID theo dõi tùy chỉnh vào nhật ký. Ví dụ: MDC.put("traceId", "12345").
MDC.clear Xóa tất cả các mục khỏi MDC sau khi yêu cầu được xử lý để tránh ô nhiễm dấu vết giữa các yêu cầu. Ví dụ: MDC.clear().
OncePerRequestFilter Bộ lọc Spring Boot đảm bảo logic bộ lọc chỉ được thực thi một lần cho mỗi yêu cầu HTTP, lý tưởng để theo dõi các tiêu đề. Ví dụ: lớp công khai CustomTraceFilter mở rộng OncePerRequestFilter.
filterChain.doFilter Chuyển sang bộ lọc tiếp theo trong chuỗi, đảm bảo yêu cầu tiếp tục thông qua các bộ lọc khác. Ví dụ: filterChain.doFilter(yêu cầu, phản hồi).
RestTemplate.getInterceptors() Truy xuất danh sách các thiết bị chặn cho phiên bản RestTemplate, cho phép thêm các thiết bị chặn tùy chỉnh. Ví dụ: RestTemplate.getInterceptors().add(new CustomInterceptor()).
ClientHttpRequestInterceptor Giao diện để chặn các yêu cầu HTTP gửi đi và thêm tiêu đề tùy chỉnh. Ví dụ: triển khai ClientHttpRequestInterceptor để chèn ID theo dõi.
HttpServletRequest.getHeader Trích xuất giá trị của tiêu đề HTTP cụ thể từ yêu cầu đến. Ví dụ: request.getHeader("ot-custom-traceid").
FilterRegistrationBean Đăng ký các bộ lọc tùy chỉnh trong ứng dụng Spring Boot. Ví dụ: registerBean.setFilter(new CustomTraceFilter()).
MockMvc.perform Mô phỏng các yêu cầu HTTP trong các bài kiểm tra đơn vị cho các ứng dụng Spring Boot. Ví dụ: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")).
ClientHttpRequestExecution.execute Thực thi yêu cầu HTTP bị chặn với nội dung và tiêu đề yêu cầu được cung cấp. Ví dụ: exec.execute(request, body).

Tuyên truyền dấu vết tiêu đề tùy chỉnh trong Spring Boot

Một trong những thành phần chính giúp giải quyết vấn đề này là CustomTraceFilter. Bộ lọc này mở rộng Bộ lọc một lần PerRequest lớp, đảm bảo logic tiêu đề theo dõi chỉ chạy một lần cho mỗi yêu cầu HTTP. Các bộ lọc trong Spring Boot cực kỳ hữu ích khi sửa đổi các yêu cầu hoặc phản hồi trên toàn cầu. Ví dụ: nếu khách hàng gửi thông tin theo dõi như ot-tùy chỉnh-dấu vết hoặc ot-tùy chỉnh-spanid trong các tiêu đề tùy chỉnh, bộ lọc này chặn yêu cầu, trích xuất các tiêu đề này và truyền chúng vào Ngữ cảnh chẩn đoán được ánh xạ (MDC). Bằng cách thêm ID theo dõi vào MDC, chúng tôi đảm bảo những số nhận dạng này hiển thị trong nhật ký được tạo trong quá trình xử lý yêu cầu.

MDC là một phần quan trọng của các khung ghi nhật ký như SLF4J và Logback. Nó cho phép chúng tôi lưu trữ thông tin theo ngữ cảnh cho luồng hiện tại, chẳng hạn như ID theo dõi tùy chỉnh. Sử dụng các lệnh như MDC.putMDC.clear, chúng tôi đảm bảo rằng hệ thống ghi nhật ký bao gồm các chi tiết theo dõi và tránh lây nhiễm giữa các yêu cầu đồng thời. Ví dụ: nếu Khách hàng Hai gửi `ot-custom-traceid` dưới dạng `8f7ebd8a73f9a8f50e6a00a87a20952a`, ID này được lưu trữ trong MDC và được bao gồm trong tất cả nhật ký xuôi dòng, tạo ra một đường dẫn theo dõi nhất quán.

Mặt khác, đối với các yêu cầu HTTP gửi đi, bộ chặn chặn RestTemplate đóng một vai trò thiết yếu. Bằng cách thực hiện ClientHttpRequestInterceptor, chúng ta có thể đính kèm các tiêu đề theo dõi giống nhau (`ot-custom-traceid` và `ot-custom-spanid`) vào các yêu cầu gửi đi. Điều này đảm bảo rằng tính liên tục của dấu vết được duy trì khi ứng dụng gọi các vi dịch vụ khác. Ví dụ: khi máy chủ xử lý một yêu cầu có ID theo dõi `8f7ebd8a73f9a8f50e6a00a87a20952a`, máy chủ sẽ gắn ID này vào các tiêu đề gửi đi để các dịch vụ hạ nguồn có thể nhận dạng và truyền bá dấu vết một cách liền mạch.

Cuối cùng, các bài kiểm thử đơn vị được viết bằng MockMvc sẽ xác thực toàn bộ quá trình thiết lập bằng cách mô phỏng các yêu cầu HTTP và xác minh việc truyền bá tiêu đề. Trong các ứng dụng trong thế giới thực, việc kiểm tra là rất quan trọng để đảm bảo các tiêu đề theo dõi được xử lý chính xác. Ví dụ: bằng cách gửi yêu cầu GET có tiêu đề tùy chỉnh và kiểm tra phản hồi hoặc nhật ký, chúng tôi có thể xác nhận rằng bộ lọc và bộ chặn hoạt động như mong đợi. Cách tiếp cận toàn diện này giải quyết được thách thức mà không cần dựa vào các phần phụ thuộc cũ như Spring Cloud Sleuth. Cuối cùng, sự kết hợp giữa các bộ lọc, bộ chặn và MDC đảm bảo tính liên tục của dấu vết ngay cả khi khách hàng sử dụng các tiêu đề tùy chỉnh, giúp hệ thống trở nên mạnh mẽ và hoàn toàn có thể quan sát được. 🌟

Tuyên truyền các tiêu đề theo dõi tùy chỉnh trong Spring Boot 3.4

Sử dụng Java với Spring Boot 3.4 và Micromet để xử lý phụ trợ

// Solution 1: Extract and Propagate Custom Trace Headers Manually
// Import necessary Spring Boot and Micrometer libraries
import org.slf4j.MDC;
import org.springframework.http.HttpHeaders;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CustomTraceFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws IOException {
        String traceId = request.getHeader("ot-custom-traceid");
        String spanId = request.getHeader("ot-custom-spanid");
        try {
            if (traceId != null) {
                MDC.put("traceId", traceId); // Add traceId to Mapped Diagnostic Context
            }
            if (spanId != null) {
                MDC.put("spanId", spanId);
            }
            filterChain.doFilter(request, response); // Continue request processing
        } finally {
            MDC.clear(); // Ensure MDC is cleared after processing
        }
    }
}

// Register the filter in your configuration class
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<CustomTraceFilter> traceFilter() {
        FilterRegistrationBean<CustomTraceFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CustomTraceFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

Kiểm tra đơn vị để truyền bá tiêu đề dấu vết tùy chỉnh

Thử nghiệm với JUnit và MockMvc để xác thực việc truyền bá tiêu đề theo dõi

// Import necessary libraries
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@WebMvcTest
public class CustomTraceFilterTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testCustomTraceHeaders() throws Exception {
        mockMvc.perform(get("/test-endpoint")
                .header("ot-custom-traceid", "12345")
                .header("ot-custom-spanid", "67890"))
                .andExpect(status().isOk());
    }
}

Tuyên truyền tiêu đề tùy chỉnh trong yêu cầu HTTP bằng RestTemplate

Sử dụng Bộ chặn RestTemplate để thêm tiêu đề tùy chỉnh trong các yêu cầu gửi đi

// Import necessary libraries
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;

public class CustomHeaderInterceptor implements ClientHttpRequestInterceptor {
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        HttpHeaders headers = request.getHeaders();
        headers.add("ot-custom-traceid", "12345");
        headers.add("ot-custom-spanid", "67890");
        return execution.execute(request, body);
    }
}

// Register the interceptor with RestTemplate
@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getInterceptors().add(new CustomHeaderInterceptor());
        return restTemplate;
    }
}

Xử lý dấu vết tiêu đề tùy chỉnh bằng OpenTelemetry trong Spring Boot 3.4

Khi làm việc với Spring Boot 3.4, một cách tiếp cận mạnh mẽ khác để truyền bá dấu vết từ tiêu đề tùy chỉnh là tích hợp Đo từ xa mở. OpenTelemetry, một khung quan sát nguồn mở, giúp thiết bị, thu thập và xuất dấu vết một cách liền mạch. Nó cung cấp các cơ chế để trích xuất và đưa vào dấu vết bối cảnh, bao gồm các tiêu đề tùy chỉnh như ot-tùy chỉnh-dấu vếtot-tùy chỉnh-spanid, vào ứng dụng của bạn. Bằng cách tận dụng TextMapPropagator của OpenTelemetry, bạn có thể thu hẹp khoảng cách giữa các máy khách không chuẩn và hệ thống quan sát của mình.

Để sử dụng OpenTelemetry trong Spring Boot 3.4, trình truyền bá tùy chỉnh có thể được triển khai để trích xuất thông tin theo dõi từ các tiêu đề tùy chỉnh và đính kèm nó vào ngữ cảnh theo dõi hiện tại. Ví dụ: khi máy chủ của bạn nhận được yêu cầu đến từ Máy khách thứ hai, OpenTelemetry có thể phân tích cú pháp các tiêu đề tùy chỉnh và xây dựng lại bối cảnh theo dõi ban đầu. Điều này đảm bảo rằng các dịch vụ hạ nguồn nhìn thấy ID theo dõi giống nhau, cho phép khả năng hiển thị từ đầu đến cuối. Không giống như các giải pháp cũ hơn như Spring Cloud Sleuth, OpenTelemetry rất nhẹ và phù hợp với các tiêu chuẩn về khả năng quan sát hiện đại.

Bằng cách kết hợp công cụ truyền bá của OpenTelemetry với Micromet, bạn có thể làm phong phú thêm số liệu của mình và ghi nhật ký bằng thông tin theo dõi. Hãy tưởng tượng bạn nhìn thấy dấu vết của các yêu cầu đến từ cả Khách hàng Một và Khách hàng Hai một cách liền mạch trong công cụ quan sát của bạn. OpenTelemetry tự động hỗ trợ tích hợp với Prometheus, Zipkin hoặc Jaeger, cho phép bạn tập trung trực quan hóa dấu vết. Cách tiếp cận này đảm bảo rằng ngay cả khi có tiêu đề tùy chỉnh, không có dữ liệu theo dõi nào bị mất và việc gỡ lỗi trở nên dễ dàng hơn đáng kể. 🚀

Câu hỏi thường gặp về việc truyền dấu vết tùy chỉnh trong Spring Boot

  1. Làm cách nào để trích xuất thủ công các tiêu đề theo dõi tùy chỉnh trong Spring Boot?
  2. Bạn có thể sử dụng request.getHeader("custom-header") để tìm nạp thủ công một tiêu đề cụ thể và thêm nó vào MDC bằng cách sử dụng MDC.put("traceId", value).
  3. Lợi ích của việc sử dụng OpenTelemetry để truyền dấu vết tùy chỉnh là gì?
  4. OpenTelemetry cung cấp cách tiếp cận hiện đại, trung lập với nhà cung cấp để truyền dấu vết, bao gồm cả tiêu đề tùy chỉnh, trên các vi dịch vụ.
  5. Tôi có thể truyền bá các tiêu đề tùy chỉnh bằng RestTemplate trong Spring Boot không?
  6. Có, bằng cách triển khai ClientHttpRequestInterceptor, bạn có thể đính kèm các tiêu đề tùy chỉnh như traceid và spanid vào các yêu cầu gửi đi.
  7. Làm cách nào để đăng ký bộ lọc để thu thập tiêu đề trên toàn cầu?
  8. Bạn có thể tạo một bộ lọc mở rộng OncePerRequestFilter và đăng ký nó bằng cách sử dụng FilterRegistrationBean để thu thập các tiêu đề cho tất cả các điểm cuối.
  9. Tôi có thể sử dụng công cụ nào để trực quan hóa dấu vết từ Spring Boot?
  10. Các công cụ như Zipkin, Jaeger và Prometheus có thể tích hợp với Spring Boot và OpenTelemetry để trực quan hóa các dấu vết từ đầu đến cuối.

Đảm bảo tính liên tục của dấu vết liền mạch

Trong các hệ thống hiện đại, việc xử lý các tiêu đề theo dõi tùy chỉnh là rất quan trọng để có khả năng quan sát đáng tin cậy. Bằng cách sử dụng các bộ lọc và thiết bị chặn, bạn có thể nắm bắt thông tin theo dõi do khách hàng cung cấp và truyền bá thông tin đó một cách chính xác trên các dịch vụ của mình. Điều này tránh các bản ghi bị phân mảnh và dấu vết bị thiếu. 🔍

Spring Boot 3.4, kết hợp với Micrometer hoặc OpenTelemetry, mang đến các giải pháp mạnh mẽ mà không cần dựa vào các công cụ cũ hơn như Spring Cloud Sleuth. Cho dù bạn đang xử lý các tiêu đề tiêu chuẩn của Khách hàng Một hay tiêu đề tùy chỉnh của Khách hàng Hai, việc triển khai các kỹ thuật này sẽ thu hẹp khoảng cách theo dõi một cách hiệu quả. 🚀

Nguồn và Tài liệu tham khảo
  1. Tài liệu chính thức của Spring Boot: Tuyên truyền bối cảnh theo dõi. Tài liệu khởi động mùa xuân
  2. OpenTelemetry dành cho nhà phát triển Java: Hướng dẫn lan truyền dấu vết. Java đo từ xa mở
  3. Tài liệu về khả năng quan sát của micromet: Tích hợp các tiêu đề dấu vết tùy chỉnh. Khả năng quan sát micromet
  4. API ghi nhật ký SLF4J: Các trường hợp sử dụng bối cảnh chẩn đoán được ánh xạ (MDC). Hướng dẫn sử dụng SLF4J