新版内容模板的内置函数便于您对数据进行各种操作,丰富了通知内容的格式和展示样式。本文介绍内置模板函数的语法及示例。

通用函数

数学函数

函数说明过滤器示例
float(value, default=0.0)将整数或字符串转换成浮点数。

如果转换失败,默认返回0.0。通过default参数,可指定转换失败的返回值。

支持
  • {{ float("123") }}的结果为123.0。
  • {{ float("foo") }}的结果为0.0。
  • {{ float("foo", default=1.23) }}的结果为1.23。
int(value, default=0)将一个字符串或数字转换为整数。

如果转换失败,默认返回0。通过default参数,可指定转换失败的返回值。

支持
  • {{ int(1.23) }}的结果为1。
  • {{ int("1.23") }}的结果为1。
  • {{ int("foo") }}的结果为0。
  • {{ int("foo", default=5) }}的结果为5。
length(value)返回对象(字符串、列表、元组等)的长度或个数。支持
  • {{ length("foo") }}的结果为3。
  • {{ length([1, 2]) }} 的结果为2。
  • {{ length({"foo": "bar"}) }}的结果为1。
abs(value)返回数字的绝对值。支持{{ abs(-1) }}的结果为1。
min(value)返回最小值。支持{{ min([1, 3, 2]) }}的结果为1。
max(value)返回最大值。支持{{ max([1, 3, 2]) }}的结果为3。
ceil(value)向上取整数。支持{{ ceil(1.23) }}的结果为2。
floor(value)向下取整数。支持{{ floor(1.23) }}的结果为1。
round(value, 1)四舍五入取整数。

其中,1表示保留1位小数。

支持
  • {{ round(1.23) }}的结果为1。
  • {{ round(1.56) }}的结果为2。
  • {{ round(1.56, 1) }}的结果为1.6。
sum(value)求和计算。支持{{ sum([1, 2, 3]) }}的结果为6。

字符串函数

函数说明过滤器示例
string(value)将对象转为字符串类型。支持{{ string(1.23) }}的结果为1.23。

此处的1.23为字符串类型。

capitalize(value)将字符串的首字母转换为大写形式,其它字符转换为小写形式。支持{{ capitalize("heLLO World") }}的结果为Hello world。
lower(value)将字符串转换为小写形式。支持{{ lower("FOO") }}的结果为foo。
upper(value)将字符串转换为大写形式。支持{{ upper("foo") }}的结果为FOO。
title(value)返回标题化的字符串,即每个单词的首字母为大写形式,其余字母为小写形式。支持{{ title("hello world") }}的结果为Hello World。
trim(value)删除字符串头尾的空字符。支持{{ trim(" foo\n") }}的结果为foo。
replace(value, old, new)替换目标字符串。不支持{{ replace("foo", "oo", "ly") }}的结果为fly。
wordcount(value)统计单词个数。支持{{ wordcount("hello world") }}的结果为2。
truncate(value, n, end='')截断字符串。
  • 通过truncate(value, n),指定截断的字符数。
  • 通过truncate(value, n, end='...'),指定要添加的后缀。
不支持
  • {{ truncate("foo bar", 5) }}的结果为foo b。
  • {{ truncate("foo bar", 5, end="...") }}的结果为foo b...。
quote(value)使用半角双引号("")包裹字符串。支持
  • {{ quote(123) }}的结果为"123"
  • {{ quote("foo") }}的结果为 "foo"。
indent(value, n=4)对每一行字符串进行缩进,默认缩进4个空格。

通过n参数,可指定缩进的空格数。

支持
  • {{ "foobar\n" }}{{ indent("foo\nbar") }} 的结果如下:
    foobar
        foo
        bar
  • {{ "foobar\n" }}{{ indent("foo\nbar", 2) }}的结果如下:
    foobar
      foo
      bar
