为什么要监控

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

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

自己动手,丰衣足食

  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. Hadoop学习之旅二:HDFS

    本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...

  2. linux 如何对文件解压或打包压缩

    tar命令用与对文件打包压缩或解压,格式: tar [选项] [文件] 打包并压缩文件: tar -czvf  压缩包名 .tar.gz 解压并展开压缩包: tar -xzvf  压缩包名 .tar. ...

  3. hadoop 笔记(zookeeper)

    1.安装 需要提前安装java环境,本文下载zookeeper-3.3.6.tar.gz包. 1.1 tar -zxvf zookeeper-3.3.6.tar.gz 1.2 修改conf中的zoo_ ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. Web前端温故知新-CSS基础

    一.CSS定义与编写CSS 1.1 CSS的定义 全名:Cascading Style Sheets -> 层叠样式表 定义:CSS成为层叠样式表,它主要用于设置HTML页面中的文本内容(字体. ...

  6. NodeJS的代码调试和性能调优

    本文转自我的个人博客. NodeJS 自 2009 年显露人间,到现在已经六个年头了,由于各种原因,中间派生出了个兄弟,叫做 iojs,最近兄弟继续合体,衍生出了 nodejs4.0 版本,这东西算是 ...

  7. Netty5使用自签证书实现SSL安全连接

    这次使用的Netty是最新的5.0 Alpha2版本,下载地址是:http://dl.bintray.com/netty/downloads/netty-5.0.0.Alpha2.tar.bz2,发布 ...

  8. 在 Linux 中使用 Eclipse 和 Gnu Autotools 管理 C/C++ 项目

    在我该系列的之前的所有随笔中,都是采用 Linux 发行版自带的包管理工具(如 apt-get.yum 等)进行软件的安装和卸载,从来没有向大家展示使用源代码自行编译安装软件的方法.但是长期混迹于 U ...

  9. 小谈Scrum敏捷开发流程

    一晃眼,有两年没有写博客了,回顾前两年,各种奔波,各种忙碌,也有不少的收获.从今天开始,我要把这些收获都分享在这里. 其实这两年,对我影响最大的是开发流程.总所周知,一个好的开发流程,对于项目的进行, ...

  10. C# OracleDBhelper

    引用 using System.Configuration;using System.Data.OracleClient; 连接字符串 <connectionStrings> <ad ...