Feign请求拦截器实现Spring Cloud中日志链路的跟踪

本文作者:suxingrui
本文链接:https://blog.csdn.net/suxingrui/article/details/103789078
版权声明:本文为原创文章,转载请注明出处。

回顾2019年碰到的问题及解决方式
问题:Spring Cloud中使用Feign,如何跟踪请求日志链路

问题发现:
问题虽然描述得不简单,但实际就是使用Feign调度的时候,如何传递TraceId,且不修改请求的方式

调查分析:
没有分析,只要记得有请求拦截器RequestInterceptor就能简单实现

解决方法:
1、实现请求拦截器

/**
 * Feign请求拦截器
 *
 * @author suxingrui
 * @time 2019/9/8 9:49
 **/
public class FeignRequestInterceptor implements RequestInterceptor {

	@Override
	public void apply(RequestTemplate template) {
		template.header("traceId", TraceIdHolder.get());
	}

}

2、调用方添加Bean

	@Bean
	public FeignRequestInterceptor feignRequestInterceptor() {
		return new FeignRequestInterceptor();
	}

3、被调用方在WebFilter中获取traceId

/**
 * @author suxx
 * @version V1.0.0
 * @date 2016-08-21 00:42:29
 */
@Slf4j
public class WebFilter extends GenericFilterBean {

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
		String threadName = Thread.currentThread().getName();
		long requestTime = System.currentTimeMillis();
		try {
			HttpServletRequest request = (HttpServletRequest) servletRequest;

			String traceId = new HttpRequestParameter(request).getParameter("traceId");
			if (StringUtils.isNotBlank(traceId)) {
				TraceIdHolder.set(traceId);
			} else {
				TraceIdHolder.create();
			}
			Thread.currentThread().setName(threadName + "-" + TraceIdHolder.get());
			
			...
			
			filterChain.doFilter(servletRequest, servletResponse);
		} catch (Throwable e) {
			log.error("cost:{}ms uncatch throwable:", System.currentTimeMillis() - requestTime, e);
		} finally {
			Thread.currentThread().setName(threadName);
			TraceIdHolder.remove();
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值