Mukautettujen otsikkojälkien käsittely Spring Bootissa 3.4
Kuvittele, että sinulla on Spring Boot 3.4 -verkkopalvelu, joka toimii saumattomasti kahden asiakkaan kanssa. Ensimmäinen asiakas käyttää Spring Boot 3+ -ohjelmaa, mikä tekee jälkien levittämisestä helppoa. Ilman ylimääräistä vaivaa saat kauniin päästä päähän -jäljityksen jatkuvuuden 🪄. Lokit näyttävät puhtailta ja yhdistetyiltä, ikään kuin taianomaisesti.
Asiat saavat kuitenkin käänteen, kun asiakas kaksi tulee peliin. Tavallisten jäljitysotsikoiden sijaan ne lähettävät mukautettuja otsikoita, kuten "ot-custom-traceid" ja "ot-custom-spanid". Vaikka nämä mukautetut otsikot sisältävät kelvollisia jäljitystietoja, Spring Boot ei pysty levittämään näitä jälkiä. Tulos? Menetät kyvyn yhdistää asiakasjäljet palvelinpuolen lokeihin.
Tämä luo havainnointiaukon. Asiakkaalle yksi näet pyynnön koko polun eri palveluissa. Asiakkaalle kaksi näet vain palvelinpuolen lokit, joista puuttuu kriittinen asiakasjäljitys. Se on kuin näkisi puolikkaan palapelin – tiedät, että jotain puuttuu, mutta et osaa koota palasia. 😓
Tässä artikkelissa tutkimme, kuinka ratkaista tämä ongelma luottamatta Spring Cloud Sleuthiin, pysyen uskollisena Spring Boot 3.4 -ekosysteemille. Loppujen lopuksi osaat levittää ja jatkaa jälkiä mukautetuista otsikoista, mikä varmistaa saumattoman havainnoinnin koko järjestelmässäsi.
Komento | Esimerkki käytöstä |
---|---|
MDC.put | Tämä komento lisää avain-arvo-parit Mapped Diagnostic Contextiin (MDC), jolloin mukautetut jäljitystunnukset voidaan sisällyttää lokeihin. Esimerkiksi MDC.put("traceId", "12345"). |
MDC.clear | Tyhjentää kaikki merkinnät MDC:stä pyynnön käsittelyn jälkeen välttääkseen jälkikontaminaation pyyntöjen välillä. Esimerkiksi MDC.clear(). |
OncePerRequestFilter | Spring Boot -suodatin, joka varmistaa, että suodatinlogiikka suoritetaan vain kerran HTTP-pyyntöä kohti, mikä on ihanteellinen otsikoiden jäljittämiseen. Esimerkki: julkinen luokka CustomTraceFilter laajentaa OncePerRequestFilteriä. |
filterChain.doFilter | Jatka ketjun seuraavaan suodattimeen varmistaen, että pyyntö jatkuu muiden suodattimien kautta. Esimerkiksi filterChain.doFilter(pyyntö, vastaus). |
RestTemplate.getInterceptors() | Hakee RestTemplate-ilmentymän sieppaajien luettelon, jolloin mukautettuja sieppaajia voidaan lisätä. Esimerkki: restTemplate.getInterceptors().add(new CustomInterceptor()). |
ClientHttpRequestInterceptor | Käyttöliittymä lähtevien HTTP-pyyntöjen sieppaamiseen ja mukautettujen otsikoiden lisäämiseen. Esimerkiksi ClientHttpRequestInterceptorin käyttöönotto jäljitystunnusten lisäämiseksi. |
HttpServletRequest.getHeader | Poimii tietyn HTTP-otsikon arvon saapuvasta pyynnöstä. Esimerkki: request.getHeader("ot-custom-traceid"). |
FilterRegistrationBean | Rekisteröi mukautettuja suodattimia Spring Boot -sovellukseen. Esimerkiksi: registerBean.setFilter(new CustomTraceFilter()). |
MockMvc.perform | Simuloi HTTP-pyyntöjä Spring Boot -sovellusten yksikkötesteissä. Esimerkki: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")). |
ClientHttpRequestExecution.execute | Suorittaa siepatun HTTP-pyynnön annetulla pyynnön rungolla ja otsikoilla. Esimerkki: execution.execute(request, body). |
Mukautettu otsikkojäljitys Spring Bootissa
Yksi avainkomponenteista tämän ongelman ratkaisemisessa on CustomTraceFilter. Tämä suodatin laajentaa OncePerRequestFilter luokassa, varmistaen, että jäljitysotsikon logiikka suoritetaan vain kerran jokaista HTTP-pyyntöä kohden. Spring Bootin suodattimet ovat uskomattoman hyödyllisiä, kun pyyntöjä tai vastauksia muutetaan maailmanlaajuisesti. Esimerkiksi jos asiakas lähettää jäljitystietoja, kuten ot-custom-traceid tai ot-custom-spanid mukautetuissa otsikoissa tämä suodatin sieppaa pyynnön, poimii nämä otsikot ja välittää ne Mapped Diagnostic Context -kontekstiin (MDC). Lisäämällä jäljitystunnukset MDC:hen varmistamme, että nämä tunnisteet näkyvät pyynnön käsittelyn aikana luoduissa lokeissa.
MDC on kriittinen osa kirjauskehyksiä, kuten SLF4J ja Logback. Sen avulla voimme tallentaa nykyisen säikeen kontekstitietoja, kuten mukautettuja jäljitystunnuksia. Käyttämällä komentoja, kuten MDC.put ja MDC.selkeä, varmistamme, että lokijärjestelmä sisältää jäljitystiedot ja välttää kontaminaatiota samanaikaisten pyyntöjen välillä. Jos Client Two esimerkiksi lähettää "ot-custom-traceid" muodossa "8f7ebd8a73f9a8f50e6a00a87a20952a", tämä tunnus tallennetaan MDC:hen ja sisällytetään kaikkiin loppupään lokeihin, mikä luo johdonmukaisen jäljityspolun.
Toisaalta lähtevissä HTTP-pyynnöissä RestTemplate sieppaaja on tärkeä rooli. Toteuttamalla ClientHttpRequestInterceptor, voimme liittää samat jäljitysotsikot ("ot-custom-traceid" ja "ot-custom-spanid") lähteviin pyyntöihin. Tämä varmistaa, että jäljityksen jatkuvuus säilyy, kun sovellus kutsuu muita mikropalveluita. Kun palvelin esimerkiksi käsittelee pyynnön, jonka jäljitystunnus on `8f7ebd8a73f9a8f50e6a00a87a20952a`, se liittää tämän tunnuksen lähteviin otsikoihin, jotta alavirran palvelut voivat tunnistaa ja välittää jäljityksen saumattomasti.
Lopuksi MockMvc:lla kirjoitetut yksikkötestit vahvistavat koko asennuksen simuloimalla HTTP-pyyntöjä ja tarkistamalla otsikon etenemisen. Tosimaailman sovelluksissa testaus on ratkaisevan tärkeää sen varmistamiseksi, että jäljitysotsikot käsitellään oikein. Esimerkiksi lähettämällä GET-pyynnön mukautetuilla otsikoilla ja tarkastamalla vastauksen tai lokit, voimme varmistaa, että suodatin ja sieppaaja toimivat odotetulla tavalla. Tämä kattava lähestymistapa ratkaisee haasteen turvautumatta vanhoihin riippuvuuksiin, kuten Spring Cloud Sleuth. Loppujen lopuksi suodattimien, sieppaajien ja MDC:n yhdistelmä varmistaa jäljityksen jatkuvuuden jopa silloin, kun asiakkaat käyttävät mukautettuja otsikoita, mikä tekee järjestelmästä vankan ja täysin havaittavan. 🌟
Mukautettujen jäljitysotsikoiden levittäminen Spring Bootissa 3.4
Javan käyttö Spring Boot 3.4:n ja Micrometerin kanssa taustakäsittelyyn
// 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;
}
}
Yksikkötesti mukautetun jäljityksen otsikon levittämiseksi
Testaus JUnitilla ja MockMvc:llä jäljityksen otsikon leviämisen vahvistamiseksi
// 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());
}
}
Mukautettujen otsikoiden lisääminen HTTP-pyynnöissä RestTemplatea käyttämällä
RestTemplate Interceptors -ohjelman käyttö mukautettujen otsikoiden lisäämiseen lähteviin pyyntöihin
// 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;
}
}
Mukautettujen otsikkojälkien käsittely OpenTelemetryllä Spring Bootissa 3.4
Kun työskentelet Spring Boot 3.4:n kanssa, toinen tehokas tapa levittää jälkiä mukautetuista otsikoista on integroida OpenTelemetry. OpenTelemetry, avoimen lähdekoodin havainnointikehys, auttaa instrumentoimaan, keräämään ja viemään jälkiä saumattomasti. Se tarjoaa mekanismeja jäljityskontekstin poimimiseen ja lisäämiseen, mukaan lukien mukautetut otsikot, kuten ot-custom-traceid ja ot-custom-spanid, sovellukseesi. Hyödyntämällä OpenTelemetryn TextMapPropagatoria voit kuroa umpeen epätyypillisten asiakkaiden ja havainnointijärjestelmäsi välisen kuilun.
OpenTelemetryn käyttämiseksi Spring Boot 3.4:ssä voidaan ottaa käyttöön mukautettu levittäjä, joka poimii jäljitystiedot mukautetuista otsikoista ja liittää ne nykyiseen jäljityskontekstiin. Esimerkiksi kun palvelimesi vastaanottaa saapuvan pyynnön Client Two -sovelluksesta, OpenTelemetry voi jäsentää mukautettuja otsikoita ja rekonstruoida alkuperäisen jäljityskontekstin. Tämä varmistaa, että loppupään palvelut näkevät samat jäljitystunnukset, mikä mahdollistaa päästä päähän -näkyvyyden. Toisin kuin vanhemmat ratkaisut, kuten Spring Cloud Sleuth, OpenTelemetry on kevyt ja vastaa nykyaikaisia havainnointistandardeja.
Yhdistämällä OpenTelemetryn levittäjän Mikrometriin voit rikastuttaa mittareitasi ja lokitietojasi jäljitystiedoilla. Kuvittele, että näet sekä Client One- että Client Two -pyyntöjen jäljet saumattomasti havainnointityökalussasi. OpenTelemetry tukee automaattisesti integraatioita Prometheuksen, Zipkinin tai Jaegerin kanssa, jolloin voit keskittää jäljityksen visualisoinnin. Tämä lähestymistapa varmistaa, että vaikka mukautettuja otsikoita käytettäisiin, jäljitystietoja ei menetetä ja virheenkorjaus helpottuu huomattavasti. 🚀
Usein kysyttyjä kysymyksiä mukautettujen jälkien levittämisestä Spring Bootissa
- Kuinka puran mukautetut jäljitysotsikot manuaalisesti Spring Bootissa?
- Voit käyttää request.getHeader("custom-header") noutaaksesi tietyn otsikon manuaalisesti ja lisätäksesi sen MDC:hen käyttämällä MDC.put("traceId", value).
- Mitä hyötyä on OpenTelemetryn käyttämisestä mukautettuun jäljityksen levittämiseen?
- OpenTelemetry tarjoaa modernin, toimittajaneutraalin lähestymistavan jälkien, mukaan lukien mukautettujen otsikoiden, levittämiseen mikropalveluissa.
- Voinko levittää mukautettuja otsikoita RestTemplatella Spring Bootissa?
- Kyllä, ottamalla käyttöön ClientHttpRequestInterceptor, voit liittää lähteviin pyyntöihin mukautettuja otsikoita, kuten traceid ja spanid.
- Kuinka rekisteröin suodattimen otsikoiden kaappaamiseksi maailmanlaajuisesti?
- Voit luoda suodattimen, joka laajentaa OncePerRequestFilteriä, ja rekisteröidä sen FilterRegistrationBeanilla kaapataksesi kaikkien päätepisteiden otsikot.
- Mitä työkaluja voin käyttää Spring Bootin jälkien visualisointiin?
- Työkalut, kuten Zipkin, Jaeger ja Prometheus, voidaan integroida Spring Bootin ja OpenTelemetryn kanssa päästäkseen päähän -jälkien visualisoimiseksi.
Saumattoman jäljityksen jatkuvuuden varmistaminen
Nykyaikaisissa järjestelmissä mukautettujen jäljitysotsikoiden käsittely on kriittistä luotettavan havainnoinnin kannalta. Käyttämällä suodattimia ja sieppaajia voit kaapata asiakkaan toimittamat jäljitystiedot ja levittää niitä oikein palveluissasi. Tämä välttää hajanaiset lokit ja puuttuvat jäljet. 🔍
Spring Boot 3.4 yhdistettynä Micrometerin tai OpenTelemetryn kanssa mahdollistaa kestäviä ratkaisuja turvautumatta vanhempiin työkaluihin, kuten Spring Cloud Sleuth. Olitpa sitten tekemisissä Client One -sovelluksen vakiootsikoiden tai Client Twon mukautettujen otsikoiden kanssa, näiden tekniikoiden käyttöönotto siltaa jäljitysaukot tehokkaasti. 🚀
Lähteet ja viitteet
- Spring Bootin virallinen dokumentaatio: Jäljityskontekstien leviäminen. Kevään käynnistysdokumentaatio
- OpenTelemetry Java-kehittäjille: opas jäljityksen levittämiseen. OpenTelemetry Java
- Mikrometrihavainnon dokumentaatio: Mukautettujen jäljitysotsikoiden integrointi. Mikrometrin havaittavuus
- SLF4J Logging API: Mapped Diagnostic Context (MDC) käyttötapaukset. SLF4J käsikirja