zoukankan      html  css  js  c++  java
  • Mybatis请求的性能指标收集——Prometheus

    mybatis的性能指标统计与Http类似,也是基于aop的方式,利用mybatis提供的intercept机制。直接看下Interceptor的定义:

    @Intercepts(
        value = {
            @Signature (type=Executor.class,
                    method="update",
                    args={MappedStatement.class,Object.class}),
            @Signature(type=Executor.class,
                    method="query",
                    args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class,
                            CacheKey.class,BoundSql.class}),
            @Signature(type=Executor.class,
                    method="query",
                    args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})
        }
    )
    public class MybatisProfilerPlugin implements Interceptor {
        private static final Stats MYBATIS_STAT = Profiler.Builder
                .builder()
                .type("mybatis")
                .build();
    
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
    
            if (!System.getProperty("mybatisProfileEnable", "true").equalsIgnoreCase("true")) {
                return invocation.proceed();
            }
            final Object[] args = invocation.getArgs();
            if (args != null && args.length > 0) {
                long begin = System.nanoTime();
                final MappedStatement mappedStatement = (MappedStatement) args[0];
                if (mappedStatement != null) {
                    final String methodName = mappedStatement.getId(); //对应的是Mapper中的一个方法,如com.coohua.mapper.UserMapper.selectUser
                    final String declaringTypeName = mappedStatement.getResource();  //对应的就是一个Mapper类文件,如UserMapper.java
                    //以类名和方法名为标签
                    String[] tags = new String[]{"operation", methodName, "class", declaringTypeName};
                    try {
                        //每个请求gauge+1
                        MYBATIS_STAT.incConc(tags);
                        return invocation.proceed();
                    } catch (Throwable throwable) {
                        //统计错误数
                        MYBATIS_STAT.error(tags);
                        throw throwable;
                    } finally {
                        //请求结束gauge-1
                        MYBATIS_STAT.decConc(tags);
                        //统计请求执行时间
                        MYBATIS_STAT.observe(System.nanoTime() - begin, TimeUnit.NANOSECONDS, tags);
                    }
                }
            }
            return invocation.proceed();
        }
    
        @Override
        public Object plugin(Object target) {
            return Plugin.wrap(target, this);
        }
    
        @Override
        public void setProperties(Properties properties) {
    
        }
    }

    在使用框架中注册好mybatis拦截器即可:

    <plugins>
         <plugin interceptor="com.pepper.metrics.integration.mybatis.MybatisProfilerPlugin" />
    </plugins>

    指标收集结果:

  • 相关阅读:
    Objective-C马路成魔【14-关键C语言功能】
    js正则表达式语法
    Python 得到Twitter所有用户friends和followers
    error:stray&#39;243&#39;in program
    VC各种方法获得的窗口句柄
    新东方雅思词汇---5.2
    php中this,self,parent三个关键字的区别辨析
    英语影视台词---一、少年派的奇幻漂流
    英语常用单词分类---1
    amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示
  • 原文地址:https://www.cnblogs.com/jing-yi/p/14388912.html
Copyright © 2011-2022 走看看