Kā izmantot Spring Boot 3.4, lai izplatītu pēdas no pielāgotajām galvenēm

Kā izmantot Spring Boot 3.4, lai izplatītu pēdas no pielāgotajām galvenēm
Tracing

Pielāgotu galvenes pēdu apstrāde Spring Boot 3.4

Iedomājieties, ka jums ir Spring Boot 3.4 tīmekļa pakalpojums, kas nemanāmi strādā ar diviem klientiem. Pirmais klients izmanto Spring Boot 3+, padarot pēdu izplatīšanu par brīze. Bez papildu piepūles jūs iegūstat skaistu no gala līdz galam izsekošanas nepārtrauktību 🪄. Baļķi šķiet tīri un savienoti, it kā ar burvju mājienu.

Tomēr lietas mainās, kad spēlē klients divi. Standarta izsekošanas galvenes vietā tie sūta pielāgotas galvenes, piemēram, "ot-custom-traceid" un "ot-custom-spanid". Lai gan šīs pielāgotās galvenes satur derīgu izsekošanas informāciju, Spring Boot neizdodas izplatīt šīs pēdas. Rezultāts? Jūs zaudējat iespēju savienot klienta pēdas ar servera puses žurnāliem.

Tas rada novērojamības plaisu. Pirmajam klientam ir redzams pilns pieprasījuma ceļš pa pakalpojumiem. Otrajam klientam tiek rādīti tikai servera puses žurnāli, kuros trūkst kritiskās klienta izsekošanas. Tas ir kā redzēt pusi puzles — tu zini, ka kaut kā trūkst, bet nevari salikt detaļas. 😓

Šajā rakstā mēs izpētīsim, kā atrisināt šo problēmu, nepaļaujoties uz Spring Cloud Sleuth, saglabājot uzticību Spring Boot 3.4 ekosistēmai. Beigās jūs zināt, kā izplatīt un turpināt pēdas no pielāgotajām galvenēm, nodrošinot netraucētu novērojamību visā sistēmā.

Pavēli Lietošanas piemērs
MDC.put Šī komanda pievieno atslēgu un vērtību pārus Mapped Diagnostic Context (MDC), ļaujot žurnālos iekļaut pielāgotus izsekošanas ID. Piemēram, MDC.put("traceId", "12345").
MDC.clear Pēc pieprasījuma apstrādes tiek notīrīti visi ieraksti no MDC, lai izvairītos no izsekošanas starp pieprasījumiem. Piemēram, MDC.clear().
OncePerRequestFilter Spring Boot filtrs, kas nodrošina, ka filtra loģika tiek izpildīta tikai vienu reizi vienā HTTP pieprasījumā, kas ir ideāli piemērots galveņu izsekošanai. Piemērs: publiskā klase CustomTraceFilter paplašina OncePerRequestFilter.
filterChain.doFilter Pāriet uz nākamo filtru ķēdē, nodrošinot, ka pieprasījums tiek turpināts, izmantojot citus filtrus. Piemēram, filterChain.doFilter(pieprasījums, atbilde).
RestTemplate.getInterceptors() Izgūst RestTemplate instances pārtvērēju sarakstu, ļaujot pievienot pielāgotus pārtvērējus. Piemērs: restTemplate.getInterceptors().add(new CustomInterceptor()).
ClientHttpRequestInterceptor Interfeiss izejošo HTTP pieprasījumu pārtveršanai un pielāgotu galveņu pievienošanai. Piemēram, ieviešot ClientHttpRequestInterceptor, lai ievietotu izsekošanas ID.
HttpServletRequest.getHeader Izvelk noteiktas HTTP galvenes vērtību no ienākošā pieprasījuma. Piemērs: request.getHeader("ot-custom-traceid").
FilterRegistrationBean Reģistrē pielāgotos filtrus lietojumprogrammā Spring Boot. Piemēram: registerBean.setFilter(new CustomTraceFilter()).
MockMvc.perform Simulē HTTP pieprasījumus vienību testos Spring Boot lietojumprogrammām. Piemērs: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")).
ClientHttpRequestExecution.execute Izpilda pārtverto HTTP pieprasījumu ar norādīto pieprasījuma pamattekstu un galvenēm. Piemērs: execution.execute(pieprasījums, pamatteksts).

Pielāgota galvenes izsekošanas izplatīšana programmā Spring Boot

