स्प्रिंग बूट 3.4 में कस्टम हेडर ट्रेस को संभालना
कल्पना करें कि आपके पास स्प्रिंग बूट 3.4 वेब सेवा है जो दो क्लाइंट के साथ निर्बाध रूप से काम कर रही है। पहला क्लाइंट स्प्रिंग बूट 3+ का उपयोग करता है, जिससे ट्रेस प्रसार आसान हो जाता है। बिना किसी अतिरिक्त प्रयास के, आपको सुंदर एंड-टू-एंड ट्रेस निरंतरता मिलती है। लॉग साफ और जुड़े हुए दिखाई देते हैं, मानो जादू से।
हालाँकि, चीजें तब बदल जाती हैं जब क्लाइंट दो खेल में आता है। मानक ट्रेसिंग हेडर के बजाय, वे `ot-custom-traceid` और `ot-custom-spanid` जैसे कस्टम हेडर भेजते हैं। हालाँकि इन कस्टम हेडर में वैध ट्रेस जानकारी होती है, स्प्रिंग बूट इन ट्रेस को प्रचारित करने में विफल रहता है। नतीजा? आप क्लाइंट ट्रेस को सर्वर-साइड लॉग से कनेक्ट करने की क्षमता खो देते हैं।
इससे अवलोकनीयता में अंतर पैदा होता है। क्लाइंट वन के लिए, आप सभी सेवाओं में अनुरोध का पूरा पथ देखते हैं। क्लाइंट दो के लिए, आप केवल सर्वर-साइड लॉग देखते हैं, महत्वपूर्ण क्लाइंट ट्रेस गायब। यह आधी पहेली देखने जैसा है—आप जानते हैं कि कुछ छूट गया है, लेकिन आप टुकड़ों को एक साथ नहीं रख सकते। 😓
इस लेख में, हम यह पता लगाएंगे कि स्प्रिंग क्लाउड स्लीथ पर भरोसा किए बिना, स्प्रिंग बूट 3.4 पारिस्थितिकी तंत्र के प्रति सच्चे रहते हुए इस समस्या को कैसे हल किया जाए। अंत तक, आपको पता चल जाएगा कि कस्टम हेडर से ट्रेस को कैसे प्रचारित और जारी रखा जाए, जिससे आपके सिस्टम में निर्बाध अवलोकन सुनिश्चित हो सके।
आज्ञा | उपयोग का उदाहरण |
---|---|
MDC.put | यह कमांड मैप्ड डायग्नोस्टिक कॉन्टेक्स्ट (एमडीसी) में कुंजी-मूल्य जोड़े जोड़ता है, जिससे कस्टम ट्रेस आईडी को लॉग में शामिल किया जा सकता है। उदाहरण के लिए, MDC.put("traceId", "12345"). |
MDC.clear | अनुरोधों के बीच ट्रेस संदूषण से बचने के लिए अनुरोध संसाधित होने के बाद एमडीसी से सभी प्रविष्टियों को साफ़ करता है। उदाहरण के लिए, MDC.clear()। |
OncePerRequestFilter | एक स्प्रिंग बूट फ़िल्टर जो सुनिश्चित करता है कि फ़िल्टर लॉजिक HTTP अनुरोध के अनुसार केवल एक बार निष्पादित होता है, हेडर को ट्रेस करने के लिए आदर्श है। उदाहरण: सार्वजनिक वर्ग CustomTraceFilter, OnePerRequestFilter का विस्तार करता है। |
filterChain.doFilter | यह सुनिश्चित करते हुए श्रृंखला में अगले फ़िल्टर पर आगे बढ़ता है कि अनुरोध अन्य फ़िल्टर के माध्यम से जारी रहता है। उदाहरण के लिए, फ़िल्टरचेन.डोफ़िल्टर (अनुरोध, प्रतिक्रिया)। |
RestTemplate.getInterceptors() | रेस्टटेम्पलेट उदाहरण के लिए इंटरसेप्टर की सूची पुनर्प्राप्त करता है, जिससे कस्टम इंटरसेप्टर जोड़े जा सकते हैं। उदाहरण:restTemplate.getInterceptors().जोड़ें(नया CustomInterceptor())। |
ClientHttpRequestInterceptor | आउटगोइंग HTTP अनुरोधों को इंटरसेप्ट करने और कस्टम हेडर जोड़ने के लिए एक इंटरफ़ेस। उदाहरण के लिए, ट्रेस आईडी डालने के लिए clientHttpRequestInterceptor लागू करना। |
HttpServletRequest.getHeader | आने वाले अनुरोध से एक विशिष्ट HTTP हेडर का मान निकालता है। उदाहरण: request.getHeader("ot-custom-traceid"). |
FilterRegistrationBean | स्प्रिंग बूट एप्लिकेशन में कस्टम फ़िल्टर पंजीकृत करता है। उदाहरण के लिए: रजिस्ट्रेशनबीन.सेटफ़िल्टर(नया कस्टमट्रेसफ़िल्टर())। |
MockMvc.perform | स्प्रिंग बूट अनुप्रयोगों के लिए यूनिट परीक्षणों में HTTP अनुरोधों का अनुकरण करता है। उदाहरण:ockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345"))। |
ClientHttpRequestExecution.execute | दिए गए अनुरोध निकाय और हेडर के साथ इंटरसेप्ट किए गए HTTP अनुरोध को निष्पादित करता है। उदाहरण: निष्पादन.निष्पादन(अनुरोध, निकाय)। |
स्प्रिंग बूट में कस्टम हेडर ट्रेस प्रसार
इस समस्या को हल करने में प्रमुख घटकों में से एक CustomTraceFilter है। यह फ़िल्टर विस्तारित करता है एक बार प्रति अनुरोधफ़िल्टर क्लास, यह सुनिश्चित करते हुए कि ट्रेस हेडर लॉजिक प्रत्येक HTTP अनुरोध के लिए केवल एक बार चलता है। वैश्विक स्तर पर अनुरोधों या प्रतिक्रियाओं को संशोधित करते समय स्प्रिंग बूट में फ़िल्टर अविश्वसनीय रूप से उपयोगी होते हैं। उदाहरण के लिए, यदि क्लाइंट ट्रेसिंग जानकारी भेजता है जैसे ओटी-कस्टम-ट्रेसिड या ओटी-कस्टम-स्पैनिड कस्टम हेडर में, यह फ़िल्टर अनुरोध को रोकता है, इन हेडर को निकालता है, और उन्हें मैप्ड डायग्नोस्टिक कॉन्टेक्स्ट (एमडीसी) में प्रसारित करता है। एमडीसी में ट्रेस आईडी जोड़कर, हम यह सुनिश्चित करते हैं कि ये पहचानकर्ता अनुरोध प्रसंस्करण के दौरान उत्पन्न लॉग में दिखाई दें।
एमडीसी SLF4J और लॉगबैक जैसे लॉगिंग फ्रेमवर्क का एक महत्वपूर्ण हिस्सा है। यह हमें वर्तमान थ्रेड के लिए प्रासंगिक जानकारी, जैसे कस्टम ट्रेस आईडी, संग्रहीत करने की अनुमति देता है। जैसे कमांड का उपयोग करना एमडीसी.पुट और एमडीसी.स्पष्ट, हम सुनिश्चित करते हैं कि लॉगिंग सिस्टम में ट्रेस विवरण शामिल हैं और समवर्ती अनुरोधों के बीच संदूषण से बचा जाता है। उदाहरण के लिए, यदि क्लाइंट दो `ot-custom-traceid` को `8f7ebd8a73f9a8f50e6a00a87a20952a` के रूप में भेजता है, तो यह आईडी MDC में संग्रहीत होती है और सभी डाउनस्ट्रीम लॉग में शामिल होती है, जिससे एक सुसंगत ट्रेस पथ बनता है।
दूसरी ओर, आउटगोइंग HTTP अनुरोधों के लिए, रेस्टटेम्पलेट इंटरसेप्टर एक आवश्यक भूमिका निभाता है। अमल करके क्लाइंटHttpRequestInterceptor, हम आउटगोइंग अनुरोधों में समान ट्रेस हेडर (`ot-custom-traceid` और `ot-custom-spanid`) संलग्न कर सकते हैं। यह सुनिश्चित करता है कि जब एप्लिकेशन अन्य माइक्रोसर्विसेज को कॉल करता है तो ट्रेस निरंतरता बनी रहती है। उदाहरण के लिए, जब सर्वर ट्रेस आईडी `8f7ebd8a73f9a8f50e6a00a87a20952a` के साथ एक अनुरोध संसाधित करता है, तो यह इस आईडी को आउटगोइंग हेडर से जोड़ता है, ताकि डाउनस्ट्रीम सेवाएं ट्रेस को पहचान सकें और निर्बाध रूप से प्रचारित कर सकें।
अंत में, MockMvc के साथ लिखे गए यूनिट परीक्षण HTTP अनुरोधों का अनुकरण करके और हेडर प्रसार को सत्यापित करके पूरे सेटअप को मान्य करते हैं। वास्तविक दुनिया के अनुप्रयोगों में, यह सुनिश्चित करने के लिए परीक्षण महत्वपूर्ण है कि ट्रेस हेडर सही ढंग से प्रबंधित किए गए हैं। उदाहरण के लिए, कस्टम हेडर के साथ GET अनुरोध भेजकर और प्रतिक्रिया या लॉग का निरीक्षण करके, हम पुष्टि कर सकते हैं कि फ़िल्टर और इंटरसेप्टर अपेक्षा के अनुरूप काम करते हैं। यह व्यापक दृष्टिकोण स्प्रिंग क्लाउड स्लीथ जैसी विरासत निर्भरता पर भरोसा किए बिना चुनौती का समाधान करता है। अंततः, फ़िल्टर, इंटरसेप्टर और एमडीसी का संयोजन ट्रेस निरंतरता सुनिश्चित करता है, तब भी जब ग्राहक कस्टम हेडर का उपयोग करते हैं, जिससे सिस्टम मजबूत और पूरी तरह से देखने योग्य हो जाता है। 🌟
स्प्रिंग बूट 3.4 में कस्टम ट्रेसिंग हेडर का प्रचार-प्रसार
बैकएंड प्रोसेसिंग के लिए स्प्रिंग बूट 3.4 और माइक्रोमीटर के साथ जावा का उपयोग करना
// 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 के साथ परीक्षण
// 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());
}
}
रेस्टटेम्पलेट का उपयोग करके 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 में ओपन टेलीमेट्री के साथ कस्टम हेडर ट्रेस को संभालना
स्प्रिंग बूट 3.4 के साथ काम करते समय, कस्टम हेडर से ट्रेस को प्रसारित करने का एक और शक्तिशाली तरीका एकीकृत करना है ओपनटेलीमेट्री. ओपन टेलीमेट्री, एक ओपन-सोर्स ऑब्जर्वेबिलिटी फ्रेमवर्क है, जो निशानों को निर्बाध रूप से उपकरणित करने, एकत्र करने और निर्यात करने में मदद करता है। यह कस्टम हेडर जैसे ट्रेस संदर्भ को निकालने और इंजेक्ट करने के लिए तंत्र प्रदान करता है ओटी-कस्टम-ट्रेसिड और ओटी-कस्टम-स्पैनिड, आपके आवेदन में। OpenTelemetry के TextMapPropagator का लाभ उठाकर, आप गैर-मानक ग्राहकों और अपने अवलोकन प्रणाली के बीच अंतर को पाट सकते हैं।
स्प्रिंग बूट 3.4 में ओपनटेलीमेट्री का उपयोग करने के लिए, कस्टम हेडर से ट्रेसिंग जानकारी निकालने और इसे वर्तमान ट्रेस संदर्भ में संलग्न करने के लिए एक कस्टम प्रोपेगेटर लागू किया जा सकता है। उदाहरण के लिए, जब आपके सर्वर को क्लाइंट दो से आने वाला अनुरोध प्राप्त होता है, तो ओपनटेलीमेट्री कस्टम हेडर को पार्स कर सकता है और मूल ट्रेस संदर्भ का पुनर्निर्माण कर सकता है। यह सुनिश्चित करता है कि डाउनस्ट्रीम सेवाएं समान ट्रेस आईडी देखें, जिससे एंड-टू-एंड दृश्यता की अनुमति मिलती है। स्प्रिंग क्लाउड स्लीथ जैसे पुराने समाधानों के विपरीत, ओपनटेलीमेट्री हल्का है और आधुनिक अवलोकन मानकों के अनुरूप है।
ओपनटेलीमेट्री के प्रोपेगेटर को माइक्रोमीटर के साथ जोड़कर, आप ट्रेस जानकारी के साथ अपने मेट्रिक्स और लॉगिंग को समृद्ध कर सकते हैं। अपने अवलोकन उपकरण में क्लाइंट वन और क्लाइंट दो दोनों से आने वाले अनुरोधों के निशान को सहजता से देखने की कल्पना करें। ओपनटेलीमेट्री स्वचालित रूप से प्रोमेथियस, ज़िप्किन, या जैगर के साथ एकीकरण का समर्थन करती है, जिससे आप ट्रेस विज़ुअलाइज़ेशन को केंद्रीकृत कर सकते हैं। यह दृष्टिकोण सुनिश्चित करता है कि जब कस्टम हेडर शामिल होते हैं, तब भी कोई ट्रेस डेटा नष्ट नहीं होता है, और डिबगिंग काफी आसान हो जाती है। 🚀
स्प्रिंग बूट में कस्टम ट्रेस के प्रचार-प्रसार के बारे में अक्सर पूछे जाने वाले प्रश्न
- मैं स्प्रिंग बूट में कस्टम ट्रेस हेडर मैन्युअल रूप से कैसे निकालूं?
- आप किसी विशिष्ट हेडर को मैन्युअल रूप से लाने के लिए request.getHeader("custom-header") का उपयोग कर सकते हैं और MDC.put("traceId", value) का उपयोग करके इसे MDC में जोड़ सकते हैं।
- कस्टम ट्रेस प्रसार के लिए ओपनटेलीमेट्री का उपयोग करने का क्या लाभ है?
- ओपनटेलीमेट्री माइक्रोसर्विसेज में कस्टम हेडर सहित ट्रेस के प्रचार-प्रसार के लिए एक आधुनिक, विक्रेता-तटस्थ दृष्टिकोण प्रदान करता है।
- क्या मैं स्प्रिंग बूट में रेस्ट टेम्पलेट के साथ कस्टम हेडर का प्रचार कर सकता हूँ?
- हां, ClientHttpRequestInterceptor को लागू करके, आप आउटगोइंग अनुरोधों में traceid और spanid जैसे कस्टम हेडर संलग्न कर सकते हैं।
- मैं विश्व स्तर पर हेडर कैप्चर करने के लिए फ़िल्टर कैसे पंजीकृत करूं?
- आप एक फ़िल्टर बना सकते हैं जो OncePerRequestFilter को विस्तारित करता है और सभी एंडपॉइंट के लिए हेडर कैप्चर करने के लिए FilterRegistrationBean का उपयोग करके इसे पंजीकृत कर सकता है।
- स्प्रिंग बूट से निशान देखने के लिए मैं किन उपकरणों का उपयोग कर सकता हूं?
- ज़िपकिन, जेगर, और प्रोमेथियस जैसे उपकरण एंड-टू-एंड ट्रेस को देखने के लिए स्प्रिंग बूट और ओपनटेलीमेट्री के साथ एकीकृत हो सकते हैं।
निर्बाध ट्रेस निरंतरता सुनिश्चित करना
आधुनिक प्रणालियों में, विश्वसनीय अवलोकन के लिए कस्टम ट्रेस हेडर को संभालना महत्वपूर्ण है। फ़िल्टर और इंटरसेप्टर का उपयोग करके, आप क्लाइंट द्वारा प्रदान की गई ट्रेसिंग जानकारी को कैप्चर कर सकते हैं और इसे अपनी सेवाओं में सही ढंग से प्रचारित कर सकते हैं। यह खंडित लॉग और लापता निशानों से बचाता है। 🔍
स्प्रिंग बूट 3.4, माइक्रोमीटर या ओपनटेलीमेट्री के साथ मिलकर, स्प्रिंग क्लाउड स्लीथ जैसे पुराने उपकरणों पर भरोसा किए बिना मजबूत समाधान की अनुमति देता है। चाहे आप क्लाइंट वन के मानक हेडर या क्लाइंट टू के कस्टम हेडर के साथ काम कर रहे हों, इन तकनीकों को लागू करने से ट्रेस गैप को कुशलता से पाट दिया जाता है। 🚀
स्रोत और सन्दर्भ
- स्प्रिंग बूट आधिकारिक दस्तावेज़ीकरण: ट्रेसिंग संदर्भों का प्रचार। स्प्रिंग बूट दस्तावेज़ीकरण
- जावा डेवलपर्स के लिए ओपन टेलीमेट्री: ट्रेस प्रोपेगेशन के लिए गाइड। ओपनटेलीमेट्री जावा
- माइक्रोमीटर अवलोकन योग्यता दस्तावेज़ीकरण: कस्टम ट्रेस हेडर को एकीकृत करना। माइक्रोमीटर अवलोकनशीलता
- SLF4J लॉगिंग एपीआई: मैप्ड डायग्नोस्टिक कॉन्टेक्स्ट (एमडीसी) उपयोग के मामले। SLF4J मैनुअल