Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Utilisation du langage de modélisation de Go
Cette rubrique de documentation est conçue pour les espaces de travail Grafana compatibles avec la version 9.x de Grafana.
Pour les espaces de travail Grafana compatibles avec la version 10.x de Grafana, voir. Travailler dans la version 10 de Grafana
Pour les espaces de travail Grafana compatibles avec la version 8.x de Grafana, voir. Travailler dans la version 8 de Grafana
Vous rédigez des modèles de notification dans le langage de modélisation de Go, texte/modèle
Cette section fournit un aperçu du langage de création de modèles de Go et des modèles d'écriture sous forme de texte/modèle.
Point
Dans le texte/modèle, il existe un curseur spécial appelé point, écrit sous la forme. .
Vous pouvez considérer ce curseur comme une variable dont la valeur change en fonction de l'endroit où il est utilisé dans le modèle. Par exemple, au début d'un modèle de notification, il .
fait référence à l'ExtendedData
objet, qui contient un certain nombre de champsAlerts
, notammentStatus
,GroupLabels
,CommonLabels
, CommonAnnotations
etExternalURL
. Cependant, le point peut faire référence à autre chose lorsqu'il est utilisé dans range
une liste, lorsqu'il est utilisé dans un with
ou lors de la rédaction de modèles de fonctionnalités à utiliser dans d'autres modèles. Vous pouvez en voir des exemples dansCréation de modèles de notification, ainsi que toutes les données et fonctions duRéférence de modèles.
Étiquettes d'ouverture et de fermeture
Dans le texte/le modèle, les modèles commencent par {{
et se terminent par}}
, qu'ils impriment une variable ou exécutent des structures de contrôle telles que des instructions if. Ceci est différent des autres langages de modélisation tels que Jinja où l'impression d'une variable utilise {{
et et où les structures de contrôle utilisent }}
{%
et. %}
Pour imprimer la valeur d'un élément, utilisez {{
et}}
. Vous pouvez imprimer la valeur d'un point, un champ de points, le résultat d'une fonction et la valeur d'une variable. Par exemple, pour imprimer le Alerts
champ où le point fait référence, ExtendedData
vous devez écrire ce qui suit :
{{ .Alerts }}
Répéter les alertes
Pour imprimer uniquement les étiquettes de chaque alerte, plutôt que toutes les informations relatives à l'alerte, vous pouvez utiliser a range
pour itérer les alertes dans ExtendedData
:
{{ range .Alerts }} {{ .Labels }} {{ end }}
À l'intérieur de la plage, le point ne fait plus référence àExtendedData
, mais à unAlert
. Vous pouvez l'utiliser {{ .Labels }}
pour imprimer les étiquettes de chaque alerte. Cela fonctionne car le point {{ range .Alerts }}
change pour faire référence à l'alerte en cours dans la liste des alertes. Lorsque la plage est terminée, le point est remis à la valeur qu'il avait avant le début de la plage, qui dans cet exemple est ExtendedData
:
{{ range .Alerts }} {{ .Labels }} {{ end }} {{/* does not work, .Labels does not exist here */}} {{ .Labels }} {{/* works, cursor was reset */}} {{ .Status }}
Répéter sur les annotations et les étiquettes
Rédigons un modèle pour imprimer les étiquettes de chaque alerte au formatThe name of the label is $name, and the
value is $value
, où $name
et $value
contenant le nom et la valeur de chaque étiquette.
Comme dans l'exemple précédent, utilisez une plage pour parcourir les alertes de .Alerts
manière à ce que le point fasse référence à l'alerte en cours dans la liste des alertes, puis utilisez une deuxième plage sur les étiquettes triées afin que le point soit mis à jour une deuxième fois pour faire référence à l'étiquette actuelle. Dans la deuxième plage, utilisez .Name
et .Value
pour imprimer le nom et la valeur de chaque étiquette :
{{ range .Alerts }} {{ range .Labels.SortedPairs }} The name of the label is {{ .Name }}, and the value is {{ .Value }} {{ end }} {{ range .Annotations.SortedPairs }} The name of the annotation is {{ .Name }}, and the value is {{ .Value }} {{ end }} {{ end }}
Si des déclarations
Vous pouvez utiliser des instructions if dans les modèles. Par exemple, pour imprimer There are no alerts
s'il n'y a aucune alerte, .Alerts
vous devez écrire ce qui suit :
{{ if .Alerts }} There are alerts {{ else }} There are no alerts {{ end }}
Avec
with est similaire aux instructions if, mais contrairement aux instructions if, with
met à jour le point pour faire référence à la valeur du with :
{{ with .Alerts }} There are {{ len . }} alert(s) {{ else }} There are no alerts {{ end }}
Variables
Les variables du texte/du modèle doivent être créées dans le modèle. Par exemple, pour créer une variable appelée $variable
avec la valeur actuelle de point, vous devez écrire ce qui suit :
{{ $variable := . }}
Vous pouvez $variable
l'utiliser à l'intérieur d'une plage ou with
cela fera référence à la valeur du point au moment où la variable a été définie, et non à la valeur actuelle du point.
Par exemple, vous ne pouvez pas écrire un modèle {{ .Labels }}
à utiliser dans la deuxième plage car ici, le point fait référence à l'étiquette actuelle, et non à l'alerte en cours :
{{ range .Alerts }} {{ range .Labels.SortedPairs }} {{ .Name }} = {{ .Value }} {{/* does not work because in the second range . is a label not an alert */}} There are {{ len .Labels }} {{ end }} {{ end }}
Vous pouvez résoudre ce problème en définissant une variable appelée $alert
dans la première plage et avant la deuxième plage :
{{ range .Alerts }} {{ $alert := . }} {{ range .Labels.SortedPairs }} {{ .Name }} = {{ .Value }} {{/* works because $alert refers to the value of dot inside the first range */}} There are {{ len $alert.Labels }} {{ end }} {{ end }}
Gamme avec index
Vous pouvez obtenir l'indice de chaque alerte au sein d'une plage en définissant des variables d'indice et de valeur au début de la plage :
{{ $num_alerts := len .Alerts }} {{ range $index, $alert := .Alerts }} This is alert {{ $index }} out of {{ $num_alerts }} {{ end }}
Définir des modèles
Vous pouvez définir des modèles qui peuvent être utilisés dans d'autres modèles define
en utilisant le nom du modèle entre guillemets. Vous ne devez pas définir de modèles portant le même nom que les autres modèles, y compris les modèles par défaut tels que __subject
__text_values_list
,__text_alert_list
, default.title
etdefault.message
. Lorsqu'un modèle a été créé avec le même nom qu'un modèle par défaut, ou un modèle dans un autre modèle de notification, Grafana peut utiliser l'un ou l'autre modèle. Grafana n'empêche pas ou n'affiche pas de message d'erreur lorsqu'il existe deux modèles ou plus portant le même nom.
{{ define "print_labels" }} {{ end }}
Intégrer des modèles
Vous pouvez intégrer un modèle défini dans votre modèle en utilisant template
le nom du modèle entre guillemets et le curseur qui doit être passé au modèle :
{{ template "print_labels" . }}
Transmettre les données aux modèles
Dans un modèle, le point fait référence à la valeur transmise au modèle.
Par exemple, si une liste d'alertes de déclenchement est transmise à un modèle, le point fait référence à cette liste d'alertes de déclenchement :
{{ template "print_alerts" .Alerts }}
Si le modèle reçoit les étiquettes triées d'une alerte, le point fait référence à la liste des étiquettes triées :
{{ template "print_labels" .SortedLabels }}
Cela est utile lors de la rédaction de modèles réutilisables. Par exemple, pour imprimer toutes les alertes, vous pouvez écrire ce qui suit :
{{ template "print_alerts" .Alerts }}
Ensuite, pour imprimer uniquement les alertes de déclenchement, vous pouvez écrire ceci :
{{ template "print_alerts" .Alerts.Firing }}
Cela fonctionne car .Alerts
les deux .Alerts.Firing
sont des listes d'alertes.
{{ define "print_alerts" }} {{ range . }} {{ template "print_labels" .SortedLabels }} {{ end }} {{ end }}
Commentaires
Vous pouvez ajouter des commentaires avec {{/*
et */}}
:
{{/* This is a comment */}}
Pour empêcher les commentaires d'ajouter des sauts de ligne, utilisez :
{{- /* This is a comment with no leading or trailing line breaks */ -}}
Indentation
Vous pouvez utiliser l'indentation, à la fois des tabulations et des espaces, ainsi que des sauts de ligne, pour rendre les modèles plus lisibles :
{{ range .Alerts }} {{ range .Labels.SortedPairs }} {{ .Name }} = {{ .Value }} {{ end }} {{ end }}
Cependant, l'indentation du modèle sera également présente dans le texte. Ensuite, nous verrons comment le supprimer.
Supprimer les espaces et les sauts de ligne
Dans le texte/le modèle, utilisez {{-
et -}}
pour supprimer les espaces de début et de fin et les sauts de ligne.
Par exemple, lorsque vous utilisez l'indentation et les sauts de ligne pour rendre un modèle plus lisible :
{{ range .Alerts }} {{ range .Labels.SortedPairs }} {{ .Name }} = {{ .Value }} {{ end }} {{ end }}
L'indentation et les sauts de ligne seront également présents dans le texte :
alertname = "Test" grafana_folder = "Test alerts"
Vous pouvez supprimer l'indentation et les sauts de ligne du texte en le }}
remplaçant par le -}}
début de chaque plage :
{{ range .Alerts -}} {{ range .Labels.SortedPairs -}} {{ .Name }} = {{ .Value }} {{ end }} {{ end }}
L'indentation et les sauts de ligne du modèle sont désormais absents du texte :
alertname = "Test" grafana_folder = "Test alerts"