Kako uporabljati Spring Boot 3.4 za širjenje sledi iz glav po meri

Tracing

Ravnanje s sledmi glave po meri pri spomladanskem zagonu 3.4

Predstavljajte si, da imate spletno storitev Spring Boot 3.4, ki nemoteno deluje z dvema odjemalcema. Prvi odjemalec uporablja Spring Boot 3+, zaradi česar je širjenje sledenja preprosto. Brez dodatnega truda dobite čudovito kontinuiteto sledenja od konca do konca 🪄. Dnevniki so videti čisti in povezani, kot po čarovniji.

Vendar se stvari obrnejo, ko pride v poštev client two. Namesto standardnih glav za sledenje pošiljajo glave po meri, kot sta `ot-custom-traceid` in `ot-custom-spanid`. Medtem ko te glave po meri vsebujejo veljavne informacije o sledenju, Spring Boot ne uspe razširiti teh sledi. rezultat? Izgubite možnost povezovanja sledi odjemalca z dnevniki na strani strežnika.

To ustvarja vrzel v opazovanju. Za prvo stranko vidite celotno pot zahteve med storitvami. Za drugega odjemalca vidite samo dnevnike na strani strežnika, pri čemer manjka kritična sled odjemalca. Kot bi videli polovico sestavljanke – veste, da nekaj manjka, a ne morete sestaviti kosov. 😓

V tem članku bomo raziskali, kako rešiti to težavo brez zanašanja na Spring Cloud Sleuth, pri čemer bomo ostali zvesti ekosistemu Spring Boot 3.4. Na koncu boste vedeli, kako razširjati in nadaljevati sledi iz glav po meri, kar bo zagotovilo brezhibno opazovanje v vašem sistemu.

Ukaz Primer uporabe
MDC.put Ta ukaz doda pare ključ-vrednost v Preslikan diagnostični kontekst (MDC), kar omogoča vključitev ID-jev sledenja po meri v dnevnike. Na primer, MDC.put("traceId", "12345").
MDC.clear Po obdelavi zahteve izbriše vse vnose iz MDC, da se izogne ​​kontaminaciji sledi med zahtevami. Na primer MDC.clear().
OncePerRequestFilter Filter Spring Boot, ki zagotavlja, da se logika filtra izvede samo enkrat na zahtevo HTTP, kar je idealno za sledenje glavam. Primer: javni razred CustomTraceFilter razširja OncePerRequestFilter.
filterChain.doFilter Nadaljuje do naslednjega filtra v verigi, s čimer zagotovi, da se zahteva nadaljuje skozi druge filtre. Na primer filterChain.doFilter(zahteva, odgovor).
RestTemplate.getInterceptors() Pridobi seznam prestreznikov za primerek RestTemplate, kar omogoča dodajanje prestreznikov po meri. Primer: restTemplate.getInterceptors().add(new CustomInterceptor()).
ClientHttpRequestInterceptor Vmesnik za prestrezanje odhodnih zahtev HTTP in dodajanje glav po meri. Na primer implementacija ClientHttpRequestInterceptor za vstavljanje ID-jev sledenja.
HttpServletRequest.getHeader Iz dohodne zahteve izvleče vrednost določene glave HTTP. Primer: request.getHeader("ot-custom-traceid").
FilterRegistrationBean Registrira filtre po meri v aplikaciji Spring Boot. Na primer: registrationBean.setFilter(new CustomTraceFilter()).
MockMvc.perform Simulira zahteve HTTP v testih enot za aplikacije Spring Boot. Primer: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")).
ClientHttpRequestExecution.execute Izvede prestreženo zahtevo HTTP s podanim telesom zahteve in glavami. Primer: izvedba. izvedba (zahteva, telo).

Razširjanje sledi glave po meri pri pomladnem zagonu

