prometheus 集成dubbo

Fightingxr 2019-07-01

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,即可看到监控项

相关推荐