Prometheus Node Exporter unter Linux einrichten
Der Software-Stack bestehend aus Grafana, Prometheus und Node Exporter bietet für den
Network Engineer eine Reihe von interessanten Möglichkeiten. Dieser Artikel startet mit der Erfassung der Daten mit dem Node Exporter.
Node Exporter Grundlagen
Der Node Exporter fragt eine ganze Reihe von Metriken eines Linux-Systems ab und stellt diese in einem standardisiertem Format zur Abfrage zur Verfügung.
Die Abfrage erfolgt über einen integrierten Webserver der per Default auf Port 9100 hört.
Funktionsweise Node Exporter
Neben den Metriken für die Netzwerkschnittstellen des Servers liefert uns der Node Exporter auch Informationen zu CPU, Arbeitsspeicher und Massenspeicher.
Diese Daten können bei der Analyse von Performanceproblemen sehr hilfreich sein. Mitunter ist ja nicht die Netzwerkkarte der Flaschenhals sondern
ein CPU-Core der bereits am Anschlag läuft.
Der Node Exporter selbst verfügt nicht über eine Datenbank und speichert keinerlei Daten.
Das Tool Node Exporter besteht aus einer einzelnen statischen Binary und ist Bestandteil des Prometheus Projektes.
Durch seinen geringen Ressourcenbedarf kann er auch auf kleineren Systemen bedenkenlos installiert werden. Es eignet sich
damit für den Einsatz auf Linux-Workstation, Linux-Servern und auch für virtuelle Linux-Instanzen in der Cloud.
Für das Monitoring von Windows-Systemen gibt es einen gesonderten Windows Node Exporter.
Installation von Node Exporter
Da der Node Exporter lediglich eine einzelne Binärdatei ist gestaltet sich die Installation recht einfach.
Die aktuelle Version kann von der Prometheus Download Seite heruntergeladen werden und mit tar entpackt werden.
wget https://github.com/prometheus/node_exporter/releases/download/v*/node_exporter-*.*-amd64.tar.gz
tar xvfz node_exporter-*.*-amd64.tar.gz
cd node_exporter-*.*-amd64
./node_exporter
Wie im Beispiel oben zu sehen ist, benötigt das Programm in einfachsten Fall weder Parameter noch eine Konfigurations-Datei.
Nach dem Entpacken könnt ihr die Binary zum Beispiel nach /usr/local/bin verschieben oder auch ein dediziertes Verzeichnis (/opt/node-exporter) dafür
erstellen.
Konfiguration Node Exporter
Die Konfiguration erfolgt im Wesentlichen über Kommandozeilenparameter.
Mit "./node_exporter --help" bekommt man eine sehr gute Hilfe angezeigt.
./node_exporter --help
usage: node_exporter []
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--collector.arp.device-include=COLLECTOR.ARP.DEVICE-INCLUDE
Regexp of arp devices to include (mutually exclusive to device-exclude).
--collector.arp.device-exclude=COLLECTOR.ARP.DEVICE-EXCLUDE
Regexp of arp devices to exclude (mutually exclusive to device-include).
--collector.bcache.priorityStats
Expose expensive priority stats.
--collector.cpu.guest Enables metric node_cpu_guest_seconds_total
--collector.cpu.info Enables metric cpu_info
--collector.cpu.info.flags-include=COLLECTOR.CPU.INFO.FLAGS-INCLUDE
Filter the `flags` field in cpuInfo with a value that must be a regular expression
--collector.cpu.info.bugs-include=COLLECTOR.CPU.INFO.BUGS-INCLUDE
Filter the `bugs` field in cpuInfo with a value that must be a regular expression
--collector.diskstats.device-exclude="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\\d+n\\d+p)\\d+$"
Regexp of diskstats devices to exclude (mutually exclusive to device-include).
...
Über die Parameter lassen sich Kollektoren bzw. Metriken an- und abwählen oder auch der Port des internen Webservers umstellen.
Tests
Für einen ersten Tests starten wir den Node Exporter ohne weitere Parameter:
./node_exporter
ts=2023-01-11T18:45:41.349Z caller=node_exporter.go:180 level=info msg="Starting node_exporter" version="(version=1.5.0, branch=HEAD...
ts=2023-01-11T18:45:41.350Z caller=node_exporter.go:181 level=info msg="Build context" build_context="(go=go1.19.3, user=root@6e7732a...
ts=2023-01-11T18:45:41.350Z caller=node_exporter.go:183 level=warn msg="Node Exporter is running as root user. This exporter is design...
ts=2023-01-11T18:45:41.351Z caller=filesystem_common.go:111 level=info collector=filesystem msg="Parsed flag --collector.filesystem.mount...
ts=2023-01-11T18:45:41.352Z caller=filesystem_common.go:113 level=info collector=filesystem msg="Parsed flag --collector.filesystem.fs-...
ts=2023-01-11T18:45:41.352Z caller=diskstats_common.go:111 level=info collector=diskstats msg="Parsed flag --collector.diskstats.device-ex...
ts=2023-01-11T18:45:41.355Z caller=node_exporter.go:110 level=info msg="Enabled collectors"
ts=2023-01-11T18:45:41.355Z caller=node_exporter.go:117 level=info collector=arp
ts=2023-01-11T18:45:41.355Z caller=node_exporter.go:117 level=info collector=bcache
ts=2023-01-11T18:45:41.355Z caller=node_exporter.go:117 level=info collector=bonding
ts=2023-01-11T18:45:41.355Z caller=node_exporter.go:117 level=info collector=btrfs
...
ts=2023-01-11T18:45:41.356Z caller=node_exporter.go:117 level=info collector=uname
ts=2023-01-11T18:45:41.356Z caller=node_exporter.go:117 level=info collector=vmstat
ts=2023-01-11T18:45:41.356Z caller=node_exporter.go:117 level=info collector=xfs
ts=2023-01-11T18:45:41.356Z caller=node_exporter.go:117 level=info collector=zfs
ts=2023-01-11T18:45:41.357Z caller=tls_config.go:232 level=info msg="Listening on" address=address=[::]:9100
ts=2023-01-11T18:45:41.357Z caller=tls_config.go:235 level=info msg="TLS is disabled." http2=false address=address=[::]:9100
Neben der aktuellen Version zeigt der Exporter an welche Kollektoren laufen und auf welcher IP-Adresse und auf welchem Port der Webserver läuft.
Den Webserver können wir mit wget/curl oder einem Browser unsere Wahl abfragen.
curl http://localhost:9100/metrics 2>&1 | grep ^node_
node_netstat_Icmp6_InErrors 0
node_netstat_Icmp6_InMsgs 443
node_netstat_Icmp6_OutMsgs 626
node_netstat_Icmp_InErrors 57
node_netstat_Icmp_InMsgs 92976
node_netstat_Icmp_OutMsgs 95614
node_netstat_Ip6_InOctets 4.4804858e+08
node_netstat_Ip6_OutOctets 9.3644372e+08
node_netstat_IpExt_InOctets 5.58249188e+08
node_netstat_IpExt_OutOctets 1.918469652e+09
node_netstat_Ip_Forwarding 2
node_netstat_TcpExt_ListenDrops 0
node_netstat_TcpExt_ListenOverflows 0
node_netstat_TcpExt_SyncookiesFailed 1
node_netstat_TcpExt_SyncookiesRecv 0
node_netstat_TcpExt_SyncookiesSent 0
node_netstat_TcpExt_TCPSynRetrans 5419
node_netstat_TcpExt_TCPTimeouts 17074
node_netstat_Tcp_ActiveOpens 15578
node_netstat_Tcp_CurrEstab 8
node_netstat_Tcp_InErrs 25
node_netstat_Tcp_InSegs 2.156148e+06
node_netstat_Tcp_OutRsts 143392
node_netstat_Tcp_OutSegs 3.034225e+06
...
Die Ausgabe gibt uns einen guten Überblick über die verfügbaren Metriken.
Im Webinterface sehen wir die selben Metriken.
Metriken im Webinterface des Node Exporters
Der Webserver hört ohne weitere Konfiguration auf allen Schnittstellen des Systems und ist so
gegebenfalls auch offen im Internet erreichbar.
Node Exporter als Service starten
Normalerweise möchte man den Node Exporter automatisch beim Hochfahren des Servers starten. Dazu muss ein
entsprechender Service konfiguriert werden.
Zuerst legen wir einen Benutzer an unter dem der Prozess laufen soll. Dadurch muss der Prozess nicht als root laufen und mögliche
Angriffsvektoren werden minimiert.
sudo useradd -rs /bin/false node_exporter
Der Service selbst wird in der Datei node_exporter im systemd beschrieben.
sudo vi /etc/systemd/system/node_exporter.service
Die Datei bekommt den folgenden Inhalt:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
Hier können später Parameter für den Node Exporter ergänzt werden.
Im nächsten Schritt wird der systemd neu geladen, unser neuer Service node_exporter gestartet und der Service beim
Systemstart aktiviert.
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
Den Status des Dienstes können wir mit dem folgenden Kommando anschauen:
sudo systemctl status node_exporter
node_exporter.service - Node Exporter
Loaded: loaded (/etc/systemd/system/node_exporter.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-01-11 19:49:43 CET; 42min ago
Main PID: 56209 (node_exporter)
Tasks: 5 (limit: 4538)
Memory: 7.8M
CPU: 4.650s
CGroup: /system.slice/node_exporter.service
-- 56209 /opt/node_exporter/node_exporter
Jan 11 19:49:43 shardik node_exporter[56209]: ts=2023-01-11T18:49:43.724Z caller=node_exporter.go:117 level=info collector=thermal_zone
Jan 11 19:49:43 shardik node_exporter[56209]: ts=2023-01-11T18:49:43.725Z caller=node_exporter.go:117 level=info collector=time
Jan 11 19:49:43 shardik node_exporter[56209]: ts=2023-01-11T18:49:43.725Z caller=node_exporter.go:117 level=info collector=timex
Jan 11 19:49:43 shardik node_exporter[56209]: ts=2023-01-11T18:49:43.725Z caller=node_exporter.go:117 level=info collector=udp_queues
Die Funktion können wir an der Stelle erneut mit curl überprüfen.
Node Exporter absichern
Auch wenn der Node Exporter lediglich Statusinformationen ausliest und anzeigt, sollte man das Webinterface nicht offen ins Internet stellen.
Im folgenden stellen wir zwei Möglichkeiten zum Schutz des Webinterfaces vor.
Webserver auf localhost beschränken
Wenn man lediglich lokal (beispielsweise mit einer lokalen Prometheus-Instanz) auf die Daten zugreifen möchte, bietet es sich an den Webserver
auf localhost zu beschränken. Dazu wird der Node Exporter mit den Parameter "--web.listen-address=localhost:9100" gestartet.
./node_exporter --web.listen-address=localhost:9100
Bei der Gelegenheit könnte man auch den Listening Port an eigene Anforderungen anpassen. Damit ist der Zugriff nur noch lokal möglich.
Basic Authentication
Wenn man über das Internet auf den Node Exporter zugreifen möchte, bietet sich eine Absicherung mittels HTTP Basic Authentication an.
Dazu genieren wir zuerst ein Passwort mit dem Tool htpasswd (gehört zu den apache2-utils). Die Option "B" erzeugt
ein mittels bcyrpt generiertes Kennwort. Der Username in unserem Beispiel lautet node_exp.
htpasswd -nBC 12 node_exp
New password:
Re-type new password:
node_exp:$2y$12$f9wfa1cmy4RJH.LKP.v.VOTOMNdWhafnRGrI9HBvm4KPh/ymq4Wnm
Die weitere Konfiguration für Basic Authentication erfolgt über ein YAML-File:
cat /etc/node-exporter/config.yml
basic_auth_users:
node_exp: $2y$12$f9wfa1cmy4RJH.LKP.v.VOTOMNdWhafnRGrI9HBvm4KPh/ymq4Wnm
Damit der Node Exporter die Konfigurations-Datei liest wird er mit der Option "--web.config.file=/etc/node_exporter/config.yml" gestartet.
./node_exporter --web.config.file=/etc/node_exporter/config.yml
Nun sollte das Webinterface bei Zugriffen nach Benutzername und Password fragen.
Ausblick: Prometheus und Grafana
Bisher können wir die vom Node Exporter erzeugt Metriken lediglich in Echtzeit anschauen.
Damit wir bei der Fehlersuche auch die Vergangenheit schauen können, müssen wir die Werte in
eine Datenbank schreiben und schöne Diagramme erstellen. Dazu werden wir uns in weiteren Tutorials
die Programme Prometheus und Grafana anschauen.
Node Exporter Visualisierung mit einem Grafana Dashboard
Mit Grafana sind wir in der Lage Daten aus den unterschiedlichsten Datenquellen (Prometheus, Telegraf, Influx, SNMP)
in gemeinsamen Dashboards darzustellen.
Links
|