Kohandatud päise jälgede käsitlemine Spring Bootis 3.4
Kujutage ette, et teil on Spring Boot 3.4 veebiteenus, mis töötab sujuvalt kahe kliendiga. Esimene klient kasutab Spring Boot 3+, muutes jälgede levitamise imelihtsaks. Ilma täiendava pingutuseta saate ilusa otsast lõpuni jälgimise järjepidevuse 🪄. Logid näivad justkui võluväel puhtad ja ühendatud.
Asjad võtavad aga pöörde, kui mängu tuleb klient kaks. Tavaliste jälgimispäiste asemel saadavad nad kohandatud päiseid, nagu "ot-custom-traceid" ja "ot-custom-spanid". Kuigi need kohandatud päised sisaldavad kehtivat jälgimisteavet, ei suuda Spring Boot neid jälgi levitada. Tulemus? Kaotate võimaluse ühendada kliendi jälgi serveripoolsete logidega.
See tekitab vaadeldavuse tühimiku. Esimese kliendi puhul näete päringu täielikku teed teenuste vahel. Kliendi 2 puhul näete ainult serveripoolseid logisid, puudub kriitiline kliendi jälg. See on nagu poole pusle nägemine – tead, et midagi on puudu, kuid ei suuda tükke kokku panna. 😓
Selles artiklis uurime, kuidas seda probleemi lahendada ilma Spring Cloud Sleuthile lootmata, jäädes truuks Spring Boot 3.4 ökosüsteemile. Lõpuks saate teada, kuidas kohandatud päistest jälgi levitada ja jätkata, tagades teie süsteemis sujuva jälgitavuse.
Käsk | Kasutusnäide |
---|---|
MDC.put | See käsk lisab Mapped Diagnostic Context (MDC) võtme-väärtuse paarid, võimaldades logidesse lisada kohandatud jälgimis-ID-sid. Näiteks MDC.put("traceId", "12345"). |
MDC.clear | Kustutab pärast päringu töötlemist MDC-st kõik kirjed, et vältida päringute vahelist saastumist. Näiteks MDC.clear(). |
OncePerRequestFilter | Spring Boot filter, mis tagab filtri loogika käivitamise ainult üks kord HTTP päringu kohta, mis sobib ideaalselt päiste jälgimiseks. Näide: avalik klass CustomTraceFilter laiendab funktsiooni OncePerRequestFilter. |
filterChain.doFilter | Liigub ahelas järgmise filtri juurde, tagades päringu jätkumise läbi teiste filtrite. Näiteks filterChain.doFilter(request, response). |
RestTemplate.getInterceptors() | Toob RestTemplate'i eksemplari pealtkuulajate loendi, mis võimaldab kohandatud pealtkuulajaid lisada. Näide: restTemplate.getInterceptors().add(new CustomInterceptor()). |
ClientHttpRequestInterceptor | Liides väljuvate HTTP-päringute pealtkuulamiseks ja kohandatud päiste lisamiseks. Näiteks ClientHttpRequestInterceptor juurutamine jälje ID-de sisestamiseks. |
HttpServletRequest.getHeader | Eraldab sissetulevast päringust konkreetse HTTP-päise väärtuse. Näide: request.getHeader("ot-custom-traceid"). |
FilterRegistrationBean | Registreerib kohandatud filtrid rakenduses Spring Boot. Näiteks: registerBean.setFilter(new CustomTraceFilter()). |
MockMvc.perform | Simuleerib HTTP-päringuid Spring Booti rakenduste ühikutestides. Näide: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")). |
ClientHttpRequestExecution.execute | Täidab pealtkuulatud HTTP-päringu koos esitatud päringu keha ja päistega. Näide: execution.execute(request, body). |
Kohandatud päise jälgimise levik Spring Bootis
Üks selle probleemi lahendamise võtmekomponente on CustomTraceFilter. See filter pikendab OncePerRequestFilter klassis, tagades, et jälgimispäise loogika käitatakse iga HTTP-päringu jaoks ainult üks kord. Spring Booti filtrid on päringute või vastuste globaalsel muutmisel väga kasulikud. Näiteks kui klient saadab jälgimisteavet nagu ot-custom-traceid või ot-custom-spanid kohandatud päistes püüab see filter päringu kinni, eraldab need päised ja edastab need Mapped Diagnostic Context (MDC) alla. Jälgimis-ID-de lisamisega MDC-sse tagame, et need identifikaatorid on nähtavad päringu töötlemisel loodud logides.
MDC on logimisraamistike, nagu SLF4J ja Logback, oluline osa. See võimaldab meil salvestada praeguse lõime kontekstuaalset teavet, näiteks kohandatud jälje ID-sid. Kasutades selliseid käske nagu MDC.put ja MDC.selge, tagame, et logisüsteem sisaldab jälgimise üksikasju ja väldib samaaegsete päringute vahelist saastumist. Näiteks kui Client Two saadab 'ot-custom-traceid' kui '8f7ebd8a73f9a8f50e6a00a87a20952a', salvestatakse see ID MDC-sse ja kaasatakse kõikidesse allavoolu logidesse, luues järjepideva jälgimistee.
Teisest küljest mängib väljaminevate HTTP-päringute puhul RestTemplate pealtkuulaja olulist rolli. Rakendades ClientHttpRequestInterceptor, saame väljaminevatele päringutele lisada samad jälgimispäised ("ot-custom-traceid" ja "ot-custom-spanid". See tagab jälgimise järjepidevuse säilimise, kui rakendus kutsub teisi mikroteenuseid. Näiteks kui server töötleb päringut jälgimis-ID-ga 8f7ebd8a73f9a8f50e6a00a87a20952a, lisab ta selle ID väljuvatele päistele, et allavooluteenused saaksid jälge sujuvalt ära tunda ja levitada.
Lõpuks kinnitavad MockMvc-ga kirjutatud ühikutestid kogu seadistuse, simuleerides HTTP-päringuid ja kontrollides päise levikut. Reaalmaailma rakendustes on testimine ülioluline tagamaks, et jälgimispäised on õigesti käsitletud. Näiteks saates kohandatud päistega GET-päringu ja kontrollides vastust või logisid, saame kinnitada, et filter ja pealtkuulaja töötavad ootuspäraselt. See kõikehõlmav lähenemisviis lahendab väljakutse ilma pärandsõltuvustele, nagu Spring Cloud Sleuth, tuginemata. Lõppkokkuvõttes tagab filtrite, pealtkuulajate ja MDC kombinatsioon jälgimise järjepidevuse isegi siis, kui kliendid kasutavad kohandatud päiseid, muutes süsteemi tugevaks ja täielikult jälgitavaks. 🌟
Kohandatud jälgimispäiste paljundamine Spring Bootis 3.4
Java kasutamine koos Spring Boot 3.4 ja mikromeetriga taustatöötluseks
// 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;
}
}
Kohandatud jälje päise levitamise ühikutest
Jäljepäise levitamise kontrollimiseks testimine JUniti ja MockMvc-ga
// 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());
}
}
Kohandatud päiste levitamine HTTP-päringutes RestTemplate abil
RestTemplate pealtkuulajate kasutamine kohandatud päiste lisamiseks väljaminevatele päringutele
// 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;
}
}
Kohandatud päisejälgede käsitlemine OpenTelemetryga Spring Boot 3.4-s
Kui töötate versiooniga Spring Boot 3.4, on veel üks võimas viis jälgede levitamiseks kohandatud päistest integreerimine OpenTelemetry. OpenTelemetry, avatud lähtekoodiga jälgitavusraamistik, aitab jälgi sujuvalt instrumenteerida, koguda ja eksportida. See pakub mehhanisme jälgimiskonteksti ekstraheerimiseks ja sisestamiseks, sealhulgas kohandatud päised ot-custom-traceid ja ot-custom-spanid, oma rakendusse. Kasutades OpenTelemetry TextMapPropagatorit, saate ületada lõhe mittestandardsete klientide ja oma jälgitavussüsteemi vahel.
OpenTelemetry kasutamiseks versioonis Spring Boot 3.4 saab rakendada kohandatud levitajat, mis eraldab kohandatud päistest jälgimisteabe ja lisab selle praegusele jälgimiskontekstile. Näiteks kui teie server saab sissetuleva päringu kliendilt 2, saab OpenTelemetry kohandatud päiseid sõeluda ja algse jälgimiskonteksti rekonstrueerida. See tagab, et alljärgnevad teenused näevad samu jälgimis-ID-sid, võimaldades otsast lõpuni nähtavust. Erinevalt vanematest lahendustest, nagu Spring Cloud Sleuth, on OpenTelemetry kerge ja ühtib tänapäevaste jälgitavusstandarditega.
Kombineerides OpenTelemetry levitaja mikromeetriga, saate rikastada oma mõõdikuid ja logimist jälgimisteabega. Kujutage ette, et näete oma jälgimistööriistas sujuvalt jälgi nii Client One-lt kui ka Client-2-lt pärit päringutele. OpenTelemetry toetab automaatselt integreerimist Prometheuse, Zipkini või Jaegeriga, võimaldades teil tsentraliseerida jälgede visualiseerimist. See lähenemisviis tagab, et isegi kohandatud päiste kasutamisel ei lähe jäljeandmed kaotsi ja silumine muutub oluliselt lihtsamaks. 🚀
Korduma kippuvad küsimused kohandatud jälgede levitamise kohta Spring Bootis
- Kuidas ma saan Spring Booti kohandatud jälgimispäiseid käsitsi ekstraktida?
- Saate kasutada request.getHeader("custom-header") konkreetse päise käsitsi toomiseks ja selle lisamiseks MDC-sse, kasutades MDC.put("traceId", value).
- Mis kasu on OpenTelemetry kasutamisest kohandatud jälgede levitamiseks?
- OpenTelemetry pakub kaasaegset, müüja-neutraalset lähenemisviisi jälgede, sealhulgas kohandatud päiste levitamiseks mikroteenustes.
- Kas ma saan Spring Booti rakenduse RestTemplate abil kohandatud päiseid levitada?
- Jah, rakendades ClientHttpRequestInterceptor, saate väljaminevatele päringutele lisada kohandatud päised, nagu traceid ja spanid.
- Kuidas registreerida filtrit päiste globaalseks hõivamiseks?
- Saate luua filtri, mis laiendab funktsiooni OncePerRequestFilter, ja registreerida selle funktsiooni FilterRegistrationBean abil, et jäädvustada kõigi lõpp-punktide päised.
- Milliseid tööriistu saan kasutada Spring Booti jälgede visualiseerimiseks?
- Selliseid tööriistu nagu Zipkin, Jaeger ja Prometheus saab integreerida Spring Booti ja OpenTelemetryga, et visualiseerida otspunktide jälgi.
Sujuva jälgimise järjepidevuse tagamine
Kaasaegsetes süsteemides on kohandatud jälgimispäiste käsitlemine usaldusväärse jälgitavuse jaoks kriitilise tähtsusega. Filtrite ja pealtkuulajate abil saate jäädvustada kliendi pakutavat jälgimisteavet ja levitada seda õigesti oma teenustes. See väldib killustatud palke ja puuduvaid jälgi. 🔍
Spring Boot 3.4 koos Micrometeri või OpenTelemetryga võimaldab tugevaid lahendusi ilma vanematele tööriistadele, nagu Spring Cloud Sleuth, tuginemata. Olenemata sellest, kas teil on tegemist Client One standardpäistega või Client Two kohandatud päistega, sillutab nende tehnikate rakendamine jälgimislüngad tõhusalt. 🚀
Allikad ja viited
- Spring Booti ametlik dokumentatsioon: jälgimiskontekstide levik. Kevadkäivituse dokumentatsioon
- OpenTelemetry Java arendajatele: jälgimise levitamise juhend. OpenTelemetry Java
- Mikromeetri vaadeldavuse dokumentatsioon: kohandatud jälgimispäiste integreerimine. Mikromeetri jälgitavus
- SLF4J logimise API: kaardistatud diagnostikakonteksti (MDC) kasutusjuhtumid. SLF4J kasutusjuhend