$lang['tuto'] = "tutorial"; ?> Cara Menggunakan Spring Boot 3.4 untuk Menyebarkan Jejak

Cara Menggunakan Spring Boot 3.4 untuk Menyebarkan Jejak daripada Pengepala Tersuai

Cara Menggunakan Spring Boot 3.4 untuk Menyebarkan Jejak daripada Pengepala Tersuai
Tracing

Mengendalikan Jejak Pengepala Tersuai dalam But Spring 3.4

Bayangkan anda mempunyai perkhidmatan web Spring Boot 3.4 yang berfungsi dengan lancar dengan dua pelanggan. Pelanggan pertama menggunakan Spring Boot 3+, menjadikan penyebaran surih menjadi mudah. Tanpa sebarang usaha tambahan, anda akan mendapat kesinambungan jejak hujung ke hujung yang cantik 🪄. Log kelihatan bersih dan bersambung, seolah-olah dengan sihir.

Walau bagaimanapun, keadaan berubah apabila klien dua mula bermain. Daripada pengepala pengesanan standard, mereka menghantar pengepala tersuai seperti `ot-custom-traceid` dan `ot-custom-spanid`. Walaupun pengepala tersuai ini mengandungi maklumat jejak yang sah, Spring Boot gagal menyebarkan jejak ini. Hasilnya? Anda kehilangan keupayaan untuk menyambungkan jejak pelanggan dengan log sebelah pelayan.

Ini mewujudkan jurang pemerhatian. Untuk pelanggan satu, anda melihat laluan penuh permintaan merentas perkhidmatan. Untuk pelanggan dua, anda hanya melihat log sebelah pelayan, hilang jejak pelanggan kritikal. Ia seperti melihat separuh teka-teki—anda tahu ada sesuatu yang hilang tetapi tidak dapat menyusun kepingan itu. 😓

Dalam artikel ini, kami akan meneroka cara untuk menyelesaikan masalah ini tanpa bergantung pada Spring Cloud Sleuth, tetap setia pada ekosistem Spring Boot 3.4. Pada akhirnya, anda akan tahu cara menyebarkan dan meneruskan jejak daripada pengepala tersuai, memastikan kebolehmerhatian yang lancar di seluruh sistem anda.

Perintah Contoh penggunaan
MDC.put Perintah ini menambah pasangan nilai kunci pada Konteks Diagnostik Dipetakan (MDC), membenarkan ID surih tersuai disertakan dalam log. Contohnya, MDC.put("traceId", "12345").
MDC.clear Kosongkan semua entri daripada MDC selepas permintaan diproses untuk mengelakkan kesan pencemaran antara permintaan. Contohnya, MDC.clear().
OncePerRequestFilter Penapis Spring Boot yang memastikan logik penapis dilaksanakan sekali sahaja bagi setiap permintaan HTTP, sesuai untuk mengesan pengepala. Contoh: CustomTraceFilter kelas awam memanjangkan OncePerRequestFilter.
filterChain.doFilter Teruskan ke penapis seterusnya dalam rantaian, memastikan permintaan diteruskan melalui penapis lain. Contohnya, filterChain.doFilter(permintaan, respons).
RestTemplate.getInterceptors() Mendapatkan semula senarai pemintas untuk contoh RestTemplate, membenarkan pemintas tersuai ditambah. Contoh: restTemplate.getInterceptors().add(New CustomInterceptor()).
ClientHttpRequestInterceptor Antara muka untuk memintas permintaan HTTP keluar dan menambah pengepala tersuai. Contohnya, melaksanakan ClientHttpRequestInterceptor untuk memasukkan ID surih.
HttpServletRequest.getHeader Mengekstrak nilai pengepala HTTP tertentu daripada permintaan masuk. Contoh: request.getHeader("ot-custom-traceid").
FilterRegistrationBean Mendaftarkan penapis tersuai dalam aplikasi Spring Boot. Contohnya: registrationBean.setFilter(New CustomTraceFilter()).
MockMvc.perform Mensimulasikan permintaan HTTP dalam ujian unit untuk aplikasi Spring Boot. Contoh: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")).
ClientHttpRequestExecution.execute Melaksanakan permintaan HTTP yang dipintas dengan badan dan pengepala permintaan yang disediakan. Contoh: execution.execute(request, body).

Penyebaran Surih Pengepala Tersuai dalam But Spring

