$lang['tuto'] = "návody"; ?> Ako používať Spring Boot 3.4 na šírenie stôp z

Ako používať Spring Boot 3.4 na šírenie stôp z vlastných hlavičiek

Temp mail SuperHeros
Ako používať Spring Boot 3.4 na šírenie stôp z vlastných hlavičiek
Ako používať Spring Boot 3.4 na šírenie stôp z vlastných hlavičiek

Spracovanie vlastných stôp hlavičky v systéme Spring Boot 3.4

Predstavte si, že máte webovú službu Spring Boot 3.4, ktorá bezproblémovo spolupracuje s dvoma klientmi. Prvý klient používa Spring Boot 3+, vďaka čomu je šírenie stopy hračkou. Bez akéhokoľvek ďalšieho úsilia získate krásnu kontinuitu sledovania od začiatku do konca 🪄. Záznamy sa zdajú byť čisté a spojené, akoby mávnutím čarovného prútika.

Veci sa však obrátia, keď do hry vstúpi klient dva. Namiesto štandardných hlavičiek sledovania odosielajú vlastné hlavičky ako „ot-custom-traceid“ a „ot-custom-spanid“. Zatiaľ čo tieto vlastné hlavičky obsahujú platné informácie o sledovaní, Spring Boot nedokáže šíriť tieto stopy. Výsledok? Stratíte možnosť spájať klientske stopy s protokolmi na strane servera.

To vytvára medzeru v pozorovateľnosti. Pri prvom klientovi vidíte celú cestu požiadavky naprieč službami. Pre klienta 2 vidíte iba protokoly na strane servera, chýba im kritická stopa klienta. Je to ako keby ste videli polovicu puzzle – viete, že niečo chýba, ale neviete poskladať kúsky. 😓

V tomto článku preskúmame, ako tento problém vyriešiť bez spoliehania sa na Spring Cloud Sleuth, pričom zostaneme verní ekosystému Spring Boot 3.4. Na konci budete vedieť, ako šíriť a pokračovať v trasách z vlastných hlavičiek, čím sa zabezpečí bezproblémová pozorovateľnosť v rámci vášho systému.

Príkaz Príklad použitia
MDC.put Tento príkaz pridá páry kľúč-hodnota do Mapped Diagnostic Context (MDC), čo umožňuje zahrnúť vlastné ID sledovania do protokolov. Napríklad MDC.put("traceId", "12345").
MDC.clear Po spracovaní požiadavky vymaže všetky položky z MDC, aby sa predišlo stopovej kontaminácii medzi požiadavkami. Napríklad MDC.clear().
OncePerRequestFilter Filter Spring Boot, ktorý zaisťuje, že logika filtra sa vykoná iba raz na požiadavku HTTP, čo je ideálne na sledovanie hlavičiek. Príklad: verejná trieda CustomTraceFilter rozširuje OncePerRequestFilter.
filterChain.doFilter Prejde na ďalší filter v reťazci, čím sa zabezpečí, že požiadavka bude pokračovať cez ďalšie filtre. Napríklad filterChain.doFilter(požiadavka, odpoveď).
RestTemplate.getInterceptors() Načíta zoznam zachytávačov pre inštanciu RestTemplate, čo umožňuje pridanie vlastných zachytávačov. Príklad: restTemplate.getInterceptors().add(new CustomInterceptor()).
ClientHttpRequestInterceptor Rozhranie na zachytávanie odchádzajúcich požiadaviek HTTP a pridávanie vlastných hlavičiek. Napríklad implementácia ClientHttpRequestInterceptor na vloženie ID sledovania.
HttpServletRequest.getHeader Extrahuje hodnotu špecifickej hlavičky HTTP z prichádzajúcej požiadavky. Príklad: request.getHeader("ot-custom-traceid").
FilterRegistrationBean Registruje vlastné filtre v aplikácii Spring Boot. Napríklad: registrationBean.setFilter(new CustomTraceFilter()).
MockMvc.perform Simuluje požiadavky HTTP v testoch jednotiek pre aplikácie Spring Boot. Príklad: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")).
ClientHttpRequestExecution.execute Vykoná zachytenú požiadavku HTTP s poskytnutým telom požiadavky a hlavičkami. Príklad: prevedenie.execute(žiadosť, telo).

Vlastné šírenie stopy hlavičky v Spring Boot

