Sådan bruges Spring Boot 3.4 til at udbrede spor fra brugerdefinerede overskrifter

Temp mail SuperHeros
Sådan bruges Spring Boot 3.4 til at udbrede spor fra brugerdefinerede overskrifter
Sådan bruges Spring Boot 3.4 til at udbrede spor fra brugerdefinerede overskrifter

Håndtering af tilpassede header-spor i fjederstøvler 3.4

Forestil dig, at du har en Spring Boot 3.4-webservice, der arbejder problemfrit med to klienter. Den første klient bruger Spring Boot 3+, hvilket gør sporudbredelse til en leg. Uden nogen ekstra indsats får du smuk ende-til-ende sporingskontinuitet 🪄. Logs vises rene og forbundet, som ved et magi.

Tingene tager dog en drejning, når klient to kommer i spil. I stedet for standardsporingsoverskrifter sender de tilpassede overskrifter som `ot-custom-traceid` og `ot-custom-spanid`. Selvom disse brugerdefinerede overskrifter indeholder gyldige sporingsoplysninger, formår Spring Boot ikke at udbrede disse spor. Resultatet? Du mister muligheden for at forbinde klientspor med logfiler på serversiden.

Dette skaber en observerbarhedskløft. For klient én ser du den fulde sti for en anmodning på tværs af tjenester. For klient to ser du kun logfiler på serversiden, mangler det kritiske klientspor. Det er som at se et halvt puslespil – du ved, at der mangler noget, men du kan ikke sætte brikkerne sammen. 😓

I denne artikel vil vi undersøge, hvordan du løser dette problem uden at stole på Spring Cloud Sleuth, og forbliver tro mod Spring Boot 3.4-økosystemet. Til sidst vil du vide, hvordan du udbreder og fortsætter spor fra tilpassede overskrifter, hvilket sikrer problemfri observerbarhed på tværs af dit system.

Kommando Eksempel på brug
MDC.put Denne kommando tilføjer nøgleværdi-par til Mapped Diagnostic Context (MDC), hvilket gør det muligt at inkludere tilpassede sporings-id'er i logfiler. For eksempel MDC.put("traceId", "12345").
MDC.clear Rydder alle poster fra MDC, efter at en anmodning er behandlet, for at undgå sporkontaminering mellem anmodninger. For eksempel MDC.clear().
OncePerRequestFilter Et Spring Boot-filter, der sikrer, at filterlogikken kun udføres én gang pr. HTTP-anmodning, ideel til sporing af overskrifter. Eksempel: offentlig klasse CustomTraceFilter udvider OncePerRequestFilter.
filterChain.doFilter Fortsæt til det næste filter i kæden, og sikrer, at anmodningen fortsætter gennem andre filtre. For eksempel filterChain.doFilter(request, response).
RestTemplate.getInterceptors() Henter listen over interceptorer for en RestTemplate-instans, hvilket gør det muligt at tilføje tilpassede interceptorer. Eksempel: restTemplate.getInterceptors().add(new CustomInterceptor()).
ClientHttpRequestInterceptor En grænseflade til at opsnappe udgående HTTP-anmodninger og tilføje brugerdefinerede overskrifter. For eksempel implementering af ClientHttpRequestInterceptor for at indsætte sporings-id'er.
HttpServletRequest.getHeader Udtrækker værdien af ​​en specifik HTTP-header fra den indgående anmodning. Eksempel: request.getHeader("ot-custom-traceid").
FilterRegistrationBean Registrerer brugerdefinerede filtre i Spring Boot-applikationen. For eksempel: registrationBean.setFilter(new CustomTraceFilter()).
MockMvc.perform Simulerer HTTP-anmodninger i enhedstest til Spring Boot-applikationer. Eksempel: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")).
ClientHttpRequestExecution.execute Udfører den opsnappede HTTP-anmodning med den angivne anmodningstekst og overskrifter. Eksempel: execution.execute(request, body).

Brugerdefineret header-sporudbredelse i fjederstøvle

