本文采用 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;/*** mybatis拦截器实现prometheus监控sql层** @author 刘昌飞(liuchangfei @ didachuxing.com)* 2018年10月10日 下午1:53:13*/@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})})@Componentpublic 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();@Overridepublic 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;}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}}
Grafana 监控如下

- Counter 监控 QPS 或者 QPM

