A Spring Boot 3.4 használata nyomok terjesztésére egyéni fejlécekből

Temp mail SuperHeros
A Spring Boot 3.4 használata nyomok terjesztésére egyéni fejlécekből
A Spring Boot 3.4 használata nyomok terjesztésére egyéni fejlécekből

Egyéni fejlécnyomok kezelése Spring Boot 3.4-ben

Képzelje el, hogy van egy Spring Boot 3.4 webszolgáltatása, amely zökkenőmentesen működik két klienssel. Az első kliens a Spring Boot 3+-ot használja, így a nyomkövetési terjesztés gyerekjáték. Minden extra erőfeszítés nélkül gyönyörű végtől végpontig terjedő nyomkövetési folytonosságot 🪄. A naplók tisztának és összefüggőnek tűnnek, mintha varázsütésre.

A dolgok azonban fordulatot vesznek, amikor a kliens kettes szóba kerül. A szabványos nyomkövetési fejlécek helyett olyan egyéni fejléceket küldenek, mint az "ot-custom-traceid" és az "ot-custom-spanid". Bár ezek az egyéni fejlécek érvényes nyomkövetési információkat tartalmaznak, a Spring Boot nem tudja továbbítani ezeket a nyomkövetéseket. Az eredmény? Elveszíti azt a képességét, hogy az ügyfélnyomkövetéseket kiszolgálóoldali naplókkal összekapcsolja.

Ez megfigyelhetőségi rést hoz létre. Az egyik ügyfél esetében láthatja a kérés teljes útvonalát a szolgáltatások között. A második ügyfél esetében csak a szerveroldali naplókat látja, hiányzik a kritikus ügyfélkövetés. Olyan, mintha egy fél puzzle-t látnál – tudod, hogy valami hiányzik, de nem tudod összerakni a darabokat. 😓

Ebben a cikkben azt fogjuk megvizsgálni, hogyan lehet megoldani ezt a problémát a Spring Cloud Sleuth-re támaszkodás nélkül, hűek maradva a Spring Boot 3.4 ökoszisztémához. A végére tudni fogja, hogyan terjesztheti és folytathatja az egyéni fejlécekből származó nyomkövetéseket, biztosítva a zökkenőmentes megfigyelhetőséget az egész rendszeren.

Parancs Használati példa
MDC.put Ez a parancs kulcs-érték párokat ad a Leképezett diagnosztikai kontextushoz (MDC), lehetővé téve az egyéni nyomkövetési azonosítók felvételét a naplókban. Például MDC.put("traceId", "12345").
MDC.clear A kérések feldolgozása után törli az összes bejegyzést az MDC-ről, hogy elkerülje a nyomkövetési szennyeződést a kérések között. Például MDC.clear().
OncePerRequestFilter Egy Spring Boot szűrő, amely biztosítja, hogy a szűrőlogika HTTP-kérésenként csak egyszer kerüljön végrehajtásra, ideális fejlécek nyomon követésére. Példa: Public Class CustomTraceFilter kiterjeszti az OncePerRequestFiltert.
filterChain.doFilter Továbblép a lánc következő szűrőjére, biztosítva, hogy a kérés más szűrőkön keresztül is folytatódjon. Például filterChain.doFilter(request, response).
RestTemplate.getInterceptors() Lekéri a RestTemplate példány elfogóinak listáját, lehetővé téve egyéni elfogók hozzáadását. Példa: restTemplate.getInterceptors().add(new CustomInterceptor()).
ClientHttpRequestInterceptor Interfész a kimenő HTTP-kérelmek lehallgatására és egyéni fejlécek hozzáadására. Például a ClientHttpRequestInterceptor megvalósítása nyomkövetési azonosítók beszúrásához.
HttpServletRequest.getHeader Kivonja egy adott HTTP-fejléc értékét a bejövő kérésből. Példa: request.getHeader("ot-custom-traceid").
FilterRegistrationBean Egyéni szűrőket regisztrál a Spring Boot alkalmazásban. Például: registerBean.setFilter(new CustomTraceFilter()).
MockMvc.perform HTTP kéréseket szimulál a Spring Boot alkalmazások egységtesztjei során. Példa: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")).
ClientHttpRequestExecution.execute Végrehajtja az elfogott HTTP-kérést a megadott kéréstörzstel és fejlécekkel. Példa: execution.execute(request, body).

Egyéni fejléc nyomkövetési terjesztése Spring Bootban

