Prometheus
HowTos rund um das Thema Prometheus
HowTos rund um das Thema Prometheus
Create a self-signed cert for node-exporter:
$ openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout node_exporter.key -out node_exporter.crt -subj “/C=ZA/ST=CT/L=SA/O=VPN/CN=localhost” -addext “subjectAltName = DNS:localhost” Move the certs into the directory we created:
$ mv node_exporter.* /etc/node-exporter/ Install htpasswd so that we can generate a password hash with bcrypt, which will prompt you for a password that we are setting for the prometheus user::
$ apt install apache2-utils $ htpasswd -nBC 10 "" | tr -d ‘:\n’; echo Now populate the config for node-exporter:
$ cat /etc/node-exporter/config.yml
tls_server_config:
cert_file: node_exporter.crt
key_file: node_exporter.key
basic_auth_users:
prometheus:
$ chown -R ${NODE_EXPORTER_USER}:${NODE_EXPORTER_USER} /etc/node-exporter Then create the systemd unit file:
$ cat > /etc/systemd/system/node_exporter.service « EOF [Unit] Description=Node Exporter Wants=network-online.target After=network-online.target StartLimitIntervalSec=500 StartLimitBurst=5 [Service] User=${NODE_EXPORTER_USER} Group=${NODE_EXPORTER_USER} Type=simple Restart=on-failure RestartSec=5s ExecStart=${BIN_DIRECTORY}/node_exporter –web.config=/etc/node-exporter/config.yml [Install] WantedBy=multi-user.target EOF Reload systemd and start node-exporter
$ systemctl daemon-reload $ systemctl enable node_exporter $ systemctl restart node_exporter Prometheus Config Copy the /etc/node-exporter/node_exporter.crt from the node-exporter node to prometheus-node, then in the /etc/prometheus/prometheus.yml config:
 scrape_configs:
PromQL wird benutzt um aus einer Prometheus Time-Series-Database (TSD) Daten abzufragen.
Die Daten liegen als Metriken vor, die bei jedem erneuten Abruf (scrape) von den Exportern aktualisiert werden. Dabei wird den Metriken jeweils der aktuelle Timestamp hinzugefügt. Über PromQL lässt sich daher sehr einfach die Veränderung der Metriken über die Zeit nachverfolgen.
Zusätzlich zu den Metriken selber werden Attribute (label) gesetzt um die Metrik genauer zu beschreiben.
Wie bei der Ausgabe ersichtlich sind für node_cpu_seconds_total 3 Attribute
gesetzt: instance, job und mode
Um auf ein oder mehrer Attribute zu filtern werden sie hinter der Metrik in geschweiften Klammern angegeben.
Hierdurch wird die Ausgabe eingeschränkt.
Um die Anzahl der CPU Kerne herauszufinden könnte reicht die Zählung der
Ergebniszeilen (count).
Allerdings nur solange es nicht mehrere Instanzen gibt. Bei einer zusätzlichen Instanz mit gleicher Anzahl an CPUs würde nicht 2 pro Instanz ausgegeben, sondern nur 4, da die Zeilen zusammengezählt werden.
Das richtige Ergebnis erhält man nur, wenn man den count nur auf die gleiche
Instanz anwendet, also eine Gruppierung auf die Instanz vornimmt.
Sollte der Wert häufiger benötigt werden, machen eine ‘recording rule’ Sinn. Hierbei werden - parallel zum Abholen neuer Metriken durch den Prometheus Server - auch auf Grund der recording rules eigene Metriken berechnet. Dies verhindert, dass oft genutzte Werte immer wieder innerhalb der PromQL Queries erneut berechnet werden.
Diese recording rule definiert eine neue Metrik
instance:node_cpu_seconds_total:count, die genau der im vorherigen Bespiel
erzeugten Abfrage entspricht.
Um diese recording rule zu aktivieren wird sie in eine yaml Datei gepackt und
über rules_file in der Prometheus Konfiguration geladen.
Mit dieser Metrik ist es dann recht enfach die Load der Instanzen
(node_load1), die die Summer der Loads aller Scheduler darstellt, durch die
Anzahl der Scheduler (= Anzahl der CPU Kerne) zu teilen und einen vergleichbaren
Wert für alle Instanzen zu haben. Wir müssen dann nicht mehr wissen wieviele CPU
Kerne die Instanzen haben, da alles relativ zu einem CPU Kern dargestellt wird.
Eigentlich ist es nur die Division der Load (node_load1) durch unsere Metrik
(instance:node_cpu_seconds_total:count).
Allerdings haben die beiden Werte nicht alle Attribute gleich. node_load1 hat
noch das zusätzliche Attribut job. Dieses gibt es bei
instance:node_cpu_seconds_total:count nicht.
Daher ist bei der Division dieses Attribut zu ignorieren oder die Division nur
auf das Attribut intance anzuwenden.