前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊artemis的ActiveMQMetricsPlugin

聊聊artemis的ActiveMQMetricsPlugin

原创
作者头像
code4it
修改2020-01-20 15:33:07
5710
修改2020-01-20 15:33:07
举报

本文主要研究一下artemis的ActiveMQMetricsPlugin

ActiveMQMetricsPlugin

activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/ActiveMQMetricsPlugin.java

public interface ActiveMQMetricsPlugin extends Serializable {
​
   ActiveMQMetricsPlugin init(Map<String, String> options);
​
   MeterRegistry getRegistry();
}
  • ActiveMQMetricsPlugin继承了Serializable,它定义了init方法以及getRegistry方法

SimpleMetricsPlugin

activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/plugins/SimpleMetricsPlugin.java

public class SimpleMetricsPlugin implements ActiveMQMetricsPlugin {
​
   private transient MeterRegistry meterRegistry;
​
   private Map<String, String> options;
​
   @Override
   public ActiveMQMetricsPlugin init(Map<String, String> options) {
      this.meterRegistry = new SimpleMeterRegistry();
      this.options = options;
      return this;
   }
​
   @Override
   public MeterRegistry getRegistry() {
      return meterRegistry;
   }
​
   public Map<String, String> getOptions() {
      return options;
   }
}
  • SimpleMetricsPlugin实现了ActiveMQMetricsPlugin接口,其init方法创建了SimpleMeterRegistry

LoggingMetricsPlugin

activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/plugins/LoggingMetricsPlugin.java

public class LoggingMetricsPlugin implements ActiveMQMetricsPlugin {
​
   private transient MeterRegistry meterRegistry;
​
   @Override
   public ActiveMQMetricsPlugin init(Map<String, String> options) {
      this.meterRegistry = new LoggingMeterRegistry();
      return this;
   }
​
   @Override
   public MeterRegistry getRegistry() {
      return meterRegistry;
   }
}
  • LoggingMetricsPlugin实现了ActiveMQMetricsPlugin接口,其init方法创建了LoggingMeterRegistry

FileConfigurationParser

activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java

public final class FileConfigurationParser extends XMLConfigurationUtil {
​
   //......
​
   private ActiveMQMetricsPlugin parseMetricsPlugin(final Node item, final Configuration config) {
      final String clazz = item.getAttributes().getNamedItem("class-name").getNodeValue();
​
      Map<String, String> properties = getMapOfChildPropertyElements(item);
​
      ActiveMQMetricsPlugin metricsPlugin = AccessController.doPrivileged(new PrivilegedAction<ActiveMQMetricsPlugin>() {
         @Override
         public ActiveMQMetricsPlugin run() {
            return (ActiveMQMetricsPlugin) ClassloadingUtil.newInstanceFromClassLoader(FileConfigurationParser.class, clazz);
         }
      });
​
      ActiveMQServerLogger.LOGGER.initializingMetricsPlugin(clazz, properties.toString());
      config.setMetricsPlugin(metricsPlugin.init(properties));
​
      return metricsPlugin;
   }
​
   //......
}
  • FileConfigurationParser的parseMetricsPlugin方法会获取配置的clazz及properties,然后实例化metricsPlugin并执行metricsPlugin.init(properties)

MetricsManager

activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/MetricsManager.java

