স্প্রিং বুটে কাস্টম হেডার ট্রেস পরিচালনা করা 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 উদাহরণের জন্য ইন্টারসেপ্টরগুলির তালিকা পুনরুদ্ধার করে, কাস্টম ইন্টারসেপ্টর যোগ করার অনুমতি দেয়। উদাহরণ: restTemplate.getInterceptors().add(new CustomInterceptor())। |
ClientHttpRequestInterceptor | বহির্গামী এইচটিটিপি অনুরোধগুলিকে বাধা দেওয়ার এবং কাস্টম শিরোনাম যুক্ত করার জন্য একটি ইন্টারফেস৷ উদাহরণস্বরূপ, ট্রেস আইডি সন্নিবেশ করার জন্য 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। এই ফিল্টার প্রসারিত OncePerRequestFilter ক্লাস, প্রতিটি HTTP অনুরোধের জন্য শুধুমাত্র একবার ট্রেস হেডার লজিক চালানো নিশ্চিত করে। স্প্রিং বুটের ফিল্টারগুলি বিশ্বব্যাপী অনুরোধ বা প্রতিক্রিয়াগুলি সংশোধন করার সময় অবিশ্বাস্যভাবে কার্যকর। উদাহরণস্বরূপ, যদি ক্লায়েন্ট যেমন ট্রেসিং তথ্য পাঠায় ot-custom-traceid বা ot-কাস্টম-স্প্যানড কাস্টম হেডারে, এই ফিল্টার অনুরোধটি আটকায়, এই শিরোনামগুলিকে বের করে এবং ম্যাপড ডায়াগনস্টিক কনটেক্সট (MDC) এ প্রচার করে। MDC-তে ট্রেস আইডি যোগ করার মাধ্যমে, আমরা নিশ্চিত করি যে এই শনাক্তকারীরা অনুরোধ প্রক্রিয়াকরণের সময় তৈরি করা লগগুলিতে দৃশ্যমান।
এমডিসি হল SLF4J এবং লগব্যাকের মতো লগিং ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ অংশ। এটি আমাদের বর্তমান থ্রেডের জন্য প্রাসঙ্গিক তথ্য সংরক্ষণ করতে দেয়, যেমন কাস্টম ট্রেস আইডি। যেমন কমান্ড ব্যবহার করে MDC.put এবং MDC.ক্লিয়ার, আমরা নিশ্চিত করি যে লগিং সিস্টেমে ট্রেস বিশদ অন্তর্ভুক্ত রয়েছে এবং সমকালীন অনুরোধগুলির মধ্যে দূষণ এড়ানো যায়। উদাহরণ স্বরূপ, যদি ক্লায়েন্ট টু `ot-custom-traceid` কে `8f7ebd8a73f9a8f50e6a00a87a20952a` হিসেবে পাঠায়, তাহলে এই আইডিটি MDC-তে সংরক্ষিত থাকে এবং একটি সামঞ্জস্যপূর্ণ ট্রেস পাথ তৈরি করে সমস্ত ডাউনস্ট্রিম লগে অন্তর্ভুক্ত করা হয়।
অন্যদিকে, বহির্গামী HTTP অনুরোধের জন্য, রেস্ট টেমপ্লেট ইন্টারসেপ্টর একটি অপরিহার্য ভূমিকা পালন করে। বাস্তবায়নের মাধ্যমে ক্লায়েন্টHttpRequestInterceptor, আমরা বহির্গামী অনুরোধগুলিতে একই ট্রেস হেডার (`ot-custom-traceid` এবং `ot-custom-spanid`) সংযুক্ত করতে পারি। এটি নিশ্চিত করে যে যখন অ্যাপ্লিকেশনটি অন্যান্য মাইক্রোসার্ভিসে কল করে তখন ট্রেস ধারাবাহিকতা বজায় থাকে। উদাহরণস্বরূপ, যখন সার্ভার ট্রেস আইডি `8f7ebd8a73f9a8f50e6a00a87a20952a` সহ একটি অনুরোধ প্রক্রিয়া করে, তখন এটি এই আইডিটি বহির্গামী শিরোনামগুলির সাথে সংযুক্ত করে, যাতে ডাউনস্ট্রিম পরিষেবাগুলি নির্বিঘ্নে ট্রেসটিকে চিনতে এবং প্রচার করতে পারে৷
অবশেষে, 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-এ OpenTelemetry সহ কাস্টম হেডার ট্রেস পরিচালনা করা
স্প্রিং বুট 3.4 এর সাথে কাজ করার সময়, কাস্টম হেডার থেকে ট্রেস প্রচার করার আরেকটি শক্তিশালী পদ্ধতি হল একীভূত করা ওপেনটেলিমেট্রি. OpenTelemetry, একটি ওপেন-সোর্স অবজারবিবিলিটি ফ্রেমওয়ার্ক, নির্বিঘ্নে যন্ত্র, সংগ্রহ এবং রপ্তানি করতে সাহায্য করে। এটি কাস্টম শিরোলেখ সহ ট্রেস প্রসঙ্গ নিষ্কাশন এবং ইনজেক্ট করার প্রক্রিয়া প্রদান করে ot-custom-traceid এবং ot-কাস্টম-স্প্যানড, আপনার আবেদনে। OpenTelemetry এর TextMapPropagator ব্যবহার করে, আপনি অ-মানক ক্লায়েন্ট এবং আপনার পর্যবেক্ষণ সিস্টেমের মধ্যে ব্যবধান পূরণ করতে পারেন।
স্প্রিং বুট 3.4-এ OpenTelemetry ব্যবহার করতে, একটি কাস্টম প্রচারক কাস্টম শিরোনাম থেকে ট্রেসিং তথ্য বের করে বর্তমান ট্রেস প্রসঙ্গে সংযুক্ত করতে প্রয়োগ করা যেতে পারে। উদাহরণস্বরূপ, যখন আপনার সার্ভার ক্লায়েন্ট টু থেকে একটি ইনকামিং অনুরোধ পায়, OpenTelemetry কাস্টম হেডার পার্স করতে পারে এবং মূল ট্রেস প্রসঙ্গ পুনর্গঠন করতে পারে। এটি নিশ্চিত করে যে ডাউনস্ট্রিম পরিষেবাগুলি একই ট্রেস আইডিগুলি দেখতে পায়, যা শেষ থেকে শেষ দৃশ্যমানতার অনুমতি দেয়। স্প্রিং ক্লাউড স্লিউথ এর মতো পুরানো সমাধানগুলির বিপরীতে, ওপেনটেলিমেট্রি হালকা ওজনের এবং আধুনিক পর্যবেক্ষণের মানগুলির সাথে সারিবদ্ধ।
OpenTelemetry-এর প্রচারকারীকে মাইক্রোমিটার-এর সাথে একত্রিত করে, আপনি আপনার মেট্রিক্স এবং ট্রেস তথ্য দিয়ে লগিং সমৃদ্ধ করতে পারেন। আপনার পর্যবেক্ষণ টুলে ক্লায়েন্ট ওয়ান এবং ক্লায়েন্ট টু উভয়ের কাছ থেকে আসা অনুরোধের ট্রেস দেখার কল্পনা করুন। OpenTelemetry স্বয়ংক্রিয়ভাবে Prometheus, Zipkin, বা Jaeger-এর সাথে ইন্টিগ্রেশন সমর্থন করে, যা আপনাকে ট্রেস ভিজ্যুয়ালাইজেশন কেন্দ্রীভূত করতে সক্ষম করে। এই পদ্ধতিটি নিশ্চিত করে যে কাস্টম শিরোনাম জড়িত থাকলেও, কোনও ট্রেস ডেটা হারিয়ে যায় না এবং ডিবাগিং উল্লেখযোগ্যভাবে সহজ হয়ে যায়। 🚀
স্প্রিং বুটে কাস্টম ট্রেস প্রচার করা সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন
- আমি কিভাবে স্প্রিং বুটে ম্যানুয়ালি কাস্টম ট্রেস হেডার বের করব?
- আপনি request.getHeader("custom-header") ব্যবহার করে ম্যানুয়ালি একটি নির্দিষ্ট হেডার আনতে পারেন এবং MDC.put("traceId", মান) ব্যবহার করে MDC এ যোগ করতে পারেন।
- কাস্টম ট্রেস প্রচারের জন্য OpenTelemetry ব্যবহার করার সুবিধা কী?
- ওপেনটেলিমেট্রি মাইক্রোসার্ভিস জুড়ে কাস্টম হেডার সহ ট্রেস প্রচারের জন্য একটি আধুনিক, বিক্রেতা-নিরপেক্ষ পদ্ধতির প্রদান করে।
- আমি কি স্প্রিং বুটে RestTemplate দিয়ে কাস্টম হেডার প্রচার করতে পারি?
- হ্যাঁ, একটি ClientHttpRequestInterceptor প্রয়োগ করে, আপনি বহির্গামী অনুরোধে traceid এবং spanid এর মতো কাস্টম হেডার সংযুক্ত করতে পারেন।
- বিশ্বব্যাপী শিরোনামগুলি ক্যাপচার করতে আমি কীভাবে একটি ফিল্টার নিবন্ধন করব?
- আপনি একটি ফিল্টার তৈরি করতে পারেন যা OncePerRequestFilterকে প্রসারিত করে এবং FilterRegistrationBean ব্যবহার করে সব শেষ পয়েন্টের হেডার ক্যাপচার করতে এটি নিবন্ধন করতে পারেন।
- স্প্রিং বুট থেকে ট্রেসগুলি কল্পনা করতে আমি কোন সরঞ্জামগুলি ব্যবহার করতে পারি?
- Zipkin, Jaeger, এবং Prometheus-এর মতো টুল এন্ড-টু-এন্ড ট্রেস কল্পনা করতে স্প্রিং বুট এবং ওপেনটেলিমেট্রির সাথে একীভূত হতে পারে।
বিজোড় ট্রেস ধারাবাহিকতা নিশ্চিত করা
আধুনিক সিস্টেমে, কাস্টম ট্রেস হেডারগুলি পরিচালনা করা নির্ভরযোগ্য পর্যবেক্ষণের জন্য গুরুত্বপূর্ণ। ফিল্টার এবং ইন্টারসেপ্টর ব্যবহার করে, আপনি ক্লায়েন্ট-প্রদত্ত ট্রেসিং তথ্য ক্যাপচার করতে পারেন এবং আপনার পরিষেবা জুড়ে সঠিকভাবে প্রচার করতে পারেন। এটি খণ্ডিত লগ এবং অনুপস্থিত ট্রেস এড়ায়। 🔍
স্প্রিং বুট 3.4, মাইক্রোমিটার বা ওপেনটেলিমেট্রির সাথে মিলিত, স্প্রিং ক্লাউড স্লিউথের মতো পুরানো সরঞ্জামগুলির উপর নির্ভর না করে শক্তিশালী সমাধানের অনুমতি দেয়। আপনি ক্লায়েন্ট ওয়ানের স্ট্যান্ডার্ড হেডার বা ক্লায়েন্ট টু-এর কাস্টম হেডারগুলির সাথে ডিল করছেন না কেন, এই কৌশলগুলি কার্যকর করা ট্রেস ফাঁকগুলি দক্ষতার সাথে পূরণ করে৷ 🚀
সূত্র এবং তথ্যসূত্র
- স্প্রিং বুট অফিসিয়াল ডকুমেন্টেশন: ট্রেসিং প্রসঙ্গগুলির প্রচার। বসন্ত বুট ডকুমেন্টেশন
- জাভা বিকাশকারীদের জন্য ওপেনটেলিমেট্রি: ট্রেস প্রচারের নির্দেশিকা। ওপেনটেলিমেট্রি জাভা
- মাইক্রোমিটার অবজারভেবিলিটি ডকুমেন্টেশন: কাস্টম ট্রেস হেডার একীভূত করা। মাইক্রোমিটার পর্যবেক্ষণযোগ্যতা
- SLF4J লগিং API: ম্যাপড ডায়াগনস্টিক কনটেক্সট (MDC) ব্যবহার কেস। SLF4J ম্যানুয়াল