排查 MQL 提醒政策问题

本页面解释了为什么某些带有 Monitoring Query Language (MQL) 条件的提醒政策的行为可能与预期不同,并为这些情况提供了可能的补救措施。

数据缺口

您创建了一个采用基于 MQL 的条件的提醒政策,MQL 查询结果显示所报告的数据之间存在意外的差距。

当计算结果在给定时间戳处生成 null 值时,对齐的数据中会出现间隙。例如,以下数据表与时间段为 30 秒的查询相关:

表 A1

时间戳
00:00:00 1
00:00:30 2
00:01:30 3
00:02:00 4

由于您的经期为 30 秒,因此您应该会在 00:01:00 看到时间戳。导致出现此类差距的原因有很多。

因对齐而出现间隙

校准窗口过窄可能会导致数据缺口。例如,下表中的未对齐原始指标数据大约每 30 秒写入一次。

表 B1

时间戳
00:00:01 1
00:00:28 2
00:01:01 3
00:01:32 4

如果您在 00:02:00 运行使用 next_older(30s) 操作对齐数据的查询,则会收到以下输出(00:01:00 存在数据缺口):

表 B2

时间戳
00:00:30 2
00:00:28 3
00:01:01 4

之所以会出现这种数据缺口,是因为原始数据中没有点落在于 00:01:00 结束的 30 秒时间范围内。为避免这种间隔,请使用较大的窗口。例如,next_older(1m) 操作会生成一个没有数据缺口的表:

表 B3

时间戳
00:00:01 1
00:00:28 2
00:01:01 3
00:01:32 4

一般情况下,如果数据每 S 秒写入一次,请使用大于 S 的对齐窗口。这样,您就可以考虑数据点随时间分布不均匀的情况。

表操作导致的间隔

某些表操作可能会产生意外的间隙。例如,join 操作仅在所有输入表中都有值的时间戳处生成输出。

join 等表操作可能会产生间隙。例如,您可以联接以下两个对齐的表:

表 C1

时间戳
00:00:30 2
00:01:30 3
00:02:00 4

表 C2

时间戳
00:00:30 4
00:01:00 3
00:01:30 2
00:02:00 1

然后,您会收到以下输出结果:

表 C3

时间戳 值 A 值 B
00:00:30 1 4
00:01:30 2 2
00:02:00 3 1

由于表 C1 中的 00:01:00 没有值,因此该表的 00:01:00 处没有值。

因缺少值而导致的间隔

当输出无法转换或未定义时,某些函数会产生间隙。例如,您可以将 value.string_to_int64 应用于下表的字符串值:

表 D1

时间戳
00:00:30 “4”
00:01:00 “3”
00:01:30 “init”
00:02:00 “1”

生成的表中在 00:01:30 包含间隔,因为 MQL 无法将 'init' 转换为整数:

表 D2

时间戳
00:00:30 4
00:01:00 3
00:01:30 null
00:02:00 1

为避免因值有误或缺失而导致数据缺口,请使用 has_valueor_else 函数处理这些值。

如果其参数的计算结果为 null,has_value 会返回 false。否则,它会返回 true。例如,如果您将 value has_value(1 / val()) 应用于表 D2,则结果不存在间隙:

表 D3

时间戳
00:00:30 true
00:01:00 true
00:01:30 false
00:02:00 true

当 MQL 图表显示尚未超过阈值时,会触发阈值提醒

您希望在虚拟机 (VM) 的 CPU 利用率出现大幅波动时收到通知,因此您创建了用于监控 compute.googleapis.com/instance/cpu/utilization 指标的提醒政策。您将创建并配置条件,以便在每 6 小时的 CPU 利用率超过阈值 50% 时生成突发事件。您的条件使用以下查询:

fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| group_by 5m, [value_utilization_mean: mean(value.utilization)]
| align delta_gauge(6h)
| condition val() > 0.5

您在 30 秒后收到提醒。但是,您的 MQL 图表显示利用率增量未超过阈值。

提醒政策的输出时段为 30 秒。不能通过不定义此时间段或在查询中定义其他时间段来覆盖此时间段。 例如,以下查询仍然使用 30 秒的输出窗口:

fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| group_by 5m, [value_utilization_mean: mean(value.utilization)]
| align delta_gauge(6h) # period not 30 seconds
| condition val() > 0.5
fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| group_by 5m, [value_utilization_mean: mean(value.utilization)]
| align delta_gauge() # undefined period
| condition val() > 0.5

在评估的前 30 秒内,超出了您的指标阈值,因此 Cloud Monitoring 发送了一条提醒。为避免此问题,请将 | every 30s 添加到查询的末尾,以验证输出窗口是否产生了预期的结果。例如:

fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| group_by 5m, [value_utilization_mean: mean(value.utilization)]
| align delta_gauge()
| every 30s # explicit 30 second output window
| condition val() > 0.5

错误:无法保存提醒政策。请求中包含无效的参数。

您创建了一个采用基于 MQL 的条件的提醒政策。保存提醒政策时,您会收到以下错误消息:

Error: Unable to save alerting policy. Request contains an invalid argument.

某些 MQL 表操作(例如 group_by)要求对齐其输入。如果您的查询未对齐其输入,则 MQL 会自动对齐数据。但是,这种自动对齐有时会导致参数无效。

为避免此问题,如果您的查询使用表操作,请确保您的查询包含数据对齐。如需查看数据校准函数的列表,请参阅 MQL 参考文档中的校准部分。

MQL 图表上未显示阈值

您创建了一个采用基于 MQL 的条件的指标阈值提醒政策。但是,MQL 图表上不会显示阈值线。

仅当查询包含用于比较两个值的布尔表达式时,Cloud Monitoring 才会绘制阈值线,其中一个值是列,另一个值是字面量。例如,以下表达式绘制了一个阈值线:

val() > 5'GBy'

但是,以下表达式不会绘制阈值线:

val(0) > val(1) #one of the values must be a literal
5 > 4 #one of the values must be a column
val() #the expression must be a comparison