En af nøglekomponenterne i løsningen af ​​dette problem er CustomTraceFilter. Dette filter forlænger OncePerRequestFilter klasse, hvilket sikrer, at sporingsheaderlogikken kun kører én gang for hver HTTP-anmodning. Filtre i Spring Boot er utrolig nyttige, når du ændrer anmodninger eller svar globalt. For eksempel hvis klienten sender sporingsinformation som f.eks ot-custom-traceid eller ot-custom-spanid i tilpassede overskrifter opsnapper dette filter anmodningen, udtrækker disse overskrifter og udbreder dem til Mapped Diagnostic Context (MDC). Ved at tilføje sporings-id'erne til MDC'en sikrer vi, at disse identifikatorer er synlige i logfilerne, der genereres under anmodningsbehandlingen.

MDC er en kritisk del af logningsrammer som SLF4J og Logback. Det giver os mulighed for at gemme kontekstuelle oplysninger for den aktuelle tråd, såsom brugerdefinerede sporings-id'er. Brug af kommandoer som MDC.put og MDC.clear, sikrer vi, at logningssystemet inkluderer spordetaljerne og undgår kontaminering mellem samtidige anmodninger. For eksempel, hvis klient to sender `ot-custom-traceid` som `8f7ebd8a73f9a8f50e6a00a87a20952a`, gemmes dette ID i MDC og inkluderes i alle downstream-logfiler, hvilket skaber en konsistent sporingssti.

På den anden side, for udgående HTTP-anmodninger, spiller RestTemplate interceptor en væsentlig rolle. Ved at implementere ClientHttpRequestInterceptor, kan vi vedhæfte de samme sporingsoverskrifter (`ot-custom-traceid` og `ot-custom-spanid`) til udgående anmodninger. Dette sikrer, at sporingskontinuiteten opretholdes, når applikationen kalder andre mikrotjenester. For eksempel, når serveren behandler en anmodning med sporings-id `8f7ebd8a73f9a8f50e6a00a87a20952a`, knytter den dette ID til de udgående overskrifter, så downstream-tjenester kan genkende og udbrede sporet problemfrit.

Endelig validerer enhedstestene skrevet med MockMvc hele opsætningen ved at simulere HTTP-anmodninger og verificere header-udbredelse. I applikationer fra den virkelige verden er test afgørende for at sikre, at sporhovederne håndteres korrekt. For eksempel, ved at sende en GET-anmodning med tilpassede overskrifter og inspicere svaret eller logfilerne, kan vi bekræfte, at filteret og interceptoren fungerer som forventet. Denne omfattende tilgang løser udfordringen uden at stole på ældre afhængigheder som Spring Cloud Sleuth. I sidste ende sikrer kombinationen af ​​filtre, interceptorer og MDC sporingskontinuitet, selv når klienter bruger tilpassede headere, hvilket gør systemet robust og fuldt observerbart. 🌟

Udbredelse af tilpassede sporingshoveder i Spring Boot 3.4

Brug af Java med Spring Boot 3.4 og Micrometer til Backend-behandling

// 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;
    }
}

Unit Test for Custom Trace Header Propagation

Test med JUnit og MockMvc for at validere sporhovedudbredelse

// 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());
    }
}

Udbredelse af tilpassede overskrifter i HTTP-anmodninger ved hjælp af RestTemplate

Brug af RestTemplate Interceptors til at tilføje brugerdefinerede overskrifter i udgående anmodninger

// 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;
    }
}

Håndtering af brugerdefinerede header-spor med OpenTelemetry i Spring Boot 3.4

Når du arbejder med Spring Boot 3.4, er en anden effektiv tilgang til at udbrede spor fra brugerdefinerede headere ved at integrere OpenTelemetri. OpenTelemetry, en open source-observationsramme, hjælper med at instrumentere, indsamle og eksportere spor problemfrit. Det giver mekanismer til at udtrække og injicere sporingskontekst, herunder tilpassede overskrifter som ot-custom-traceid og ot-custom-spanid, i din ansøgning. Ved at udnytte OpenTelemetrys TextMapPropagator kan du bygge bro mellem ikke-standardklienter og dit observerbarhedssystem.

