Simple Log Service admite dos versiones de sintaxis para plantillas de alertas: la nueva y la original. La nueva sintaxis utiliza un enfoque similar al de Python para permitir un renderizado personalizado más flexible y avanzado de las notificaciones de alerta.
Descripción general
En comparación con las plantillas de alertas originales, las nuevas plantillas utilizan una sintaxis similar a la de Python para ofrecer una lógica de renderizado personalizado más flexible, así como contenido y estilos de notificación optimizados, como el escape de caracteres Markdown. Las principales ventajas incluyen:
Renderizado dinámico basado en los niveles de severidad de la alerta, que utiliza fuentes de diferentes colores para distinguir dichos niveles.
Renderizado iterativo de los resultados de consulta de alertas en una lista o tabla dentro de un correo electrónico.
Funciones integradas para codificación y decodificación Base64, así como operaciones aritméticas sobre valores numéricos.
La nueva sintaxis es totalmente compatible con la sintaxis original, pero utiliza tipos, valores y estilos diferentes para los atributos de las alertas. Se recomienda utilizar exclusivamente la nueva sintaxis y evitar mezclar ambas versiones.
Inicio rápido
A continuación se muestran ejemplos del contenido de notificación definido en las nuevas plantillas de alertas.
-
Contenido de la 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" } ] } -
Configuración de la plantilla de alertas:
- 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 de salida:
- 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
Sintaxis básica
Data types
La siguiente tabla describe los tipos de datos compatibles con la sintaxis similar a la de Python.
|
Tipo de dato |
Descripción |
|
Number |
Los números admitidos incluyen enteros y números de punto flotante. Ejemplos: 3 y -1. |
|
String |
Una cadena debe ir entre comillas simples ('') o dobles (""). Ejemplos: "foo" y 'bar'. Si una cadena contiene caracteres especiales, se debe usar una barra invertida (\) para escaparlos. Por ejemplo, |
|
Boolean |
Los valores booleanos admitidos son True y False. |
|
Null |
None. |
|
List |
Una lista puede denominarse matriz o segmento en otros lenguajes de programación. Ejemplo: ['foo', 'bar']. |
|
Dictionary |
Un diccionario puede denominarse objeto en otros lenguajes de programación. Ejemplo: {'foo': 'bar'}. |
Delimiters
|
Delimitador |
Escenario de uso |
Ejemplo |
|
|
Marca el inicio y el final de una variable o expresión. |
|
|
|
Marca el inicio y el final de una instrucción. |
|
|
|
Marca el inicio y el final de un comentario. Los comentarios no se incluyen en las notificaciones de alerta. |
|
Removal of empty strings
De forma predeterminada, Simple Log Service ignora los espacios entre un delimitador y la expresión interna. Por ejemplo, tanto {{ 23 }} < {{ 45 }} como {{23}} < {{45}} se renderizan como 23 < 45. Sin embargo, los caracteres de espacio en blanco (espacios, tabulaciones y saltos de línea) fuera de los delimitadores se conservan. Por ejemplo, {{ 23 }} < {{ 45 }} se renderiza como 23 < 45, no como 23<45.
Para eliminar espacios en blanco no deseados a la izquierda o derecha de un delimitador, agregue un guion (-) junto al delimitador. Por ejemplo, {{ 23 -}} < {{- 45 }} se renderiza como 23<45.
{{-,{{%-y{#-eliminan todos los espacios en blanco a la izquierda del delimitador.-}},-%}y-%}eliminan todos los espacios en blanco a la derecha del delimitador.
No se permiten espacios entre el guion (-) y el delimitador. Por ejemplo, el guion en
{{- 3 }}es válido y renderiza el número como3. Sin embargo, el guion en{{ - 3 }}se trata como un signo menos y renderiza el número como-3.El guion solo afecta a los espacios en blanco fuera de los delimitadores, no al contenido interno. Por ejemplo,
{{ "hello " }} {{- "world"}}se renderiza comohello world.
Conditional statements
Las instrucciones condicionales evalúan valores de parámetros y expresiones lógicas para controlar el renderizado.
Si a la cláusula
ifle sigue una constante o variable, esta se evalúa como verdadera o falsa. El valor booleanofalse, el número0, la cadena vacía"",null, la matriz vacía[]y el objeto vacío{}se evalúan como falso. Todos los demás valores se evalúan como verdadero.Si a la cláusula
ifle sigue una expresión lógica, el resultado de la expresión se evalúa como verdadero o falso. Por ejemplo,{{ if alert.severity >= 8 }}comprueba si la severidad de la alerta es 8 o superior.
La siguiente tabla describe los flujos condicionales compatibles.
|
Flujo de control |
Ejemplo |
|
if |
|
|
if-else |
|
|
if-elif |
|
|
if-elif-else |
|
|
Instrucción anidada |
|
Iterations
Las instrucciones de bucle iteran sobre matrices y objetos. La siguiente tabla describe las instrucciones de bucle compatibles.
|
Instrucción de bucle |
Ejemplo |
|
Instrucciones de bucle en matrices |
|
|
Instrucciones de bucle con subíndices en matrices |
La función enumerate itera sobre los subíndices de la matriz. Para obtener más información sobre la función enumerate, consulte Built-in functions in alert templates.
Los subíndices comienzan en 0 de forma predeterminada. Utilice el parámetro start en la función enumerate para especificar un subíndice de inicio personalizado. Ejemplo:
|
|
Instrucciones de bucle en objetos |
La función items() convierte un objeto en una matriz de pares clave-valor con formato
|
|
Instrucciones anidadas |
|
Escape characters
Para evitar que Simple Log Service analice sintácticamente cadenas de caracteres especiales como {{, puede escaparlas. El siguiente ejemplo conserva intacto todo el contenido entre {% raw %} y {% endraw %}:
-
Configuración de la plantilla de alertas
{% raw %} {% for result in alert.results %} {{ result }} {% endfor %} {% endraw %} -
Resultado
{% for result in alert.results %} {{ result }} {% endfor %}
Functions
Las plantillas de alertas proporcionan funciones integradas para configurar de manera flexible los formatos y estilos de las notificaciones. Para obtener más información, consulte Built-in template functions.
Por ejemplo, para enviar notificaciones de alerta en formato JSON mediante una URL de webhook, utilice la siguiente configuración de plantilla:
-
Instrucción de consulta con un salto de línea incluido
* | select count(*) as cnt -
Comparación entre diferentes configuraciones de plantillas de alertas
Elemento
Plantilla de alertas
Resultado
Observaciones
Sin uso de funciones
{ "query": "{{ alert.results[0].query }}" }{ "query": "* | select count(*) as pv" }El formato JSON no es válido.
Uso de la función quote
{ "query": {{ quote(alert.results[0].query) }} }{ "query": "* | \nselect count(*) as pv" }El formato JSON es válido.
Filters
Cuando las funciones anidadas como {{ block(to_list(alert.labels)) }} resultan difíciles de leer, puede utilizar filtros en su lugar. Los filtros usan barras verticales (|) como operadores y admiten el encadenamiento de métodos. Especifique los filtros con el formato {{ xxx | filiter1 | filter2 | ... }}. Por ejemplo, {{ blockquote(to_list(alert.labels)) }} equivale a {{ alert.labels | to_list | blockquote }}.
Antes de usar filtros con una función integrada, compruebe que la función admita filtros. La mayoría de las funciones integradas en las nuevas plantillas de alertas son compatibles con filtros. Para obtener más información, consulte Built-in template functions.
Si una función integrada no tiene parámetros, no se pueden utilizar filtros.
Si una función integrada tiene un solo parámetro, se recomienda utilizar la sintaxis de filtro. El formato es
{{ arg | fn }}. Por ejemplo,{{ abs(-1) }}equivale a{{ -1 | abs }}.Si una función integrada tiene varios parámetros y todos excepto el primero tienen valores predeterminados, se pueden utilizar filtros. Si necesita especificar valores para todos los parámetros, se recomienda llamar a la función directamente en lugar de usar filtros.
Operators
La siguiente tabla describe los operadores compatibles. Para obtener más información sobre la prioridad de los operadores, consulte Operator precedence.
|
Categoría |
Operador |
Descripción |
|
Operaciones aritméticas |
+ |
Realiza una operación de suma. |
|
- |
Realiza una operación de resta. |
|
|
* |
Realiza una operación de multiplicación. |
|
|
/ |
División. Devuelve un número de punto flotante. |
|
|
// |
División. Devuelve un número entero. |
|
|
% |
Realiza una operación de módulo. |
|
|
Operaciones de comparación |
== |
Evalúa si un valor es igual a otro valor. |
|
!= |
Evalúa si un valor no es igual a otro valor. |
|
|
> |
Evalúa si un valor es mayor que otro valor. |
|
|
>= |
Evalúa si un valor es mayor o igual que otro valor. |
|
|
< |
Evalúa si un valor es menor que otro valor. |
|
|
<= |
Evalúa si un valor es menor o igual que otro valor. |
|
|
Operaciones lógicas |
and |
Especifica una relación AND. |
|
or |
Especifica una relación OR. |
|
|
not |
Especifica una relación NOT. |
|
|
Otras operaciones |
in |
Comprueba si un valor está incluido en otro valor y devuelve un valor booleano. Admite matrices, objetos y cadenas.
|
|
() |
Especifica una combinación de operaciones. Ejemplo: {{ a > b and (a > c or b > c) }}. |
Variables de alerta
En las nuevas plantillas de alertas, las variables de alerta utilizan el formato alert.xxx. Por ejemplo, alert.project es una variable de alerta válida. Para obtener más información, consulte Variables in alert templates.
Ejemplos de configuración
-
Ejemplo 1: Mostrar información de la alerta según su estado.
Cuando se activa una alerta, se proporcionan el estado, el nivel de severidad y el resultado. Cuando se resuelve una alerta, solo se proporciona el estado.
-
La siguiente configuración de plantilla no incluye funciones:
{% 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 siguiente configuración de plantilla incluye funciones:
Las funciones format_status y format_severity simplifican la configuración de la plantilla:
- Status: {{ alert.status | format_status }} {% if alert.status == "firing" %} - Severity level: {{ alert.severity | format_severity }} - Results: {{ alert.results | to_json }} {% endif %}
-
-
Ejemplo 2: Mostrar información de la alerta en un formato estructurado.
Las etiquetas de alerta se convierten en una matriz con formato Markdown.
-
La siguiente configuración de plantilla no incluye funciones:
- Project: {{ alert.project }} - Alert name: {{ alert.alert_name }} - Label: {%- for key, val in alert.labels.items() %} > - {{ key }}: {{ val }} {%- endfor %} -
La siguiente configuración de plantilla incluye funciones:
Las funciones to_list y blockquote simplifican la configuración de la plantilla.
- Project: {{ alert.project }} - Alert name: {{ alert.alert_name }} - Label: {{ alert.labels | to_list | blockquote }}
-