Viens no galvenajiem komponentiem šīs problēmas risināšanā ir CustomTraceFilter. Šis filtrs paplašina klasē, nodrošinot, ka izsekošanas galvenes loģika darbojas tikai vienu reizi katram HTTP pieprasījumam. Spring Boot filtri ir neticami noderīgi, mainot pieprasījumus vai atbildes globāli. Piemēram, ja klients nosūta izsekošanas informāciju, piemēram, vai pielāgotajās galvenēs šis filtrs pārtver pieprasījumu, izvelk šīs galvenes un izplata tās Mapped Diagnostic Context (MDC). Pievienojot izsekošanas ID MDC, mēs nodrošinām, ka šie identifikatori ir redzami žurnālos, kas ģenerēti pieprasījuma apstrādes laikā.

MDC ir būtiska reģistrēšanas sistēmu, piemēram, SLF4J un Logback, sastāvdaļa. Tas ļauj mums saglabāt pašreizējā pavediena kontekstuālo informāciju, piemēram, pielāgotos izsekošanas ID. Izmantojot tādas komandas kā un , mēs nodrošinām, ka reģistrēšanas sistēma ietver izsekošanas informāciju un novērš piesārņojumu starp vienlaicīgiem pieprasījumiem. Piemēram, ja Client Two nosūta “ot-custom-traceid” kā “8f7ebd8a73f9a8f50e6a00a87a20952a”, šis ID tiek saglabāts MDC un iekļauts visos pakārtotajos žurnālos, izveidojot konsekventu izsekošanas ceļu.

No otras puses, izejošajiem HTTP pieprasījumiem RestTemplate pārtvērējam ir būtiska loma. Ieviešot , mēs varam pievienot tās pašas izsekošanas galvenes ("ot-custom-traceid" un "ot-custom-spanid") izejošajiem pieprasījumiem. Tas nodrošina, ka tiek saglabāta izsekošanas nepārtrauktība, kad lietojumprogramma izsauc citus mikropakalpojumus. Piemēram, kad serveris apstrādā pieprasījumu ar izsekošanas ID 8f7ebd8a73f9a8f50e6a00a87a20952a, tas pievieno šo ID izejošajām galvenēm, lai pakārtotie pakalpojumi varētu nevainojami atpazīt un izplatīt izsekošanu.

Visbeidzot, vienību testi, kas rakstīti ar MockMvc, apstiprina visu iestatījumu, simulējot HTTP pieprasījumus un pārbaudot galvenes izplatīšanu. Reālās pasaules lietojumprogrammās testēšana ir ļoti svarīga, lai nodrošinātu, ka izsekošanas galvenes tiek pareizi apstrādātas. Piemēram, nosūtot GET pieprasījumu ar pielāgotām galvenēm un pārbaudot atbildi vai žurnālus, mēs varam apstiprināt, ka filtrs un pārtvērējs darbojas, kā paredzēts. Šī visaptverošā pieeja atrisina problēmu, nepaļaujoties uz mantotajām atkarībām, piemēram, Spring Cloud Sleuth. Galu galā filtru, pārtvērēju un MDC kombinācija nodrošina izsekošanas nepārtrauktību pat tad, ja klienti izmanto pielāgotas galvenes, padarot sistēmu stabilu un pilnībā novērojamu. 🌟

Pielāgotu izsekošanas galveņu pavairošana programmā Spring Boot 3.4

Java izmantošana ar Spring Boot 3.4 un mikrometru aizmugures apstrādei

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

Vienības pārbaude pielāgotas izsekošanas galvenes izplatīšanai

Testēšana ar JUnit un MockMvc, lai apstiprinātu izsekošanas galvenes izplatīšanu

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

Pielāgotu galveņu pavairošana HTTP pieprasījumos, izmantojot RestTemplate

RestTemplate pārtvērēju izmantošana, lai pievienotu pielāgotas galvenes izejošajiem pieprasījumiem

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

Pielāgotu galvenes izsekojumu apstrāde, izmantojot OpenTelemetry Spring Boot 3.4

Strādājot ar Spring Boot 3.4, vēl viena efektīva pieeja pēdu izplatīšanai no pielāgotajām galvenēm ir integrēšana . OpenTelemetry, atvērtā pirmkoda novērošanas sistēma, palīdz nevainojami instrumentēt, apkopot un eksportēt pēdas. Tas nodrošina mehānismus, lai iegūtu un ievadītu izsekošanas kontekstu, tostarp pielāgotas galvenes, piemēram un , savā pieteikumā. Izmantojot OpenTelemetry TextMapPropagator, varat pārvarēt plaisu starp nestandarta klientiem un novērošanas sistēmu.