public class MetricsManager {
​
   private final String brokerName;
​
   private final MeterRegistry meterRegistry;
​
   private final Map<String, List<Meter>> meters = new ConcurrentHashMap<>();
​
   public MetricsManager(String brokerName, ActiveMQMetricsPlugin metricsPlugin) {
      this.brokerName = brokerName;
      meterRegistry = metricsPlugin.getRegistry();
      Metrics.globalRegistry.add(meterRegistry);
      new JvmMemoryMetrics().bindTo(meterRegistry);
   }
​
   public MeterRegistry getMeterRegistry() {
      return meterRegistry;
   }
​
   @FunctionalInterface
   public interface MetricGaugeBuilder {
​
      void register(String metricName, Object state, ToDoubleFunction f, String description);
   }
​
   public void registerQueueGauge(String address, String queue, Consumer<MetricGaugeBuilder> builder) {
      final MeterRegistry meterRegistry = this.meterRegistry;
      if (meterRegistry == null) {
         return;
      }
      final List<Gauge.Builder> newMeters = new ArrayList<>();
      builder.accept((metricName, state, f, description) -> {
         Gauge.Builder meter = Gauge
            .builder("artemis." + metricName, state, f)
            .tag("broker", brokerName)
            .tag("address", address)
            .tag("queue", queue)
            .description(description);
         newMeters.add(meter);
      });
      final String resource = ResourceNames.QUEUE + queue;
      this.meters.compute(resource, (s, meters) -> {
         //the old meters are ignored on purpose
         meters = new ArrayList<>(newMeters.size());
         for (Gauge.Builder gauge : newMeters) {
            meters.add(gauge.register(meterRegistry));
         }
         return meters;
      });
   }
​
   public void registerAddressGauge(String address, Consumer<MetricGaugeBuilder> builder) {
      final MeterRegistry meterRegistry = this.meterRegistry;
      if (meterRegistry == null) {
         return;
      }
      final List<Gauge.Builder> newMeters = new ArrayList<>();
      builder.accept((metricName, state, f, description) -> {
         Gauge.Builder meter = Gauge
            .builder("artemis." + metricName, state, f)
            .tag("broker", brokerName)
            .tag("address", address)
            .description(description);
         newMeters.add(meter);
      });
      final String resource = ResourceNames.ADDRESS + address;
      this.meters.compute(resource, (s, meters) -> {
         //the old meters are ignored on purpose
         meters = new ArrayList<>(newMeters.size());
         for (Gauge.Builder gauge : newMeters) {
            meters.add(gauge.register(meterRegistry));
         }
         return meters;
      });
   }
​
   public void registerBrokerGauge(Consumer<MetricGaugeBuilder> builder) {
      final MeterRegistry meterRegistry = this.meterRegistry;
      if (meterRegistry == null) {
         return;
      }
      final List<Gauge.Builder> newMeters = new ArrayList<>();
      builder.accept((metricName, state, f, description) -> {
         Gauge.Builder meter = Gauge
            .builder("artemis." + metricName, state, f)
            .tag("broker", brokerName)
            .description(description);
         newMeters.add(meter);
      });
      final String resource = ResourceNames.BROKER + "." + brokerName;
      this.meters.compute(resource, (s, meters) -> {
         //the old meters are ignored on purpose
         meters = new ArrayList<>(newMeters.size());
         for (Gauge.Builder gauge : newMeters) {
            meters.add(gauge.register(meterRegistry));
         }
         return meters;
      });
   }
​
   public void remove(String component) {
      meters.computeIfPresent(component, (s, meters) -> {
         if (meters == null) {
            return null;
         }
         for (Meter meter : meters) {
            Meter removed = meterRegistry.remove(meter);
            if (ActiveMQServerLogger.LOGGER.isDebugEnabled()) {
               ActiveMQServerLogger.LOGGER.debug("Removed meter: " + removed.getId());
            }
         }
         return null;
      });
   }
}
  • MetricsManager的构造器接收brokerName以及metricsPlugin两个参数;之后定义了registerQueueGauge(QueueImpl使用)、registerAddressGauge(AddressInfo使用)、registerBrokerGauge(ActiveMQServerImpl使用)、remove方法(QueueImpl、AddressInfo、ActiveMQServerImpl使用)

小结

ActiveMQMetricsPlugin继承了Serializable,它定义了init方法以及getRegistry方法;FileConfigurationParser的parseMetricsPlugin方法会获取配置的clazz及properties,然后实例化metricsPlugin并执行metricsPlugin.init(properties);MetricsManager的构造器接收brokerName以及metricsPlugin两个参数;之后定义了registerQueueGauge(QueueImpl使用)、registerAddressGauge(AddressInfo使用)、registerBrokerGauge(ActiveMQServerImpl使用)、remove方法(QueueImpl、AddressInfo、ActiveMQServerImpl使用)

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ActiveMQMetricsPlugin
  • SimpleMetricsPlugin
  • LoggingMetricsPlugin
  • FileConfigurationParser
  • MetricsManager
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档