Simple Log Serviceの新しいアラート機能は、新しいアラートテンプレートで使用される構文と、元のアラートテンプレートで使用される構文をサポートしています。 このトピックでは、新しいアラートテンプレートで使用される構文について説明します。
概要
元のアラートテンプレートと比較して、新しいアラートテンプレートは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。 |
String | 各文字列は、一重引用符 ('') または二重引用符 (" ") のペアで囲む必要があります。 例: 「foo」と「bar」。 文字列に特殊文字が含まれている場合は、特殊文字をエスケープするためにバックスラッシュ (\) を使用する必要があります。 たとえば、 |
Boolean | サポートされるブール値はTrueとFalseです。 |
ヌル | なし。 |
List | リストは、他のプログラミング言語では配列またはスライスと呼ぶことができます。 例: ['foo', 'bar'] 。 |
辞書 | 辞書は、他のプログラミング言語ではオブジェクトと呼ぶことができる。 例: {'foo': 'bar'} 。 |
区切り文字
デリミタ | 使用シナリオ | 例 |
| 変数または式の開始と終了をマークするために使用します。 |
|
| ステートメントの開始と終了をマークするために使用します。 |
|
| コメントの開始と終了をマークするために使用します。 アラート通知の内容にコメントは含まれません。 |
|
空の文字列の削除
デフォルトでは、区切り文字を使用して式の開始と終了をマークすると、Simple Log Serviceは区切り文字と区切り文字内の式の間のスペースを無視します。 たとえば、Simple Log Serviceは、{{23}} < {45}}
と {{23}} < {45}
の両方を23 < 45
にレンダリングします。 ただし、Simple Log Serviceは、スペース、タブ、改行などの空の文字列を区切り文字の外側に保持します。 たとえば、Simple Log Serviceは {{ 23 }} < {45}
を23 <45
ではなく23 <45
にレンダリングします。
区切り文字の左右にある不要な空の文字列を削除する場合は、区切り文字の左右にハイフン (-) を追加できます。 たとえば、Simple Log Serviceは {{ 23 -}} < {{- 45 }}
を23<45
にレンダリングします。
{{-
、{{%-
、および{#
-区切り文字は、区切り文字の左側にあるすべての空の文字列を削除するために使用されます。-}}
、-%}
、および-%}
区切り文字は、区切り文字の右側にあるすべての空の文字列を削除するために使用されます。
ハイフン (-) とハイフン (-) が追加されている区切り文字の間には空白はありません。 たとえば、Simple Log Serviceは、
{{- 3 }}
のハイフン (-) が有効であると見なし、数値を3
にレンダリングします。 ただし、Simple Log Serviceは{{ - 3 }}
のハイフン (-) を無効とみなし、数値を-3
にレンダリングします。ハイフン (-) は区切り文字の外側のスペースにのみ有効で、区切り文字の内側のスペースには影響しません。 たとえば、Simple Log Serviceは
{{ "hello"}} {{- "world"}}
をhello world
にレンダリングします。
条件付きステートメント
条件フローは, パラメーターの値と論理式の結果を評価するために使用されます。 Simple Log Serviceは、条件フローに基づいてデータをレンダリングできます。
If
句の後に定数または正規変数が続く場合、Simple Log Serviceは定数または正規変数の値をtrueまたはfalseに評価します。 Simple Log Serviceは、すべてのブール値false
、数値0
、空の文字列""
、空の値null
、空の配列[]
、空のオブジェクト{}
をfalseに評価し、他のすべての値をtrueに評価します。If
句の後に論理式が続く場合、Simple Log Serviceは論理式の結果をtrueまたはfalseに評価します。 たとえば、{{ if alert.severity >= 8 }}
を使用して、アラートの重大度レベルが8以上かどうかを評価します。
次の表に、新しいアラートテンプレートでサポートされる条件フローを示します。
制御フロー | 例 |
if |
|
if-else |
|
if-elif |
|
if-elif-else |
|
ネストされたステートメント |
|
反復
ループステートメントは、配列とオブジェクトに対して反復操作を実行するために使用されます。 次の表に、新しいアラートテンプレートでサポートされているループステートメントを示します。
ループ文 | 例 |
配列のループステートメント |
|
配列の添え字を持つループステートメント | 列挙関数は、配列の添え字に対して反復演算を実行するために使用されます。 列挙関数の詳細については、「アラートテンプレートの組み込み関数」をご参照ください。
下付き文字はデフォルトで位置0から始まります。 列挙関数のstartパラメーターを使用して、開始添字と終了添字を定義できます。 例:
|
オブジェクトのループ文 | items() 関数は、オブジェクトを
|
入れ子になったステートメント |
|
エスケープ文字
Simple Log Serviceで {{
などの特殊文字で構成される文字列を解析またはレンダリングしたくない場合は、文字列をエスケープできます。 たとえば、次のアラートテンプレート設定では、{% raw %}
と {% endraw %}
の間のすべてのコンテンツを保持するように指定します。
アラートテンプレートの設定
{% raw %} {% for result in alert.results %} {{ result }} {% endfor %} {% endraw %}
結果
{% for result in alert.results %} {{ result }} {% endfor %}
関数
アラートテンプレートは組み込み機能を提供します。 組み込み機能を使用して、アラート通知の形式とスタイルを柔軟に設定できます。 詳細については、「アラートテンプレートの組み込み関数」をご参照ください。
たとえば、Simple Log Serviceでwebhook URLを使用してアラート通知を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 }}
に相当します。
組み込み関数でフィルターを指定する前に、組み込み関数がフィルターをサポートしていることを確認する必要があります。 新しいアラートテンプレートで使用できる組み込み関数のほとんどは、フィルターをサポートしています。 詳細については、「アラートテンプレートの組み込み関数」をご参照ください。
組み込み関数にパラメーターが指定されていない場合、組み込み関数にフィルターを指定することはできません。
組み込み関数でパラメーターを1つだけ指定する場合は、組み込み関数でフィルターを指定することを推奨します。 この場合、組み込み関数は
{{ arg | fn }}
形式になります。 たとえば、{{ abs(-1) }}
は{{ -1 | abs }}
に相当します。組み込み関数で複数のパラメーターを指定し、最初のパラメーターを除くすべてのパラメーターをデフォルト値に設定できる場合は、組み込み関数でフィルターを指定できます。 組み込み関数に複数のパラメーターを指定して、それぞれのパラメーターに値を指定する場合は、組み込み関数にフィルターを指定しないことを推奨します。
演算子
次の表に、新しいアラートテンプレートでサポートされる演算子を示します。 演算子の優先順位の詳細については、「演算子の優先順位」をご参照ください。
カテゴリ | 演算子 | 説明 |
算術演算 | + | 追加操作を実行します。 |
- | 減算操作を実行します。 | |
* | 乗算演算を実行します。 | |
/ | 除算操作を実行します。 戻り値は浮動小数点数です。 | |
// | 除算操作を実行します。 戻り値は整数です。 | |
% | モジュロ演算を実行します。 | |
比較操作 | == | 値が別の値と等しいかどうかを評価します。 |
!= | 値が別の値と等しくないかどうかを評価します。 | |
> | 値が別の値より大きいかどうかを評価します。 | |
>= | 値が別の値以上かどうかを評価します。 | |
< | 値が別の値より小さいかどうかを評価します。 | |
<= | 値が別の値以下であるかどうかを評価します。 | |
論理操作 | and | AND関係を指定します。 |
or | OR関係を指定します。 | |
not | NOT In関係を指定します。 | |
その他の操作 | in | 値が別の値に含まれているかどうかを評価し、ブール値を返します。 指定する値には、配列、オブジェクト、または文字列を指定できます。
|
() | 操作の組み合わせを指定します。 例: {{ a > b and (a > c or b > c) }} 。 |
アラート変数
新しいアラートテンプレートでは、アラート変数はalert.xxx
形式です。 たとえば、alert.project
変数は有効なアラート変数です。 詳細については、「新しいアラートテンプレートの変数」をご参照ください。
設定例
例1: アラートのステータスに基づいて、各アラートに関する情報を表示します。
アラートがトリガーされた後、アラートのステータス、重大度レベル、結果などの情報が提供されます。 アラートがクリアされると、アラートのステータスのみが提供されます。
次のアラートテンプレート設定には、機能は含まれません。
{% if alert.status == "firing" %} - Status: <font color="#E03C39">Firing</font> - Severity level: {{ alert.severity | format_severity }} - Results: {{ alert.results | to_json }} {% else %} - Status: <font color="#72C140">Cleared</font> {% endif %}
次のアラートテンプレート設定には機能が含まれます。
format_status関数とformat_severity関数は、アラートテンプレートの設定を簡素化するために使用されます。
- Status: {{ alert.status | format_status }} {% if alert.status == "firing" %} - Severity level: {{ alert.severity | format_severity }} - Results: {{ alert.results | to_json }} {% endif %}
例2: 各アラートに関する情報を構造化された形式で表示します。
各アラートのラベルは、Markdown形式の配列に変換されます。
次のアラートテンプレート設定には、機能は含まれません。
- Project: {{ alert.project }} - Alert name: {{ alert.alert_name }} - Label: {%- for key, val in alert.labels.items() %} > - {{ key }}: {{ val }} {%- endfor %}
次のアラートテンプレート設定には機能が含まれます。
to_list関数とblockquote関数は、アラートテンプレートの設定を簡素化するために使用されます。
- Project: {{ alert.project }} - Alert name: {{ alert.alert_name }} - Label: {{ alert.labels | to_list | blockquote }}