Todos los productos
Search
Centro de documentos

Simple Log Service:Sintaxis para nuevas plantillas de alertas

Última actualización: Sep 02, 2026

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, \foo debe escaparse como "\\foo".

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.

  • Número: {{ 123 }}

  • Cadena: {{ "abc" }} or {{ 'xyz' }}

    Una cadena debe ir entre comillas dobles ("") o simples ('').

  • Variable: {{ alert.alert_name }}

  • Expresión: {{ alert.project + '/' + alert.alert_id }}

{% %}

Marca el inicio y el final de una instrucción.

{% if alert.status == 'firing' %}FIRING{% else %}RESOLVED{% endif %}

{# #}

Marca el inicio y el final de un comentario. Los comentarios no se incluyen en las notificaciones de alerta.

{# this is a comment #}

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.

Importante
  • No se permiten espacios entre el guion (-) y el delimitador. Por ejemplo, el guion en {{- 3 }} es válido y renderiza el número como 3. 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 como hello 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 if le sigue una constante o variable, esta se evalúa como verdadera o falsa. El valor booleano false, el número 0, 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 if le 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 alert.severity >= 8 %}
Critical alert
{% endif %}

if-else

{% if alert.severity >= 8 %}
Critical alert
{% else %}
Normal alert
{% endif %}

if-elif

{% if alert.severity >= 8 %}
Critical alert
{% elif alert.severity >= 4 %}
Normal alert
{% endif %}

if-elif-else

{% if alert.severity >= 8 %}
Critical alert
{% elif alert.severity >= 4 %}
Normal alert
{% else %}
Notification
{% endif %}

Instrucción anidada

{% if alert.severity >= 8 %}
Critical alert
{% else %}
{% if alert.severity >= 4 %}
Normal alert
{% else %}
Notification
{% endif %}
{% endif %}

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

{% for result in alert.results %}
{{ result }}
{% endfor %}

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.

{% for index, result in enumerate(alert.results) %}
{{ index }}: {{ result }}
{% endfor %}

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:

{% for index, result in enumerate(alert.results, start=1) %}
{{ index }}: {{ result }}
{% endfor %}

Instrucciones de bucle en objetos

La función items() convierte un objeto en una matriz de pares clave-valor con formato Key:Value para su iteración.

{% for key, val in alert.labels.items() %}
    {{ key }}: {{ val }}
    {% endfor %}

Instrucciones anidadas

{% for result in alert.fire_results %}
{% for key, val in result.items() %}
{{ key }}: {{ val }}
{% endfor %}
{% endfor %}

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.

Importante
  • 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.

  • Matriz: {{ 1 in [1, 2, 3] }}

  • Objeto: {{ "foo" in {"foo": "bar" } }}

  • Cadena: {{ "ll" in "hello" }}

()

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