日志服务支持根据仪表盘中的统计图表设置告警,实现实时的服务状态监控。

告警的查询区间和执行间隔

日志服务根据执行间隔定时执行您所配置的查询和分析语句,并将查询和分析结果作为告警条件的参数进行计算。如果计算结果为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
  • 对不同时间范围的查询和分析结果进行组合告警。
    例如您希望15分钟内的PV大于100000,一小时内的UV小于1000时触发告警,则您可以按照如下配置创建告警。具体操作,请参见设置告警仪表盘告警
  • 基于部分图表告警,其他图表的查询结果作为辅助信息。

    例如,您希望基于日志级别为ERROR的日志条数触发告警,与此同时,希望能够在告警通知中看到实际的日志级别为ERROR的日志,则您可以按照如下配置创建告警。具体操作,请参见设置告警

    告警
    在告警通知中只需要设置如下内容,即可看到实际日志级别为ERROR的日志。
    ${results[1].RawResultsAsKv}

告警抑制

当告警触发时,可能会在一段时间内多次收到通知。为了防止因为数据抖动导致的误报和重复告警,可以通过设置连续通知阈值或通知间隔来对告警进行抑制。 具体操作,请参见设置告警告警抑制
  • 设置连续通知阈值。

    只有告警在连续多次检查中都满足告警条件才会触发告警。

    例如告警执行间隔为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
    }

排查告警未触发原因

配置告警之后,您可以通过告警日志排查告警未触发的原因。具体操作,请参见查看告警记录。日志字段说明,请参见告警日志字段