startswith(value, prefix)判断字符串是否以特定子串开始。支持{{ startswith("football", "foo") }}的结果为true。
endswith(value, suffix)判断字符串是否以特定子串结束。支持{{ endswith("football", "all") }}的结果为true。
removeprefix(value, prefix)移除字符串的前缀。支持{{ removeprefix("football", "foot") }}的结果为ball。
removesuffix(value, suffix)移除字符串的后缀。支持{{ removesuffix("football", "ball") }}的结果为foot。
split(value, sep=None, maxsplit=-1)切割字符串。
  • 通过sep参数指定分隔符。
  • 通过maxsplit参数限制切割次数。

    如果未指定maxsplit或设置为-1,表示对切割数量没有限制。

支持
  • {{ split('a b c ') }} 的结果为['a', 'b', 'c']。
  • {{ split('a-b-c', sep='-') }}的结果为['a', 'b', 'c']。
  • {{ split('a-b-c', sep='-', maxsplit=1) }}的结果为['a', 'b-c']。
  • {{ split('a<>b<>c', sep='<>') }}的结果为['a', 'b', 'c']。

列表和对象函数

函数说明过滤器示例
enumerate(value)将一个可迭代的对象组合为一个索引序列,并列出原始元素和元素的下标。不支持{{ enumerate(["foo", "bar"]) }}的结果为[(0, 'foo'), (1, 'bar')]。
list(value)将一个可迭代的对象转换为列表类型。支持
  • {{ list(("foo", "bar")) }}的结果为 ['foo', 'bar']。
  • {{ list("foo") }}的结果为 ['f', 'o', 'o']。
dict(value)创建一个字典,类似于直接使用{}创建字典。不支持{{ dict(foo=1, bar="hello") }}的结果为{'foo': 1, 'bar': 'hello'}。
first(value)返回列表中的第一项。支持{{ first([1, 2, 3]) }}的结果为1。
last(value)返回列表中的最后一项。支持{{ last([1, 2, 3]) }}的结果为3。
sort(value, reverse=true)对列表中的元素进行排序。

通过reverse=true,可实现逆序排序。

支持
  • {{ sort([3, 1, 2]) }}的结果为[1, 2, 3]。
  • {{ sort([3, 1, 2], reverse=true) }}的结果为[3, 2, 1]。
dictsort(value)将对象中的键值对(Key:Value)按照Key进行排序,返回数组。支持
  • alert.labels字段示例
    {
        "host": "host-1",
        "app": "nginx"
    }
  • 内容模板配置
    {%- for key, val in dictsort(alert.labels) %}
    {{ key }}: {{ val }}
    {%- endfor %}
  • 结果
    app: nginx
    host: host-1
join(value, d='')使用连接符连接列表中的元素。

通过d参数,可指定连接符。

支持
  • {{ join([1, 2, 3]) }}的结果为123。
  • {{ join([1, 2, 3], ',') }}的结果为1,2,3。

格式化函数

函数说明过滤器示例
escape_markdown(value)转义特殊的Markdown字符。支持{{ escape_markdown("__a__ **b** #c") }}的结果为&#95;&#95;a&#95;&#95; &#42;&#42;b&#42;&#42; &#35;c
escape_html(value)转义特殊的HTML字符。支持{{ escape_html("<div>") }}的结果为&lt;div&gt;
to_json(value)将对象转为JSON格式。支持
  • {{ to_json("foo") }}的结果为"foo"。
  • {{ to_json(1.23) }}的结果为1.23。
  • {{ to_json(True) }}的结果为true。
  • {{ to_json(alert.labels) }}的结果为{"host": "host-1", "app": "nginx"}。
parse_json(value)将字符串解析为JSON数据结构。支持
  • {{ parse_json('{"foo": "bar"}').foo }}的结果为bar。
  • {{ parse_json('[1, 2, 3]')[1] }}的结果为2。

编码和解码函数