Salah satu komponen utama dalam menyelesaikan isu ini ialah CustomTraceFilter. Penapis ini memanjangkan kelas, memastikan logik pengepala surih berjalan sekali sahaja untuk setiap permintaan HTTP. Penapis dalam Spring Boot amat berguna apabila mengubah suai permintaan atau respons secara global. Sebagai contoh, jika pelanggan menghantar maklumat pengesanan seperti atau dalam pengepala tersuai, penapis ini memintas permintaan, mengekstrak pengepala ini dan menyebarkannya ke dalam Konteks Diagnostik Dipetakan (MDC). Dengan menambahkan ID surih pada MDC, kami memastikan pengecam ini kelihatan dalam log yang dijana semasa pemprosesan permintaan.

MDC adalah bahagian penting dalam rangka kerja pembalakan seperti SLF4J dan Logback. Ia membolehkan kami menyimpan maklumat kontekstual untuk urutan semasa, seperti ID surih tersuai. Menggunakan arahan seperti dan , kami memastikan bahawa sistem pembalakan termasuk butiran surih dan mengelakkan pencemaran antara permintaan serentak. Contohnya, jika Client Two menghantar `ot-custom-traceid` sebagai `8f7ebd8a73f9a8f50e6a00a87a20952a`, ID ini disimpan dalam MDC dan disertakan dalam semua log hiliran, mewujudkan laluan jejak yang konsisten.

Sebaliknya, untuk permintaan HTTP keluar, Pemintas RestTemplate memainkan peranan penting. Dengan melaksanakan , kita boleh melampirkan pengepala surih yang sama (`ot-custom-traceid` dan `ot-custom-spanid`) pada permintaan keluar. Ini memastikan bahawa kesinambungan jejak dikekalkan apabila aplikasi memanggil perkhidmatan mikro lain. Sebagai contoh, apabila pelayan memproses permintaan dengan ID surih `8f7ebd8a73f9a8f50e6a00a87a20952a`, ia melampirkan ID ini pada pengepala keluar, jadi perkhidmatan hiliran boleh mengecam dan menyebarkan surih dengan lancar.

Akhir sekali, ujian unit yang ditulis dengan MockMvc mengesahkan keseluruhan persediaan dengan mensimulasikan permintaan HTTP dan mengesahkan penyebaran pengepala. Dalam aplikasi dunia sebenar, ujian adalah penting untuk memastikan pengepala surih dikendalikan dengan betul. Contohnya, dengan menghantar permintaan GET dengan pengepala tersuai dan memeriksa respons atau log, kami boleh mengesahkan bahawa penapis dan pemintas berfungsi seperti yang diharapkan. Pendekatan komprehensif ini menyelesaikan cabaran tanpa bergantung pada kebergantungan warisan seperti Spring Cloud Sleuth. Akhirnya, gabungan penapis, pemintas dan MDC memastikan kesinambungan jejak walaupun pelanggan menggunakan pengepala tersuai, menjadikan sistem itu teguh dan boleh diperhatikan sepenuhnya. 🌟

Menyebarkan Pengepala Pengesanan Tersuai dalam But Spring 3.4

Menggunakan Java dengan Spring Boot 3.4 dan Micrometer untuk Pemprosesan Bahagian Belakang

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

Ujian Unit untuk Penyebaran Tajuk Jejak Tersuai

Menguji dengan JUnit dan MockMvc untuk Mengesahkan Penyebaran Pengepala Surih

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

Menyebarkan Pengepala Tersuai dalam Permintaan HTTP Menggunakan RestTemplate

Menggunakan RestTemplate Interceptors untuk Menambah Pengepala Tersuai dalam Permintaan Keluar

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

Mengendalikan Jejak Pengepala Tersuai dengan OpenTelemetry dalam But Spring 3.4

Apabila bekerja dengan Spring Boot 3.4, satu lagi pendekatan berkuasa untuk menyebarkan jejak daripada pengepala tersuai ialah dengan menyepadukan . OpenTelemetry, rangka kerja pemerhatian sumber terbuka, membantu instrumen, mengumpul dan mengeksport jejak dengan lancar. Ia menyediakan mekanisme untuk mengekstrak dan menyuntik konteks jejak, termasuk pengepala tersuai seperti dan , ke dalam permohonan anda. Dengan memanfaatkan TextMapPropagator OpenTelemetry, anda boleh merapatkan jurang antara pelanggan bukan standard dan sistem pemerhatian anda.