A probléma megoldásának egyik kulcsfontosságú összetevője a CustomTraceFilter. Ez a szűrő kiterjeszti a OncePerRequestFilter osztályban, biztosítva, hogy a nyomkövetési fejléc logikája csak egyszer futhasson minden HTTP-kéréshez. A Spring Boot szűrői hihetetlenül hasznosak a kérések vagy válaszok globális módosítása során. Például, ha az ügyfél nyomkövetési információkat küld, mint pl ot-custom-traceid vagy ot-custom-spanid az egyéni fejlécekben ez a szűrő elfogja a kérést, kibontja ezeket a fejléceket, és továbbítja a Mapped Diagnostic Context (MDC)-be. A nyomkövetési azonosítók hozzáadásával az MDC-hez biztosítjuk, hogy ezek az azonosítók láthatóak legyenek a kérésfeldolgozás során generált naplókban.

Az MDC a naplózási keretrendszerek, például az SLF4J és a Logback kritikus része. Lehetővé teszi az aktuális szál környezeti információinak, például egyéni nyomkövetési azonosítók tárolását. Olyan parancsok használata, mint pl MDC.put és MDC.tiszta, biztosítjuk, hogy a naplózási rendszer tartalmazza a nyomkövetési adatokat, és elkerülje az egyidejű kérések közötti szennyeződést. Például, ha a kettes ügyfél az "ot-custom-traceid" értéket "8f7ebd8a73f9a8f50e6a00a87a20952a" néven küldi el, akkor ezt az azonosítót a rendszer az MDC-ben tárolja, és az összes későbbi naplóban szerepel, következetes nyomkövetési útvonalat hozva létre.

Másrészt a kimenő HTTP-kéréseknél a RestTemplate elfogó alapvető szerepet játszik. Megvalósításával ClientHttpRequestInterceptor, ugyanazokat a nyomkövetési fejléceket (`ot-custom-traceid` és `ot-custom-spanid`) csatolhatjuk a kimenő kérésekhez. Ez biztosítja, hogy a nyomkövetési folytonosság megmaradjon, amikor az alkalmazás más mikroszolgáltatásokat hív meg. Például amikor a kiszolgáló feldolgozza a `8f7ebd8a73f9a8f50e6a00a87a20952a` nyomkövetési azonosítójú kérelmet, ezt az azonosítót csatolja a kimenő fejlécekhez, így a továbbmenő szolgáltatások zökkenőmentesen felismerhetik és terjeszthetik a nyomkövetést.

Végül a MockMvc-el írt egységtesztek a HTTP kérések szimulálásával és a fejléc terjedésének ellenőrzésével érvényesítik a teljes beállítást. A valós alkalmazásokban a tesztelés kulcsfontosságú a nyomkövetési fejlécek megfelelő kezelésének biztosításához. Például egy egyedi fejlécekkel ellátott GET kérés elküldésével és a válasz vagy a naplók ellenőrzésével megerősíthetjük, hogy a szűrő és az elfogó a várt módon működik. Ez az átfogó megközelítés megoldja a kihívást anélkül, hogy olyan örökölt függőségekre hagyatkozna, mint a Spring Cloud Sleuth. Végül a szűrők, elfogók és MDC kombinációja biztosítja a nyomkövetési folytonosságot még akkor is, ha az ügyfelek egyéni fejléceket használnak, így a rendszer robusztussá és teljes mértékben megfigyelhetővé válik. 🌟

Egyéni nyomkövetési fejlécek propagálása a Spring Boot 3.4-ben

Java használata Spring Boot 3.4-el és Micrometerrel a háttérfeldolgozáshoz

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

Egységteszt az egyéni nyomkövetési fejléc terjesztéséhez

Tesztelés JUnit és MockMvc segítségével a nyomkövetési fejlécek terjedésének érvényesítéséhez

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

Egyéni fejlécek terjesztése HTTP-kérésekben a RestTemplate használatával

RestTemplate elfogók használata egyéni fejlécek hozzáadásához a kimenő kérésekhez

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

Egyéni fejléc nyomkövetések kezelése OpenTelemetry segítségével a Spring Boot 3.4-ben

Amikor a Spring Boot 3.4 verzióval dolgozik, egy másik hatékony módszer az egyéni fejlécek nyomainak terjesztésére az integráció OpenTelemetry. Az OpenTelemetry, egy nyílt forráskódú megfigyelési keretrendszer, segít a nyomkövetések zökkenőmentesen műszerezni, összegyűjteni és exportálni. Mechanizmusokat biztosít a nyomkövetési kontextus kinyerésére és beillesztésére, beleértve az egyéni fejléceket is ot-custom-traceid és ot-custom-spanid, az alkalmazásába. Az OpenTelemetry TextMapPropagator-jának kihasználásával áthidalhatja a szakadékot a nem szabványos kliensek és a megfigyelési rendszere között.