函数说明过滤器示例
base64_encoding(value)对输入值进行Base64编码。支持{{ base64_encoding("foo") }}的结果为Zm9v。
base64_decoding(value)对输入值进行Base64解码。支持{{ base64_decoding("Zm9v") }}的结果为foo。
md5_encoding(value)对输入值进行MD5编码。支持{{ md5_encoding("foo") }}的结果为acbd18db4cc2f85cedef654fccc4a4d8。
url_encoding(value)对输入值进行URL编码。支持{{ url_encoding("https://example.com?a=b&c=d") }}的结果为https%3A%2F%2Fexample.com%3Fa%3Db%26c%3Dd。
url_decoding(value)对输入值进行URL解码。支持{{ url_decoding("https%3A%2F%2Fexample.com%3Fa%3Db%26c%3Dd") }}的结果为https://example.com?a=b&c=d。

日期和时间函数

函数说明过滤器示例
parse_date(value, fmt="%Y-%m-%d %H:%M:%S")将输入值转为timestamp类型的日期和时间表达式。

通过fmt参数,可指定日期和时间表达式的格式。

支持
  • {{ parse_date(1629820800) }}的结果为2021-08-25 00:00:00。
  • {{ parse_date("2021|08|25|00|00|00", fmt="%Y|%m|%d|%H|%M|%S") }}的结果为2021-08-25 00:00:00。
format_date(value, tz=None, fmt="%Y-%m-%d %H:%M:%S")将输入值进行格式化。

通过fmt参数,可指定日期和时间表达式的格式。

如果输入值不是日期对象,则函数会将其转换为日期对象,再进行格式化。关于日期时间格式化指令的更多信息,请参见日期时间格式化指令。关于时区列表的更多信息,请参见时区列表

不支持
  • {{ format_date(1629820800) }}的结果为2021-08-25 00:00:00。
  • {{ format_date(1629820800, fmt="%Y/%m/%d %H:%M:%S") }}的结果为2021/08/25 00:00:00。
  • {{ format_date(1629820800, tz="UTC", fmt="%Y/%m/%d %H:%M:%S") }}的结果为2021/08/24 16:00:00。
timestamp(value)将时间和日期字符串转换为Unix时间戳。

如果输入值不是日期对象,则函数会将其转换为日期对象,再进行格式化。

支持
  • {{ timestamp("2021-08-25 00:00:00") }}的结果为1629820800。
  • {{ timestamp(parse_date("2021-08-25 00:00:00")) }}的结果为1629820800。
format_duration(value, locale='en-US', sep='')格式化时间间隔。其中value的单位为秒。

通过locale参数,可指定文字的语言。locale参数的取值请参见告警业务函数locale取值

支持
  • {{ 10 | format_duration }}的结果为10s。
  • {{ 60 | format_duration }}的结果为1m。
  • {{ 3600 | format_duration }}的结果为1h。
  • {{ 86400 | format_duration }}的结果为1d。
  • {{ 100000 | format_duration }}的结果为1d3h46m40s。
  • {{ 100000 | format_duration(sep=",") }}的结果为1d,3h,46m,40s。

告警业务函数

告警业务函数是和告警上下文以及内容模板配置相关,可自动感知如下信息:
说明 在不同的告警上下文中执行告警业务函数时,返回的结果有可能不同。
  • 告警属性,例如当前告警的严重度、状态等。
  • 内容模板语言配置,例如是中文、英文。
  • 通知渠道,例如钉钉、邮件等。
函数说明过滤器示例
format_type(alert.type, locale=None)将告警类型转换为文字描述。

通过locale参数,可指定文字的语言。locale参数的取值请参见告警业务函数locale取值

支持
  • 告警类型为sls_pub
  • 内容模板配置
    {{ format_type(alert.type) }}
  • 结果
    • 内容模板中的语言配置为中文时,通知内容为开放告警
    • 内容模板中的语言配置为英文时,通知内容为Pub Alert
format_region(alert.region, locale=None)将告警所在地域转换为文字描述。

通过locale参数,可指定文字的语言。locale参数的取值请参见告警业务函数locale取值

支持
  • 当前告警地域为cn-hangzhou
  • 内容模板配置
    {{ format_region(alert.region) }}
  • 结果
    • 内容模板中的语言配置为中文时,通知内容为华东1(杭州)
    • 内容模板中的语言配置为英文时,通知内容为 China (Hangzhou)
