本文采用 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})
})
@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 监控如下
- Counter 监控 QPS 或者 QPM