Utilisation du langage de création de modèles de Go - Amazon Managed Grafana

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 création de modèles de Go

Cette rubrique de documentation est conçue pour les espaces de travail Grafana qui prennent en charge la version 10.x de Grafana.

Pour les espaces de travail Grafana compatibles avec la version 9.x de Grafana, voir. Travailler dans la version 9 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/le 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'ExtendedDataobjet, 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. %}

Print

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 }}

Les fonctions d'index

Pour imprimer une annotation ou une étiquette spécifique, utilisez la index fonction.

{{ range .Alerts }} The name of the alert is {{ index .Labels "alertname" }} {{ 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 }}

Exécuter des modèles

Vous pouvez exécuter 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 libellés triés d'une alerte, le point fait référence à la liste des libellés triés :

{{ 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"