Ena od ključnih komponent pri reševanju te težave je CustomTraceFilter. Ta filter razširja razreda, ki zagotavlja, da se logika glave sledenja izvaja samo enkrat za vsako zahtevo HTTP. Filtri v programu Spring Boot so neverjetno uporabni pri globalnem spreminjanju zahtev ali odgovorov. Na primer, če stranka pošlje podatke o sledenju, kot je oz v glavah po meri ta filter prestreže zahtevo, ekstrahira te glave in jih posreduje v Preslikani diagnostični kontekst (MDC). Z dodajanjem ID-jev sledenja v MDC zagotovimo, da so ti identifikatorji vidni v dnevnikih, ustvarjenih med obdelavo zahteve.

MDC je kritičen del ogrodij za beleženje, kot sta SLF4J in Logback. Omogoča nam shranjevanje kontekstualnih informacij za trenutno nit, kot so ID-ji sledenja po meri. Uporaba ukazov, kot je in , zagotavljamo, da sistem beleženja vključuje podrobnosti sledenja in se izogiba kontaminaciji med sočasnimi zahtevami. Na primer, če odjemalec 2 pošlje `ot-custom-traceid` kot `8f7ebd8a73f9a8f50e6a00a87a20952a`, je ta ID shranjen v MDC in vključen v vse spodnje dnevnike, kar ustvari dosledno pot sledenja.

Po drugi strani pa ima za odhodne zahteve HTTP ključno vlogo RestTemplate interceptor. Z izvajanjem , lahko odhodnim zahtevam pripnemo iste glave sledenja (`ot-custom-traceid` in `ot-custom-spanid`). To zagotavlja, da se ohrani kontinuiteta sledenja, ko aplikacija kliče druge mikrostoritve. Na primer, ko strežnik obdela zahtevo z ID-jem sledenja `8f7ebd8a73f9a8f50e6a00a87a20952a`, pripne ta ID odhodnim glavam, tako da lahko storitve na nižji stopnji prepoznajo in nemoteno razširjajo sled.

Končno, testi enot, napisani z MockMvc, potrdijo celotno nastavitev s simulacijo zahtev HTTP in preverjanjem širjenja glave. V aplikacijah v resničnem svetu je testiranje ključnega pomena za zagotovitev pravilne obravnave glav sledi. Če na primer pošljemo zahtevo GET z glavami po meri in pregledamo odgovor ali dnevnike, lahko potrdimo, da filter in prestreznik delujeta po pričakovanjih. Ta celovit pristop rešuje izziv brez zanašanja na podedovane odvisnosti, kot je Spring Cloud Sleuth. Navsezadnje kombinacija filtrov, prestreznikov in MDC zagotavlja kontinuiteto sledenja, tudi ko odjemalci uporabljajo glave po meri, zaradi česar je sistem robusten in popolnoma opazljiv. 🌟

Razmnoževanje glav sledenja po meri v spomladanskem zagonu 3.4

Uporaba Jave s Spring Boot 3.4 in Micrometer za zaledno obdelavo

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

Preizkus enote za širjenje glave sledi po meri

Testiranje z JUnit in MockMvc za preverjanje širjenja glave sledi

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

Razširjanje glav po meri v zahtevah HTTP z uporabo RestTemplate

Uporaba prestreznikov RestTemplate za dodajanje glav po meri v odhodne zahteve

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

Ravnanje s sledmi glave po meri z OpenTelemetry v spomladanskem zagonu 3.4

Pri delu s Spring Boot 3.4 je še en močan pristop za širjenje sledi iz glav po meri integracija . OpenTelemetry, odprtokodno ogrodje za opazovanje, pomaga brezhibno instrumentirati, zbirati in izvažati sledi. Zagotavlja mehanizme za ekstrahiranje in vstavljanje konteksta sledenja, vključno z glavami po meri, kot je in , v vašo aplikacijo. Z uporabo OpenTelemetryjevega TextMapPropagatorja lahko premostite vrzel med nestandardnimi odjemalci in vašim sistemom opazovanja.

