Simple Log Service prend en charge deux versions de la syntaxe des modèles d'alerte : nouvelle et originale. La nouvelle syntaxe s'inspire de Python pour offrir un rendu personnalisé plus flexible et avancé des notifications d'alerte.
Présentation
Par rapport aux modèles d'alerte originaux, les nouveaux modèles utilisent une syntaxe semblable à Python pour une logique de rendu personnalisé plus flexible, ainsi qu'un contenu et un style de notification optimisés (par exemple, l'échappement des caractères Markdown). Les principaux avantages sont les suivants :
Rendu dynamique basé sur les niveaux de gravité des alertes, avec des polices de couleur différente pour distinguer les niveaux.
Rendu itératif des résultats de requête d'alerte sous forme de liste ou de tableau dans un e-mail.
Fonctions intégrées pour l'encodage/décodage Base64 et les opérations arithmétiques sur les valeurs numériques.
La nouvelle syntaxe est entièrement compatible avec la syntaxe originale, mais utilise des types, des valeurs et des styles différents pour les attributs d'alerte. Nous vous recommandons d'utiliser uniquement la nouvelle syntaxe et d'éviter de mélanger les deux.
Démarrage rapide
Les exemples suivants illustrent le contenu des notifications défini dans les nouveaux modèles d'alerte.
-
Contenu de l'alerte :
{ "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" } ] } -
Configuration du modèle d'alerte :
- 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 }} -
Résultat de sortie :
- 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
Syntaxe de base
Types de données
Le tableau suivant décrit les types de données pris en charge par la syntaxe semblable à Python.
|
Type de données |
Description |
|
Nombre |
Les nombres pris en charge incluent les entiers et les nombres à virgule flottante. Exemples : 3 et -1. |
|
Chaîne |
Une chaîne doit être entourée de guillemets simples ('') ou doubles (""). Exemples : "foo" et 'bar'. Si une chaîne contient des caractères spéciaux, utilisez une barre oblique inverse (\) pour les échapper. Par exemple, |
|
Booléen |
Les valeurs booléennes prises en charge sont True et False. |
|
Null |
None. |
|
Liste |
Une liste peut être appelée tableau ou slice dans d'autres langages de programmation. Exemple : ['foo', 'bar']. |
|
Dictionnaire |
Un dictionnaire peut être appelé objet dans d'autres langages de programmation. Exemple : {'foo': 'bar'}. |
<!--@foreign {"id":"foreign_cdt_cpv_5x8","_raw_html":"
Délimiteurs
"}/-->|
Délimiteur |
Cas d'utilisation |
Exemple |
|
|
Marque le début et la fin d'une variable ou d'une expression. |
|
|
|
Marque le début et la fin d'une instruction. |
|
|
|
Marque le début et la fin d'un commentaire. Les commentaires ne sont pas inclus dans les notifications d'alerte. |
|
<!--@foreign {"id":"foreign_nqe_17t_e1n","_raw_html":"
Suppression des chaînes vides
"}/-->Par défaut, Simple Log Service ignore les espaces entre un délimiteur et l'expression qu'il contient. Par exemple, {{ 23 }} < {{ 45 }} et {{23}} < {{45}} produisent tous deux le rendu 23 < 45. Cependant, les caractères d'espacement (espaces, tabulations et sauts de ligne) situés en dehors des délimiteurs sont conservés. Par exemple, {{ 23 }} < {{ 45 }} produit le rendu 23 < 45, et non 23<45.
Pour supprimer les espaces indésirables à gauche ou à droite d'un délimiteur, ajoutez un trait d'union (-) à côté du délimiteur. Par exemple, {{ 23 -}} < {{- 45 }} produit le rendu 23<45.
{{-,{{%-et{#-suppriment tous les espaces à gauche du délimiteur.-}},-%}et-%}suppriment tous les espaces à droite du délimiteur.
Aucun espace n'est autorisé entre le trait d'union (-) et le délimiteur. Par exemple, le trait d'union dans
{{- 3 }}est valide et affiche le nombre sous la forme3. En revanche, le trait d'union dans{{ - 3 }}est traité comme un signe moins et affiche le nombre sous la forme-3.Le trait d'union affecte uniquement les espaces situés en dehors des délimiteurs, pas le contenu à l'intérieur. Par exemple,
{{ "hello " }} {{- "world"}}produit le renduhello world.
<!--@foreign {"id":"foreign_1fz_bot_2lz","_raw_html":"
Instructions conditionnelles
"}/-->Les instructions conditionnelles évaluent les valeurs des paramètres et les expressions logiques pour contrôler le rendu.
Si la clause
ifest suivie d'une constante ou d'une variable, elle est évaluée comme vraie ou fausse. Les valeurs booléennesfalse, le nombre0, la chaîne vide"",null, le tableau vide[]et l'objet vide{}sont évalués comme faux. Toutes les autres valeurs sont évaluées comme vraies.Si la clause
ifest suivie d'une expression logique, le résultat de l'expression est évalué comme vrai ou faux. Par exemple,{{ if alert.severity >= 8 }}vérifie si la gravité de l'alerte est supérieure ou égale à 8.
Le tableau suivant décrit les flux conditionnels pris en charge.
|
Flux de contrôle |
Exemple |
|
if |
|
|
if-else |
|
|
if-elif |
|
|
if-elif-else |
|
|
Instruction imbriquée |
|
<!--@foreign {"id":"foreign_02z_8au_hd2","_raw_html":"
Itérations
"}/-->Les instructions de boucle itèrent sur les tableaux et les objets. Le tableau suivant décrit les instructions de boucle prises en charge.
|
Instruction de boucle |
Exemple |
|
Instructions de boucle sur les tableaux |
|
|
Instructions de boucle avec indices sur les tableaux |
La fonction enumerate itère sur les indices des tableaux. Pour plus d'informations sur la fonction enumerate, consultez Fonctions intégrées dans les modèles d'alerte.
Par défaut, les indices commencent à 0. Utilisez le paramètre start dans la fonction enumerate pour spécifier un indice de départ personnalisé. Exemple :
|
|
Instructions de boucle sur les objets |
La fonction items() convertit un objet en un tableau de paires clé-valeur au format
|
|
Instructions imbriquées |
|
<!--@foreign {"id":"foreign_2it_e5u_xx1","_raw_html":"
Caractères d'échappement
"}/-->Pour empêcher Simple Log Service d'analyser les chaînes de caractères spéciaux telles que {{, vous pouvez les échapper. L'exemple suivant conserve tel quel tout le contenu situé entre {% raw %} et {% endraw %} :
-
Configuration du modèle d'alerte
{% raw %} {% for result in alert.results %} {{ result }} {% endfor %} {% endraw %} -
Résultat
{% for result in alert.results %} {{ result }} {% endfor %}
<!--@foreign {"id":"foreign_szp_lpp_88l","_raw_html":"
Fonctions
"}/-->Les modèles d'alerte fournissent des fonctions intégrées pour configurer de manière flexible les formats et les styles des notifications. Pour plus d'informations, consultez Fonctions intégrées des modèles.
Par exemple, pour envoyer des notifications d'alerte au format JSON à l'aide d'une URL de webhook, utilisez la configuration de modèle suivante :
-
Instruction de requête incluant un saut de ligne
* | select count(*) as cnt -
Comparaison entre différentes configurations de modèles d'alerte
Élément
Modèle d'alerte
Résultat
Remarques
Aucune fonction utilisée
{ "query": "{{ alert.results[0].query }}" }{ "query": "* | select count(*) as pv" }Le format JSON n'est pas valide.
Utilisation de la fonction quote
{ "query": {{ quote(alert.results[0].query) }} }{ "query": "* | \nselect count(*) as pv" }Le format JSON est valide.
<!--@foreign {"id":"foreign_2ie_dux_hfx","_raw_html":"
Filtres
"}/-->Lorsque des fonctions imbriquées telles que {{ block(to_list(alert.labels)) }} deviennent difficiles à lire, vous pouvez utiliser des filtres à la place. Les filtres utilisent des barres verticales (|) comme opérateurs et prennent en charge le chaînage de méthodes. Spécifiez les filtres au format {{ xxx | filiter1 | filter2 | ... }}. Par exemple, {{ blockquote(to_list(alert.labels)) }} équivaut à {{ alert.labels | to_list | blockquote }}.
Avant d'utiliser des filtres avec une fonction intégrée, vérifiez que la fonction prend en charge les filtres. La plupart des fonctions intégrées dans les nouveaux modèles d'alerte prennent en charge les filtres. Pour plus d'informations, consultez Fonctions intégrées des modèles.
Si une fonction intégrée ne possède aucun paramètre, les filtres ne peuvent pas être utilisés.
Si une fonction intégrée possède un seul paramètre, nous vous recommandons d'utiliser la syntaxe de filtre. Le format est
{{ arg | fn }}. Par exemple,{{ abs(-1) }}équivaut à{{ -1 | abs }}.Si une fonction intégrée possède plusieurs paramètres et que tous sauf le premier ont des valeurs par défaut, les filtres peuvent être utilisés. Si vous devez spécifier des valeurs pour tous les paramètres, nous vous recommandons d'appeler la fonction directement plutôt que d'utiliser des filtres.
<!--@foreign {"id":"foreign_tod_nwm_4k0","_raw_html":"
Opérateurs
"}/-->Le tableau suivant décrit les opérateurs pris en charge. Pour plus d'informations sur les priorités des opérateurs, consultez Priorité des opérateurs.
|
Catégorie |
Opérateur |
Description |
|
Opérations arithmétiques |
+ |
Effectue une addition. |
|
- |
Effectue une soustraction. |
|
|
* |
Effectue une multiplication. |
|
|
/ |
Division. Renvoie un nombre à virgule flottante. |
|
|
// |
Division. Renvoie un entier. |
|
|
% |
Effectue un modulo. |
|
|
Opérations de comparaison |
== |
Vérifie si une valeur est égale à une autre. |
|
!= |
Vérifie si une valeur est différente d'une autre. |
|
|
> |
Vérifie si une valeur est supérieure à une autre. |
|
|
>= |
Vérifie si une valeur est supérieure ou égale à une autre. |
|
|
< |
Vérifie si une valeur est inférieure à une autre. |
|
|
<= |
Vérifie si une valeur est inférieure ou égale à une autre. |
|
|
Opérations logiques |
and |
Spécifie une relation ET. |
|
or |
Spécifie une relation OU. |
|
|
not |
Spécifie une relation NON. |
|
|
Autres opérations |
in |
Vérifie si une valeur est incluse dans une autre et renvoie une valeur booléenne. Prend en charge les tableaux, les objets et les chaînes.
|
|
() |
Spécifie une combinaison d'opérations. Exemple : {{ a > b and (a > c or b > c) }}. |
Variables d'alerte
Dans les nouveaux modèles d'alerte, les variables d'alerte utilisent le format alert.xxx. Par exemple, alert.project est une variable d'alerte valide. Pour plus d'informations, consultez Variables dans les modèles d'alerte.
Exemples de configuration
-
Exemple 1 : Affichez les informations d'alerte en fonction de l'état de l'alerte.
Lorsqu'une alerte est déclenchée, l'état, le niveau de gravité et le résultat sont fournis. Lorsqu'une alerte est résolue, seul l'état est fourni.
-
La configuration de modèle suivante n'inclut pas de fonctions :
{% 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 %} -
La configuration de modèle suivante inclut des fonctions :
Les fonctions format_status et format_severity simplifient la configuration du modèle :
- Status: {{ alert.status | format_status }} {% if alert.status == "firing" %} - Severity level: {{ alert.severity | format_severity }} - Results: {{ alert.results | to_json }} {% endif %}
-
-
Exemple 2 : Affichez les informations d'alerte dans un format structuré.
Les libellés d'alerte sont convertis en un tableau au format Markdown.
-
La configuration de modèle suivante n'inclut pas de fonctions :
- Project: {{ alert.project }} - Alert name: {{ alert.alert_name }} - Label: {%- for key, val in alert.labels.items() %} > - {{ key }}: {{ val }} {%- endfor %} -
La configuration de modèle suivante inclut des fonctions :
Les fonctions to_list et blockquote simplifient la configuration du modèle.
- Project: {{ alert.project }} - Alert name: {{ alert.alert_name }} - Label: {{ alert.labels | to_list | blockquote }}
-