Lai izmantotu OpenTelemetry versijā Spring Boot 3.4, var ieviest pielāgotu izplatītāju, lai iegūtu izsekošanas informāciju no pielāgotajām galvenēm un pievienotu to pašreizējam izsekošanas kontekstam. Piemēram, kad jūsu serveris saņem ienākošu pieprasījumu no otrā klienta, OpenTelemetry var parsēt pielāgotās galvenes un rekonstruēt sākotnējo izsekošanas kontekstu. Tas nodrošina, ka pakārtotie pakalpojumi redz tos pašus izsekošanas ID, nodrošinot pilnīgu redzamību. Atšķirībā no vecākiem risinājumiem, piemēram, Spring Cloud Sleuth, OpenTelemetry ir viegls un atbilst mūsdienu novērojamības standartiem.

Apvienojot OpenTelemetry izplatītāju ar mikrometru, varat bagātināt savus rādītājus un reģistrēšanu ar izsekošanas informāciju. Iedomājieties, ka savā novērošanas rīkā nemanāmi redzat pēdas pieprasījumiem, kas nāk gan no Client One, gan Client Two. OpenTelemetry automātiski atbalsta integrāciju ar Prometheus, Zipkin vai Jaeger, ļaujot centralizēt izsekošanas vizualizāciju. Šī pieeja nodrošina, ka pat tad, ja ir iesaistītas pielāgotas galvenes, netiek zaudēti izsekošanas dati, un atkļūdošana kļūst ievērojami vienkāršāka. 🚀

  1. Kā manuāli izvilkt pielāgotās izsekošanas galvenes programmā Spring Boot?
  2. Varat izmantot request.getHeader("custom-header"), lai manuāli izgūtu konkrētu galveni un pievienotu to MDC, izmantojot MDC.put("traceId", value).
  3. Kāds ir OpenTelemetry izmantošanas ieguvums pielāgotai izsekošanas izplatīšanai?
  4. OpenTelemetry nodrošina modernu, piegādātāju ziņā neitrālu pieeju izsekojumu, tostarp pielāgotu galveņu, izplatīšanai mikropakalpojumos.
  5. Vai es varu izplatīt pielāgotas galvenes, izmantojot RestTemplate programmā Spring Boot?
  6. Jā, ieviešot ClientHttpRequestInterceptor, izejošajiem pieprasījumiem varat pievienot pielāgotas galvenes, piemēram, traceid un spanid.
  7. Kā reģistrēt filtru, lai globāli uztvertu galvenes?
  8. Varat izveidot filtru, kas paplašina OncePerRequestFilter, un reģistrēt to, izmantojot FilterRegistrationBean, lai tvertu visu galapunktu galvenes.
  9. Kādus rīkus es varu izmantot, lai vizualizētu pēdas no Spring Boot?
  10. Tādus rīkus kā Zipkin, Jaeger un Prometheus var integrēt ar Spring Boot un OpenTelemetry, lai vizualizētu pēdas līdz galam.

Mūsdienu sistēmās pielāgotu izsekošanas galveņu apstrāde ir ļoti svarīga uzticamai novērojamībai. Izmantojot filtrus un pārtvērējus, varat tvert klienta nodrošināto izsekošanas informāciju un pareizi izplatīt to savos pakalpojumos. Tas ļauj izvairīties no sadrumstalotiem baļķiem un trūkstošām pēdām. 🔍

Spring Boot 3.4 apvienojumā ar Micrometer vai OpenTelemetry nodrošina stabilus risinājumus, nepaļaujoties uz vecākiem rīkiem, piemēram, Spring Cloud Sleuth. Neatkarīgi no tā, vai jums ir darīšana ar Client One standarta galvenēm vai Client Two pielāgotajām galvenēm, šo metožu ieviešana efektīvi novērš izsekošanas nepilnības. 🚀

  1. Spring Boot oficiālā dokumentācija: izsekošanas kontekstu izplatīšana. Pavasara sāknēšanas dokumentācija
  2. OpenTelemetry Java izstrādātājiem: ceļvedis izsekošanas izplatīšanai. OpenTelemetry Java
  3. Mikrometra novērojamības dokumentācija: pielāgotu izsekošanas galveņu integrēšana. Mikrometru novērojamība
  4. SLF4J reģistrēšanas API: kartēta diagnostikas konteksta (MDC) lietošanas gadījumi. SLF4J rokasgrāmata