$lang['tuto'] = "ट्यूटोरियल"; ?> सानुकूल हेडरमधून

सानुकूल हेडरमधून ट्रेस प्रसारित करण्यासाठी स्प्रिंग बूट 3.4 कसे वापरावे

Temp mail SuperHeros
सानुकूल हेडरमधून ट्रेस प्रसारित करण्यासाठी स्प्रिंग बूट 3.4 कसे वापरावे
सानुकूल हेडरमधून ट्रेस प्रसारित करण्यासाठी स्प्रिंग बूट 3.4 कसे वापरावे

स्प्रिंग बूट मध्ये सानुकूल हेडर ट्रेस हाताळणे 3.4

कल्पना करा की तुमच्याकडे स्प्रिंग बूट ३.४ वेब सेवा दोन क्लायंटसह अखंडपणे काम करत आहे. पहिला क्लायंट स्प्रिंग बूट 3+ वापरतो, ज्यामुळे ट्रेस प्रसार एक ब्रीझ बनतो. कोणत्याही अतिरिक्त प्रयत्नाशिवाय, तुम्हाला सुंदर एन्ड-टू-एंड ट्रेस सातत्य 🪄 मिळेल. लॉग स्वच्छ आणि जोडलेले दिसतात, जणू जादूने.

तथापि, जेव्हा क्लायंट दोन कार्यात येतात तेव्हा गोष्टी बदलतात. मानक ट्रेसिंग शीर्षलेखांऐवजी, ते `ot-custom-traceid` आणि `ot-custom-spanid` सारखे सानुकूल शीर्षलेख पाठवतात. या सानुकूल शीर्षलेखांमध्ये वैध ट्रेस माहिती असताना, स्प्रिंग बूट या ट्रेसचा प्रसार करण्यात अयशस्वी ठरते. परिणाम? तुम्ही सर्व्हर-साइड लॉगसह क्लायंट ट्रेस कनेक्ट करण्याची क्षमता गमावता.

यामुळे निरीक्षणक्षमता अंतर निर्माण होते. क्लायंट एकसाठी, तुम्हाला संपूर्ण सेवांमध्ये विनंतीचा मार्ग दिसेल. क्लायंट दोनसाठी, तुम्हाला फक्त सर्व्हर-साइड लॉग दिसतात, महत्वपूर्ण क्लायंट ट्रेस गहाळ आहे. हे अर्धे कोडे पाहण्यासारखे आहे—तुम्हाला माहित आहे की काहीतरी गहाळ आहे परंतु तुकडे एकत्र ठेवू शकत नाही. 😓

या लेखात, आम्ही स्प्रिंग बूट 3.4 इकोसिस्टमवर खरे राहून स्प्रिंग क्लाउड स्लीथ वर अवलंबून न राहता ही समस्या कशी सोडवायची ते शोधू. अखेरीस, तुमच्या सिस्टमवर अखंड निरीक्षणक्षमता सुनिश्चित करून, सानुकूल शीर्षलेखांमधून ट्रेसचा प्रसार आणि पुढे कसे चालू ठेवायचे हे तुम्हाला कळेल.

