学习 Druid(十二):使用 Prometheus 监控 Druid 集群

更新至 Druid 0.15.1 版本

截止目前,Druid 官方并不支持 Prometheus,且使用 Prometheus 监控 Druid 集群面临以下几个问题:

  • Druid 使用 Push 的方式发送指标,而 Prometheus 使用 Pull 的方式;
  • Druid 指标格式为 JSON,而 Prometheus 使用专有的指标格式。

为了解决:point_up_2:的难题,需要动手编写 druid-exporter,从而将 Druid 各个服务的指标提供给 Prometheus。

整体架构如下图所示:

Druid 监控

默认,Druid 并未开启指标采集和发送。编辑 runtime.properties 文件:

druid.monitoring.emissionPeriod=PT1M  
druid.monitoring.monitors=[]

druid.emitter=http  
druid.emitter.http.recipientBaseUrl=http://:

配置项 druid.monitoring.emissionPeriod 指标发送周期;

配置项 druid.monitoring.monitors 进程监控列表;

配置项 druid.emitter 指标发送方式,使用 HTTP POST;

配置项 druid.emitter.http.recipientBaseUrl 指标发送 URL。

常用的监控有:

  • org.apache.druid.client.cache.CacheMonitor 缓存相关指标,适用于 Broker 和 Historical;
  • org.apache.druid.server.metrics.QueryCountStatsMonitor 查询相关指标,适用于 Broker 和 Historical;
  • org.apache.druid.server.metrics.HistoricalMetricsMonitor 适用于 Historical;
  • org.apache.druid.java.util.metrics.SysMonitor 系统相关指标,使用 SIGAR library 监控系统活动和状态;
  • org.apache.druid.java.util.metrics.JvmMonitor JVM 相关指标;
  • org.apache.druid.java.util.metrics.JvmCpuMonitor JVM CPU 相关指标;
  • org.apache.druid.java.util.metrics.JvmThreadsMonitor JVM 线程相关指标。

监控不是 Druid 的主要功能,官方对监控维护不够及时,缺少了 MiddleManager 和 Peon 相关的指标。

非常遗憾。☹️

Druid Exporter

Python 语言开发的 druid-exporter ,由于版本过久,需要一些定制开发。

Prometheus

编辑 prometheus.yml 文件,添加 druid-exporter,:point_down:是一个模板:

global:  
  scrape_interval: 1m
  evaluation_interval: 1m

rule_files:  
  - rules/druid.yaml

alerting:  
  alertmanagers:
    - static_configs:
      - targets:
        - :

scrape_configs:  
  - job_name: druid-coordinator
    static_configs:
      - targets: []
  - job_name: druid-broker
    static_configs:
      - targets: []
  - job_name: druid-historical
    static_configs:
      - targets: []
  - job_name: druid-middlemanager
    static_configs:
      - targets:[]

编辑 rules/druid.yaml 文件,添加告警规则,:point_down:是一个模板:

groups:  
  - name: druid
    rules:
      - alert: CoordinatorOverlordDown
        expr: up{job="druid-coordinator"} == 0
        for: 5m
        labels:
          app: druid
          service: CoordinatorOverlord
      - alert: BrokerDown
        expr: up{job="druid-broker"} == 0
        for: 5m
        labels:
          app: druid
          service: Broker
      - alert: MiddleManagerDown
        expr: up{job="druid-middlemanager"} == 0
        for: 5m
        labels:
          app: druid
          service: MiddleManager
      - alert: HistoricalDown
        expr: up{job="druid-historical"} == 0
        for: 5m
        labels:
          app: druid
          service: Historical

参考