Home Relabeling bei Prometheus
Post
Cancel

Relabeling bei Prometheus

Ich versuche gerade mal wieder intensiv über meinen Tellerrand zu schauen und neue Dinge auszuprobieren.

Autodidaktisches lernen nennt man das wohl.

Seit kurzen ist auch Prometheus mit dabei.

Zu Beginn, ein Rant

Der erste Punkt, der mich bei Prometheus aus die Palme bringt .. die Konfigurationsdatei.

Warum erschafft man sich eine YAML Monstertapete!?

Es gibt bei vielen Services die Möglichkeit, über ein conf.d Verzeichniss sauber getrennte Konfigurationsschnipsel so provisionieren. Nur nicht bei allem aus dem “Cloudnative” Umfeld. Dort muss alles in einer riesig fetten Datei stehen!

Relabel

Aber deswegen habe ich nicht angefangen den Post hier zu schreiben. Ich wollte was übers Relabeling schreiben.

Man kann jeden Meßpunkt mit einem oder vielen Labels versehen.

Das sieht dann z.B so aus:

1
up{instance="sensor-01.matrix.lan:9080", service="sensors"}

Mein innerer Monk stört sich jetzt aber gewaltig am Port und möchte einfach nur den Hostnamen sehen.

Um jetzt den Port zu entfernen, muss man ein wenig mit regex schwarze Magie betreiben.

In meiner prometheus.yml habe ich für meine Sensoren einen Job definert:

1
2
3
4
5
scrape_configs:
  - job_name: "sensors"
    file_sd_configs:
      - files:
        - file_sd/sensors.yaml

Ich nutze hier wenigstens einen kleinen Teil einer Art “Modularisierung”, die file-based service discovery.

Die Datei sensors.yaml ist schlicht und sieht folgendermaßen aus:

1
2
3
4
5
- labels:
    service: sensors
  targets:
    - sensor-01.matrix.lan:9080  # buero
    - sensor-05.matrix.lan:9080  # it-bunker

Damit bekomme ich schon mal 2 Labels im Prometheus zu sehen:

  • service="sensors" und
  • instance="sensor-01.matrix.lan:9080"

Als erstes entfernen wir den Port. Dazu erweitern wir obigen Job:

1
2
3
4
5
6
7
8
9
10
11
12
scrape_configs:
  - job_name: "sensors"
    file_sd_configs:
      - files:
        - file_sd/sensors.yaml
    relabel_configs:
      # remove port from instance name
      - source_labels:
          - __address__
        regex: '(.*):.*'
        replacement: $1
        target_label: instance

Wir, oder eben Prometheus, puhlt sich mittels regex vom source_label den Instanznamen und ersetzt damit das ursprüngliche Label.
bähm

Aber ich habe ja einige Sensoren mehr im Haus. Und ich hab nicht immer Ahnung, welche Sensor-Id in welchem Raum liegt. Ich möchte also, basierend auf den Hostnamen, noch weitere Labels hinzufügen.

Zum Beispiel, in welchem Raum der Sensor liegt. Und welche ID er hat.

Das läuft dann ähnlich ab. Also noch mehr schwarze Magie …

Wir erweitern den Punkt relabel_configs um folgende Einträge:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
      # Extract the host ID (last octet of IPv4 address)
      - source_labels:
          - __address__
        regex: "sensor-(\\d+)..*"
        target_label: "host_id"

      # Set location label
      - source_labels:
          - host_id
        regex: "01"
        replacement: "buero"
        target_label: "location"

      - source_labels:
          - host_id
        regex: "05"
        replacement: "it-bunker"
        target_label: "location"

Nach einem Neustart und ein wenig Zeit schaut das Ergebniss im Prometheus wie folgt aus:

1
up{host_id="01", instance="sensor-01.matrix.lan", location="buero", service="sensors"}

En voilà, mein Monk ist zufriedengestellt und im Grafana kann ich jetzt feine Graphen basteln.

This post is licensed under CC BY 4.0 by the author.