आज्ञा वापराचे उदाहरण
MDC.put ही कमांड मॅप्ड डायग्नोस्टिक कॉन्टेक्स्ट (MDC) मध्ये की-व्हॅल्यू जोड्या जोडते, सानुकूल ट्रेस आयडी लॉगमध्ये समाविष्ट करण्यास अनुमती देते. उदाहरणार्थ, MDC.put("traceId", "12345").
MDC.clear विनंत्यांमधील ट्रेस दूषित टाळण्यासाठी विनंतीवर प्रक्रिया केल्यानंतर MDC कडील सर्व नोंदी साफ करते. उदाहरणार्थ, MDC.clear().
OncePerRequestFilter स्प्रिंग बूट फिल्टर जे फिल्टर लॉजिक प्रत्येक HTTP विनंतीवर फक्त एकदाच अंमलात आणले जाईल याची खात्री करते, हेडर ट्रेसिंगसाठी आदर्श. उदाहरण: सार्वजनिक वर्ग CustomTraceFilter एकदा PerRequestFilter वाढवतो.
filterChain.doFilter साखळीतील पुढील फिल्टरवर जा, विनंती इतर फिल्टरद्वारे सुरू राहील याची खात्री करून. उदाहरणार्थ, filterChain.doFilter(विनंती, प्रतिसाद).
RestTemplate.getInterceptors() सानुकूल इंटरसेप्टर्स जोडण्यासाठी अनुमती देऊन, रेस्ट टेम्प्लेट उदाहरणासाठी इंटरसेप्टर्सची सूची पुनर्प्राप्त करते. उदाहरण: restTemplate.getInterceptors().add(new CustomInterceptor()).
ClientHttpRequestInterceptor आउटगोइंग HTTP विनंत्या रोखण्यासाठी आणि सानुकूल शीर्षलेख जोडण्यासाठी इंटरफेस. उदाहरणार्थ, ट्रेस आयडी घालण्यासाठी ClientHttpRequestInterceptor लागू करणे.
HttpServletRequest.getHeader येणाऱ्या विनंतीवरून विशिष्ट HTTP शीर्षलेखाचे मूल्य काढते. उदाहरण: request.getHeader("ot-custom-traceid").
FilterRegistrationBean स्प्रिंग बूट ऍप्लिकेशनमध्ये कस्टम फिल्टर्सची नोंदणी करते. उदाहरणार्थ: registrationBean.setFilter(नवीन CustomTraceFilter()).
MockMvc.perform स्प्रिंग बूट ऍप्लिकेशन्ससाठी युनिट चाचण्यांमध्ये HTTP विनंत्यांची नक्कल करते. उदाहरण: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345")).
ClientHttpRequestExecution.execute प्रदान केलेल्या विनंती मुख्य भाग आणि शीर्षलेखांसह अवरोधित HTTP विनंती कार्यान्वित करते. उदाहरण: execution.execute(request, body).

स्प्रिंग बूटमध्ये सानुकूल शीर्षलेख ट्रेस प्रसार

या समस्येचे निराकरण करण्यासाठी मुख्य घटकांपैकी एक म्हणजे CustomTraceFilter. हे फिल्टर विस्तारित करते OncePerRequestFilter वर्ग, प्रत्येक HTTP विनंतीसाठी ट्रेस हेडर लॉजिक फक्त एकदाच चालते याची खात्री करणे. स्प्रिंग बूट मधील फिल्टर्स जागतिक स्तरावर विनंत्या किंवा प्रतिसाद सुधारित करताना आश्चर्यकारकपणे उपयुक्त आहेत. उदाहरणार्थ, क्लायंटने ट्रेसिंग माहिती पाठवली तर ot-custom-traceid किंवा ot-custom-spanid सानुकूल शीर्षलेखांमध्ये, हे फिल्टर विनंतीमध्ये अडथळा आणतो, हे शीर्षलेख काढतो आणि त्यांना मॅप केलेल्या डायग्नोस्टिक कॉन्टेक्स्ट (MDC) मध्ये प्रसारित करतो. MDC मध्ये ट्रेस आयडी जोडून, ​​आम्ही खात्री करतो की हे अभिज्ञापक विनंती प्रक्रियेदरम्यान व्युत्पन्न केलेल्या लॉगमध्ये दृश्यमान आहेत.

