最近同事有这样一个需求:
一个微服务即将被下线,但是还有两三个访问量非常少的接口在使用此服务,同事想知道这些访问来自哪里。
可以写一段代码来把来源 IP 打印出来,但是需要发布服务到测试环境,生产环境,十分繁琐。
Arthas能很好的解决这个问题。
分析了一下,这实际上是一个比较通用的功能,写出来供大家参考。
例如:
- 根据 URI 过滤请求;
- 监听指定 IP 过来的请求;
- 打印请求的 Header 信息等。
使用Arthas进行监听,不需要涉及业务代码,只涉及 Spring 框架中的方法,十分便利。
watch org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod '{params[0].getHeader("x-forwarded-for"),params[0].getHeader("Proxy-Client-IP"),params[0].getHeader("WL-Proxy-Client-IP"),params[0].getRemoteAddr()}' 'params[0].getRequestURI().contains("/cricketuser/inside/get/user/by/client")' -n 5 -x 2
解释一下上面的命令:
params[0].getHeader("x-forwarded-for"), 打印Header中各种信息;
params[0].getHeader("Proxy-Client-IP"),
params[0].getHeader("WL-Proxy-Client-IP"),
params[0].getRemoteAddr() 打印IP地址
'params[0].getRequestURI().contains("/cricketuser/inside/get/user/by/client")' 根据URI过滤;
此方法的原理是:SpringMVC 的请求会通过 RequestMappingHandlerAdapter 执行 invokeHandlerMethod 到达目标接口上进行处理,所以每一个 Http 请求,都会调用此方法。
转载请注明:牛哥678 » 使用 Arthas 监控 HttpServletRequest