• Home
  • Articles
    • 日志
    • 妍小言
    • 舒小书
    • 浩然说
    • 生活日记
  • All Tags

dubbo自定义监控

15 Oct 2017

Reading time ~1 minute

  1. 按照文档扩展自定义的monitor(并没有增加<dubbo:monitor>节点,仅新增自定义monitor扩展)。
  2. 在节点上配置增加parameter,如:
    • <dubbo:parameter key="monitor" value="myProtocol://"/>,注意myProtocol必须和SPI扩展里设置的MonitorFactory实现name一致,因为dubbo通过自定义协议来查找相应扩展。
  3. 在MonitorService.collect方法实现里实现性能数据上报即可,URL statistics已采集性能数据并作为参数传递。
  4. 当前版本如果在provider侧增加了默认URL参数,会被合并拷贝到consumer层,致使provider侧开启的监控上报在consumer层同样生效,这点需要注意。

后记

通过阅读代码发现,并非是<dubbo:monitor>节点无效,而是由于provider侧如果不配置scope的话,默认会除了开启远程服务外,同时在本地使用injvm协议导出一份, 而使用injvm协议的链接,则不会添加monitor参数,具体代码见serviceConfig.doExportUrlsFor1Protocol:

//配置为none不暴露
if (!Constants.SCOPE_NONE.toString().equalsIgnoreCase(scope)) {

    //配置不是remote的情况下做本地暴露 (配置为remote,则表示只暴露远程服务)
    if (!Constants.SCOPE_REMOTE.toString().equalsIgnoreCase(scope)) {
        exportLocal(url);
    }
    //如果配置不是local则暴露为远程服务.(配置为local,则表示只暴露本地服务)
    if (!Constants.SCOPE_LOCAL.toString().equalsIgnoreCase(scope)) {
        if (logger.isInfoEnabled()) {
            logger.info("Export dubbo service " + interfaceClass.getName() + " to url " + url);
        }
        if (registryURLs != null && registryURLs.size() > 0
                && url.getParameter("register", true)) {
            for (URL registryURL : registryURLs) {
                url = url.addParameterIfAbsent("dynamic", registryURL.getParameter("dynamic"));
                URL monitorUrl = loadMonitor(registryURL);
                if (monitorUrl != null) {
                    url = url.addParameterAndEncoded(Constants.MONITOR_KEY, monitorUrl.toFullString());
                }
                if (logger.isInfoEnabled()) {
                    logger.info("Register dubbo service " + interfaceClass.getName() + " url " + url + " to registry " + registryURL);
                }
                Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));

                Exporter<?> exporter = protocol.export(invoker);
                exporters.add(exporter);
            }
        } else {
            Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, url);

            Exporter<?> exporter = protocol.export(invoker);
            exporters.add(exporter);
        }
    }
}

不知道这么设计出于什么原因,但我想应该也会有很多人和我一样,在本地测试自定义性能数据采集协议的时候感到困扰。



dubbomonitor