Jedným z kľúčových komponentov pri riešení tohto problému je CustomTraceFilter. Tento filter predlžuje OncePerRequestFilter triedy, čím sa zabezpečí, že logika hlavičky sledovania sa spustí iba raz pre každú požiadavku HTTP. Filtre v aplikácii Spring Boot sú neuveriteľne užitočné pri globálnej úprave požiadaviek alebo odpovedí. Napríklad, ak klient pošle informácie o sledovaní ako ot-custom-traceid alebo ot-custom-spanid vo vlastných hlavičkách tento filter zachytí požiadavku, extrahuje tieto hlavičky a rozšíri ich do Mapovaného diagnostického kontextu (MDC). Pridaním identifikátorov sledovania do MDC zaisťujeme, že tieto identifikátory sú viditeľné v protokoloch generovaných počas spracovania požiadavky.

MDC je kritickou súčasťou protokolovacích rámcov, ako sú SLF4J a Logback. Umožňuje nám ukladať kontextové informácie pre aktuálne vlákno, ako sú napríklad vlastné ID sledovania. Pomocou príkazov ako MDC.put a MDC.clear, zabezpečíme, aby protokolovací systém obsahoval podrobnosti o sledovaní a zabránil kontaminácii medzi súbežnými požiadavkami. Ak napríklad klient dva odošle `ot-custom-traceid` ako `8f7ebd8a73f9a8f50e6a00a87a20952a`, toto ID sa uloží do MDC a zahrnie sa do všetkých protokolov v smere toku, čím sa vytvorí konzistentná cesta sledovania.

Na druhej strane, pre odchádzajúce HTTP požiadavky hrá RestTemplate interceptor podstatnú úlohu. Realizáciou ClientHttpRequestInterceptor, môžeme k odchádzajúcim požiadavkám pripojiť rovnaké hlavičky sledovania (`ot-custom-traceid` a `ot-custom-spanid`). To zaisťuje zachovanie kontinuity sledovania, keď aplikácia volá iné mikroslužby. Napríklad, keď server spracuje požiadavku s ID sledovania `8f7ebd8a73f9a8f50e6a00a87a20952a`, pripojí toto ID k odchádzajúcim hlavičkám, takže následné služby môžu sledovanie hladko rozpoznať a šíriť.

Nakoniec testy jednotiek napísané pomocou MockMvc overia celé nastavenie simuláciou požiadaviek HTTP a overením šírenia hlavičiek. V reálnych aplikáciách je testovanie rozhodujúce, aby sa zabezpečilo správne spracovanie hlavičiek sledovania. Napríklad odoslaním požiadavky GET s vlastnými hlavičkami a skontrolovaním odpovede alebo protokolov môžeme potvrdiť, že filter a zachytávač fungujú podľa očakávania. Tento komplexný prístup rieši problém bez spoliehania sa na staršie závislosti, ako je Spring Cloud Sleuth. V konečnom dôsledku kombinácia filtrov, zachytávačov a MDC zaisťuje kontinuitu sledovania, aj keď klienti používajú vlastné hlavičky, vďaka čomu je systém robustný a plne pozorovateľný. 🌟

Propagácia vlastných hlavičiek sledovania v systéme Spring Boot 3.4

Použitie Java s Spring Boot 3.4 a Micrometer pre Backend Processing

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

Test jednotky pre vlastné šírenie hlavičky sledovania

Testovanie pomocou JUnit a MockMvc na overenie šírenia hlavičky sledovania

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

Propagácia vlastných hlavičiek v požiadavkách HTTP pomocou šablóny RestTemplate

Používanie zachytávačov RestTemplate na pridávanie vlastných hlavičiek do odchádzajúcich požiadaviek

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

Spracovanie vlastných stôp hlavičky pomocou OpenTelemetry v Spring Boot 3.4

Pri práci s Spring Boot 3.4 je ďalším účinným prístupom k šíreniu stôp z vlastných hlavičiek integrácia OpenTelemetry. OpenTelemetry, open-source rámec pozorovateľnosti, pomáha bezproblémovo prístrojovať, zhromažďovať a exportovať stopy. Poskytuje mechanizmy na extrakciu a vloženie kontextu sledovania vrátane vlastných hlavičiek, ako sú ot-custom-traceid a ot-custom-spanid, do vašej aplikácie. Využitím TextMapPropagator od OpenTelemetry môžete preklenúť priepasť medzi neštandardnými klientmi a vaším systémom pozorovania.