MDC हा SLF4J आणि लॉगबॅक सारख्या लॉगिंग फ्रेमवर्कचा एक महत्त्वाचा भाग आहे. हे आम्हाला वर्तमान थ्रेडसाठी संदर्भित माहिती संचयित करण्यास अनुमती देते, जसे की सानुकूल ट्रेस आयडी. सारख्या आज्ञा वापरणे MDC.put आणि MDC.स्पष्ट, आम्ही खात्री करतो की लॉगिंग सिस्टममध्ये ट्रेस तपशील समाविष्ट आहेत आणि समवर्ती विनंत्यांमधील दूषितपणा टाळतो. उदाहरणार्थ, जर क्लायंट दोनने `ot-custom-traceid` `8f7ebd8a73f9a8f50e6a00a87a20952a` म्हणून पाठवले, तर हा आयडी MDC मध्ये संग्रहित केला जातो आणि सर्व डाउनस्ट्रीम लॉगमध्ये समाविष्ट केला जातो, एक सुसंगत ट्रेस पथ तयार करतो.

दुसरीकडे, आउटगोइंग HTTP विनंत्यांसाठी, RestTemplate इंटरसेप्टर महत्त्वाची भूमिका बजावते. अंमलबजावणी करून ClientHttpRequestInterceptor, आम्ही आउटगोइंग विनंत्यांना समान ट्रेस शीर्षलेख (`ot-custom-traceid` आणि `ot-custom-spanid`) संलग्न करू शकतो. हे सुनिश्चित करते की जेव्हा ऍप्लिकेशन इतर मायक्रो सर्व्हिसेसना कॉल करते तेव्हा ट्रेस सातत्य राखले जाते. उदाहरणार्थ, जेव्हा सर्व्हर ट्रेस आयडी `8f7ebd8a73f9a8f50e6a00a87a20952a` सह विनंतीवर प्रक्रिया करतो, तेव्हा तो हा आयडी आउटगोइंग हेडरशी संलग्न करतो, त्यामुळे डाउनस्ट्रीम सेवा अखंडपणे ट्रेस ओळखू शकतात आणि त्याचा प्रसार करू शकतात.

शेवटी, MockMvc सह लिहीलेल्या युनिट चाचण्या HTTP विनंत्यांचे अनुकरण करून आणि शीर्षलेख प्रसाराची पडताळणी करून संपूर्ण सेटअप प्रमाणित करतात. वास्तविक-जागतिक अनुप्रयोगांमध्ये, ट्रेस शीर्षलेख योग्यरित्या हाताळले गेले आहेत याची खात्री करण्यासाठी चाचणी महत्त्वपूर्ण आहे. उदाहरणार्थ, सानुकूल शीर्षलेखांसह GET विनंती पाठवून आणि प्रतिसाद किंवा लॉगची तपासणी करून, आम्ही पुष्टी करू शकतो की फिल्टर आणि इंटरसेप्टर अपेक्षेप्रमाणे कार्य करतात. हा सर्वसमावेशक दृष्टीकोन स्प्रिंग क्लाउड स्लीथ सारख्या वारसा अवलंबनावर अवलंबून न राहता आव्हान सोडवतो. शेवटी, फिल्टर्स, इंटरसेप्टर्स आणि MDC चे संयोजन ट्रेस सातत्य सुनिश्चित करते जरी क्लायंट कस्टम शीर्षलेख वापरत असताना, सिस्टम मजबूत आणि पूर्णपणे निरीक्षण करण्यायोग्य बनवते. 🌟

स्प्रिंग बूटमध्ये सानुकूल ट्रेसिंग हेडरचा प्रसार करणे 3.4

बॅकएंड प्रक्रियेसाठी स्प्रिंग बूट 3.4 आणि मायक्रोमीटरसह Java वापरणे

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

कस्टम ट्रेस हेडर प्रसारासाठी युनिट चाचणी

ट्रेस हेडर प्रसार प्रमाणित करण्यासाठी JUnit आणि MockMvc सह चाचणी

RestTemplate वापरून HTTP विनंत्यांमध्ये सानुकूल शीर्षलेखांचा प्रसार करणे

