为什么要监控

  服务化接口是提供服务的,接口正确性、稳定性是最最重要的,在保证正确的同时需要尽量提高接口响应时间。

  有的团队会有专门的工具来对系统响应时间、吞吐量做监控,但如果团队没有这种“待遇”就需要自己来做一些工具为自己的代码提供服务。

自己动手,丰衣足食

  AOP + Annotation 简陋实现,能达到目的

  AOP : 使用环绕方式对接口拦截,在拦截接口前后记录时间最后计算用时

  Annotation : 自定义注解在接口上设置超时时间(timeout)和超时是否发送邮件选项(emailIfTimeout)

  通过对接口实际执行时间和配置的超时时间比较,系统可以计算出接口是否超时,此时可使用日志(或其他能通知到开发人员的方式)记录具体哪个接口、什么参数以及执行时间

  注解可以提供更多的选项,来为自己接口服务,比如支持注解到类上,批量为接口设置了默认超时时间、支持日志中显示的处理方法名称 等等...

代码实施

接口Annotation定义

/**
* 接口自定义属性
*
* @author tianshu on 16/8/30 下午4:55.
*/
@Target(value = {ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface InterfaceProperty { /**
* 接口超时时间,单位毫秒.默认值100毫秒
* @return 设置的超时时间
*/
int timeout() default 400; /**
* 当接口响应超时时,是否发送邮件.默认发送
* @return 返回ture需要发送邮件
*/
boolean emailIfTimeout() default true;
}

AOP实现

/**
* @author tianshu on 16/1/28 下午10:35.
*/
@Component
@Aspect
public class SystemRequestAspect { /** 日志 */
private static final Logger LOG = LoggerFactory.getLogger(SystemRequestAspect.class); /** 接口超时日志 */
private static final Logger INTERFACE_TIMEOUT_LOG = LoggerFactory.getLogger("INTERFACE_TIMEOUT_LOG"); @Around(value = "execution(* com.xx.xx.xx.xx..*.*(..))", argNames="pjp")
public Object validator(ProceedingJoinPoint pjp) throws Throwable {
Object[] args = pjp.getArgs(); /** 拦截的方法名称 */
String methodName = pjp.getTarget().getClass().getSimpleName() + "." + pjp.getSignature().getName(); try {
long start = System.currentTimeMillis();
Object obj = pjp.proceed(args);
long finish = System.currentTimeMillis();
long useTime = finish - start;
/** 接口响应时间监控 */
interfaceUseTimeMonitor(pjp.getTarget().getClass(), pjp.getSignature().getName(), args, useTime); return obj;
} catch(Throwable e) {//处理你的异常
} finally {//处理其他
}
} /**
* 接口响应时间监控
*
* @param targetClass 接口实现class
* @param methodName 接口方法
* @param args 接口如参
* @param useTime 调用接口实际使用时间
*/
private void interfaceUseTimeMonitor(Class targetClass, String methodName, Object[] args, long useTime) {
/** 与接口注解最高用时做比较,符合条件发送邮件 */
try {
Class[] classArray = new Class[args.length];
for(int i = 0; i < args.length ; ++i) {
classArray[i] = args[i].getClass();
}
Method method = targetClass.getMethod(methodName, classArray);
if(method.isAnnotationPresent(InterfaceProperty.class)) {
InterfaceProperty interfaceProperty = method.getAnnotation(InterfaceProperty.class);
if(useTime >= interfaceProperty.timeout()) {
if(INTERFACE_TIMEOUT_LOG.isInfoEnabled()) {
INTERFACE_TIMEOUT_LOG.info("接口超时,interface:[{}].useTime:[{}].settingUseTime:[{}].traceId:[{}]",
new Object[]{targetClass.getSimpleName() + "." + methodName,
useTime, interfaceProperty.timeout(), TraceUtils.getTrace()});
}
}
}
} catch(Throwable e) {
/** 监控逻辑处理错误什么都不做 */
}
} }

Java接口响应超时监控的更多相关文章

  1. java 接口方法超时异常处理 设置超时时间

    原文:https://blog.csdn.net/coding_1994/article/details/87728374 使用线程池另起一个线程,可以使用  newFixedThreadPool() ...

  2. Java接口的幂等性设计

    转载:https://www.cnblogs.com/jack87224088/p/8688948.html 在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: 一个订单创建接口,第一次调用 ...

  3. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)

    1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...

  4. java接口调用——webservice就是一个RPC而已

    很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过 ...

  5. 接口偶尔超时,竟又是JVM停顿的锅!

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 继上次我们JVM停顿十几秒的问题解决后,我们系统终于稳定了,再也不会无故重启了! 这是之前的文章:耗时几个月,终于 ...

  6. 并发:OPP 响应超并发:OPP 响应超时

    用户提交报表,无法正常结束,报表日志中有如下消息: “正在执行请求完成选项... +------------- 1) PUBLISH -------------+ 节点 FIN1 上的请求 29884 ...

  7. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  8. 性能调优之Java系统级性能监控及优化

    性能调优之Java系统级性能监控及优化   对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化 ...

  9. Zuul超时问题,微服务响应超时,zuul进行熔断

    天碰到了微服务响应超时问题,而且超时时间特别短,2秒就超时,zuul就走熔断了. 我采用zuul作为网关,根据不同的访问路径进行微服务的路由,譬如有个服务是user,我访问user服务的某个接口时,该 ...

随机推荐

  1. OpenLiveWriter代码插件

    1.OpenLiveWriter安装 Windows Live Writer在2012年就停止了更新,Open Live Writer(以下简称OLW)是由Windows Live WriterWri ...

  2. Supermap iCloudManager -负载均衡

    Supermap icm负载均衡理解: 应用场景:地图出图 子节点1和子节点2中的服务保持一致,一般情况下设置的是匿名用户通过nginx访问服务信息,所以不需要登录. 1.通过nginx分发请求,(轮 ...

  3. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  4. 《深入理解Java虚拟机》调优案例分析与实战

    上节学习回顾 在上一节当中,主要学习了Sun JDK的一些命令行和可视化性能监控工具的具体使用,但性能分析的重点还是在解决问题的思路上面,没有好的思路,再好的工具也无补于事. 本节学习重点 在书本上本 ...

  5. Android Starting Window(Preview Window)

    当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前系统要做什么呢?如果 ...

  6. idea打包jar的多种方式

    这里总结出用IDEA打包jar包的多种方式,以后的项目打包Jar包可以参考如下形式: 用IDEA自带的打包形式 用Maven插件maven-shade-plugin打包 用Maven插件maven-a ...

  7. eclipse内下载及配置maven插件(转)

    本文介绍Maven的安装和配置,同样适用于eclipse 1.首先需要安装jdk,eclipse(废话!). 然后到maven官网下载maven,http://maven.apache.org/dow ...

  8. iOS-----App闪退,程序崩溃---解决方案

    1.iOS-中app启动闪退的原因 2.iOS开发-闪退问题-解决之前上架的 App 在 iOS 9 会闪退问题 3.iOS-应用闪退总结 4.iOS开发-捕获程序崩溃日志 5.iOS开发-应用崩溃日 ...

  9. 【译】Unity3D Shader 新手教程(3/6) —— 更加真实的积雪

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你满足以下条件,我建议你阅读这篇教程: 你想知道如何在表面着色器中进行混色(blend colour) 你想实 ...

  10. C可变参数的函数

    我们实现一个简单的printf函数(可变参数) #include <stdio.h> #include <stdarg.h> void myprintf(const char ...