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 OncePerRequestFilter 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, ot-custom-tracid vai ot-custom-spanid 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ā MDC.put un MDC.skaidrs, 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 ClientHttpRequestInterceptor, 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. 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 ot-custom-tracid un ot-custom-spanid, 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. 🚀
Bieži uzdotie jautājumi par pielāgoto pēdu pavairošanu programmā Spring Boot
- Kā manuāli izvilkt pielāgotās izsekošanas galvenes programmā Spring Boot?
- Varat izmantot request.getHeader("custom-header"), lai manuāli izgūtu konkrētu galveni un pievienotu to MDC, izmantojot MDC.put("traceId", value).
- Kāds ir OpenTelemetry izmantošanas ieguvums pielāgotai izsekošanas izplatīšanai?
- OpenTelemetry nodrošina modernu, piegādātāju ziņā neitrālu pieeju izsekojumu, tostarp pielāgotu galveņu, izplatīšanai mikropakalpojumos.
- Vai es varu izplatīt pielāgotas galvenes, izmantojot RestTemplate programmā Spring Boot?
- Jā, ieviešot ClientHttpRequestInterceptor, izejošajiem pieprasījumiem varat pievienot pielāgotas galvenes, piemēram, traceid un spanid.
- Kā reģistrēt filtru, lai globāli uztvertu galvenes?
- Varat izveidot filtru, kas paplašina OncePerRequestFilter, un reģistrēt to, izmantojot FilterRegistrationBean, lai tvertu visu galapunktu galvenes.
- Kādus rīkus es varu izmantot, lai vizualizētu pēdas no Spring Boot?
- 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.
Nevainojama izsekošanas nepārtrauktības nodrošināšana
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. 🚀
Avoti un atsauces
- Spring Boot oficiālā dokumentācija: izsekošanas kontekstu izplatīšana. Pavasara sāknēšanas dokumentācija
- OpenTelemetry Java izstrādātājiem: ceļvedis izsekošanas izplatīšanai. OpenTelemetry Java
- Mikrometra novērojamības dokumentācija: pielāgotu izsekošanas galveņu integrēšana. Mikrometru novērojamība
- SLF4J reģistrēšanas API: kartēta diagnostikas konteksta (MDC) lietošanas gadījumi. SLF4J rokasgrāmata