Usar a linguagem de modelos do Go - Amazon Managed Grafana

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usar a linguagem de modelos do Go

Este tópico de documentação foi desenvolvido para espaços de trabalho do Grafana compatíveis com o Grafana versão 9.x.

Para espaços de trabalho do Grafana compatíveis com o Grafana versão 10.x, consulte Trabalhar no Grafana versão 10.

Para espaços de trabalho do Grafana compatíveis com o Grafana versão 8.x, consulte Trabalhar no Grafana versão 8.

Você escreve modelos de notificação na linguagem de modelos do Go, texto/modelo.

Esta seção fornece uma visão geral da linguagem de modelos e dos modelos de escrita do Go em texto/modelo.

Ponto

Em texto/modelo, há um cursor especial chamado ponto, e é escrito como. . Você pode pensar nesse cursor como uma variável cujo valor muda dependendo de onde ele é usado no modelo. Por exemplo, no início de um modelo de notificação, . refere-se ao objeto ExtendedData, que contém vários campos, incluindo Alerts, Status, GroupLabels, CommonLabels, CommonAnnotations e ExternalURL. No entanto, ponto pode se referir a outra coisa quando usado em um range em uma lista, quando usado dentro de um with ou ao escrever modelos de recursos para serem usados em outros modelos. Você pode ver exemplos disso em Criar modelos de notificações, e todos os dados e funções na Referência do modelo.

Tags de abertura e fechamento

Em texto/modelo, os modelos começam com {{ e terminam com }}, independentemente de o modelo imprimir uma variável ou executar estruturas de controle, como instruções if. Isso é diferente de outras linguagens de modelos, como Jinja, em que a impressão de uma variável usa {{ e }} e as estruturas de controle usam {% e %}.

Print (Imprimir)

Para imprimir o valor de algo, use {{ e }}. Você pode imprimir o valor do ponto, um campo do ponto, o resultado de uma função e o valor de uma variável. Por exemplo, para imprimir o campo Alerts em que o ponto se refere a ExtendedData, você escreve o seguinte:

{{ .Alerts }}

Iterar em alertas

Para imprimir apenas os rótulos de cada alerta, em vez de todas as informações sobre o alerta, você pode usar um range para iterar os alertas emExtendedData:

{{ range .Alerts }} {{ .Labels }} {{ end }}

Dentro do intervalo, o ponto não mais se refere a ExtendedData, mas a um Alert. Você pode usar {{ .Labels }} para imprimir os rótulos de cada alerta. Isso funciona porque {{ range .Alerts }} altera o ponto para se referir ao alerta atual na lista de alertas. Quando o intervalo termina, o ponto é redefinido para o valor que tinha antes do início do intervalo, que neste exemplo é ExtendedData:

{{ range .Alerts }} {{ .Labels }} {{ end }} {{/* does not work, .Labels does not exist here */}} {{ .Labels }} {{/* works, cursor was reset */}} {{ .Status }}

Iterar em anotações e rótulos

Vamos escrever um modelo para imprimir os rótulos de cada alerta no formato The name of the label is $name, and the value is $value, em que $name e $value contêm o nome e o valor de cada rótulo.

Como no exemplo anterior, use um intervalo para iterar nos alertas em .Alerts de forma que o ponto se refira ao alerta atual na lista de alertas e, em seguida, use um segundo intervalo nos rótulos classificados para que o ponto seja atualizado uma segunda vez para se referir ao rótulo atual. Dentro do segundo intervalo, use .Name e .Value para imprimir o nome e o valor de cada rótulo:

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

Instruções If

Você pode usar instruções if em modelos. Por exemplo, para imprimir There are no alerts se não houver alertas em .Alerts, você escreve o seguinte:

{{ if .Alerts }} There are alerts {{ else }} There are no alerts {{ end }}

With

With é semelhante às instruções if, porém, diferentemente das instruções if, o with atualiza o ponto para se referir ao valor do with:

{{ with .Alerts }} There are {{ len . }} alert(s) {{ else }} There are no alerts {{ end }}

Variáveis

