es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer que jinja2 evalúe una variable dentro de una cadena de texto?

¿Existe alguna forma de que las variables definidas dentro de una cadena sean evaluadas en jinja2? Podemos ver en esta definición de la lista de alarmas a continuación que “expr” es una cadena que contiene otras variables que están definidas previamente, como oea_env, oea_subsystem, etc. Quiero que esas variables sean evaluadas para que el producto final tenga una “expr” donde esas variables estén llenas en lugar de dejar {{oea_env}}, etc., detrás.

{% set oeaenv = "dev" %}
{% set oeasubsystem = "mysite" %}
{% set crithighrh = 85  %}

{% set alarmlist = [
  {
    'alert': 'No hay lecturas de temperatura',
    'expr': '(containerhumidityrh{oeaassetid=~".*:service:1"} >= {{crithigh_rh}})'
  }] 
%}

{% macro generatealerts(alarmlist) %}
  {% for alarm in alarm_list %}
  - alerta: {{ alarm.alert }}
    expr: {{ alarm.expr }} 
  {% endfor %}
{% endmacro %}

más adelante en el código:

grupos:
- nombre: 'mis-alertas-prometheus'
  reglas:
  {{generatealerts(alarmlist) }}

Obtengo:

grupos:
- nombre: 'mis-alertas-prometheus'
  reglas:
  - alerta: 'Lectura de humedad alta',
    expr: (containerhumidityrh{oeaassetid=~".*:{{oeaenv}}:{{oeasubsystem}}:service:1"} >= {{crithighrh}})

Quiero:

grupos:
- nombre: 'mis-alertas-prometheus'
  reglas:
  - alerta: 'Lectura de humedad alta',
    expr: (containerhumidityrh{oeaassetid=~".*:dev:mysite:service:1"} >= 85)

Si hubiera más uniformidad en las expresiones que estoy llamando, probablemente crearía una macro con estas variables como parámetros de la macro, pero como cada una de estas expresiones puede ser arbitrariamente diferente, eso no es posible.

¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible obtener variables definidas dentro de una cadena para que sean evaluadas en Jinja2. Puede usar la sintaxis {{ }} para evaluar variables dentro de una cadena. Por ejemplo, puede usar el siguiente código para evaluar las variables dentro de la cadena expr:

    {% set oea_env = "dev" %}
    {% set oea_subsystem = "mysite" %}
    {% set crit_high_rh = 85 %}
    
    {% set alarm_list = [
      {
        'alert': 'No Temperature Readings',
        'expr': '(container_humidity_rh{oea_asset_id=~".*:{{ oea_env }}:{{ oea_subsystem }}:service:1"} >= {{ crit_high_rh }})'
      }] 
    %}
    
    {% macro generate_alerts(alarm_list) %}
      {% for alarm in alarm_list %}
      - alert: {{ alarm.alert }}
        expr: {{ alarm.expr }} 
      {% endfor %}
    {% endmacro %}
    
    <h1>más adelante en el código:</h1>
    
    groups:
    - name: 'my-prometheus-alerts'
      rules:
      {{ generate_alerts(alarm_list) }}
    

    Esto dará como resultado la siguiente salida:

    groups:
    - name: 'my-prometheus-alerts'
    rules:
    - alert: 'No Temperature Readings',
    expr: (container_humidity_rh{oea_asset_id=~".*:dev:mysite:service:1"} >= 85)

Comments are closed.