美文网首页
mybatis 拦截器实现 prometheus 监控 sql

mybatis 拦截器实现 prometheus 监控 sql

作者: 消失的码农 | 来源:发表于2020-12-10 20:57 被阅读0次

本文采用 Java 的实现方式针对 prometheus 监控

需要新建 Mybatis 的代理类

import java.util.Properties;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;

import com.didapinche.server.commons.common.metrics.InterfaceMonitor;
import com.didapinche.server.commons.common.metrics.base.CommonUtils;

import io.prometheus.client.SimpleTimer;
import io.prometheus.client.Summary;

@Intercepts({
    @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 }),
    @Signature(type = Executor.class, method = "query",  args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class })
})
@Component
public class MybatisExecuteInterceptor implements Interceptor {

    private static final String MYBATIS = "mybatis";
    
    private static final Summary sqlLatency = Summary
            .build("server_sql_duration_seconds", "about sql execute duration")
            .labelNames("host", "app", "method")
            .quantile(0.8, 0.01).quantile(0.9, 0.01).quantile(0.99, 0.01)
            .register();

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        
        MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
        String id = ms.getId();
        String[] split = id.split("\\.");
        String methodName = split[split.length - 2] + ":" + split[split.length -1];

        InterfaceMonitor.getInstance().addTotal(methodName, MYBATIS);
        SimpleTimer st = new SimpleTimer();
        
        Object proceed = null;
        try {
            proceed = invocation.proceed();
        } catch (Exception e) {
            InterfaceMonitor.getInstance().addFail(methodName, MYBATIS);
            throw e;
        }
        sqlLatency.labels(CommonUtils.getHostName(), CommonUtils.getAppName(), methodName).observe(st.elapsedSeconds());
        return proceed;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }

}

Grafana 监控如下

image.png
  • Counter 统计


    image.png

相关文章

网友评论

      本文标题:mybatis 拦截器实现 prometheus 监控 sql

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