指标样本的收集与存储

Dubbo 指标模块源码分析-指标样本的收集与存储

一、指标样本的收集与存储

指标样本收集

指标收集器(Collector)是指标对外导出的入口。最终导出到指标统计中心的指标采样实际均直接来源于各个指标采样器。因此,我们将从各个收集器实现开始,分析 dubbo-metrics 模块是如何工作的。

指标收集操作定义在 MetricsCollector (指标采集器,SPI)接口中,可以通过它的实现收集某一类的指标样本(MetricSample)。它主要有以下实现:

  • ConfigCenterMetricsCollector 配置中心操作相关指标收集器 ,收集配置信息的变化次数
  • MetadataMetricsCollector 元数据中心操作相关指标收集器,收集提供者、消费者对元数据中心操作(推送数据、拉取数据)情况的计数、耗时统计。
  • RegistryMetricsCollector 注册中心相关操作指标收集器,收集应用级、接口级服务注册成功、失败、耗时的相关计数。
  • DefaultMetricsCollector 默认指标收集器,内置了 方法指标采样器(MethodMetricsSampler)、线程池指标采样器(ThreadPoolMetricsSampler) 用于统计方法、线程池相关指标,包括方法调用成功、失败计数级线程池线程情况的相关计数。这些指标收集器会被默认应用程序部署器(DefaultApplicationDeployer ) 创建,完成初始化。
  • HistogramMetricsCollector 直方图指标收集器,利用 micrometer 处理直方图类型的指标,它的实现较为特殊。

配置中心 、元数据、服务注册指标收集器均实现自混合指标收集器(CombMetricsCollector)。该收集器实现了ApplicationMetricsCollector 、ServiceMetricsCollector 两个接口(定义按应用名收集和应用名-服务名收集指标操作),因此它们可以进行应用和服务两个层面的指标收集工作。

默认指标收集器是 MetricsCollector 接口的默认实现,主要负责线程池和方法相关指标的收集。

直方图指标收集器则负责收集直方图类型的指标。它利用直方图度量寄存器(HistogramMetricRegister)借助 micrometer API 完成直方图样本的采集。直方图类型包括百分位数、服务水平目标、最小预期值、最大预期值、统计数据分布有效期等。

Collector的继承关系:

collectors

可以看出,每个指标收集器都具有来自 MetricsListener 的监听指标事件的能力。为什么指标收集器本身需要监听指标事件? 在后文中,我们将讨论指标收集器是如何利用内置的转发器转发指标的。

指标样本存储

前文中,我们了解了指标收集的入口是指标收集器(Collector)。那么各个收集器从哪里收集指标样本?

对于配置中心、元数据中心、 注册中心的指标收集器:

它们分别负责采集三大中心模块的指标,均继承于混合数据收集器(CombMetricsCollector),而混合数据收集器中实现了 export 方法 。

混合数据收集器内部有一个基本数据聚合器(BaseStatComposite),它实现了 MetricsExport 接口,该接口定义了指标导出操作,混合数据收集器则利用它的 export 方法导出指标。

基本数据聚合器是一个抽象类,内有三个属性:ApplicationStatComposite 、ServiceStatComposite 和 RtStatComposite 。它们的作用:

  • ApplicationStatComposite 应用数据聚合器,应用程序级别相关事件的计数 ,根据指标Key( MetricsKey )和应用名统计指标,提供计数递增操作
  • ServiceStatComposite 服务数据聚合器,服务级别相关事件的计数,根据指标Key、应用名和服务名统计指标,提供计数递增操作
  • RtStatComposite,Rt(Response Time,响应时间)数据聚合器,包括应用级别和服务级别。根据应用名、服务名、注册的指标名及相应相应时间统计指标,提供添加操作。

对于以上三个聚合器,可以认为它们是作为不同类型统计数据的仓库使用的。

**基本数据聚合器 (BaseStatComposite)**对这三个子聚合器的操作进行了简单整合,统一提供给外界。而混合指标收集器(CombMetricsCollector) 也基本保留了内部基本数据聚合器的所有操作,将其封装为 incrementsetNumaddRt 三个方法(及它们的重载,分别收集应用级数据和服务级数据)向上提供。外部组件可以直接调用这些收集器完成指标更新操作。

当调用元数据中心指标收集器、注册中心指标收集器的 collect 方法时,最终会调用BaseStatComposite.export(MetricsCategory category) , 该方法会收集内部三个聚合器的指标并返回。

需要注意的是, 配置中心指标收集器不依赖于基本数据聚合器 导出数据,它在创建时将基本数据聚合器置为null,而使用自己的 updatedMetrics 字段存储采样:

//ConfigCenterMetricsCollector
private final Map<ConfigCenterMetric, AtomicLong> updatedMetrics = new ConcurrentHashMap<>(); 

   public ConfigCenterMetricsCollector(ApplicationModel applicationModel) {
      //BaseStatComposite = null
        super(null);
     ...
   }

混合指标收集器和数据聚合器之间呈现如下的包含关系:

composite-struct

DefaultMetricsCollector 默认指标采集器:

它不直接存储采样数据,而是通过收集其下**指标采样器(MetricsSampler)**的样本来完成采样工作。这些采样器包括:

  • 方法采样器
  • 应用采样器
  • 线程池采样器

这些采样器完成采样后,还会利用采集器中的**事件多播器(Multicaster)**将指标事件发布出去,可以被其它监听器处理。详细流程将在后文中探讨。