user1365697
user1365697

Reputation: 5989

How to fix the error undefined variable "$labels"in Prometheus?

I used this alret

        - alert: my alert
          expr: status{status="ERROR"}
          for: 30m
          labels:
            severity: WARNING   
          annotations:
            myData: "{{ $labels.myData }}"
            myData2: "{{ $labels.myData2 }}"

I got an error ERROR - templates/: parse error in "prometheus/templates/alertmanager-prometheusRule.yaml": template: prometheus/templates/alertmanager-prometheusRule.yaml:419: undefined variable "$labels"

I saw the same issue in

Prometheus Docker fails to start with `Template: (dynamic): parse: template: :10: undefined variable "$labels"`

but I didn't understand how to solve it

in the configuration I used this data

text: "{{ range .Alerts -}}{{ .Annotations.myData }}{{ .Annotations.myData2}}{{ end-}}"

The error is from helm lint

Upvotes: 6

Views: 8852

Answers (4)

François
François

Reputation: 2200

Kind of the same answer as @bjakubski, but with examples:

I would suggest doing the same way as the official Prometheus helm chart is doing to pass alerts:

description: Filesystem on {{`{{`}} $labels.device {{`}}`}} at {{`{{`}} $labels.instance {{`}}`}} has only {{`{{`}} printf "%.2f" $value {{`}}`}}% available space left and is filling up.

They have plenty of examples in the repository.

Link: https://github.com/prometheus-community/helm-charts/blob/d6c45e97eca55e6212ef8acf546b45aa7851c72e/charts/kube-prometheus-stack/templates/prometheus/rules-1.14/node-exporter.yaml

Upvotes: 1

Ali
Ali

Reputation: 1449

You can use this awenser

OR

you can simply instead of using double qoutes "", use the single-qoutes ''

e.g. here would be like:

annotations:
  myData: '{{ $labels.myData }}'
  myData2: '{{ $labels.myData2 }}'

source: Prometheus Docs

Upvotes: 1

chrismead
chrismead

Reputation: 2243

Here is a python script to make @bjakubski's change in bulk on a file:


import sys
import re

f = sys.argv[1]

regex = re.compile(r"(\{\{.*?\}\})")

with open (f, "r") as myfile:
     s=myfile.read()

ret = regex.sub(lambda x:x.group(1)[0:2]+' "{{" }}'+ x.group(1)[2:],s)

print ret

Upvotes: 0

bjakubski
bjakubski

Reputation: 1747

It seems you are deploying your Prometheus setup via a helm chart. This causes an issue as the same delimiters ({{ and }}) are used both by helm templating and the alerting templating in Prometheus.

The {{ $labels.myData }} has to reach prometheus config intact, so helm must not process it.

The simplest way would be to use:

{{ "{{" }} $labels.myData }}

The {{ "{{" }} block will be processed by helm and will produce {{ as a result with rest of the line not being altered and will get you the result you need.

Upvotes: 23

Related Questions