dubbo 自身的监控使用了dubbo 的拦截器,这里我们也使用dubbo 的拦截器来添加prometheus 监控
首先需要dubbo 项目提供http的接口,为dubbo 项目添加 web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
加入 micrometer prometheus
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
实现dubbo 的filter 接口,添加 @Activate(group = Constants.PROVIDER)注解,声明拦截所有服务提供者
@Activate(group = Constants.PROVIDER)
public class PrometheusFilter implements Filter {
private Logger logger = LoggerFactory.getLogger(PrometheusFilter.class);
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
logger.info("----------------prometheus filter---------------");
RequestTimeCollector requestTimeCollector = (RequestTimeCollector) ServiceBean.getSpringContext().
getBean("dubboRequestTimeCollector");
RpcContext context = RpcContext.getContext();
boolean isProvider = context.isProviderSide();
String serviceName = invoker.getInterface().getName();
String methodName = RpcUtils.getMethodName(invocation);
long start = System.currentTimeMillis();
try {
// proceed invocation chain
Result result = invoker.invoke(invocation);
long duration = System.currentTimeMillis() - start;
String status = "success";
if(result.getException()!=null){
status = result.getException().getClass().getSimpleName();
}
requestTimeCollector.setValue(duration,serviceName,methodName,status);
return result;
} catch (RpcException e) {
long duration = System.currentTimeMillis() - start;
String result = "error";
if (e.isTimeout()) {
result = "timeoutError";
}
if (e.isBiz()) {
result = "bisError";
}
if (e.isNetwork()) {
result = "networkError";
}
if (e.isSerialization()) {
result = "serializationError";
}
requestTimeCollector.setValue(duration,serviceName,methodName,result);
throw e;
}
}
}
配置拦截器扩展
在 resourceMETA-INFdubbo 文件夹下创建
com.alibaba.dubbo.rpc.Filter 文本文件
添加 prometheus=com.rcplatform.livechat.dubbo.filter.PrometheusFilter文本
启动项目
访问/actuator/prometheus,即可看到监控项