आउटगोइंग विनंत्यांमध्ये कस्टम हेडर जोडण्यासाठी रेस्ट टेम्प्लेट इंटरसेप्टर्स वापरणे

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

स्प्रिंग बूट 3.4 मध्ये OpenTelemetry सह सानुकूल हेडर ट्रेस हाताळणे

स्प्रिंग बूट ३.४ सह काम करताना, सानुकूल शीर्षलेखांवरून ट्रेस प्रसारित करण्याचा आणखी एक शक्तिशाली दृष्टीकोन म्हणजे एकत्रित करणे OpenTelemetry. OpenTelemetry, एक ओपन-सोर्स ऑब्झर्व्हेबिलिटी फ्रेमवर्क, इन्स्ट्रुमेंटला मदत करते, संकलित करते आणि ट्रेस अखंडपणे निर्यात करते. हे सानुकूल शीर्षलेखांसह ट्रेस संदर्भ काढण्यासाठी आणि इंजेक्ट करण्यासाठी यंत्रणा प्रदान करते ot-custom-traceid आणि ot-custom-spanid, तुमच्या अर्जामध्ये. OpenTelemetry च्या TextMapPropagator चा फायदा घेऊन, तुम्ही नॉन-स्टँडर्ड क्लायंट आणि तुमची निरीक्षणक्षमता प्रणाली यांच्यातील अंतर भरून काढू शकता.

स्प्रिंग बूट 3.4 मध्ये OpenTelemetry वापरण्यासाठी, सानुकूल शीर्षलेखांमधून ट्रेसिंग माहिती काढण्यासाठी आणि वर्तमान ट्रेस संदर्भाशी संलग्न करण्यासाठी कस्टम प्रचारक लागू केला जाऊ शकतो. उदाहरणार्थ, जेव्हा तुमच्या सर्व्हरला क्लायंट दोनकडून येणारी विनंती प्राप्त होते, तेव्हा OpenTelemetry कस्टम हेडर पार्स करू शकते आणि मूळ ट्रेस संदर्भाची पुनर्रचना करू शकते. हे सुनिश्चित करते की डाउनस्ट्रीम सेवांना समान ट्रेस आयडी दिसतात, ज्यामुळे एंड-टू-एंड दृश्यमानता मिळते. स्प्रिंग क्लाउड स्लीथ सारख्या जुन्या सोल्यूशन्सच्या विपरीत, OpenTelemetry हलकी आहे आणि आधुनिक निरीक्षणक्षमता मानकांशी संरेखित आहे.

OpenTelemetry च्या प्रोपेगेटरला मायक्रोमीटर सह एकत्रित करून, तुम्ही तुमचे मेट्रिक्स आणि ट्रेस माहितीसह लॉगिंग समृद्ध करू शकता. क्लायंट वन आणि क्लायंट टू या दोन्हींकडून येणाऱ्या विनंत्यांचे ट्रेस तुमच्या निरीक्षणीय साधनामध्ये अखंडपणे पाहण्याची कल्पना करा. OpenTelemetry आपोआप प्रोमिथियस, Zipkin किंवा Jaeger सह एकत्रीकरणास समर्थन देते, ज्यामुळे तुम्हाला ट्रेस व्हिज्युअलायझेशन केंद्रीकृत करण्यात सक्षम होते. हा दृष्टीकोन सुनिश्चित करतो की सानुकूल शीर्षलेख गुंतलेले असतानाही, कोणताही ट्रेस डेटा गमावला जात नाही आणि डीबगिंग लक्षणीयरीत्या सोपे होते. 🚀