format_severity(alert.severity, locale=None)将告警严重度转换为文字描述,且支持彩色字体。
说明 目前只有钉钉、企业微信、邮件和消息中心这四个渠道支持彩色文本。

通过locale参数,可指定文字的语言。locale参数的取值请参见告警业务函数locale取值

支持
  • 告警严重度为6
  • 内容模板配置
    {{ format_severity(alert.severity) }}
  • 结果
    • 内容模板中的语言配置为中文时,通知内容为中级,黄色字体。
    • 内容模板中的语言配置为英文时,通知内容为 Medium,黄色字体。
format_status(alert.status, locale=None)将告警状态转换为文字描述,且支持彩色字体。
说明 目前只有钉钉、企业微信、邮件和消息中心这四个渠道支持彩色文本。其他渠道时调用该函数会无改变。

通过locale参数,可指定文字的语言。locale参数的取值请参见告警业务函数locale取值

支持
  • 当前告警为触发状态
  • 内容模板配置
    {{ format_status(alert.status) }}
  • 结果
    • 内容模板中的语言配置为中文时,通知内容为触发,红色字体。
    • 内容模板中的语言配置为英文时,通知内容为 Firing,红色字体。
to_list(value)将数组或对象转换为列表。支持
  • 告警标签
    {
        "app": "nginx",
        "host": "host-1"
    }
  • 内容模板配置
    {{ to_list(alert.labels) }}
  • 结果
    • 通知内容为Markdown格式时,返回结果如下:

      支持根据渠道是否需要进行Markdown转义而自动转义。

      - app: nginx
      - host: host&#45;1
    • 通知内容为HTML格式时,返回结果如下:
      <ul>
        <li>app: nginx</li>
        <li>host: host-1</li>
      </ul>
    • 通知内容为普通文本格式时,返回结果如下:
      [app: nginx][host: host-1]
annotations_to_list(alert.annotations, locale=None)将告警标注转换为列表形式。类似于to_list(alert.annotations),区别在于annotations_to_list函数支持自动将标准名称转换为文字描述,例如将title字段转换为标题或者Title。标准名称列表,请参见告警标注字段映射

通过locale参数,可指定文字的语言。locale参数的取值请参见告警业务函数locale取值

支持
  • 告警标注
    {
        "title": "Nginx访问异常",
        "desc": "PV同比下降80%",
        "cnt": "120"
    }
  • 内容模板配置
    {{ annotations_to_list(alert.annotations) }}
  • 结果
    通知内容为Markdown格式时,返回结果如下:
    - 标题: Nginx访问异常
    - 描述: PV同比下降80%
    - cnt: 120
blockquote(value)为通知内容添加引用样式。
  • 通知内容为Markdown格式时,在每一行的开头添加>符号。
  • 通知内容为HTML格式时,使用<blockquote>标签包裹通知内容。
支持
  • 内容模板配置
    {{ blockquote("foo\nbar") }}
  • 结果
    • 通知内容为Markdown格式时,返回结果如下:
      > foo
      > bar
    • 通知内容为HTML格式时,返回结果如下:
      <blockquote>
      foo
      bar
      </blockquote>

参考信息

  • 告警业务函数中locale参数的取值
    locale取值说明
    None或空字符串使用内容模板中配置的语言。
    en-US英文。
    zh-CN中文。
  • 告警标注字段映射
    标注映射值(中文)映射值(英文)
    title标题Title
    desc描述Description
    anomaly_score异常分数Anomaly Score
    job_id任务IDTask ID
    model_id模型IDModel ID
    severity异常严重度Anomaly Severity
    __pub_alert_app__应用Application
    __pub_alert_protocol__协议Protocol
    __pub_alert_region__接入区域Region
    __pub_alert_service__服务Service
    __ensure_url__异常确认Anomaly Confirmation
    __mismatch_url__误报确认False Positive Confirmation
    __plot_image__时序图Time Series Chart
    __host_ip__机器地址Machine Address
    __host_group_name__机器组名称Machine Group Name
    __cloud_monitor_type__阿里云云监控CloudMonitor