美文网首页
完全掌控logging的生与死(五)拦截器上报到CAT

完全掌控logging的生与死(五)拦截器上报到CAT

作者: 牧羊人刘俏 | 来源:发表于2021-01-08 09:35 被阅读0次

    这篇是(四篇)的补充篇,我们通过一个简单的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调用的相关信息,大家可以在里面继续丰富相关的信息。

    相关文章

      网友评论

          本文标题:完全掌控logging的生与死(五)拦截器上报到CAT

          本文链接:https://www.haomeiwen.com/subject/wmuxaktx.html