स्प्रिंग बूटमध्ये कस्टम ट्रेसचा प्रसार करण्याबद्दल वारंवार विचारले जाणारे प्रश्न

  1. स्प्रिंग बूटमध्ये मी स्वतः सानुकूल ट्रेस हेडर कसे काढू?
  2. तुम्ही request.getHeader("custom-header") वापरू शकता विशिष्ट हेडर मॅन्युअली आणण्यासाठी आणि MDC.put("traceId", मूल्य) वापरून MDC मध्ये जोडू शकता.
  3. सानुकूल ट्रेस प्रसारासाठी OpenTelemetry वापरण्याचा काय फायदा आहे?
  4. OpenTelemetry मायक्रो सर्व्हिसेसवर कस्टम हेडरसह ट्रेसचा प्रसार करण्यासाठी आधुनिक, विक्रेता-तटस्थ दृष्टिकोन प्रदान करते.
  5. मी स्प्रिंग बूटमध्ये रेस्ट टेम्प्लेटसह सानुकूल शीर्षलेखांचा प्रसार करू शकतो का?
  6. होय, ClientHttpRequestInterceptor लागू करून, तुम्ही आउटगोइंग विनंत्यांना traceid आणि spanid सारखे सानुकूल शीर्षलेख संलग्न करू शकता.
  7. जागतिक स्तरावर शीर्षलेख कॅप्चर करण्यासाठी मी फिल्टरची नोंदणी कशी करू?
  8. तुम्ही OncePerRequestFilter चा विस्तार करणारा फिल्टर तयार करू शकता आणि सर्व एंडपॉइंटसाठी हेडर कॅप्चर करण्यासाठी FilterRegistrationBean वापरून त्याची नोंदणी करू शकता.
  9. स्प्रिंग बूटमधील ट्रेस व्हिज्युअलाइज करण्यासाठी मी कोणती साधने वापरू शकतो?
  10. झिपकिन, जेगर, आणि प्रोमिथियस सारखी साधने स्प्रिंग बूट आणि ओपनटेलीमेट्रीसह एंड-टू-एंड ट्रेस व्हिज्युअलाइझ करू शकतात.

निर्बाध ट्रेस सातत्य सुनिश्चित करणे

आधुनिक प्रणालींमध्ये, सानुकूल ट्रेस शीर्षलेख हाताळणे विश्वसनीय निरीक्षणासाठी महत्त्वपूर्ण आहे. फिल्टर आणि इंटरसेप्टर्स वापरून, तुम्ही क्लायंटने दिलेली ट्रेसिंग माहिती कॅप्चर करू शकता आणि तुमच्या सर्व सेवांमध्ये ती योग्यरित्या प्रसारित करू शकता. हे विखंडित नोंदी आणि गहाळ ट्रेस टाळते. 🔍

स्प्रिंग बूट 3.4, मायक्रोमीटर किंवा ओपनटेलीमेट्रीसह एकत्रित, स्प्रिंग क्लाउड स्लीथ सारख्या जुन्या साधनांवर अवलंबून न राहता मजबूत उपायांना अनुमती देते. तुम्ही क्लायंट वनच्या स्टँडर्ड हेडर किंवा क्लायंट टूच्या सानुकूल शीर्षलेखांशी व्यवहार करत असलात तरीही, या तंत्रांची अंमलबजावणी केल्याने ट्रेसमधील अंतर कार्यक्षमतेने भरून काढले जाते. 🚀

स्रोत आणि संदर्भ
  1. स्प्रिंग बूट अधिकृत दस्तऐवजीकरण: ट्रेसिंग संदर्भांचा प्रसार. स्प्रिंग बूट दस्तऐवजीकरण
  2. जावा डेव्हलपर्ससाठी ओपनटेलीमेट्री: ट्रेस प्रसारासाठी मार्गदर्शक. OpenTelemetry Java
  3. मायक्रोमीटर निरीक्षणक्षमता दस्तऐवजीकरण: सानुकूल ट्रेस शीर्षलेख एकत्रित करणे. मायक्रोमीटर निरीक्षणक्षमता
  4. SLF4J लॉगिंग API: मॅप केलेले डायग्नोस्टिक संदर्भ (MDC) वापर प्रकरणे. SLF4J मॅन्युअल