Na použitie OpenTelemetry v Spring Boot 3.4 je možné implementovať vlastný propagátor na extrahovanie informácií o sledovaní z vlastných hlavičiek a ich pripojenie k aktuálnemu kontextu sledovania. Napríklad, keď váš server dostane prichádzajúcu požiadavku od klienta 2, OpenTelemetry môže analyzovať vlastné hlavičky a rekonštruovať pôvodný kontext sledovania. To zaisťuje, že nadväzujúce služby vidia rovnaké ID sledovania, čo umožňuje viditeľnosť od začiatku do konca. Na rozdiel od starších riešení, ako je Spring Cloud Sleuth, je OpenTelemetry ľahká a je v súlade s modernými štandardmi pozorovateľnosti.

Kombináciou propagátora OpenTelemetry s Mikrometrom môžete obohatiť svoje metriky a protokolovanie o informácie o sledovaní. Predstavte si, že vo svojom nástroji na sledovanie bez problémov vidíte stopy pre požiadavky prichádzajúce od klienta 1 aj klienta 2. OpenTelemetry automaticky podporuje integráciu s Prometheus, Zipkin alebo Jaeger, čo vám umožňuje centralizovať vizualizáciu sledovania. Tento prístup zaisťuje, že aj keď sú zahrnuté vlastné hlavičky, nestratia sa žiadne údaje sledovania a ladenie sa výrazne zjednoduší. 🚀

Často kladené otázky o šírení vlastných stôp v Spring Boot

  1. Ako manuálne extrahujem vlastné hlavičky sledovania v aplikácii Spring Boot?
  2. Pomocou request.getHeader("custom-header") môžete manuálne načítať konkrétnu hlavičku a pridať ju do MDC pomocou MDC.put("traceId", hodnota).
  3. Aká je výhoda používania OpenTelemetry na vlastné šírenie sledovania?
  4. OpenTelemetry poskytuje moderný, dodávateľsky neutrálny prístup k šíreniu stôp, vrátane vlastných hlavičiek, cez mikroslužby.
  5. Môžem šíriť vlastné hlavičky pomocou šablóny RestTemplate v aplikácii Spring Boot?
  6. Áno, implementáciou ClientHttpRequestInterceptor môžete k odchádzajúcim požiadavkám pripojiť vlastné hlavičky ako traceid a spanid.
  7. Ako zaregistrujem filter na globálne zachytávanie hlavičiek?
  8. Môžete vytvoriť filter, ktorý rozširuje OncePerRequestFilter a zaregistrovať ho pomocou FilterRegistrationBean na zachytenie hlavičiek pre všetky koncové body.
  9. Aké nástroje môžem použiť na vizualizáciu stôp z aplikácie Spring Boot?
  10. Nástroje ako Zipkin, Jaeger a Prometheus sa dajú integrovať so Spring Boot a OpenTelemetry na vizualizáciu stôp od konca po koniec.

Zabezpečenie bezproblémovej kontinuity sledovania

V moderných systémoch je manipulácia s vlastnými hlavičkami sledovania kritická pre spoľahlivú pozorovateľnosť. Pomocou filtrov a zachytávačov môžete zachytiť informácie o sledovaní od klienta a správne ich šíriť vo vašich službách. Vyhnete sa tak fragmentovaným protokolom a chýbajúcim stopám. 🔍

Spring Boot 3.4 v kombinácii s Micrometer alebo OpenTelemetry umožňuje robustné riešenia bez spoliehania sa na staršie nástroje, ako je Spring Cloud Sleuth. Či už máte čo do činenia so štandardnými hlavičkami klienta 1 alebo vlastnými hlavičkami klienta 2, implementácia týchto techník efektívne premosťuje medzery v sledovaní. 🚀

Zdroje a odkazy
  1. Oficiálna dokumentácia Spring Boot: Propagation of Tracing Contexts. Spring Boot Documentation
  2. OpenTelemetry for Java Developers: Guide to Trace Propagation. OpenTelemetry Java
  3. Dokumentácia pozorovateľnosti mikrometra: Integrácia vlastných hlavičiek sledovania. Pozorovateľnosť mikrometrom
  4. SLF4J protokolovacie API: Prípady použitia mapovaného diagnostického kontextu (MDC). Manuál SLF4J