You need to enable JavaScript to run this app.
导航

内容语法

最近更新时间2023.11.14 20:08:13

首次发布时间2022.12.09 19:44:40

日志服务提供多样化的告警通知内容语法,例如特殊字符转义、变量的条件判断等,以便于您在高阶的使用场景中自定义设计告警通知的内容与显示样式,使告警通知的内容更加丰富和清晰。

功能概述

日志服务在告警功能中提供内置的内容语法,支持针对告警通知的内容和样式进行自定义设计,满足多种场景下的通知内容定制化需求。在设计告警通知内容时,您应遵循本文中提及的内容语法,以便获得更优质的使用体验。
日志服务提供的语法如下:

类型

语法

说明

基础语法支持

数据类型

支持整数、浮点数、字符串、数组、字典等数据类型。

分隔符

分隔符用于分隔不同类型的对象。

操作符

支持算数操作等操作符。

操作

删除空白符

删除指定位置的空白符。

条件判断

参数或者逻辑比较表达式进行条件化判断。

迭代

通过 for 循环语句对数组和对象进行迭代操作。

特殊字符转义

使用 verbatim 标签对特殊语句进行转义。

内容注释

通过注释语法在通知内容中插入注释信息。

变量定义

通过 with 语句进行变量定义。

数据类型

内容变量语法类似于 Python 语法,支持以下数据类型。

数据类型

说明

数字

包含整型(Integer)和浮点型(Double),例如 1、3.1、-2 等。

字符串

所有字符串均需要被双引号("")或单引号('')包裹。其中,字符串中的特殊字符需转义,支持的转义符为反斜线(\),例如 ""source"" 需写为 "\"source\""

布尔值

支持布尔值,即 True 和 False。

空值

None。

列表

支持列表类型。列表在不同编程语言中的叫法不同,例如数组、列表、Slice 等。例如 list("abc", "xyz")

字典

支持字典类型。字典在不同编程语言中的叫法不同,例如对象、字典等。例如 dict("abc", "xyz")

分隔符

分隔符用于分隔不同类型的对象,日志服务告警通知中支持的分隔符包括:

分隔符

使用场景

示例

{{ }}

可用于变量或表达式中,是变量和表达式的基本格式。

  • 变量:{{AccountID}}
  • 表达式:{{ 1 \+ 2 }}
  • 数字:{{ 123 }}
  • 字符串:{{ "abc" }}{{ 'xyz' }}需要使用双引号("")或单引号('')。
  • 函数调用:{{list(a,b,c,d)}}

{% %}

用于控制语句。

{% if count >0 %}
有错误
{% else %}
无错误
{% endif %}

