如何为GCP Cloud Monitoring设置基于时段的动态告警阈值?
问题描述
我有一个Google Dataflow Pipeline,会记录如下格式的JSON日志:
jsonPayload: { metric: "viewings-per-second", time: "2023-03-28 17:16:14", value: 15 }
已创建基于日志的指标(Log-based-metric)提取value字段,用于Cloud Monitoring的固定阈值告警。但实际需求是设置两个阈值:高峰时段(6:00-次日1:00)和非高峰时段(1:00-6:00)。
请问是否可以创建动态阈值?是否可借助Monitoring Query Language(MQL)实现?
我想到一个替代方案:创建两个基于日志的指标,通过日志查询语言(LQL)添加时段条件。在日志资源管理器中测试时,以下查询可正常运行:
jsonPayload.time>="2023-03-28 06:00:00"
但无法从datetime值中单独提取小时部分。
最后的办法是修改Dataflow Pipeline,使其仅记录小时或时间信息,但想了解是否有更优方案。
编辑:
当前使用的LQL如下:
logName="projects/example-project/logs/dataflow-viewings-per-second" jsonPayload.metric="viewings-per-second" jsonPayload.time>="2023-03-28 06:00:00"
解决方案
1. 用MQL实现动态阈值(推荐)
无需拆分指标,直接在Cloud Monitoring告警策略中用MQL根据时段设置不同阈值:
基于日志自带时间戳的查询
fetch global | metric 'logging.googleapis.com/user/viewings_per_second' | align rate(1m) | condition val() > (if hour(timestamp) >=6 AND hour(timestamp) <25 then 20 else 5)
说明:
hour(timestamp)提取日志系统自带时间戳的小时数- 高峰时段(6:00-次日1:00)阈值设为20,非高峰(1:00-6:00)设为5,可按需调整数值
基于日志内容中jsonPayload.time的查询
如果必须以日志里的自定义时间字段为准,先解析字符串为时间类型再提取小时:
fetch global | metric 'logging.googleapis.com/user/viewings_per_second' | parse jsonPayload.time as string log_time | let log_hour = hour(parse_time("%Y-%m-%d %H:%M:%S", log_time)) | align rate(1m) | condition val() > (if log_hour >=6 OR log_hour <1 then 20 else 5)
2. 用LQL拆分两个日志指标
创建日志指标时,通过正则提取小时部分过滤时段:
- 高峰时段指标过滤条件:
logName="projects/example-project/logs/dataflow-viewings-per-second" jsonPayload.metric="viewings-per-second" REGEXP_EXTRACT(jsonPayload.time, r" (\d{2}):") >= "06" OR REGEXP_EXTRACT(jsonPayload.time, r" (\d{2}):") < "01"
- 非高峰时段指标过滤条件:
logName="projects/example-project/logs/dataflow-viewings-per-second" jsonPayload.metric="viewings-per-second" REGEXP_EXTRACT(jsonPayload.time, r" (\d{2}):") >= "01" AND REGEXP_EXTRACT(jsonPayload.time, r" (\d{2}):") < "06"
说明:用REGEXP_EXTRACT匹配jsonPayload.time中空格后的两位小时数字,再做时段判断。
3. 修改Dataflow Pipeline(备选)
如果上述方法不适用,可修改Pipeline在日志中额外添加hour字段:
jsonPayload: { metric: "viewings-per-second", time: "2023-03-28 17:16:14", hour: 17, value: 15 }
后续LQL过滤或MQL查询会更简洁直接。
内容的提问来源于stack exchange,提问作者Shahid Thaika
相关产品推荐
相关产品推荐

