这篇是(四篇)的补充篇,我们通过一个简单的demo,实现对系统中自定义的redisService的拦截,然后将相关的信息上报到cat,拦截器我们使用aspectj框架实现,关于pointcut的语法规则详见
https://www.mekau.com/4880.html
代码如下,我们先定一个Pointcut切点,代码如下
@Pointcut("execution(public * com.*.*.service.RedisService.*(..)) || execution(public * com.*.*.general.service.*RedisService.*(..))")
public void redisPointcut() {
}
此拦截器会对RedisService类下的所有方法和匹配了RedisService后缀的类下的所有方法进行拦截。
然后我们定个@Around的Advice,代码如下
@Around("redisPointcut()")
public Object executeRedisMethod(ProceedingJoinPoint jp) throws Throwable {
//如下是一些系统方法,不关注的话,可以直接的skip掉
if(jp.getSignature().getName().equals("getMetaClass") ||
jp.getSignature().getName().equals("getPool") ||
jp.getSignature().getName().equals("withJedis")){
return jp.proceed(jp.getArgs());
}
Cat cat = Cat.getInstance();
//方法
String method = jp.getSignature().getName() == null ? "no method" : jp.getSignature().getName();
Object[] args = jp.getArgs() ;
String displayValue = "redis ".concat(method).concat(" -->").concat(args == null ? "no args" : JSON.toJSONString(args) )
//上报一个通用的Transaction
Transaction transaction = Cat.newTransaction(CatConstants.REDIS_OPERATING, method);
//通过Event类型记录下此transaction里面的一些参数
Cat.logEvent("REDIS_ARGS",displayValue);
try {
Object proceed = jp.proceed(jp.getArgs());
//记录成功完成状态
transaction.setStatus(Message.SUCCESS);
return proceed;
} catch (Exception e) {
//自定义的异常处理utils(记录异常log和设置transaction为异常status)
CatUtil.processException(e, transaction);
throw e;
} finally {
if(transaction!=null) {
//记录异常完成时间的统计,并在这里异步的上报
transaction.complete();
}
}
}
以上是一个非常简单的demo,但是却很好的使用cat记录了每次redis调用的相关信息,大家可以在里面继续丰富相关的信息。
网友评论