跳转到主要内容
Monitors 支持使用标准 SQL 语法对 ClickHouse 进行查询,并根据查询结果触发告警。

前置说明

配置项说明
查询语言使用 ClickHouse SQL 语法
字段处理所有字段名自动转换为小写,配置时请使用小写字母
类型转换建议使用 toString()toFloat64() 等函数转换复杂类型

1. 阈值判定模式

此模式适用于需要对聚合后的数值进行阈值比对的场景。

配置方式

  1. 查询语句:编写 SQL 聚合查询,返回数值列和(可选的)标签列。
  • 示例:统计最近 5 分钟内,各服务的错误日志数量。
    SELECT 
        service_name, 
        count(*) AS error_cnt 
    FROM app_log 
    WHERE timestamp > now() - INTERVAL 5 MINUTE AND level = 'error'
    GROUP BY service_name
    
  1. 字段映射
  • 标签字段:用于区分不同告警对象的字段。上例中为 service_name。该字段可留空,Monitors 会自动把除了值字段外的所有字段都作为标签字段。
  • 值字段:用于阈值判定的数值字段。上例中为 error_cnt
  1. 阈值条件
  • 使用 $A.field_name 引用数值。
  • 示例:Critical: $A.error_cnt > 50Warning: $A.error_cnt > 10

工作原理

引擎执行 SQL 查询,获取结果集。根据”标签字段”将数据分组,然后提取”值字段”的数值与阈值表达式进行比对。

恢复逻辑

策略说明
自动恢复当数值不再满足任何告警阈值时,自动生成恢复事件
特定恢复条件配置恢复表达式(如 $A.error_cnt < 5
恢复查询独立 SQL 用于恢复判定,支持 ${label_name} 变量

2. 数据存在模式

此模式适用于将过滤逻辑直接写在 SQL 中的场景。

配置方式

  1. 查询语句:在 SQL 中使用 HAVING 子句直接过滤出异常数据。
  • 示例:直接查询错误数超过 50 的服务。
    SELECT 
        service_name, 
        count(*) AS error_cnt 
    FROM app_log 
    WHERE timestamp > now() - INTERVAL 5 MINUTE AND level = 'error'
    GROUP BY service_name
    HAVING count(*) > 50
    
  1. 判定规则:只要 SQL 查询返回了数据,即触发告警。

优缺点分析

类型说明
优点利用 ClickHouse 强大的 OLAP 能力进行计算和过滤,性能极佳
缺点无法区分多级告警

恢复逻辑

  • 数据消失即恢复:当 SQL 查询结果为空时,判定恢复
  • 恢复查询:支持配置额外的查询语句用于辅助判断恢复状态

3. 数据缺失模式

此模式用于监控”预期应该有数据,但实际没有数据”的场景。

配置方式

  1. 查询语句:编写一个预期应该持续返回数据的 SQL 查询。
  • 示例:查询所有探针的心跳上报。
    SELECT probe_id, max(timestamp) as last_seen
    FROM probe_heartbeat
    WHERE timestamp > now() - INTERVAL 5 MINUTE
    GROUP BY probe_id
    
  1. 判定规则:如果某个 probe_id 在之前的周期中出现过,但在当前及连续 N 个周期中查不到数据,则触发”数据缺失”告警。

4. 最佳实践

ClickHouse 的驱动在处理复杂类型时可能返回引擎无法识别的格式。建议在 SELECT 子句中显式转换:
  • toString(uuid)
  • toFloat64(avg_duration)
ClickHouse 对时间分区非常敏感,务必在 WHERE 子句中包含时间范围过滤以利用索引:
  • timestamp > now() - INTERVAL 5 MINUTE
  • timestamp > toDateTime(now()) - 300
Monitors 引擎会将 ClickHouse 返回的列名统一转为小写。在填写”标签字段”和”值字段”时,请始终使用小写字母。