స్ప్రింగ్ బూట్ 3.4లో కస్టమ్ హెడర్ ట్రేస్లను నిర్వహించడం
మీకు స్ప్రింగ్ బూట్ 3.4 వెబ్ సర్వీస్ ఇద్దరు క్లయింట్లతో సజావుగా పని చేస్తుందని ఊహించుకోండి. మొదటి క్లయింట్ స్ప్రింగ్ బూట్ 3+ని ఉపయోగిస్తుంది, ట్రేస్ ప్రాపగేషన్ను బ్రీజ్గా చేస్తుంది. ఎటువంటి అదనపు ప్రయత్నం లేకుండా, మీరు అందమైన ఎండ్-టు-ఎండ్ ట్రేస్ కంటిన్యూటీని పొందుతారు 🪄. లాగ్లు మ్యాజిక్ చేసినట్లుగా శుభ్రంగా మరియు కనెక్ట్ చేయబడినట్లు కనిపిస్తాయి.
అయితే, క్లయింట్ ఇద్దరు అమలులోకి వచ్చినప్పుడు విషయాలు మలుపు తిరుగుతాయి. ప్రామాణిక ట్రేసింగ్ హెడర్లకు బదులుగా, వారు `ot-custom-traceid` మరియు `ot-custom-spanid` వంటి అనుకూల శీర్షికలను పంపుతారు. ఈ అనుకూల శీర్షికలు చెల్లుబాటు అయ్యే ట్రేస్ సమాచారాన్ని కలిగి ఉండగా, స్ప్రింగ్ బూట్ ఈ ట్రేస్లను ప్రచారం చేయడంలో విఫలమైంది. ఫలితం? మీరు క్లయింట్ ట్రేస్లను సర్వర్ వైపు లాగ్లతో కనెక్ట్ చేసే సామర్థ్యాన్ని కోల్పోతారు.
ఇది గమనించదగిన అంతరాన్ని సృష్టిస్తుంది. క్లయింట్ ఒకటి కోసం, మీరు సేవలలో అభ్యర్థన యొక్క పూర్తి మార్గాన్ని చూస్తారు. క్లయింట్ రెండు కోసం, మీరు సర్వర్ సైడ్ లాగ్లను మాత్రమే చూస్తారు, క్లిష్టమైన క్లయింట్ ట్రేస్ని కోల్పోయారు. ఇది సగం పజిల్ను చూసినట్లుగా ఉంది—ఏదో మిస్ అయినట్లు మీకు తెలుసు కానీ ముక్కలను కలిపి ఉంచలేము. 😓
ఈ కథనంలో, స్ప్రింగ్ బూట్ 3.4 ఎకోసిస్టమ్కు కట్టుబడి ఉండి, స్ప్రింగ్ క్లౌడ్ స్లీత్పై ఆధారపడకుండా ఈ సమస్యను ఎలా పరిష్కరించాలో మేము విశ్లేషిస్తాము. చివరికి, మీ సిస్టమ్ అంతటా అతుకులు లేని పరిశీలనను నిర్ధారిస్తూ అనుకూల శీర్షికల నుండి ట్రేస్లను ఎలా ప్రచారం చేయాలో మరియు కొనసాగించాలో మీకు తెలుస్తుంది.
ఆదేశం | ఉపయోగం యొక్క ఉదాహరణ |
---|---|
MDC.put | ఈ ఆదేశం మ్యాప్డ్ డయాగ్నస్టిక్ కాంటెక్స్ట్ (MDC)కి కీ-విలువ జతలను జోడిస్తుంది, ఇది కస్టమ్ ట్రేస్ IDలను లాగ్లలో చేర్చడానికి అనుమతిస్తుంది. ఉదాహరణకు, MDC.put("traceId", "12345"). |
MDC.clear | అభ్యర్థనల మధ్య ట్రేస్ కాలుష్యాన్ని నివారించడానికి అభ్యర్థనను ప్రాసెస్ చేసిన తర్వాత MDC నుండి అన్ని ఎంట్రీలను క్లియర్ చేస్తుంది. ఉదాహరణకు, MDC.clear(). |
OncePerRequestFilter | ఒక HTTP అభ్యర్థనకు ఒకసారి మాత్రమే ఫిల్టర్ లాజిక్ అమలు చేయబడుతుందని నిర్ధారించే స్ప్రింగ్ బూట్ ఫిల్టర్, హెడర్లను కనుగొనడానికి అనువైనది. ఉదాహరణ: పబ్లిక్ క్లాస్ CustomTraceFilter OncePerRequestFilterని పొడిగిస్తుంది. |
filterChain.doFilter | ఇతర ఫిల్టర్ల ద్వారా అభ్యర్థన కొనసాగుతుందని నిర్ధారిస్తూ, గొలుసులోని తదుపరి ఫిల్టర్కి చేరుకుంటుంది. ఉదాహరణకు, filterChain.doFilter(అభ్యర్థన, ప్రతిస్పందన). |
RestTemplate.getInterceptors() | RestTemplate ఉదాహరణ కోసం ఇంటర్సెప్టర్ల జాబితాను తిరిగి పొందుతుంది, అనుకూల ఇంటర్సెప్టర్లను జోడించడానికి అనుమతిస్తుంది. ఉదాహరణ: restTemplate.getInterceptors().add(new CustomInterceptor()). |
ClientHttpRequestInterceptor | అవుట్గోయింగ్ HTTP అభ్యర్థనలను అడ్డుకోవడం మరియు అనుకూల శీర్షికలను జోడించడం కోసం ఇంటర్ఫేస్. ఉదాహరణకు, ట్రేస్ IDలను చొప్పించడానికి 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(అభ్యర్థన, శరీరం). |
స్ప్రింగ్ బూట్లో అనుకూల హెడర్ ట్రేస్ ప్రచారం
ఈ సమస్యను పరిష్కరించడంలో కీలకమైన అంశాలలో ఒకటి CustomTraceFilter. ఈ ఫిల్టర్ విస్తరించింది ఒకసారిPerRequestFilter తరగతి, ప్రతి HTTP అభ్యర్థన కోసం ట్రేస్ హెడర్ లాజిక్ ఒక్కసారి మాత్రమే నడుస్తుందని నిర్ధారిస్తుంది. ప్రపంచవ్యాప్తంగా అభ్యర్థనలు లేదా ప్రతిస్పందనలను సవరించేటప్పుడు స్ప్రింగ్ బూట్లోని ఫిల్టర్లు చాలా ఉపయోగకరంగా ఉంటాయి. ఉదాహరణకు, క్లయింట్ వంటి ట్రేసింగ్ సమాచారాన్ని పంపితే ఓట్-కస్టమ్-ట్రేసిడ్ లేదా ఓట్-కస్టమ్-స్పానిడ్ కస్టమ్ హెడర్లలో, ఈ ఫిల్టర్ అభ్యర్థనను అడ్డగిస్తుంది, ఈ హెడర్లను సంగ్రహిస్తుంది మరియు వాటిని మ్యాప్డ్ డయాగ్నస్టిక్ కాంటెక్స్ట్ (MDC)లో ప్రచారం చేస్తుంది. MDCకి ట్రేస్ IDలను జోడించడం ద్వారా, అభ్యర్థన ప్రాసెసింగ్ సమయంలో రూపొందించబడిన లాగ్లలో ఈ ఐడెంటిఫైయర్లు కనిపించేలా మేము నిర్ధారిస్తాము.
SLF4J మరియు లాగ్బ్యాక్ వంటి లాగింగ్ ఫ్రేమ్వర్క్లలో MDC కీలకమైన భాగం. ఇది కస్టమ్ ట్రేస్ IDల వంటి ప్రస్తుత థ్రెడ్ కోసం సందర్భోచిత సమాచారాన్ని నిల్వ చేయడానికి మమ్మల్ని అనుమతిస్తుంది. వంటి ఆదేశాలను ఉపయోగించడం MDC.పుట్ మరియు MDC. clear, లాగింగ్ సిస్టమ్ ట్రేస్ వివరాలను కలిగి ఉందని మరియు ఉమ్మడి అభ్యర్థనల మధ్య కలుషితాన్ని నివారిస్తుందని మేము నిర్ధారిస్తాము. ఉదాహరణకు, క్లయింట్ రెండు `ot-custom-traceid`ని `8f7ebd8a73f9a8f50e6a00a87a20952a`గా పంపితే, ఈ ID MDCలో నిల్వ చేయబడుతుంది మరియు అన్ని దిగువ లాగ్లలో చేర్చబడుతుంది, స్థిరమైన ట్రేస్ పాత్ను సృష్టిస్తుంది.
మరోవైపు, అవుట్గోయింగ్ HTTP అభ్యర్థనల కోసం, RestTemplate ఇంటర్సెప్టర్ ముఖ్యమైన పాత్రను పోషిస్తుంది. అమలు చేయడం ద్వారా ClientHttpRequestInterceptor, మేము అవుట్గోయింగ్ అభ్యర్థనలకు అదే ట్రేస్ హెడర్లను (`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 ఇంటర్సెప్టర్లను ఉపయోగించడం
// 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, ఒక ఓపెన్ సోర్స్ అబ్జర్బిలిటీ ఫ్రేమ్వర్క్, సాధనం, సేకరించడం మరియు ట్రేస్లను సజావుగా ఎగుమతి చేయడంలో సహాయపడుతుంది. కస్టమ్ హెడర్లతో సహా ట్రేస్ కాంటెక్స్ట్ను సంగ్రహించడానికి మరియు ఇంజెక్ట్ చేయడానికి ఇది మెకానిజమ్లను అందిస్తుంది ఓట్-కస్టమ్-ట్రేసిడ్ మరియు ఓట్-కస్టమ్-స్పానిడ్, మీ అప్లికేషన్ లోకి. OpenTelemetry యొక్క TextMapPropagatorని ఉపయోగించడం ద్వారా, మీరు ప్రామాణికం కాని క్లయింట్లు మరియు మీ పరిశీలనా వ్యవస్థ మధ్య అంతరాన్ని తగ్గించవచ్చు.
స్ప్రింగ్ బూట్ 3.4లో OpenTelemetryని ఉపయోగించడానికి, కస్టమ్ హెడర్ల నుండి ట్రేసింగ్ సమాచారాన్ని సంగ్రహించడానికి మరియు దానిని ప్రస్తుత ట్రేస్ సందర్భానికి జోడించడానికి కస్టమ్ ప్రొపగేటర్ని అమలు చేయవచ్చు. ఉదాహరణకు, మీ సర్వర్ క్లయింట్ టూ నుండి ఇన్కమింగ్ అభ్యర్థనను స్వీకరించినప్పుడు, OpenTelemetry కస్టమ్ హెడర్లను అన్వయించగలదు మరియు అసలు ట్రేస్ సందర్భాన్ని పునర్నిర్మించగలదు. ఇది డౌన్స్ట్రీమ్ సేవలు ఒకే ట్రేస్ IDలను చూసేలా నిర్ధారిస్తుంది, ఇది ఎండ్-టు-ఎండ్ విజిబిలిటీని అనుమతిస్తుంది. స్ప్రింగ్ క్లౌడ్ స్లీత్ వంటి పాత పరిష్కారాల వలె కాకుండా, OpenTelemetry తేలికైనది మరియు ఆధునిక పరిశీలనా ప్రమాణాలకు అనుగుణంగా ఉంటుంది.
మైక్రోమీటర్తో OpenTelemetry యొక్క ప్రచారకర్తను కలపడం ద్వారా, మీరు మీ మెట్రిక్లను మెరుగుపరచవచ్చు మరియు ట్రేస్ సమాచారంతో లాగింగ్ చేయవచ్చు. మీ అబ్జర్బిలిటీ టూల్లో క్లయింట్ వన్ మరియు క్లయింట్ టూ రెండింటి నుండి సజావుగా వచ్చే అభ్యర్థనల కోసం ట్రేస్లను చూసినట్లు ఊహించుకోండి. OpenTelemetry స్వయంచాలకంగా ప్రోమేతియస్, జిప్కిన్ లేదా జేగర్తో అనుసంధానాలకు మద్దతు ఇస్తుంది, ట్రేస్ విజువలైజేషన్ను కేంద్రీకరించడానికి మిమ్మల్ని అనుమతిస్తుంది. ఈ విధానం కస్టమ్ హెడర్లు ప్రమేయం ఉన్నప్పటికీ, ట్రేస్ డేటాను కోల్పోకుండా మరియు డీబగ్గింగ్ చాలా సులభం అవుతుందని నిర్ధారిస్తుంది. 🚀
స్ప్రింగ్ బూట్లో కస్టమ్ ట్రేస్లను ప్రచారం చేయడం గురించి తరచుగా అడిగే ప్రశ్నలు
- నేను స్ప్రింగ్ బూట్లో కస్టమ్ ట్రేస్ హెడర్లను మాన్యువల్గా ఎలా సంగ్రహించగలను?
- మీరు నిర్దిష్ట హెడర్ను మాన్యువల్గా పొందేందుకు request.getHeader("కస్టమ్-హెడర్")ని ఉపయోగించవచ్చు మరియు MDC.put("traceId", value)ని ఉపయోగించి MDCకి జోడించవచ్చు.
- కస్టమ్ ట్రేస్ ప్రచారం కోసం OpenTelemetryని ఉపయోగించడం వల్ల ప్రయోజనం ఏమిటి?
- OpenTelemetry మైక్రోసర్వీస్లలో అనుకూల శీర్షికలతో సహా ట్రేస్లను ప్రచారం చేయడానికి ఆధునిక, విక్రేత-తటస్థ విధానాన్ని అందిస్తుంది.
- నేను స్ప్రింగ్ బూట్లో RestTemplateతో అనుకూల శీర్షికలను ప్రచారం చేయవచ్చా?
- అవును, ClientHttpRequestInterceptorని అమలు చేయడం ద్వారా, మీరు అవుట్గోయింగ్ అభ్యర్థనలకు traceid మరియు spanid వంటి అనుకూల శీర్షికలను జోడించవచ్చు.
- ప్రపంచవ్యాప్తంగా హెడర్లను క్యాప్చర్ చేయడానికి నేను ఫిల్టర్ను ఎలా నమోదు చేయాలి?
- మీరు OncePerRequestFilterని విస్తరించే ఫిల్టర్ని సృష్టించవచ్చు మరియు అన్ని ఎండ్ పాయింట్ల కోసం హెడర్లను క్యాప్చర్ చేయడానికి FilterRegistrationBeanని ఉపయోగించి దాన్ని నమోదు చేసుకోవచ్చు.
- స్ప్రింగ్ బూట్ నుండి జాడలను దృశ్యమానం చేయడానికి నేను ఏ సాధనాలను ఉపయోగించగలను?
- Zipkin, Jaeger మరియు Prometheus వంటి సాధనాలు ఎండ్-టు-ఎండ్ ట్రేస్లను విజువలైజ్ చేయడానికి స్ప్రింగ్ బూట్ మరియు OpenTelemetryతో అనుసంధానించవచ్చు.
అతుకులు లేని ట్రేస్ కంటిన్యూటీని నిర్ధారించడం
ఆధునిక సిస్టమ్లలో, విశ్వసనీయమైన పరిశీలన కోసం అనుకూల ట్రేస్ హెడర్లను నిర్వహించడం చాలా కీలకం. ఫిల్టర్లు మరియు ఇంటర్సెప్టర్లను ఉపయోగించడం ద్వారా, మీరు క్లయింట్ అందించిన ట్రేసింగ్ సమాచారాన్ని క్యాప్చర్ చేయవచ్చు మరియు దానిని మీ సేవల్లో సరిగ్గా ప్రచారం చేయవచ్చు. ఇది ఫ్రాగ్మెంటెడ్ లాగ్లు మరియు మిస్సింగ్ ట్రేస్లను నివారిస్తుంది. 🔍
స్ప్రింగ్ బూట్ 3.4, మైక్రోమీటర్ లేదా ఓపెన్టెలిమెట్రీతో కలిపి, స్ప్రింగ్ క్లౌడ్ స్లీత్ వంటి పాత సాధనాలపై ఆధారపడకుండా బలమైన పరిష్కారాలను అనుమతిస్తుంది. మీరు క్లయింట్ వన్ యొక్క స్టాండర్డ్ హెడర్లతో లేదా క్లయింట్ టూ యొక్క కస్టమ్ హెడర్లతో వ్యవహరిస్తున్నా, ఈ టెక్నిక్లను అమలు చేయడం ద్వారా ట్రేస్ గ్యాప్లను సమర్ధవంతంగా తగ్గించవచ్చు. 🚀
మూలాలు మరియు సూచనలు
- స్ప్రింగ్ బూట్ అధికారిక డాక్యుమెంటేషన్: ట్రేసింగ్ కాంటెక్స్ట్ల ప్రచారం. స్ప్రింగ్ బూట్ డాక్యుమెంటేషన్
- జావా డెవలపర్ల కోసం ఓపెన్టెలిమెట్రీ: ట్రేస్ ప్రాపగేషన్కు మార్గదర్శి. ఓపెన్ టెలీమెట్రీ జావా
- మైక్రోమీటర్ అబ్జర్వేబిలిటీ డాక్యుమెంటేషన్: కస్టమ్ ట్రేస్ హెడర్లను సమగ్రపరచడం. మైక్రోమీటర్ పరిశీలన
- SLF4J లాగింగ్ API: మ్యాప్డ్ డయాగ్నస్టిక్ కాంటెక్స్ట్ (MDC) కేసులను ఉపయోగించండి. SLF4J మాన్యువల్