Az OpenTelemetry használatához a Spring Boot 3.4-ben egy egyéni propagátor valósítható meg, amely nyomkövetési információkat nyer ki az egyéni fejlécekből, és csatolja azokat az aktuális nyomkövetési kontextushoz. Például, ha a szervere bejövő kérést kap a második ügyféltől, az OpenTelemetry képes elemezni az egyéni fejléceket, és rekonstruálni az eredeti nyomkövetési kontextust. Ez biztosítja, hogy a downstream szolgáltatások ugyanazokat a nyomkövetési azonosítókat lássák, lehetővé téve a végpontok közötti láthatóságot. A régebbi megoldásoktól, például a Spring Cloud Sleuth-tól eltérően az OpenTelemetry könnyű, és megfelel a modern megfigyelési szabványoknak.

Az OpenTelemetry propagátorának a Mikrométerrel kombinálásával nyomon követési információkkal gazdagíthatja metrikáit és naplózását. Képzelje el, hogy a megfigyelési eszközben zökkenőmentesen látja az első és második ügyféltől érkező kérések nyomait. Az OpenTelemetry automatikusan támogatja a Prometheus, Zipkin vagy Jaeger integrációját, lehetővé téve a nyomkövetési megjelenítés központosítását. Ez a megközelítés biztosítja, hogy még egyéni fejlécek esetén se vesszenek el nyomkövetési adatok, és a hibakeresés jelentősen könnyebbé válik. 🚀

Gyakran ismételt kérdések az egyéni nyomok terjesztésével kapcsolatban a Spring Boot rendszerben

  1. Hogyan bonthatom ki manuálisan az egyéni nyomkövetési fejléceket a Spring Boot alkalmazásban?
  2. A request.getHeader("custom-header") használatával manuálisan lekérhet egy adott fejlécet, és hozzáadhatja az MDC-hez az MDC.put("traceId", value) használatával.
  3. Milyen előnyökkel jár az OpenTelemetry használata egyéni nyomkövetési terjesztéshez?
  4. Az OpenTelemetry modern, gyártó-semleges megközelítést biztosít a nyomkövetések, köztük az egyéni fejlécek mikroszolgáltatásokon keresztüli terjesztéséhez.
  5. Terjeszthetek egyéni fejléceket a RestTemplate segítségével a Spring Boot rendszerben?
  6. Igen, a ClientHttpRequestInterceptor implementálásával egyéni fejléceket, például traceid és spanid csatolhat a kimenő kérésekhez.
  7. Hogyan regisztrálhatok egy szűrőt a fejlécek globális rögzítéséhez?
  8. Létrehozhat egy szűrőt, amely kiterjeszti az OncePerRequestFilter elemet, és regisztrálhatja a FilterRegistrationBean használatával, hogy rögzítse az összes végpont fejléceit.
  9. Milyen eszközökkel jeleníthetem meg a Spring Boot nyomait?
  10. Az olyan eszközök, mint a Zipkin, Jaeger és Prometheus, integrálhatók a Spring Boot-tal és az OpenTelemetry-vel a végpontok közötti nyomkövetések megjelenítéséhez.

A zökkenőmentes nyomkövetési folytonosság biztosítása

A modern rendszerekben az egyéni nyomkövetési fejlécek kezelése kritikus fontosságú a megbízható megfigyelhetőség érdekében. Szűrők és elfogók használatával rögzítheti az ügyfél által biztosított nyomkövetési információkat, és azokat megfelelően terjesztheti a szolgáltatások között. Ezzel elkerülhető a töredezett naplók és a hiányzó nyomok. 🔍

A Spring Boot 3.4 a Micrometerrel vagy az OpenTelemetry-vel kombinálva robusztus megoldásokat tesz lehetővé anélkül, hogy olyan régebbi eszközökre kellene támaszkodnia, mint a Spring Cloud Sleuth. Függetlenül attól, hogy a Client One szabványos fejléceivel vagy a Client Two egyéni fejléceivel foglalkozik, ezeknek a technikáknak a megvalósítása hatékonyan áthidalja a nyomkövetési hézagokat. 🚀

Források és hivatkozások
  1. Spring Boot hivatalos dokumentációja: Propagation of Tracing Contexts. Tavaszi rendszerindítási dokumentáció
  2. OpenTelemetry Java fejlesztőknek: Útmutató a nyomkövetési terjesztéshez. OpenTelemetry Java
  3. Mikrométeres megfigyelhetőségi dokumentáció: Egyedi nyomkövetési fejlécek integrálása. Mikrométeres megfigyelhetőség
  4. SLF4J Logging API: Mapped Diagnostic Context (MDC) használati esetek. SLF4J kézikönyv