{# #}

用于在通知内容中插入注释信息,注释仅显示在告警策略的配置中,不会随通知内容发送给接受者。

{# 这是一行单行注释 #}

{% comment %}
这是多行注释中的第一行
这是多行注释中的第二行
{% endcomment %}

操作符

日志服务告警通知中支持以下操作符。其中,算数和比较操作符通常只对数值类型的变量或常量生效。

类别

操作符

说明

算数操作

+

加法

-

减法

*

乘法

/

除法,返回值是一个浮点数。

%

取模

比较操作

==

等于

!=

不等于

>

大于

>=

大于等于

<

小于

<=

小于等于

逻辑操作

&&

且操作

||

或操作

!

取反

其它操作

In

用于判断是否包含,判断后返回 Boolean 类型的结果。
例如针对以下类型进行判断:

  • 数组:{{ 400 in list(401, 402, 403) }}
  • 对象:{{ "abc" in dict("abc", "xyz") }}
  • 字符串:{{ "error" in "errorLog" }}

()

操作组合,例如:{{ x > y and (x > z or y > z) }}

删除空白符

默认情况下,在被分隔符包裹的内容中:

  • 分隔符与其他对象之间的空格会被忽略,例如分隔符与表达式之间的空格、分隔符与变量之间的空格。例如 {{ AccountID }} 等同于 {{AccountID}},在通知内容中该变量会被替换为实际的账号 ID。
  • 分隔符外部的空白符会被保留,例如分隔符外部的空格符、制表符(Tab)、换行符等。例如用户 {{AccountID}} 账号下的 {{Topics}} 触发了告警规则。中,两个变量前后的空白符会被保留。
    告警通知语法支持通过连字符(-)的方式清除多余的空白符。在分隔符开始或结束的地方添加一个连字符,用于清除该分隔符前面和后面所有紧连着的空白符。例如 {{ abc -}} 和 {{- xyz }} 的渲染结果为 abc和xyz
    您也可以通过以下方式删除空白符:
  • 删除分隔符左侧紧跟着的所有空白符:{{-{%-
  • 删除分隔符右侧紧跟着的所有空白符:-}}-%}

说明

  • 清除空白符操作只对分隔符外部的空格有效。例如 {{ "abc " }} {{- "xyz"}} 格式化后为 abc xyz
  • 连字符(-)和分隔符之间不能插入空格,否则将作为普通字符处理。例如 {{- abc }} 中清除空白符语法有效,格式化之后为abc{{ - abc }} 中清除控制符操作无效,,格式化之后为 -abc
  • 空行默认删除,无需通过此语法进行删除。

条件判断

通知内容中,日志服务可以通过指定的 if 条件语句对参数或者逻辑比较表达式进行条件化判断,并根据判断结果进行动态的内容展示。

  • 真值判断:在 if 之后的传入普通变量或常量,表示对该值进行真值判断。其中以下字符将被日志服务判定为假,其它值则被判定为真:
    布尔值 false、数字 0、空字符串 ""
  • 比较判断:在 if 之后传入逻辑比较表达式,表示按照比较结果进行判断。例如 {{ if ConsecutiveAlertNums >= 5 }} 用于判断连续告警次数在 5 次及以上。

条件判断支持如下几种形式:

使用方式

示例

if

{% if ConsecutiveAlertNums >= 300 %}
持续告警
{% endif %}

if-else

{% if ConsecutiveAlertNums >= 300 %}
持续告警
{% else %}
短暂告警
{% endif %}

if-elif

{% if ConsecutiveAlertNums >= 300 %}
持续告警
{% elif ConsecutiveAlertNums >= 150 %}
短暂告警
{% endif %}

if-elif-else

{% if ConsecutiveAlertNums >= 300 %}
持续告警
{% elif ConsecutiveAlertNums>=100 && type == 2 %}
告警恢复
{% else  %}
短暂告警
{% endif %}

If 嵌套

{% if ConsecutiveAlertNums >= 300 %}
持续告警
{% else %}
    {% if ConsecutiveAlertNums >= 150 && type==1 %}
    短暂告警
    {% elif type==2 %}
    告警恢复
    {% endif %}
{% endif %}

迭代

在告警通知中,日志服务支持通过 for 循环语句对数组和对象进行迭代操作。支持的迭代方式如下:

使用方式

示例

数组迭代

{% for log in QueryResultStr %}
{{ log }}
{% endfor %}

对象迭代

通过 for 循环将对象转为键值对(Key:Value)格式的的对象进行迭代。

{% for key, val in dict("a",1,"b",2) %}
{{ key }}: {{ val }}
{% endfor %}

特殊字符转义

如果需要在告警通知内容中添加{{等特殊字符串,且该字符串不应被作为分隔符或变量语法进行解析,在配置通知内容时,您需要对此类特殊字符串进行转义。使用 verbatim 标签包裹需要按照原始样式输出的内容即可。
例如,以下配置表示保留{% verbatim %}{% endverbatim %}之间所有的内容。

{% verbatim %}
{{ QueryResultStr }}
{% endverbatim %}

转义并格式化后,输出结果如下:

{{ QueryResultStr }}

内容注释

您可以通过注释语法在通知内容中插入注释信息,注释仅显示在告警策略的配置中,不会随通知内容发送给接收者。

注释类型

语法

示例

单行注释

{# #}
{# 这是一行注释信息 #}

多行注释

{% comment %}
{% endcomment %}
{% comment %}
这是多行注释中的第一行
这是第二行
{% endcomment %}

变量定义

  • 通过 with 语句进行变量定义,语法格式如下:

    {%with t=list("a","b")%}
    {%endwith%}
    
  • 通过 set 关键词进行变量定义,语法格式如下:

    {% set t=0 %}