日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

內容模板語法(新版)

新版告警支持兩個版本的內容模板語法。本文介紹新版內容模板語法。

概述

相對于舊版的內容模板語法,新版通過類似Python語法的方式,提供更加靈活且高級的自定義渲染邏輯,在定制通知內容(例如Markdown轉義)、自定義內容樣式等方面都做了優化,滿足更多樣化的定制內容需求。例如:

  • 根據告警的嚴重度進行動態的內容渲染,不同嚴重度使用不同顏色的文字進行區分。

  • 對告警的查詢結果進行迭代渲染,在郵件中渲染為列表或者表格。

  • 通過函數對某個字段進行BASE64編碼和解碼、對數值進行數學運算等。

新版的內容模板語法完全兼容舊版,并支持新舊版混合使用。但在不同版本的內容模板語法中使用告警屬性時,其類型、取值和展示形式等存在差異,因此建議您不要混合使用新舊版本的內容模板語法。推薦您使用新版本的內容模板語法。

快速開始

通過新版內容模板定義通知內容的示例如下:

  • 告警內容

    {
        "alert_id": "test-alert",
        "alert_name": "PV/UV Alert",
        "project": "project-1",
        "status": "firing",
        "severity": 6,
        "labels": {
            "app": "nginx",
            "host": "host-1"
        },
        "results": [
            {
                "project": "project-1",
                "logstore": "logstore-1",
                "query": "* | select count(*) as pv"
            },
            {
                "project": "project-2",
                "logstore": "logstore-2",
                "query": "* | select count(distinct user_id) as uv"
            }
        ]
    }
  • 內容模板配置

    - Alert ID: {{ alert.alert_id }}
    - Alert Name: {{ alert.alert_name }}
    - Project: {{ alert.project }}
    - Status: {% if alert.status == "firing" %}FIRING{% else %}RESOLVED{% endif %}
    - Labels:
    {%- for key, val in alert.labels.items() %}
        - {{ key }}: {{ val }}
    {%- endfor %}
    - Query: {{ alert.results[0].query }}
  • 輸出結果

    - Alert ID: test-alert
    - Alert Name: PV/UV Alert
    - Project: project-1
    - Status: FIRING
    - Labels:
        - app: nginx
        - host: host-1
    - Query: * | select count(*) as pv

基本語法

數據類型

內容模板語法類似于Python語法,支持如下數據類型。

數據類型

說明

數字

包含整數和浮點數。例如3、-1。

字符串

需要使用單引號('')或者雙引號("")包裹。例如"foo"、'bar'。

當字符串中存在特殊字符時,需使用反斜線(\)進行轉義。例如\foo需寫為"\\foo"

布爾值

True、False。

空值

None。

列表

不同編程語言中的叫法不同,可以為列表、數組、Slice等。例如['foo', 'bar']。

字典

不同編程語言中的叫法不同,可以為字典、對象等。例如{'foo': 'bar'}。

分隔符

分隔符

使用場景

示例

{{ }}

在變量或表達式中使用。

  • 數字:{{ 123 }}

  • 字符串:{{ "abc" }}或{{ 'xyz' }}

    需要使用雙引號("")或單引號('')。

  • 變量:{{ alert.alert_name }}

  • 表達式:{{ alert.project + '/' + alert.alert_id }}

{% %}

用于控制語句。

{% if alert.status == 'firing' %}FIRING{% else %}RESOLVED{% endif %}