As variáveis no texto/modelo devem ser criadas dentro do modelo. Por exemplo, para criar uma variável chamada $variable com o valor atual de ponto, você escreve o seguinte:

{{ $variable := . }}

Você pode usar $variable dentro de um intervalo ou with e vai se referir ao valor do ponto no momento em que a variável foi definida, não ao valor atual do ponto.

Por exemplo, você não pode escrever um modelo que use {{ .Labels }} no segundo intervalo porque aqui o ponto se refere ao rótulo atual, não ao alerta atual:

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

Você pode corrigir isso definindo uma variável chamada $alert no primeiro intervalo e antes do segundo intervalo:

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

Intervalo com índice

Você pode obter o índice de cada alerta em um intervalo definindo variáveis de índice e valor no início do intervalo:

{{ $num_alerts := len .Alerts }} {{ range $index, $alert := .Alerts }} This is alert {{ $index }} out of {{ $num_alerts }} {{ end }}

Definir modelos

Você pode definir modelos que podem ser usados em outros modelos, usando define e o nome do modelo entre aspas duplas. Você não deve definir modelos com o mesmo nome de outros modelos, incluindo modelos padrão, como __subject, __text_values_list, __text_alert_list, default.title e default.message. Quando um modelo foi criado com o mesmo nome de um modelo padrão, ou um modelo em outro modelo de notificação, o Grafana pode usar qualquer um dos modelos. O Grafana não impossibilita nem mostra uma mensagem de erro quando há dois ou mais modelos com o mesmo nome.

{{ define "print_labels" }} {{ end }}

Incorporar modelos

Você pode incorporar um modelo definido em seu modelo usando template, o nome do modelo entre aspas duplas e o cursor que deve ser passado para o modelo:

{{ template "print_labels" . }}

Passar dados para modelos

Em um modelo, o ponto refere-se ao valor que é passado para o modelo.

Por exemplo, se um modelo receber uma lista de alertas disparados, o ponto então vai se referir a essa lista de alertas disparados:

{{ template "print_alerts" .Alerts }}

Se o modelo receber os rótulos classificados para um alerta, o ponto então vai se referir à lista de rótulos classificados:

{{ template "print_labels" .SortedLabels }}

Isso é útil ao escrever modelos reutilizáveis. Por exemplo, para imprimir todos os alertas, você pode escrever o seguinte:

{{ template "print_alerts" .Alerts }}

Depois, para imprimir apenas os alertas disparados, você pode escrever o seguinte:

{{ template "print_alerts" .Alerts.Firing }}

Isso funciona porque tanto .Alerts como .Alerts.Firing são listas de alertas.

{{ define "print_alerts" }} {{ range . }} {{ template "print_labels" .SortedLabels }} {{ end }} {{ end }}

Comentários

Você pode adicionar comentários com {{/* e */}}:

{{/* This is a comment */}}

Para evitar que comentários adicionem quebras de linha, use:

{{- /* This is a comment with no leading or trailing line breaks */ -}}

Recuo

Você pode usar recuo, tabs e espaços e quebras de linha para tornar os modelos mais legíveis:

{{ range .Alerts }} {{ range .Labels.SortedPairs }} {{ .Name }} = {{ .Value }} {{ end }} {{ end }}

No entanto, o recuo no modelo também estará presente no texto. A seguir, veremos como removê-lo.

Remover espaços e quebras de linha

Em texto/modelo, use {{- e -}} para remover espaços à esquerda e à direita e quebras de linha.

Por exemplo, ao usar recuo e quebras de linha para tornar um modelo mais legível:

{{ range .Alerts }} {{ range .Labels.SortedPairs }} {{ .Name }} = {{ .Value }} {{ end }} {{ end }}

O recuo e as quebras de linha também estarão presentes no texto:

alertname = "Test" grafana_folder = "Test alerts"

Você pode remover o recuo e as quebras de linha do texto, alterando }} para -}} no início de cada intervalo:

{{ range .Alerts -}} {{ range .Labels.SortedPairs -}} {{ .Name }} = {{ .Value }} {{ end }} {{ end }}

O recuo e as quebras de linha no modelo agora estão ausentes do texto:

alertname = "Test" grafana_folder = "Test alerts"