اسپرنگ بوٹ 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 OnePerRequestFilter میں توسیع کرتا ہے۔ |
filterChain.doFilter | سلسلہ میں اگلے فلٹر پر آگے بڑھتا ہے، اس بات کو یقینی بناتے ہوئے کہ درخواست دوسرے فلٹرز کے ذریعے جاری رہے۔ مثال کے طور پر، filterChain.doFilter(درخواست، جواب)۔ |
RestTemplate.getInterceptors() | RestTemplate مثال کے لیے انٹرسیپٹرز کی فہرست بازیافت کرتا ہے، اپنی مرضی کے انٹرسیپٹرز کو شامل کرنے کی اجازت دیتا ہے۔ مثال: restTemplate.getInterceptors().add(new CustomInterceptor())۔ |
ClientHttpRequestInterceptor | باہر جانے والی HTTP درخواستوں کو روکنے اور حسب ضرورت ہیڈر شامل کرنے کے لیے ایک انٹرفیس۔ مثال کے طور پر، ٹریس آئی ڈی داخل کرنے کے لیے ClientHttpRequestInterceptor کو لاگو کرنا۔ |
HttpServletRequest.getHeader | آنے والی درخواست سے مخصوص HTTP ہیڈر کی قدر نکالتا ہے۔ مثال: request.getHeader("ot-custom-traceid")۔ |
FilterRegistrationBean | اسپرنگ بوٹ ایپلی کیشن میں اپنی مرضی کے فلٹرز کو رجسٹر کرتا ہے۔ مثال کے طور پر: registrationBean.setFilter(new CustomTraceFilter())۔ |
MockMvc.perform | اسپرنگ بوٹ ایپلی کیشنز کے لیے یونٹ ٹیسٹ میں HTTP درخواستوں کی نقل کرتا ہے۔ مثال: mockMvc.perform(get("/test-endpoint").header("ot-custom-traceid", "12345"))۔ |
ClientHttpRequestExecution.execute | فراہم کردہ درخواست کے باڈی اور ہیڈرز کے ساتھ مداخلت شدہ HTTP درخواست کو انجام دیتا ہے۔ مثال: execution.execute(request، body)۔ |
اسپرنگ بوٹ میں کسٹم ہیڈر ٹریس پروپیگیشن
اس مسئلے کو حل کرنے میں کلیدی اجزاء میں سے ایک CustomTraceFilter ہے۔ یہ فلٹر توسیع کرتا ہے۔ کلاس، اس بات کو یقینی بنانا کہ ٹریس ہیڈر منطق ہر HTTP درخواست کے لیے صرف ایک بار چلتا ہے۔ اسپرنگ بوٹ میں فلٹرز عالمی سطح پر درخواستوں یا جوابات میں ترمیم کرتے وقت ناقابل یقین حد تک مفید ہوتے ہیں۔ مثال کے طور پر، اگر کلائنٹ ٹریسنگ کی معلومات بھیجتا ہے جیسے یا حسب ضرورت ہیڈر میں، یہ فلٹر درخواست کو روکتا ہے، ان ہیڈرز کو نکالتا ہے، اور انہیں میپڈ ڈائیگنوسٹک سیاق و سباق (MDC) میں پھیلاتا ہے۔ ٹریس IDs کو MDC میں شامل کرکے، ہم اس بات کو یقینی بناتے ہیں کہ یہ شناخت کنندگان درخواست کی کارروائی کے دوران تیار کردہ لاگز میں دکھائی دیں۔
MDC لاگنگ فریم ورک جیسے SLF4J اور لاگ بیک کا ایک اہم حصہ ہے۔ یہ ہمیں موجودہ تھریڈ کے لیے متعلقہ معلومات کو ذخیرہ کرنے کی اجازت دیتا ہے، جیسے کہ حسب ضرورت ٹریس IDs۔ جیسے کمانڈز کا استعمال کرنا اور ، ہم اس بات کو یقینی بناتے ہیں کہ لاگنگ سسٹم میں ٹریس کی تفصیلات شامل ہیں اور ہم آہنگی کی درخواستوں کے درمیان آلودگی سے بچتا ہے۔ مثال کے طور پر، اگر کلائنٹ ٹو `ot-custom-traceid` کو `8f7ebd8a73f9a8f50e6a00a87a20952a` کے طور پر بھیجتا ہے، تو یہ ID MDC میں محفوظ ہے اور تمام ڈاؤن اسٹریم لاگز میں شامل ہے، جس سے ایک مستقل ٹریس پاتھ بنتا ہے۔
دوسری طرف، سبکدوش ہونے والی HTTP درخواستوں کے لیے، RestTemplate interceptor ایک ضروری کردار ادا کرتا ہے۔ نافذ کرکے ، ہم ایک ہی ٹریس ہیڈر (`ot-custom-traceid` اور `ot-custom-spanid`) باہر جانے والی درخواستوں کے ساتھ منسلک کر سکتے ہیں۔ یہ یقینی بناتا ہے کہ جب ایپلی کیشن دیگر مائیکرو سروسز کو کال کرتی ہے تو ٹریس کا تسلسل برقرار رہتا ہے۔ مثال کے طور پر، جب سرور ٹریس ID `8f7ebd8a73f9a8f50e6a00a87a20952a` کے ساتھ درخواست پر کارروائی کرتا ہے، تو یہ اس ID کو باہر جانے والے ہیڈرز کے ساتھ منسلک کرتا ہے، تاکہ ڈاؤن اسٹریم سروسز بغیر کسی رکاوٹ کے ٹریس کو پہچان سکیں اور اس کی تشہیر کر سکیں۔
آخر میں، MockMvc کے ساتھ لکھے گئے یونٹ ٹیسٹ HTTP درخواستوں کی تقلید اور ہیڈر پروپیگیشن کی تصدیق کرکے پورے سیٹ اپ کی توثیق کرتے ہیں۔ حقیقی دنیا کی ایپلی کیشنز میں، اس بات کو یقینی بنانے کے لیے ٹیسٹنگ بہت ضروری ہے کہ ٹریس ہیڈر کو صحیح طریقے سے سنبھالا جائے۔ مثال کے طور پر، اپنی مرضی کے ہیڈر کے ساتھ ایک GET درخواست بھیج کر اور جواب یا لاگ کا معائنہ کر کے، ہم تصدیق کر سکتے ہیں کہ فلٹر اور انٹرسیپٹر توقع کے مطابق کام کر رہے ہیں۔ یہ جامع نقطہ نظر اسپرنگ کلاؤڈ سلیتھ جیسے میراثی انحصار پر انحصار کیے بغیر چیلنج کو حل کرتا ہے۔ بالآخر، فلٹرز، انٹرسیپٹرز، اور MDC کا مجموعہ ٹریس تسلسل کو یقینی بناتا ہے یہاں تک کہ جب کلائنٹ حسب ضرورت ہیڈر استعمال کرتے ہیں، نظام کو مضبوط اور مکمل طور پر قابل مشاہدہ بناتے ہیں۔ 🌟
اسپرنگ بوٹ میں کسٹم ٹریسنگ ہیڈرز کا پرچار کرنا 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());
}
}
RestTemplate کا استعمال کرتے ہوئے HTTP درخواستوں میں کسٹم ہیڈرز کو پھیلانا
باہر جانے والی درخواستوں میں حسب ضرورت ہیڈر شامل کرنے کے لیے RestTemplate Interceptors کا استعمال
// 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، ایک اوپن سورس آبزرویبلٹی فریم ورک، بغیر کسی رکاوٹ کے نشانات کو آلہ بنانے، جمع کرنے اور برآمد کرنے میں مدد کرتا ہے۔ یہ ٹریس سیاق و سباق کو نکالنے اور انجیکشن کرنے کے طریقہ کار فراہم کرتا ہے، بشمول کسٹم ہیڈر جیسے اور ، آپ کی درخواست میں۔ OpenTelemetry کے TextMapPropagator کا فائدہ اٹھا کر، آپ غیر معیاری کلائنٹس اور اپنے مشاہداتی نظام کے درمیان فرق کو پر کر سکتے ہیں۔
اسپرنگ بوٹ 3.4 میں OpenTelemetry استعمال کرنے کے لیے، اپنی مرضی کے ہیڈر سے ٹریسنگ کی معلومات نکالنے اور اسے موجودہ ٹریس سیاق و سباق سے منسلک کرنے کے لیے کسٹم پروپیگیٹر کو لاگو کیا جا سکتا ہے۔ مثال کے طور پر، جب آپ کے سرور کو کلائنٹ ٹو کی طرف سے آنے والی درخواست موصول ہوتی ہے، تو OpenTelemetry حسب ضرورت ہیڈر کو پارس کر سکتا ہے اور اصل ٹریس سیاق و سباق کو دوبارہ تشکیل دے سکتا ہے۔ یہ یقینی بناتا ہے کہ ڈاؤن اسٹریم سروسز ایک ہی ٹریس آئی ڈیز کو دیکھتی ہیں، جس سے آخر سے آخر تک مرئیت کی اجازت ملتی ہے۔ پرانے حل جیسے Spring Cloud Sleuth کے برعکس، OpenTelemetry ہلکا پھلکا ہے اور جدید مشاہداتی معیارات کے مطابق ہے۔
OpenTelemetry کے پروپیگیٹر کو مائکرومیٹر کے ساتھ جوڑ کر، آپ ٹریس کی معلومات کے ساتھ اپنے میٹرکس اور لاگنگ کو بہتر بنا سکتے ہیں۔ اپنے مشاہداتی ٹول میں بغیر کسی رکاوٹ کے کلائنٹ ون اور کلائنٹ ٹو دونوں سے آنے والی درخواستوں کے نشانات کو دیکھنے کا تصور کریں۔ OpenTelemetry خود بخود Prometheus، Zipkin، یا Jaeger کے ساتھ انضمام کی حمایت کرتا ہے، جو آپ کو ٹریس ویژولائزیشن کو مرکزی بنانے کے قابل بناتا ہے۔ یہ نقطہ نظر اس بات کو یقینی بناتا ہے کہ یہاں تک کہ جب حسب ضرورت ہیڈر شامل ہوں، کوئی ٹریس ڈیٹا ضائع نہیں ہوتا ہے، اور ڈیبگنگ نمایاں طور پر آسان ہو جاتی ہے۔ 🚀
- میں اسپرنگ بوٹ میں کسٹم ٹریس ہیڈرز کو دستی طور پر کیسے نکال سکتا ہوں؟
- آپ request.getHeader("custom-header") استعمال کر سکتے ہیں تاکہ ایک مخصوص ہیڈر کو دستی طور پر حاصل کیا جا سکے اور MDC.put("traceId", value) کا استعمال کرتے ہوئے اسے MDC میں شامل کریں۔
- کسٹم ٹریس پروپیگیشن کے لیے OpenTelemetry استعمال کرنے کا کیا فائدہ ہے؟
- OpenTelemetry مائیکرو سروسز میں اپنی مرضی کے ہیڈرز سمیت ٹریس کو پھیلانے کے لیے ایک جدید، وینڈر غیر جانبدار طریقہ فراہم کرتا ہے۔
- کیا میں اسپرنگ بوٹ میں RestTemplate کے ساتھ کسٹم ہیڈر کا پرچار کر سکتا ہوں؟
- ہاں، ClientHttpRequestInterceptor کو لاگو کرکے، آپ اپنی مرضی کے ہیڈرز جیسے traceid اور spanid کو باہر جانے والی درخواستوں سے منسلک کر سکتے ہیں۔
- میں عالمی سطح پر ہیڈر کیپچر کرنے کے لیے فلٹر کیسے رجسٹر کروں؟
- آپ ایک فلٹر بنا سکتے ہیں جو OncePerRequestFilter کو بڑھاتا ہے اور اسے FilterRegistrationBean کا استعمال کرتے ہوئے رجسٹر کر سکتے ہیں تاکہ تمام اینڈ پوائنٹس کے ہیڈرز کیپچر کریں۔
- اسپرنگ بوٹ کے نشانات کو دیکھنے کے لیے میں کون سے ٹولز استعمال کر سکتا ہوں؟
- ٹولز جیسے Zipkin، Jaeger، اور Prometheus Spring Boot اور OpenTelemetry کے ساتھ ضم ہو سکتے ہیں تاکہ آخر سے آخر تک نشانات کو تصور کیا جا سکے۔
جدید نظاموں میں، قابل اعتماد مشاہدے کے لیے حسب ضرورت ٹریس ہیڈر کو سنبھالنا بہت ضروری ہے۔ فلٹرز اور انٹرسیپٹرز کا استعمال کرکے، آپ کلائنٹ کی فراہم کردہ ٹریسنگ کی معلومات حاصل کر سکتے ہیں اور اسے اپنی تمام سروسز میں صحیح طریقے سے پھیلا سکتے ہیں۔ یہ بکھرے ہوئے نوشتہ جات اور گمشدہ نشانات سے بچتا ہے۔ 🔍
Spring Boot 3.4، Micrometer یا OpenTelemetry کے ساتھ مل کر، Spring Cloud Sleuth جیسے پرانے ٹولز پر انحصار کیے بغیر مضبوط حل کی اجازت دیتا ہے۔ چاہے آپ کلائنٹ ون کے معیاری ہیڈرز یا کلائنٹ ٹو کے کسٹم ہیڈرز کے ساتھ کام کر رہے ہوں، ان تکنیکوں کو لاگو کرنے سے ٹریس گیپس کو مؤثر طریقے سے ختم کیا جاتا ہے۔ 🚀
- اسپرنگ بوٹ آفیشل ڈاکومینٹیشن: ٹریسنگ سیاق و سباق کی تبلیغ۔ بہار بوٹ دستاویزی
- OpenTelemetry for Java Developers: گائیڈ ٹو ٹریس پروپیگیشن۔ اوپن ٹیلی میٹری جاوا
- مائیکرو میٹر آبزرویبلٹی دستاویز: کسٹم ٹریس ہیڈرز کو مربوط کرنا۔ مائیکرو میٹر آبزرویبلٹی
- SLF4J لاگنگ API: میپڈ ڈائیگنوسٹک سیاق و سباق (MDC) استعمال کے کیسز۔ SLF4J دستی