日志服务支持根据仪表盘中的统计图表设置告警,实现实时的服务状态监控。
告警的查询区间和执行间隔
日志服务根据执行间隔定时执行您所配置的查询和分析语句,并将查询和分析结果作为告警条件的参数进行计算。如果计算结果为true,则告警触发。
请勿将查询和分析的时间范围设置成与执行间隔一致的相对时间。原因如下(以执行间隔为1分钟为例):
数据写入日志服务到能够被查询到,这期间存在延时(一般少于3秒)。即使延时很低,也存在数据漏查的风险。例如告警执行时间为12:03:30,查询和分析的时间范围为相对一分钟,即[12:02:30,12:03:30),对于12:03:29秒写入的日志,不能保证在12:03:30肯定能够查询到。
如果对告警准确性要求高(不重复报警、不漏报),将查询和分析时间范围中的起止时间都往前推移。例如告警执行时间为12:03:30,则查询和分析的时间范围为[12:02:20,12:03:20),通过设置10秒的缓冲时间来避免因为索引速度导致的漏查。
如果对告警的实时性要求高(第一时间收到告警,能够容忍重复报警),查询和分析时间范围中的开始时间往前推移。例如告警执行时间为12:03:30,查询和分析的时间范围设置为[12:02:20,12:03:30)。
同一分钟内包含不同时间的日志时,由于日志索引的构建,时间较迟的日志的索引可能落盘到较早的时间点。例如告警执行时间为12:03:30,查询范围为相对一分钟,即[12:02:30,12:03:30)。如果在12:02:50秒写入日志,这些日志时间为12:02:20、12:02:50等,那么这些日志的索引可能落盘在12:02:20这个时间点,导致在[12:02:30,12:03:30)期间查询不到日志。
如果对告警的准确性要求高(不重复报警,不漏报),查询和分析的时间范围使用整点时间,例如整点1分钟、整点5分钟、整点1小时等,并且将执行间隔设置为一致的时间,例如1分钟、5分钟、1小时等。
如果对告警的实时性要求高(第一时间收到告警,能够容忍重复报警),查询和分析的时间范围至少需要包含前一分钟。例如告警执行时间为12:03:30,查询和分析的时间范围可以设置为相对90秒,那么实际的查询和分析的时间范围为[12:02:00,12:03:30),同时设置执行间隔为1分钟。
基于查询结果告警
基于查询结果设置告警时,只要查询结果不为空就认为满足告警条件,即设置告警触发条件为判断任意字段存在即可。
例如您希望当日志中包含键值对client_ip: 192.0.2.1
就产生告警,则您可以按照如下配置创建告警。具体操作,请参见设置告警。假设client_ip字段在每条日志都存在且不为空字符串,则只要client_ip字段不为空就触发告警。
基于分析结果告警
基于分析结果设置告警是最常见的场景。例如您希望包含ERROR关键字的日志条数达到阈值即触发告警,则您可以按照如下配置创建告警。具体操作,请参见设置告警。
关联多个图表
当您基于仪表盘创建告警时,日志服务支持同时对1~3个查询和分析结果设置告警。
多个图表之间的查询区间相互独立。
关联多个图表时,触发条件中需要使用${编号}.{字段}方式引用查询和分析结果中的字段。例如
$0.pv > 100000 && $1.uv < 1000
,其中$0表示编号为0的图表,$1表示编号为1的图表。更多信息,请参见如何查看图表编号。多个触发条件之间使用2个and符号(&&)连接,例如
pv%100 > 0 && uv > 0
。
告警抑制
当告警触发时,可能会在一段时间内多次收到通知。为了防止因为数据抖动导致的误报和重复告警,可以通过设置连续通知阈值或通知间隔来对告警进行抑制。 具体操作,请参见设置告警。
设置连续通知阈值。
只有在连续多次检查中都满足告警条件才会触发告警。
例如告警执行间隔为1分钟,触发阈值为5,则表示在连续5次即5分钟内每次告警检查结果都满足告警条件才会发送通知。只要有一次没有满足触发条件,计数将重置。
设置通知间隔。
当告警设置的执行间隔较小时,为了防止频繁收到通知,您可以设置两次通知之间的最小间隔。例如告警执行间隔为1分钟,通知间隔为30分钟,即使30分钟内有告警触发,也不会收到任何通知。
使用模板变量丰富通知内容
您在配置通知方式时,可在发送内容和主题中,通过${fieldName}方式引用模板变量。日志服务发送告警通知时,会将发送内容和主题中的模板变量替换为真实值。例如${Project}替换为告警规则所属的Project名称。更多信息,请参见旧版告警的模板变量。
对于顶层的变量如Project、AlertName、Dashboard,可以直接使用${fieldName}方式引用,不区分大小写。
每次产生告警时,系统自动生成告警上下文信息,存储于Results字段(数组类型)中。数组中的每个元素对应告警关联的一个图表(对于大多数场景,可能只有一个元素)。更多信息,请参见告警日志字段。Results中的字段可以通过如下方式引用:
数组类型的字段通过${fieldName[{index}]}方式引用,其中{index}表示数组下标,从0开始。例如${results[0]}表示引用Results数组中的第1个元素。
对象类型的字段通过${object.key}引用。例如${results[0].StartTimeTs}的结果为1542453580。
说明RawResults和FireResult内的字段为查询结果,区分大小写,其他字段均不区分大小写。
{ "EndTime": "2006-01-02 15:04:05", "EndTimeTs": 1542507580, "FireResult": { "__time__": "1542453580", "field": "value1", "count": "100" }, "FireResultAsKv": "[field:value1,count:100]", "Truncated": false, "LogStore": "test-logstore", "Query": "* | SELECT field, count(1) group by field", "QueryUrl": "http://xxxx", "RawResultCount": 2, "RawResults": [ { "__time__": "1542453580", "field": "value1", "count": "100" }, { "__time__": "1542453580", "field": "value2", "count": "20" } ], "RawResultsAsKv": "[field:value1,count:100],[field:value2,count:20]", "StartTime": "2006-01-02 15:04:05", "StartTimeTs": 1542453580 }