Untuk menggunakan OpenTelemetry dalam Spring Boot 3.4, propagator tersuai boleh dilaksanakan untuk mengekstrak maklumat pengesanan daripada pengepala tersuai dan melampirkannya pada konteks jejak semasa. Contohnya, apabila pelayan anda menerima permintaan masuk daripada Client Two, OpenTelemetry boleh menghuraikan pengepala tersuai dan membina semula konteks jejak asal. Ini memastikan perkhidmatan hiliran melihat ID surih yang sama, membolehkan keterlihatan hujung ke hujung. Tidak seperti penyelesaian lama seperti Spring Cloud Sleuth, OpenTelemetry adalah ringan dan sejajar dengan piawaian kebolehmerhatian moden.

Dengan menggabungkan propagator OpenTelemetry dengan Micrometer, anda boleh memperkayakan metrik dan pengelogan anda dengan maklumat surih. Bayangkan melihat kesan untuk permintaan yang datang daripada kedua-dua Klien Satu dan Klien Dua dengan lancar dalam alat pemerhatian anda. OpenTelemetry secara automatik menyokong penyepaduan dengan Prometheus, Zipkin atau Jaeger, membolehkan anda memusatkan visualisasi surih. Pendekatan ini memastikan bahawa walaupun pengepala tersuai terlibat, tiada data surih hilang dan penyahpepijatan menjadi lebih mudah. 🚀

  1. Bagaimanakah cara saya mengekstrak pengepala surih tersuai secara manual dalam Spring Boot?
  2. Anda boleh menggunakan request.getHeader("custom-header") untuk mengambil secara manual pengepala tertentu dan menambahkannya pada MDC menggunakan MDC.put("traceId", value).
  3. Apakah faedah menggunakan OpenTelemetry untuk penyebaran surih tersuai?
  4. OpenTelemetry menyediakan pendekatan moden, neutral vendor untuk menyebarkan jejak, termasuk pengepala tersuai, merentas perkhidmatan mikro.
  5. Bolehkah saya menyebarkan pengepala tersuai dengan RestTemplate dalam Spring Boot?
  6. Ya, dengan melaksanakan ClientHttpRequestInterceptor, anda boleh melampirkan pengepala tersuai seperti traceid dan spanid pada permintaan keluar.
  7. Bagaimanakah cara saya mendaftarkan penapis untuk menangkap pengepala di seluruh dunia?
  8. Anda boleh membuat penapis yang memanjangkan OncePerRequestFilter dan mendaftarkannya menggunakan FilterRegistrationBean untuk menangkap pengepala untuk semua titik akhir.
  9. Apakah alatan yang boleh saya gunakan untuk menggambarkan kesan daripada Spring Boot?
  10. Alat seperti Zipkin, Jaeger dan Prometheus boleh disepadukan dengan Spring Boot dan OpenTelemetry untuk menggambarkan jejak hujung ke hujung.

Dalam sistem moden, pengendalian pengepala surih tersuai adalah penting untuk kebolehcerap yang boleh dipercayai. Dengan menggunakan penapis dan pemintas, anda boleh menangkap maklumat pengesanan yang disediakan oleh pelanggan dan menyebarkannya dengan betul ke seluruh perkhidmatan anda. Ini mengelakkan log berpecah-belah dan jejak yang hilang. 🔍

Spring Boot 3.4, digabungkan dengan Micrometer atau OpenTelemetry, membenarkan penyelesaian yang mantap tanpa bergantung pada alatan lama seperti Spring Cloud Sleuth. Sama ada anda berurusan dengan pengepala standard Client One atau pengepala tersuai Client Two, melaksanakan teknik ini merapatkan jurang surih dengan cekap. 🚀

  1. Dokumentasi Rasmi Spring Boot: Penyebaran Konteks Pengesanan. Dokumentasi Spring Boot
  2. OpenTelemetry untuk Pembangun Java: Panduan Mengesan Penyebaran. OpenTelemetry Java
  3. Dokumentasi Kebolehcerapan Mikrometer: Mengintegrasikan Pengepala Surih Tersuai. Kebolehlihatan Mikrometer
  4. API Pengelogan SLF4J: Kes Penggunaan Konteks Diagnostik (MDC) Dipetakan. Manual SLF4J