{# #}

用于注釋,不會出現在通知內容中。

{# this is a comment #}

清除空字符

默認情況下,在分隔符內部,分隔符與表達式之間的空格會被忽略。例如{{ 23 }} < {{ 45 }}等同于{{23}} < {{45}},渲染結果都為23 < 45。但是分隔符外部的空字符(空格、Tab、換行等)會被保留,例如{{ 23 }} < {{ 45 }}的渲染結果為23 < 45,而不是23<45

當您需要刪除多余的空字符時,可以使用清除空字符操作。在分隔符開始或結束的地方添加一個短劃線(-),用于清除該分隔符前面和后面所有緊連著的空字符。例如{{ 23 -}} < {{- 45 }}的渲染結果為23<45

  • {{-{{%-{#-用于刪除分隔符左側緊連著的所有空字符。

  • -}}-%}-%}用于刪除分隔符右側緊連著的所有空字符。

重要
  • 短劃線(-)和分隔符之間不能有空格。例如{{- 3 }}是有效的,渲染結果為3{{ - 3 }}是無效的,渲染結果為-3

  • 清除空字符操作只對分隔符外部的空格有效,不影響分隔符內部的空格。例如{{ "hello " }} {{- "world"}}渲染結果為hello world

條件語句

條件判斷支持對參數或者邏輯比較表達式進行判斷。通過條件判斷,可以進行動態渲染。

  • 如果if后面傳入的是常量或者普通變量,則對該值進行真值判斷。其中布爾值false、數字0、空字符串""、空值null、空數組[]、空對象{}都會被判定為假,其它值被判定為真。

  • 如果if后面傳入的是邏輯比較表達式,則按照比較結果進行判斷。例如{{ if alert.severity >= 8 }}用于判斷告警嚴重度是否大于等于8。

條件判斷支持如下幾種形式:

使用方式

示例

if

{% if alert.severity >= 8 %}
嚴重告警
{% endif %}

if-else

{% if alert.severity >= 8 %}
嚴重告警
{% else %}
普通告警
{% endif %}

if-elif

{% if alert.severity >= 8 %}
嚴重告警
{% elif alert.severity >= 4 %}
普通告警
{% endif %}

if-elif-else

{% if alert.severity >= 8 %}
嚴重告警
{% elif alert.severity >= 4 %}
普通告警
{% else %}
通知
{% endif %}

嵌套使用

{% if alert.severity >= 8 %}
嚴重告警
{% else %}
{% if alert.severity >= 4 %}
普通告警
{% else %}
通知
{% endif %}
{% endif %}

迭代

循環語句用于對數組和對象進行迭代操作。支持如下幾種使用方式:

使用方式

示例

數組迭代

{% for result in alert.results %}
{{ result }}
{% endfor %}

數組迭代,包含下標

使用enumerate函數對數組進行下標迭代。關于enumerate函數的更多信息,請參見enumerate函數

{% for index, result in enumerate(alert.results) %}
{{ index }}: {{ result }}
{% endfor %}

下標默認從0開始。您也可以通過enumerate函數中的start參數自定義起始下標。例如:

{% for index, result in enumerate(alert.results, start=1) %}
{{ index }}: {{ result }}
{% endfor %}

對象迭代

通過items()方法將對象轉為Key:Value形式的數組進行迭代。

{% for key, val in alert.labels.items() %}
{{ key }}: {{ val }}
{% endfor %}

嵌套使用

{% for result in alert.fire_results %}
{% for key, val in result.items() %}
{{ key }}: {{ val }}
{% endfor %}
{% endfor %}

轉義

如果您希望特殊字符串(例如{{)不被內容模板解析和渲染,可對特殊字符串進行轉義。例如:根據如下配置表示保留{% raw %}{% endraw %}之間所有的內容。

  • 內容模板配置

    {% raw %}
    {% for result in alert.results %}
    {{ result }}
    {% endfor %}
    {% endraw %}
  • 結果

    {% for result in alert.results %}
    {{ result }}
    {% endfor %}

函數

內置模板函數便于您對數據進行各種操作,豐富了通知內容的格式和展示樣式。更多信息,請參見內置模板函數

例如您要通過Webhook方式發送JSON格式的內容,相關信息如下:

  • 告警的查詢語句(包含一個換行)

    * |
    select count(*) as cnt
  • 不同使用方式的對比說明

    對比項

    內容模板

    結果

    說明

    不使用函數

    {
        "query": "{{ alert.results[0].query }}"
    }
    {
        "query": "* |
    select count(*) as pv"
    }

    JSON格式不合法

    使用quote函數

    {
        "query": {{ quote(alert.results[0].query) }}
    }
    {
        "query": "* | \nselect count(*) as pv"
    }

    JSON格式合法

過濾器

在函數嵌套使用場景中,通知內容的編輯麻煩且不夠直觀,例如{{ block(to_list(alert.labels)) }},此時您可以使用過濾器功能。過濾器使用豎線(|) 操作符,并支持鏈式調用,一般格式為{{ xxx | filiter1 | filter2 | ... }}。例如{{ blockquote(to_list(alert.labels)) }}等同于{{ alert.labels | to_list | blockquote }}

使用過濾器方式時,請先確認目標內置函數是否支持過濾器方式。大部分內置函數都支持過濾器方式的調用。更多信息,請參見內置模板函數

重要
  • 如果函數中沒有參數,則只能使用函數方式,不支持過濾器方式。

  • 當函數中只有一個參數時,推薦使用過濾器方式,即使用{{ arg | fn }}。例如{{ abs(-1) }} 等同于{{ -1 | abs }}

  • 如果函數中有多個參數,且從第二個參數開始有默認值,也可以使用過濾器。如果有多個參數值需要傳遞,通過過濾器方式并不直觀。不建議對多參數的函數使用過濾器方式。

操作符

內容模板表達式中支持如下操作符。操作符的優先級說明請參見Operator precedence

類別

操作符

說明

算數

+

加法

-

減法

*

乘法

/

除法,返回值是一個浮點數。

//

除法,返回整數。

%

取模

比較

==

等于

!=

不等于

>

大于

>=

大于等于

<

小于

<=

小于等于

邏輯

and

且操作

or

或操作

not

取反

其它

in

判斷是否包含,返回布爾類型的結果。

  • 數組:{{ 1 in [1, 2, 3] }}

  • 對象:{{ "foo" in {"foo": "bar" } }}

  • 字符串:{{ "ll" in "hello" }}

()

操作組合,例如:{{ a > b and (a > c or b > c) }}

使用告警變量

在新版內容模板中,告警變量的使用形式為alert.xxx,例如alert.project。更多信息,請參見內容模板變量說明(新版)

配置示例

  • 示例1:根據告警狀態展示不同內容

    觸發告警后,展示告警狀態、告警嚴重度和觸發結果等信息;告警恢復時,只展示告警狀態。

    • 不使用函數

      {% if alert.status == "firing" %}
      - 狀態: <font color="#E03C39">觸發</font>
      - 嚴重度:{{ alert.severity | format_severity }}
      - Results: {{ alert.results | to_json }}
      {% else %}
      - 狀態: <font color="#72C140">恢復</font>
      {% endif %}
    • 使用函數

      使用format_status函數和format_severity函數簡化配置。

      - 狀態: {{ alert.status | format_status }}
      {% if alert.status == "firing" %}
      - 嚴重度:{{ alert.severity | format_severity }}
      - Results: {{ alert.results | to_json }}
      {% endif %}
  • 結構化數據展示

    將告警標簽的內容轉換為列表形式,內容為Markdown格式。

    • 不使用函數

      - 項目: {{ alert.project }}
      - 告警名稱: {{ alert.alert_name }}
      - 告警標簽:
      {%- for key, val in alert.labels.items() %}
      > - {{ key }}: {{ val }}
      {%- endfor %}
    • 使用函數

      使用to_list函數和blockquote函數簡化配置。

      - 項目: {{ alert.project }}
      - 告警名稱: {{ alert.alert_name }}
      - 告警標簽:
      {{ alert.labels | to_list | blockquote }}