ਸਪਰਿੰਗ ਬੂਟ ਵਿੱਚ ਕਸਟਮ ਹੈਡਰ ਟਰੇਸ ਨੂੰ ਸੰਭਾਲਣਾ 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(ਨਵਾਂ 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-ਕਸਟਮ-ਟਰੇਸੀਡ ਜਾਂ ot-ਕਸਟਮ-ਸਪੈਨਿਡ ਕਸਟਮ ਸਿਰਲੇਖਾਂ ਵਿੱਚ, ਇਹ ਫਿਲਟਰ ਬੇਨਤੀ ਨੂੰ ਰੋਕਦਾ ਹੈ, ਇਹਨਾਂ ਸਿਰਲੇਖਾਂ ਨੂੰ ਕੱਢਦਾ ਹੈ, ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਮੈਪਡ ਡਾਇਗਨੌਸਟਿਕ ਸੰਦਰਭ (MDC) ਵਿੱਚ ਪ੍ਰਸਾਰਿਤ ਕਰਦਾ ਹੈ। MDC ਵਿੱਚ ਟਰੇਸ ਆਈਡੀ ਜੋੜ ਕੇ, ਅਸੀਂ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹਾਂ ਕਿ ਇਹ ਪਛਾਣਕਰਤਾ ਬੇਨਤੀ ਪ੍ਰਕਿਰਿਆ ਦੌਰਾਨ ਤਿਆਰ ਕੀਤੇ ਗਏ ਲੌਗਾਂ ਵਿੱਚ ਦਿਖਾਈ ਦੇ ਰਹੇ ਹਨ।
MDC ਲਾਗਿੰਗ ਫਰੇਮਵਰਕ ਜਿਵੇਂ ਕਿ SLF4J ਅਤੇ ਲੌਗਬੈਕ ਦਾ ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਹਿੱਸਾ ਹੈ। ਇਹ ਸਾਨੂੰ ਮੌਜੂਦਾ ਥ੍ਰੈਡ ਲਈ ਪ੍ਰਸੰਗਿਕ ਜਾਣਕਾਰੀ ਸਟੋਰ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਕਸਟਮ ਟਰੇਸ ਆਈ.ਡੀ. ਵਰਗੇ ਕਮਾਂਡਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨਾ MDC.put ਅਤੇ MDC.clear, ਅਸੀਂ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹਾਂ ਕਿ ਲੌਗਿੰਗ ਸਿਸਟਮ ਵਿੱਚ ਟਰੇਸ ਵੇਰਵੇ ਸ਼ਾਮਲ ਹਨ ਅਤੇ ਸਮਕਾਲੀ ਬੇਨਤੀਆਂ ਵਿਚਕਾਰ ਗੰਦਗੀ ਤੋਂ ਬਚਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਜੇਕਰ ਕਲਾਇੰਟ ਦੋ `ot-custom-traceid` ਨੂੰ `8f7ebd8a73f9a8f50e6a00a87a20952a` ਵਜੋਂ ਭੇਜਦਾ ਹੈ, ਤਾਂ ਇਹ ਆਈਡੀ 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 ਬੇਨਤੀਆਂ ਵਿੱਚ ਕਸਟਮ ਸਿਰਲੇਖਾਂ ਦਾ ਪ੍ਰਚਾਰ ਕਰਨਾ
ਆਊਟਗੋਇੰਗ ਬੇਨਤੀਆਂ ਵਿੱਚ ਕਸਟਮ ਹੈਡਰ ਜੋੜਨ ਲਈ ਰੈਸਟਟੈਂਪਲੇਟ ਇੰਟਰਸੈਪਟਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨਾ
// 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-ਕਸਟਮ-ਟਰੇਸੀਡ ਅਤੇ ot-ਕਸਟਮ-ਸਪੈਨਿਡ, ਤੁਹਾਡੀ ਅਰਜ਼ੀ ਵਿੱਚ. OpenTelemetry ਦੇ TextMapPropagator ਦਾ ਲਾਭ ਉਠਾ ਕੇ, ਤੁਸੀਂ ਗੈਰ-ਮਿਆਰੀ ਕਲਾਇੰਟਸ ਅਤੇ ਤੁਹਾਡੇ ਨਿਰੀਖਣ ਪ੍ਰਣਾਲੀ ਦੇ ਵਿਚਕਾਰ ਪਾੜੇ ਨੂੰ ਪੂਰਾ ਕਰ ਸਕਦੇ ਹੋ।
ਸਪਰਿੰਗ ਬੂਟ 3.4 ਵਿੱਚ ਓਪਨਟੈਲੀਮੇਟਰੀ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਕਸਟਮ ਹੈਡਰਾਂ ਤੋਂ ਟਰੇਸਿੰਗ ਜਾਣਕਾਰੀ ਨੂੰ ਐਕਸਟਰੈਕਟ ਕਰਨ ਅਤੇ ਮੌਜੂਦਾ ਟਰੇਸ ਸੰਦਰਭ ਵਿੱਚ ਇਸ ਨੂੰ ਜੋੜਨ ਲਈ ਇੱਕ ਕਸਟਮ ਪ੍ਰੋਪੇਗੇਟਰ ਲਾਗੂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਜਦੋਂ ਤੁਹਾਡੇ ਸਰਵਰ ਨੂੰ ਕਲਾਇੰਟ ਦੋ ਤੋਂ ਇੱਕ ਇਨਕਮਿੰਗ ਬੇਨਤੀ ਪ੍ਰਾਪਤ ਹੁੰਦੀ ਹੈ, ਓਪਨਟੈਲੀਮੇਟਰੀ ਕਸਟਮ ਸਿਰਲੇਖਾਂ ਨੂੰ ਪਾਰਸ ਕਰ ਸਕਦੀ ਹੈ ਅਤੇ ਮੂਲ ਟਰੇਸ ਸੰਦਰਭ ਦਾ ਪੁਨਰਗਠਨ ਕਰ ਸਕਦੀ ਹੈ। ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਡਾਊਨਸਟ੍ਰੀਮ ਸੇਵਾਵਾਂ ਉਹੀ ਟਰੇਸ ਆਈਡੀ ਵੇਖਦੀਆਂ ਹਨ, ਅੰਤ-ਤੋਂ-ਅੰਤ ਦਿੱਖ ਦੀ ਆਗਿਆ ਦਿੰਦੀਆਂ ਹਨ। ਸਪਰਿੰਗ ਕਲਾਉਡ ਸਲੀਥ ਵਰਗੇ ਪੁਰਾਣੇ ਹੱਲਾਂ ਦੇ ਉਲਟ, ਓਪਨਟੈਲੀਮੈਟਰੀ ਹਲਕਾ ਹੈ ਅਤੇ ਆਧੁਨਿਕ ਨਿਰੀਖਣਤਾ ਮਿਆਰਾਂ ਨਾਲ ਇਕਸਾਰ ਹੈ।
OpenTelemetry ਦੇ ਪ੍ਰਚਾਰਕ ਨੂੰ ਮਾਈਕ੍ਰੋਮੀਟਰ ਨਾਲ ਜੋੜ ਕੇ, ਤੁਸੀਂ ਟਰੇਸ ਜਾਣਕਾਰੀ ਨਾਲ ਆਪਣੇ ਮੈਟ੍ਰਿਕਸ ਅਤੇ ਲੌਗਿੰਗ ਨੂੰ ਅਮੀਰ ਬਣਾ ਸਕਦੇ ਹੋ। ਕਲਪਨਾ ਕਰੋ ਕਿ ਤੁਹਾਡੇ ਆਬਜ਼ਰਵੇਬਿਲਟੀ ਟੂਲ ਵਿੱਚ ਕਲਾਇੰਟ ਵਨ ਅਤੇ ਕਲਾਈਂਟ ਦੋ ਦੋਵਾਂ ਤੋਂ ਆਉਣ ਵਾਲੀਆਂ ਬੇਨਤੀਆਂ ਲਈ ਟਰੇਸ ਦੇਖਣਾ ਹੈ। OpenTelemetry ਆਪਣੇ ਆਪ ਹੀ ਪ੍ਰੋਮੀਥੀਅਸ, ਜ਼ਿਪਕਿਨ, ਜਾਂ ਜੇਗਰ ਨਾਲ ਏਕੀਕਰਣ ਦਾ ਸਮਰਥਨ ਕਰਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਟਰੇਸ ਵਿਜ਼ੂਅਲਾਈਜ਼ੇਸ਼ਨ ਨੂੰ ਕੇਂਦਰੀਕ੍ਰਿਤ ਕਰ ਸਕਦੇ ਹੋ। ਇਹ ਪਹੁੰਚ ਯਕੀਨੀ ਬਣਾਉਂਦੀ ਹੈ ਕਿ ਭਾਵੇਂ ਕਸਟਮ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਹੋਣ, ਕੋਈ ਟਰੇਸ ਡੇਟਾ ਨਹੀਂ ਗੁਆਚਦਾ ਹੈ, ਅਤੇ ਡੀਬੱਗਿੰਗ ਕਾਫ਼ੀ ਆਸਾਨ ਹੋ ਜਾਂਦੀ ਹੈ। 🚀
ਬਸੰਤ ਬੂਟ ਵਿੱਚ ਕਸਟਮ ਟਰੇਸ ਨੂੰ ਪ੍ਰਸਾਰਿਤ ਕਰਨ ਬਾਰੇ ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸਵਾਲ
- ਮੈਂ ਸਪਰਿੰਗ ਬੂਟ ਵਿੱਚ ਕਸਟਮ ਟਰੇਸ ਹੈਡਰ ਨੂੰ ਹੱਥੀਂ ਕਿਵੇਂ ਐਕਸਟਰੈਕਟ ਕਰਾਂ?
- ਤੁਸੀਂ ਇੱਕ ਖਾਸ ਸਿਰਲੇਖ ਨੂੰ ਹੱਥੀਂ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ request.getHeader("custom-header") ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਇਸਨੂੰ MDC.put("traceId", ਮੁੱਲ) ਦੀ ਵਰਤੋਂ ਕਰਕੇ MDC ਵਿੱਚ ਸ਼ਾਮਲ ਕਰ ਸਕਦੇ ਹੋ।
- ਕਸਟਮ ਟਰੇਸ ਪ੍ਰਸਾਰ ਲਈ OpenTelemetry ਦੀ ਵਰਤੋਂ ਕਰਨ ਦਾ ਕੀ ਫਾਇਦਾ ਹੈ?
- OpenTelemetry ਮਾਈਕ੍ਰੋ ਸਰਵਿਸਿਜ਼ ਵਿੱਚ ਕਸਟਮ ਸਿਰਲੇਖਾਂ ਸਮੇਤ, ਟਰੇਸ ਨੂੰ ਫੈਲਾਉਣ ਲਈ ਇੱਕ ਆਧੁਨਿਕ, ਵਿਕਰੇਤਾ-ਨਿਰਪੱਖ ਪਹੁੰਚ ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ।
- ਕੀ ਮੈਂ ਬਸੰਤ ਬੂਟ ਵਿੱਚ RestTemplate ਨਾਲ ਕਸਟਮ ਸਿਰਲੇਖਾਂ ਦਾ ਪ੍ਰਚਾਰ ਕਰ ਸਕਦਾ ਹਾਂ?
- ਹਾਂ, ਇੱਕ ClientHttpRequestInterceptor ਨੂੰ ਲਾਗੂ ਕਰਕੇ, ਤੁਸੀਂ ਆਊਟਗੋਇੰਗ ਬੇਨਤੀਆਂ ਵਿੱਚ traceid ਅਤੇ spanid ਵਰਗੇ ਕਸਟਮ ਸਿਰਲੇਖਾਂ ਨੂੰ ਨੱਥੀ ਕਰ ਸਕਦੇ ਹੋ।
- ਮੈਂ ਵਿਸ਼ਵ ਪੱਧਰ 'ਤੇ ਸਿਰਲੇਖਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰਨ ਲਈ ਇੱਕ ਫਿਲਟਰ ਕਿਵੇਂ ਰਜਿਸਟਰ ਕਰਾਂ?
- ਤੁਸੀਂ ਇੱਕ ਫਿਲਟਰ ਬਣਾ ਸਕਦੇ ਹੋ ਜੋ OncePerRequestFilter ਨੂੰ ਵਧਾਉਂਦਾ ਹੈ ਅਤੇ ਇਸਨੂੰ FilterRegistrationBean ਵਰਤ ਕੇ ਰਜਿਸਟਰ ਕਰ ਸਕਦਾ ਹੈ ਤਾਂ ਜੋ ਸਾਰੇ ਅੰਤਮ ਬਿੰਦੂਆਂ ਲਈ ਸਿਰਲੇਖਾਂ ਨੂੰ ਕੈਪਚਰ ਕੀਤਾ ਜਾ ਸਕੇ।
- ਸਪਰਿੰਗ ਬੂਟ ਤੋਂ ਟਰੇਸ ਦੀ ਕਲਪਨਾ ਕਰਨ ਲਈ ਮੈਂ ਕਿਹੜੇ ਸਾਧਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹਾਂ?
- ਜ਼ਿਪਕਿਨ, ਜੇਗਰ, ਅਤੇ ਪ੍ਰੋਮੀਥੀਅਸ ਵਰਗੇ ਟੂਲ ਐਂਡ-ਟੂ-ਐਂਡ ਟਰੇਸ ਦੀ ਕਲਪਨਾ ਕਰਨ ਲਈ ਸਪਰਿੰਗ ਬੂਟ ਅਤੇ ਓਪਨ ਟੈਲੀਮੇਟਰੀ ਨਾਲ ਏਕੀਕ੍ਰਿਤ ਹੋ ਸਕਦੇ ਹਨ।
ਸਹਿਜ ਟਰੇਸ ਨਿਰੰਤਰਤਾ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਣਾ
ਆਧੁਨਿਕ ਪ੍ਰਣਾਲੀਆਂ ਵਿੱਚ, ਕਸਟਮ ਟਰੇਸ ਸਿਰਲੇਖਾਂ ਨੂੰ ਸੰਭਾਲਣਾ ਭਰੋਸੇਯੋਗ ਨਿਰੀਖਣਯੋਗਤਾ ਲਈ ਮਹੱਤਵਪੂਰਨ ਹੈ। ਫਿਲਟਰਾਂ ਅਤੇ ਇੰਟਰਸੈਪਟਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ, ਤੁਸੀਂ ਕਲਾਇੰਟ ਦੁਆਰਾ ਪ੍ਰਦਾਨ ਕੀਤੀ ਟਰੇਸਿੰਗ ਜਾਣਕਾਰੀ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਇਸਨੂੰ ਆਪਣੀਆਂ ਸੇਵਾਵਾਂ ਵਿੱਚ ਸਹੀ ਢੰਗ ਨਾਲ ਪ੍ਰਸਾਰਿਤ ਕਰ ਸਕਦੇ ਹੋ। ਇਹ ਖੰਡਿਤ ਲੌਗਾਂ ਅਤੇ ਗੁੰਮ ਹੋਏ ਨਿਸ਼ਾਨਾਂ ਤੋਂ ਬਚਦਾ ਹੈ। 🔍
ਸਪਰਿੰਗ ਬੂਟ 3.4, ਮਾਈਕ੍ਰੋਮੀਟਰ ਜਾਂ ਓਪਨਟੈਲੀਮੈਟਰੀ ਦੇ ਨਾਲ, ਸਪਰਿੰਗ ਕਲਾਉਡ ਸਲੂਥ ਵਰਗੇ ਪੁਰਾਣੇ ਟੂਲਸ 'ਤੇ ਭਰੋਸਾ ਕੀਤੇ ਬਿਨਾਂ ਮਜ਼ਬੂਤ ਹੱਲਾਂ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਭਾਵੇਂ ਤੁਸੀਂ ਕਲਾਇੰਟ ਵਨ ਦੇ ਸਟੈਂਡਰਡ ਸਿਰਲੇਖਾਂ ਜਾਂ ਕਲਾਇੰਟ ਟੂ ਦੇ ਕਸਟਮ ਸਿਰਲੇਖਾਂ ਨਾਲ ਕੰਮ ਕਰ ਰਹੇ ਹੋ, ਇਹਨਾਂ ਤਕਨੀਕਾਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਨਾਲ ਟਰੇਸ ਗੈਪ ਨੂੰ ਕੁਸ਼ਲਤਾ ਨਾਲ ਪੂਰਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। 🚀
ਸਰੋਤ ਅਤੇ ਹਵਾਲੇ
- ਸਪਰਿੰਗ ਬੂਟ ਅਧਿਕਾਰਤ ਦਸਤਾਵੇਜ਼: ਟਰੇਸਿੰਗ ਪ੍ਰਸੰਗਾਂ ਦਾ ਪ੍ਰਸਾਰ। ਬਸੰਤ ਬੂਟ ਦਸਤਾਵੇਜ਼
- ਜਾਵਾ ਡਿਵੈਲਪਰਾਂ ਲਈ ਓਪਨ ਟੈਲੀਮੇਟਰੀ: ਟਰੇਸ ਪ੍ਰਸਾਰ ਲਈ ਗਾਈਡ। OpenTelemetry Java
- ਮਾਈਕ੍ਰੋਮੀਟਰ ਨਿਰੀਖਣਯੋਗਤਾ ਦਸਤਾਵੇਜ਼: ਕਸਟਮ ਟਰੇਸ ਸਿਰਲੇਖਾਂ ਨੂੰ ਏਕੀਕ੍ਰਿਤ ਕਰਨਾ। ਮਾਈਕ੍ਰੋਮੀਟਰ ਨਿਰੀਖਣਯੋਗਤਾ
- SLF4J ਲੌਗਿੰਗ API: ਮੈਪਡ ਡਾਇਗਨੌਸਟਿਕ ਸੰਦਰਭ (MDC) ਵਰਤੋਂ ਦੇ ਕੇਸ। SLF4J ਮੈਨੂਅਲ