Za uporabo OpenTelemetry v Spring Boot 3.4 je mogoče implementirati propagator po meri za ekstrahiranje informacij o sledenju iz glav po meri in jih priložiti trenutnemu kontekstu sledenja. Na primer, ko vaš strežnik prejme dohodno zahtevo od drugega odjemalca, lahko OpenTelemetry razčleni glave po meri in rekonstruira prvotni kontekst sledenja. To zagotavlja, da storitve na nižji stopnji vidijo iste ID-je sledenja, kar omogoča vidnost od konca do konca. Za razliko od starejših rešitev, kot je Spring Cloud Sleuth, je OpenTelemetry lahek in usklajen s sodobnimi standardi opazljivosti.

Če združite propagator OpenTelemetry z Mikrometrom, lahko svoje meritve in beleženje obogatite z informacijami o sledenju. Predstavljajte si, da v svojem orodju za opazovanje nemoteno vidite sledi za zahteve, ki prihajajo od odjemalca ena in odjemalca dva. OpenTelemetry samodejno podpira integracije s Prometheusom, Zipkinom ali Jaegerjem, kar vam omogoča centralno vizualizacijo sledi. Ta pristop zagotavlja, da se podatki o sledenju ne izgubijo, tudi če so vključene glave po meri, odpravljanje napak pa postane bistveno lažje. 🚀

  1. Kako ročno ekstrahiram glave sledi po meri v programu Spring Boot?
  2. Uporabite lahko request.getHeader("custom-header"), da ročno pridobite določeno glavo in jo dodate v MDC z uporabo MDC.put("traceId", value).
  3. Kakšne so prednosti uporabe OpenTelemetry za širjenje sledenja po meri?
  4. OpenTelemetry zagotavlja sodoben pristop, nevtralen glede prodajalca, za širjenje sledi, vključno z glavami po meri, po mikrostoritvah.
  5. Ali lahko razširim glave po meri z RestTemplate v Spring Boot?
  6. Da, z implementacijo ClientHttpRequestInterceptor lahko odhodnim zahtevam pripnete glave po meri, kot sta traceid in spanid.
  7. Kako registriram filter za globalni zajem glav?
  8. Ustvarite lahko filter, ki razširi OncePerRequestFilter in ga registrirate z uporabo FilterRegistrationBean za zajem glav za vse končne točke.
  9. Katera orodja lahko uporabim za vizualizacijo sledi iz programa Spring Boot?
  10. Orodja, kot so Zipkin, Jaeger in Prometheus, se lahko integrirajo s Spring Boot in OpenTelemetry za vizualizacijo sledi od konca do konca.

V sodobnih sistemih je ravnanje z glavami sledi po meri ključnega pomena za zanesljivo opazovanje. Z uporabo filtrov in prestreznikov lahko zajamete informacije o sledenju, ki jih posreduje stranka, in jih pravilno razširjate po svojih storitvah. S tem se izognete razdrobljenim dnevnikom in manjkajočim sledom. 🔍

Spring Boot 3.4 v kombinaciji z Micrometer ali OpenTelemetry omogoča robustne rešitve brez zanašanja na starejša orodja, kot je Spring Cloud Sleuth. Ne glede na to, ali imate opravka s standardnimi glavami odjemalca ena ali glavami po meri odjemalca dva, izvajanje teh tehnik učinkovito premosti vrzeli v sledenju. 🚀

  1. Uradna dokumentacija spomladanskega zagona: Razširjanje kontekstov sledenja. Dokumentacija za pomladni zagon
  2. OpenTelemetry for Java Developers: Guide to Trace Propagation. OpenTelemetry Java
  3. Dokumentacija o opazovanju mikrometrov: Integracija glav sledi po meri. Opazljivost mikrometra
  4. API za beleženje SLF4J: primeri uporabe preslikanega diagnostičnega konteksta (MDC). SLF4J priročnik