HttpFilter.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package com.jd.platform.jlog.client.filter;
  2. import com.jd.platform.jlog.client.Context;
  3. import com.jd.platform.jlog.client.cache.ExtParamFactory;
  4. import com.jd.platform.jlog.client.log.LogExceptionStackTrace;
  5. import com.jd.platform.jlog.client.percent.DefaultTracerPercentImpl;
  6. import com.jd.platform.jlog.client.percent.ITracerPercent;
  7. import com.jd.platform.jlog.client.tracerholder.TracerHolder;
  8. import com.jd.platform.jlog.client.udp.UdpSender;
  9. import com.jd.platform.jlog.common.model.TracerBean;
  10. import com.jd.platform.jlog.common.handler.CompressHandler.Outcome;
  11. import com.jd.platform.jlog.common.utils.IdWorker;
  12. import com.jd.platform.jlog.common.utils.IpUtils;
  13. import com.jd.platform.jlog.core.ClientHandler;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import javax.servlet.*;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19. import java.io.BufferedReader;
  20. import java.io.IOException;
  21. import java.io.PrintWriter;
  22. import java.util.*;
  23. /**
  24. * HttpFilter
  25. * http://blog.chinaunix.net/uid-20783755-id-4729930.html
  26. *
  27. * @author wuweifeng
  28. * @version 1.0
  29. * @date 2021-08-16
  30. */
  31. public class HttpFilter implements Filter {
  32. /**
  33. * 获取切量百分比的
  34. */
  35. private ITracerPercent iTracerPercent;
  36. private Logger logger = LoggerFactory.getLogger(getClass());
  37. /**
  38. * 传入百分比实现类
  39. */
  40. public HttpFilter(ITracerPercent iTracerPercent) {
  41. this.iTracerPercent = iTracerPercent;
  42. }
  43. public HttpFilter() {
  44. iTracerPercent = new DefaultTracerPercentImpl();
  45. }
  46. public void setTracerPercent(ITracerPercent iTracerPercent) {
  47. this.iTracerPercent = iTracerPercent;
  48. }
  49. @Override
  50. public void init(FilterConfig filterConfig) {
  51. }
  52. @Override
  53. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  54. HttpServletResponse resp = (HttpServletResponse) servletResponse;
  55. RequestWrapper requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
  56. long currentTImeMills = System.currentTimeMillis();
  57. String uri = requestWrapper.getRequestURI().replace("/", "");
  58. //设置随机数
  59. Random random = new Random(currentTImeMills);
  60. //1-100之间
  61. int number = random.nextInt(100) + 1;
  62. //此处要有个开关,控制百分比
  63. if (iTracerPercent.percent() < number) {
  64. filterChain.doFilter(requestWrapper, servletResponse);
  65. return;
  66. }
  67. //如果是要忽略的接口,就继续执行,不搜集信息
  68. if (iTracerPercent.ignoreUriSet() != null && iTracerPercent.ignoreUriSet().contains(uri)) {
  69. filterChain.doFilter(requestWrapper, servletResponse);
  70. return;
  71. }
  72. //链路唯一Id
  73. long tracerId = IdWorker.nextId();
  74. TracerHolder.setTracerId(tracerId);
  75. TracerBean tracerBean = new TracerBean();
  76. tracerBean.setTracerId(tracerId);
  77. tracerBean.setCreateTimeLong(System.currentTimeMillis());
  78. tracerBean.setUri(uri);
  79. tracerBean.setApp(Context.APP_NAME);
  80. //处理request的各个入参
  81. parseRequestMap(requestWrapper, tracerBean);
  82. try {
  83. //处理response
  84. tracerBean.setResponseContent(dealResponseMap(requestWrapper, servletResponse,
  85. resp, filterChain));
  86. } catch (Exception e) {
  87. //异常信息
  88. tracerBean.setErrmsg(LogExceptionStackTrace.erroStackTrace(e).toString());
  89. filterChain.doFilter(requestWrapper, servletResponse);
  90. }finally {
  91. //设置耗时
  92. tracerBean.setCostTime((System.currentTimeMillis() - tracerBean.getCreateTimeLong()));
  93. //udp发送
  94. UdpSender.offerBean(tracerBean);
  95. }
  96. }
  97. /**
  98. * 处理出参相关信息
  99. */
  100. private byte[] dealResponseMap(ServletRequest servletRequest, ServletResponse servletResponse, HttpServletResponse resp,
  101. FilterChain filterChain) throws IOException, ServletException {
  102. // 包装响应对象 resp 并缓存响应数据
  103. ResponseWrapper mResp = new ResponseWrapper(resp);
  104. filterChain.doFilter(servletRequest, mResp);
  105. byte[] contentBytes = mResp.getContent();
  106. String content = new String(contentBytes);
  107. Map<String, Object> map = ExtParamFactory.getRespMap(content);
  108. Outcome outcome = ClientHandler.processResp(contentBytes, map);
  109. //此处可以对content做处理,然后再把content写回到输出流中
  110. servletResponse.setContentLength(-1);
  111. PrintWriter out = servletResponse.getWriter();
  112. out.write(content);
  113. out.flush();
  114. out.close();
  115. return (byte[]) outcome.getContent();
  116. }
  117. /**
  118. * 处理入参相关信息
  119. */
  120. private void parseRequestMap(RequestWrapper requestWrapper, TracerBean tracerBean) {
  121. //request的各个入参
  122. Map<String, String[]> params = requestWrapper.getParameterMap();
  123. Map<String, Object> requestMap = new HashMap<>(params.size());
  124. for (String key : params.keySet()) {
  125. requestMap.put(key, params.get(key)[0]);
  126. }
  127. tracerBean.setUid((String) requestMap.get("uid"));
  128. // 自定义的其他的参数对
  129. requestMap.putAll(ExtParamFactory.getReqMap(requestWrapper));
  130. Outcome out = ClientHandler.processReq(requestMap);
  131. tracerBean.setRequestContent((byte[]) out.getContent());
  132. }
  133. @Override
  134. public void destroy() {
  135. }
  136. }