如何在CnosDB中检测无数据并实现脚本化告警?
在CnosDB中检测监控数据流入中断的方案
适用场景
你通过CnosDB + Grafana采集CPU、内存等系统指标,需要脱离可视化工具,纯靠脚本从CnosDB层面判断数据是否停止流入。
具体实现方案
方案1:利用导数判断(兼容你参考的InfluxQL逻辑)
CnosDB兼容InfluxQL语法,直接用derivative函数计算指标的变化率。如果返回结果为空或全为0,说明指定时间窗口内没有新数据写入:
SELECT derivative(usage_idle) FROM CPU WHERE time > now() - 1h
- 无返回结果:过去1小时完全没有CPU数据
- 返回值全为0:数据时间序列无变化,大概率是没有新数据流入
方案2:检查最新数据的时间戳
直接查询最近一条数据的时间,和当前时间做对比,判断是否超出采集间隔阈值:
SELECT max(time) AS latest_data_time FROM CPU WHERE time > now() - 2h
在脚本里计算latest_data_time与当前时间的差值,如果超过你设定的告警阈值(比如5分钟,根据实际采集频率调整),就触发告警。
方案3:统计时间窗口内的数据量
统计最近一段时间内的数据点总数,若为0则直接判定数据流入中断:
SELECT count(*) AS data_point_count FROM CPU WHERE time > now() - 10m
如果data_point_count等于0,说明过去10分钟没有任何新数据写入CnosDB。
脚本化执行示例
Shell脚本(使用CnosDB CLI)
# 假设数据采集间隔为1分钟,检查过去10分钟的数据量 cnosdb-cli -u http://your-cnosdb-host:8902 -d your-db-name -q "SELECT count(*) FROM CPU WHERE time > now() - 10m" | awk '{if ($NF == 0) print "ALERT: CPU数据流入中断"}'
Python脚本(调用HTTP API)
import requests import time from datetime import datetime CNOSDB_API = "http://your-cnosdb-host:8902/api/v1/sql" DB_NAME = "your-db-name" CHECK_WINDOW = "2h" # 检查过去2小时的数据 ALERT_THRESHOLD = 300 # 超过5分钟无数据则告警 query = f"SELECT max(time) FROM CPU WHERE time > now() - {CHECK_WINDOW}" response = requests.post(CNOSDB_API, params={"db": DB_NAME}, data=query) data = response.json() if not data["results"][0]["series"]: print("ALERT: 过去2小时无CPU数据流入") else: latest_time_str = data["results"][0]["series"][0]["values"][0][1] latest_time = datetime.strptime(latest_time_str, "%Y-%m-%dT%H:%M:%SZ").timestamp() current_time = time.time() if current_time - latest_time > ALERT_THRESHOLD: print(f"ALERT: 最近数据已超过{ALERT_THRESHOLD//60}分钟未更新")
内容的提问来源于stack exchange,提问作者Munin
相关产品推荐
相关产品推荐

