Rukovanje prilagođenim tragovima zaglavlja u Spring pokretanju 3.4
Zamislite da imate web uslugu Spring Boot 3.4 koja besprijekorno radi s dva klijenta. Prvi klijent koristi Spring Boot 3+, čineći širenje traga lakim. Bez dodatnog napora, dobivate prekrasan kontinuitet traga od kraja do kraja 🪄. Dnevnici izgledaju čisti i povezani, kao čarolijom.
Međutim, stvari se preokreću kada u igru uđe klijent dva. Umjesto standardnih zaglavlja praćenja, šalju prilagođena zaglavlja poput `ot-custom-traceid` i `ot-custom-spanid`. Iako ta prilagođena zaglavlja sadrže valjane informacije o praćenju, Spring Boot ne uspijeva propagirati ta praćenja. Rezultat? Gubite mogućnost povezivanja praćenja klijenta sa zapisnicima na strani poslužitelja.
To stvara jaz u vidljivosti. Za klijenta jedan, vidite cijeli put zahtjeva preko usluga. Za klijenta dva, vidite samo zapisnike na strani poslužitelja, nedostaje kritično praćenje klijenta. To je kao da vidite pola slagalice - znate da nešto nedostaje, ali ne možete sastaviti dijelove. 😓
U ovom ćemo članku istražiti kako riješiti ovaj problem bez oslanjanja na Spring Cloud Sleuth, ostajući vjerni ekosustavu Spring Boot 3.4. Na kraju ćete znati kako širiti i nastaviti tragove iz prilagođenih zaglavlja, osiguravajući besprijekornu vidljivost u vašem sustavu.
Naredba | Primjer korištenja |
---|---|
MDC.put | Ova naredba dodaje parove ključ-vrijednost u Mapirani dijagnostički kontekst (MDC), dopuštajući uključivanje prilagođenih ID-ova praćenja u zapisnike. Na primjer, MDC.put("traceId", "12345"). |
MDC.clear | Briše sve unose iz MDC-a nakon obrade zahtjeva kako bi se izbjegla kontaminacija tragova između zahtjeva. Na primjer, MDC.clear(). |
OncePerRequestFilter | Spring Boot filter koji osigurava da se logika filtera izvršava samo jednom po HTTP zahtjevu, idealno za praćenje zaglavlja. Primjer: javna klasa CustomTraceFilter proširuje OncePerRequestFilter. |
filterChain.doFilter | Nastavlja do sljedećeg filtra u lancu, osiguravajući nastavak zahtjeva kroz druge filtre. Na primjer, filterChain.doFilter(zahtjev, odgovor). |
RestTemplate.getInterceptors() | Dohvaća popis presretača za instancu RestTemplate, dopuštajući dodavanje prilagođenih presretača. Primjer: restTemplate.getInterceptors().add(new CustomInterceptor()). |
ClientHttpRequestInterceptor | Sučelje za presretanje odlaznih HTTP zahtjeva i dodavanje prilagođenih zaglavlja. Na primjer, implementacija ClientHttpRequestInterceptor za umetanje ID-ova praćenja. |
HttpServletRequest.getHeader | Izvlači vrijednost određenog HTTP zaglavlja iz dolaznog zahtjeva. Primjer: request.getHeader("ot-custom-traceid"). |
FilterRegistrationBean | Registrira prilagođene filtre u aplikaciji Spring Boot. Na primjer: registrationBean.setFilter(new CustomTraceFilter()). |
MockMvc.perform | Simulira HTTP zahtjeve u jediničnim testovima za Spring Boot aplikacije. Primjer: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")). |
ClientHttpRequestExecution.execute | Izvršava presretnuti HTTP zahtjev s navedenim tijelom zahtjeva i zaglavljima. Primjer: izvršenje.izvršenje(zahtjev, tijelo). |
Prilagođeno širenje praćenja zaglavlja u proljetnom pokretanju
Jedna od ključnih komponenti u rješavanju ovog problema je CustomTraceFilter. Ovaj filtar proširuje OncePerRequestFilter klase, osiguravajući da se logika zaglavlja praćenja izvodi samo jednom za svaki HTTP zahtjev. Filtri u Spring Boot-u nevjerojatno su korisni kada se globalno mijenjaju zahtjevi ili odgovori. Na primjer, ako klijent pošalje podatke o praćenju kao što su ot-prilagođeni-traceid ili ot-prilagođeno-spanid u prilagođenim zaglavljima, ovaj filtar presreće zahtjev, izdvaja ta zaglavlja i prenosi ih u Mapirani dijagnostički kontekst (MDC). Dodavanjem ID-ova praćenja u MDC osiguravamo da su ti identifikatori vidljivi u zapisima koji se generiraju tijekom obrade zahtjeva.
MDC je kritični dio okvira za bilježenje kao što su SLF4J i Logback. Omogućuje nam pohranjivanje kontekstualnih informacija za trenutnu nit, kao što su prilagođeni ID-ovi praćenja. Korištenje naredbi poput MDC.put i MDC.jasno, osiguravamo da sustav bilježenja uključuje pojedinosti praćenja i izbjegava kontaminaciju između istodobnih zahtjeva. Na primjer, ako Klijent dva pošalje `ot-custom-traceid` kao `8f7ebd8a73f9a8f50e6a00a87a20952a`, ovaj ID se pohranjuje u MDC i uključuje se u sve nizvodne zapisnike, stvarajući dosljednu putanju praćenja.
S druge strane, za odlazne HTTP zahtjeve, presretač RestTemplate igra ključnu ulogu. Provođenjem ClientHttpRequestInterceptor, možemo pridružiti ista zaglavlja praćenja (`ot-custom-traceid` i `ot-custom-spanid`) odlaznim zahtjevima. Ovo osigurava da se kontinuitet praćenja održava kada aplikacija poziva druge mikroservise. Na primjer, kada poslužitelj obradi zahtjev s ID-om praćenja `8f7ebd8a73f9a8f50e6a00a87a20952a`, on prilaže ovaj ID odlaznim zaglavljima, tako da nizvodne usluge mogu prepoznati i neprimjetno širiti praćenje.
Konačno, jedinični testovi napisani pomoću MockMvc potvrđuju cjelokupnu postavku simulacijom HTTP zahtjeva i provjerom propagacije zaglavlja. U aplikacijama u stvarnom svijetu testiranje je ključno kako bi se osiguralo da se zaglavljima praćenja ispravno rukuje. Na primjer, slanjem GET zahtjeva s prilagođenim zaglavljima i pregledom odgovora ili zapisa, možemo potvrditi da filtar i presretač rade prema očekivanjima. Ovaj sveobuhvatni pristup rješava izazov bez oslanjanja na naslijeđene ovisnosti kao što je Spring Cloud Sleuth. U konačnici, kombinacija filtera, presretača i MDC-a osigurava kontinuitet praćenja čak i kada klijenti koriste prilagođena zaglavlja, čineći sustav robusnim i potpuno vidljivim. 🌟
Širenje prilagođenih zaglavlja praćenja u Spring Boot-u 3.4
Korištenje Jave sa Spring Boot 3.4 i Micrometer za pozadinsku obradu
// 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;
}
}
Jedinični test za prilagođeno širenje zaglavlja praćenja
Testiranje s JUnit i MockMvc za provjeru valjanosti širenja zaglavlja praćenja
// 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());
}
}
Širenje prilagođenih zaglavlja u HTTP zahtjevima pomoću RestTemplate
Korištenje presretača RestTemplate za dodavanje prilagođenih zaglavlja u odlazne zahtjeve
// 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;
}
}
Rukovanje prilagođenim tragovima zaglavlja s OpenTelemetry u Spring Boot 3.4
Kada radite sa Spring Boot 3.4, još jedan moćan pristup za širenje tragova iz prilagođenih zaglavlja je integracija OpenTelemetry. OpenTelemetry, open-source okvir za promatranje, pomaže u instrumentiranju, prikupljanju i izvozu tragova bez problema. Omogućuje mehanizme za izdvajanje i ubacivanje konteksta praćenja, uključujući prilagođena zaglavlja poput ot-prilagođeni-traceid i ot-prilagođeno-spanid, u svoju aplikaciju. Korištenjem OpenTelemetryjevog TextMapPropagatora, možete premostiti jaz između nestandardnih klijenata i vašeg sustava za promatranje.
Za korištenje OpenTelemetry u Spring Boot 3.4, može se implementirati prilagođeni propagator za izdvajanje informacija o praćenju iz prilagođenih zaglavlja i njihovo pripajanje trenutnom kontekstu praćenja. Na primjer, kada vaš poslužitelj primi dolazni zahtjev od drugog klijenta, OpenTelemetry može analizirati prilagođena zaglavlja i rekonstruirati originalni kontekst praćenja. Ovo osigurava da nizvodne usluge vide iste ID-ove praćenja, omogućujući vidljivost od kraja do kraja. Za razliku od starijih rješenja kao što je Spring Cloud Sleuth, OpenTelemetry je lagan i usklađen s modernim standardima promatranja.
Kombiniranjem propagatora OpenTelemetryja s Mikrometrom možete obogatiti svoju metriku i bilježenje informacijama o praćenju. Zamislite da vidite tragove za zahtjeve koji dolaze i od klijenta jedan i od klijenta dva neprimjetno u vašem alatu za promatranje. OpenTelemetry automatski podržava integracije s Prometheusom, Zipkinom ili Jaegerom, omogućujući vam da centralizirate vizualizaciju tragova. Ovaj pristup osigurava da čak i kada su uključena prilagođena zaglavlja, podaci praćenja nisu izgubljeni, a otklanjanje pogrešaka postaje znatno lakše. 🚀
Često postavljana pitanja o širenju prilagođenih tragova u Spring Boot-u
- Kako mogu ručno izdvojiti prilagođena zaglavlja praćenja u Spring Boot-u?
- Možete koristiti request.getHeader("custom-header") da ručno dohvatite određeno zaglavlje i dodate ga u MDC pomoću MDC.put("traceId", value).
- Koja je korist korištenja OpenTelemetryja za prilagođeno širenje praćenja?
- OpenTelemetry pruža moderan, dobavljaču neutralan pristup širenju praćenja, uključujući prilagođena zaglavlja, preko mikroservisa.
- Mogu li propagirati prilagođena zaglavlja s RestTemplate u Spring Boot-u?
- Da, implementacijom ClientHttpRequestInterceptor, možete priložiti prilagođena zaglavlja kao što su traceid i spanid odlaznim zahtjevima.
- Kako mogu registrirati filtar za globalno hvatanje zaglavlja?
- Možete stvoriti filtar koji proširuje OncePerRequestFilter i registrirati ga pomoću FilterRegistrationBean za hvatanje zaglavlja za sve krajnje točke.
- Koje alate mogu koristiti za vizualizaciju tragova iz Spring Boot-a?
- Alati kao što su Zipkin, Jaeger i Prometheus mogu se integrirati sa Spring Bootom i OpenTelemetryjem za vizualizaciju tragova s kraja na kraj.
Osiguravanje besprijekornog kontinuiteta traga
U modernim sustavima, rukovanje prilagođenim zaglavljima praćenja ključno je za pouzdanu vidljivost. Korištenjem filtara i presretača možete uhvatiti informacije o praćenju koje dostavlja klijent i ispravno ih širiti kroz svoje usluge. Time se izbjegavaju fragmentirani zapisi i nedostajući tragovi. 🔍
Spring Boot 3.4, u kombinaciji s Micrometerom ili OpenTelemetryjem, omogućuje robusna rješenja bez oslanjanja na starije alate kao što je Spring Cloud Sleuth. Bilo da imate posla sa standardnim zaglavljima Klijenta jedan ili prilagođenim zaglavljima Klijenta dva, implementacija ovih tehnika učinkovito premošćuje praznine u tragovima. 🚀
Izvori i reference
- Službena dokumentacija Spring Boot-a: Širenje konteksta praćenja. Spring Boot Dokumentacija
- OpenTelemetry for Java Developers: Guide to Trace Propagation. OpenTelemetry Java
- Dokumentacija o mikrometarskoj vidljivosti: integracija prilagođenih zaglavlja tragova. Opservabilnost mikrometra
- API za bilježenje SLF4J: slučajevi upotrebe mapiranog dijagnostičkog konteksta (MDC). SLF4J priručnik