O Simple Log Service oferece suporte a duas versões de sintaxe de modelo de alerta: nova e original. A nova sintaxe utiliza uma abordagem semelhante à do Python para permitir renderização personalizada mais flexível e avançada das notificações de alerta.
Visão geral
Em comparação com os modelos originais, os novos modelos de alerta utilizam sintaxe semelhante à do Python para oferecer lógica de renderização personalizada mais flexível, além de conteúdo e estilos de notificação otimizados, como escape de caracteres Markdown. As principais vantagens incluem:
Renderização dinâmica baseada nos níveis de severidade do alerta, com uso de fontes coloridas para distinguir cada nível.
Renderização iterativa dos resultados da consulta de alerta em lista ou tabela no e-mail.
Funções integradas para codificação e decodificação Base64 e operações aritméticas em valores numéricos.
A nova sintaxe é totalmente compatível com a original, mas usa tipos, valores e estilos diferentes para os atributos de alerta. Recomendamos usar apenas a nova sintaxe e evitar misturar as duas.
Início rápido
Os exemplos a seguir mostram o conteúdo da notificação definido nos novos modelos de alerta.
-
Conteúdo do alerta:
{ "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" } ] } -
Configuração do modelo de alerta:
- 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 }} -
Resultado da saída:
- 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
Sintaxe básica
Data types
A tabela a seguir descreve os tipos de dados compatíveis com a sintaxe semelhante à do Python.
|
Tipo de dado |
Descrição |
|
Number |
Os números compatíveis incluem inteiros e pontos flutuantes. Exemplos: 3 e -1. |
|
String |
Coloque a string entre aspas simples ('') ou duplas (""). Exemplos: "foo" e 'bar'. Se a string contiver caracteres especiais, use barra invertida (\) para escapá-los. Por exemplo, |
|
Boolean |
Os valores booleanos compatíveis são True e False. |
|
Null |
None. |
|
List |
Uma lista pode ser chamada de array ou slice em outras linguagens de programação. Exemplo: ['foo', 'bar']. |
|
Dictionary |
Um dicionário pode ser chamado de objeto em outras linguagens de programação. Exemplo: {'foo': 'bar'}. |
Delimiters
|
Delimitador |
Cenário de uso |
Exemplo |
|
|
Marca o início e o fim de uma variável ou expressão. |
|
|
|
Marca o início e o fim de uma instrução. |
|
|
|
Marca o início e o fim de um comentário. Comentários não aparecem nas notificações de alerta. |
|
Removal of empty strings
Por padrão, o Simple Log Service ignora espaços entre um delimitador e a expressão interna. Por exemplo, tanto {{ 23 }} < {{ 45 }} quanto {{23}} < {{45}} são renderizados como 23 < 45. No entanto, caracteres de espaço em branco (espaços, tabulações e quebras de linha) fora dos delimitadores são preservados. Por exemplo, {{ 23 }} < {{ 45 }} é renderizado como 23 < 45, e não como 23<45.
Para remover espaços em branco indesejados à esquerda ou à direita de um delimitador, adicione um hífen (-) ao lado dele. Por exemplo, {{ 23 -}} < {{- 45 }} é renderizado como 23<45.
{{-,{{%-e{#-removem todos os espaços em branco à esquerda do delimitador.-}},-%}e-%}removem todos os espaços em branco à direita do delimitador.
Não insira espaços entre o hífen (-) e o delimitador. Por exemplo, o hífen em
{{- 3 }}é válido e renderiza o número como3. Porém, o hífen em{{ - 3 }}é tratado como sinal de menos e renderiza o número como-3.O hífen afeta apenas os espaços em branco fora dos delimitadores, não o conteúdo interno. Por exemplo,
{{ "hello " }} {{- "world"}}é renderizado comohello world.
Conditional statements
Instruções condicionais avaliam valores de parâmetros e expressões lógicas para controlar a renderização.
Se a cláusula
iffor seguida por uma constante ou variável, ela será avaliada como verdadeira ou falsa. O valor booleanofalse, o número0, a string vazia"",null, o array vazio[]e o objeto vazio{}são avaliados como falso. Todos os outros valores são avaliados como verdadeiro.Caso a cláusula
ifseja seguida por uma expressão lógica, o resultado da expressão é avaliado como verdadeiro ou falso. Por exemplo,{{ if alert.severity >= 8 }}verifique se a severidade do alerta é 8 ou superior.
A tabela a seguir descreve os fluxos condicionais compatíveis.
|
Fluxo de controle |
Exemplo |
|
if |
|
|
if-else |
|
|
if-elif |
|
|
if-elif-else |
|
|
Instrução aninhada |
|
Iterations
Instruções de loop iteram sobre arrays e objetos. A tabela a seguir descreve as instruções de loop compatíveis.
|
Instrução de loop |
Exemplo |
|
Instruções de loop em arrays |
|
|
Instruções de loop com subscritos em arrays |
A função enumerate itera sobre subscritos de array. Para obter mais informações sobre a função enumerate, consulte Funções integradas em modelos de alerta.
Os subscritos começam em 0 por padrão. Use o parâmetro start na função enumerate para especificar um subscrito inicial personalizado. Exemplo:
|
|
Instruções de loop em objetos |
A função items() converte um objeto em um array de pares chave-valor no formato
|
|
Instruções aninhadas |
|
Escape characters
Para evitar que o Simple Log Service analise strings de caracteres especiais como {{, escape-as. O exemplo a seguir mantém todo o conteúdo entre {% raw %} e {% endraw %} exatamente como está:
-
Configuração do modelo de alerta
{% raw %} {% for result in alert.results %} {{ result }} {% endfor %} {% endraw %} -
Resultado
{% for result in alert.results %} {{ result }} {% endfor %}
Functions
Os modelos de alerta fornecem funções integradas para configurar formatos e estilos de notificação de forma flexível. Para obter mais informações, consulte Funções de modelo integradas.
Por exemplo, para enviar notificações de alerta em formato JSON usando uma URL de webhook, utilize a seguinte configuração de modelo:
-
Instrução de consulta com quebra de linha incluída
* | select count(*) as cnt -
Comparação entre diferentes configurações de modelo de alerta
Item
Modelo de alerta
Resultado
Observações
Nenhuma função utilizada
{ "query": "{{ alert.results[0].query }}" }{ "query": "* | select count(*) as pv" }O formato JSON é inválido.
Função quote utilizada
{ "query": {{ quote(alert.results[0].query) }} }{ "query": "* | \nselect count(*) as pv" }O formato JSON é válido.
Filters
Quando funções aninhadas como {{ block(to_list(alert.labels)) }} tornam-se difíceis de ler, use filtros. Os filtros usam barras verticais (|) como operadores e suportam encadeamento de métodos. Especifique os filtros no formato {{ xxx | filiter1 | filter2 | ... }}. Por exemplo, {{ blockquote(to_list(alert.labels)) }} equivale a {{ alert.labels | to_list | blockquote }}.
Antes de usar filtros com uma função integrada, verifique se a função oferece suporte a eles. A maioria das funções integradas nos novos modelos de alerta suporta filtros. Para obter mais informações, consulte Funções de modelo integradas.
Se uma função integrada não tiver parâmetros, não será possível usar filtros.
Para funções integradas com um único parâmetro, recomendamos o uso da sintaxe de filtro. O formato é
{{ arg | fn }}. Por exemplo,{{ abs(-1) }}equivale a{{ -1 | abs }}.Caso uma função integrada tenha vários parâmetros e todos, exceto o primeiro, possuam valores padrão, é possível usar filtros. Se precisar especificar valores para todos os parâmetros, recomendamos chamar a função diretamente em vez de usar filtros.
Operators
A tabela a seguir descreve os operadores compatíveis. Para obter mais informações sobre prioridades de operadores, consulte Precedência de operadores.
|
Categoria |
Operador |
Descrição |
|
Operações aritméticas |
+ |
Executa uma operação de adição. |
|
- |
Executa uma operação de subtração. |
|
|
* |
Executa uma operação de multiplicação. |
|
|
/ |
Divisão. Retorna um número de ponto flutuante. |
|
|
// |
Divisão. Retorna um número inteiro. |
|
|
% |
Executa uma operação de módulo. |
|
|
Operações comparativas |
== |
Avalia se um valor é igual a outro. |
|
!= |
Avalia se um valor é diferente de outro. |
|
|
> |
Avalia se um valor é maior que outro. |
|
|
>= |
Avalia se um valor é maior ou igual a outro. |
|
|
< |
Avalia se um valor é menor que outro. |
|
|
<= |
Avalia se um valor é menor ou igual a outro. |
|
|
Operações lógicas |
and |
Especifica uma relação E (AND). |
|
or |
Especifica uma relação OU (OR). |
|
|
not |
Especifica uma relação NÃO (NOT). |
|
|
Outras operações |
in |
Verifica se um valor está incluído em outro e retorna um valor booleano. Suporta arrays, objetos e strings.
|
|
() |
Especifica uma combinação de operações. Exemplo: {{ a > b and (a > c or b > c) }}. |
Variáveis de alerta
Nos novos modelos de alerta, as variáveis de alerta usam o formato alert.xxx. Por exemplo, alert.project é uma variável de alerta válida. Para obter mais informações, consulte Variáveis em modelos de alerta.
Exemplos de configuração
-
Exemplo 1: Exibir informações de alerta com base no status do alerta.
Quando um alerta é disparado, o status, o nível de severidade e o resultado são fornecidos. Quando um alerta é resolvido, apenas o status é fornecido.
-
A seguinte configuração de modelo não inclui funções:
{% 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 %} -
A seguinte configuração de modelo inclui funções:
As funções format_status e format_severity simplificam a configuração do modelo:
- Status: {{ alert.status | format_status }} {% if alert.status == "firing" %} - Severity level: {{ alert.severity | format_severity }} - Results: {{ alert.results | to_json }} {% endif %}
-
-
Exemplo 2: Exibir informações de alerta em formato estruturado.
Os rótulos de alerta são convertidos em um array formatado em Markdown.
-
A seguinte configuração de modelo não inclui funções:
- Project: {{ alert.project }} - Alert name: {{ alert.alert_name }} - Label: {%- for key, val in alert.labels.items() %} > - {{ key }}: {{ val }} {%- endfor %} -
A seguinte configuração de modelo inclui funções:
As funções to_list e blockquote simplificam a configuração do modelo.
- Project: {{ alert.project }} - Alert name: {{ alert.alert_name }} - Label: {{ alert.labels | to_list | blockquote }}
-