For at bruge OpenTelemetry i Spring Boot 3.4 kan en custom propagator implementeres til at udtrække sporingsinformation fra de tilpassede headere og vedhæfte den til den aktuelle sporingskontekst. Når din server f.eks. modtager en indgående anmodning fra klient to, kan OpenTelemetry parse tilpassede overskrifter og rekonstruere den originale sporingskontekst. Dette sikrer, at downstream-tjenester ser de samme sporings-id'er, hvilket tillader ende-til-ende-synlighed. I modsætning til ældre løsninger som Spring Cloud Sleuth, er OpenTelemetry let og tilpasser sig moderne observerbarhedsstandarder.

Ved at kombinere OpenTelemetrys propagator med Micrometer kan du berige dine metrics og logning med sporingsinformation. Forestil dig at se spor efter anmodninger, der kommer fra både Client One og Client Two problemfrit i dit observationsværktøj. OpenTelemetry understøtter automatisk integrationer med Prometheus, Zipkin eller Jaeger, så du kan centralisere sporvisualisering. Denne tilgang sikrer, at selv når brugerdefinerede overskrifter er involveret, går ingen sporingsdata tabt, og fejlretningen bliver væsentligt nemmere. 🚀

Ofte stillede spørgsmål om udbredelse af tilpassede spor i fjederstøvler

  1. Hvordan udtrækker jeg manuelt tilpassede sporingsoverskrifter i Spring Boot?
  2. Du kan bruge request.getHeader("custom-header") til manuelt at hente en specifik header og tilføje den til MDC ved hjælp af MDC.put("traceId", værdi).
  3. Hvad er fordelen ved at bruge OpenTelemetry til tilpasset sporudbredelse?
  4. OpenTelemetry giver en moderne, leverandørneutral tilgang til udbredelse af spor, herunder tilpassede headere, på tværs af mikrotjenester.
  5. Kan jeg udbrede tilpassede overskrifter med RestTemplate i Spring Boot?
  6. Ja, ved at implementere en ClientHttpRequestInterceptor, kan du vedhæfte tilpassede overskrifter som traceid og spanid til udgående anmodninger.
  7. Hvordan registrerer jeg et filter til at fange overskrifter globalt?
  8. Du kan oprette et filter, der udvider OncePerRequestFilter og registrere det ved hjælp af FilterRegistrationBean for at fange overskrifter for alle endepunkter.
  9. Hvilke værktøjer kan jeg bruge til at visualisere spor fra Spring Boot?
  10. Værktøjer som Zipkin, Jaeger og Prometheus kan integreres med Spring Boot og OpenTelemetry for at visualisere ende-til-ende-spor.

Sikring af sømløs sporingskontinuitet

I moderne systemer er håndtering af tilpassede sporingshoveder afgørende for pålidelig observerbarhed. Ved at bruge filtre og interceptorer kan du fange klient-leveret sporingsinformation og udbrede den korrekt på tværs af dine tjenester. Dette undgår fragmenterede logfiler og manglende spor. 🔍

Spring Boot 3.4, kombineret med Micrometer eller OpenTelemetry, tillader robuste løsninger uden at være afhængige af ældre værktøjer som Spring Cloud Sleuth. Uanset om du beskæftiger dig med Client Ones standardheaders eller Client Twos tilpassede headers, slår implementeringen af ​​disse teknikker bro mellem sporingshullerne effektivt. 🚀

Kilder og referencer
  1. Spring Boot Officiel dokumentation: Udbredelse af sporingskontekster. Spring Boot Dokumentation
  2. OpenTelemetry for Java-udviklere: Guide til sporudbredelse. OpenTelemetry Java
  3. Mikrometerobservationsdokumentation: Integration af tilpassede sporingshoveder. Mikrometer observerbarhed
  4. SLF4J Logging API: Mapped Diagnostic Context (MDC) Use Cases. SLF4J manual