Da ich die Informationen an verschiedenen Orten zusammengesucht habe ist dieses Tutorial primär eine Anleitung für mich selbst um mit Grafana und Prometheus diverse Server und Services zu überwachen.
Der Hauptgrund dafür ist hauptsächlich, dass ich die Metrics von verschiedenen Servern ermitteln und darstellen will und deshalb die Daten öffentlich zugägnglich machen muss, was ein Sicherheitsrisiko darstellt.
Deshalb ist diese Anleitung dafür Gedacht, die Daten einigermassen sicher zugänglich zu machen.

Als erstes erstelle ich mal eine Gruppe und einen User pmjmetrics und füge den User dann der docker Grupe hinzu.

groupadd --system pmjmetrics
useradd -m -d /opt/pmjmetrics -s /bin/bash --system -g pmjmetrics pmjmetrics
usermod -aG docker pmjmetrics

Anschliessend benutze ich diesen User für die weiterern Schritte

su - pmjmetrics

Node Exporter

Node exporter ist einfach zu installieren; einfach herunterladen und ausführen.
Ich mache das im Verzeichnis ~/exporter/node

mkdir -p ~/exporter
cd ~/exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
tar xvfz node_exporter-1.5.0.linux-amd64.tar.gz
mv node_exporter-1.5.0.linux-amd64 node
rm node_exporter-1.5.0.linux-amd64.tar.gz

Nun erstelle ich einen Service für den Exporter.
Dies muss ich wieder als root erledigen.

exit
nano /etc/systemd/system/pmjmetrics-node.service

mit folgendem Inhalt

[Unit]
Description=Node Exporter
After=network.target
[Service]
User=pmjmetrics
Group=pmjmetrics
Type=simple
ExecStart=/opt/pmjmetrics/exporter/node/node_exporter --collector.textfile.directory=/opt/pmjmetrics/exporter/node
[Install]
WantedBy=multi-user.target

Anschliessend den Service Daeom neu laden

systemctl daemon-reload

Jetzt kann der Exporter beim Systemstart automatisch gestartet werden

systemctl enable pmjmetrics-node
service pmjmetrics-node start

Prometheus

Nun installiere ich Prometheus.
Dazu nutze ich wieder den User pmjmetrics.

su - pmjmetrics

Ich starte Prometheus aus bequemlichkeit in einem Docker Container.
Damit ich mit dem Exporter kommunizieren kann, muss ich folgende Flag beim starten des Containers benutzen: --add-host=host.docker.internal:host-gateway.
Ausserdem muss ich noch die Verzeichnisse ~/prometheus/config und ~/prometheus/data erstellen.

Aber erst muss ich die Prometheus Konfigurationsdatei erstellen

mkdir -p ~/prometheus/config
nano ~/prometheus/config/prometheus.yml

mit folgendem Inhalt

#global config
global:
  scrape_interval:     1m
  evaluation_interval: 5s
  scrape_timeout:     15s
  external_labels:
    monitor: 'codelab-monitor'
# Scrape configs only contain one scrape target
scrape_configs:
  - job_name: 'PMJ Prometheus'
    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'PMJ Node'
    scrape_interval: 5s
    static_configs:
      - targets: ['host.docker.internal:9100']
        labels:
          instance: 'localhost:9100'

Nun starte ich den Container

mkdir -p ~/prometheus/data
ID=$(id -u)
docker run -d --user $ID -p 9090:9090 --volume /opt/pmjmetrics/prometheus/config:/etc/prometheus --volume /opt/pmjmetrics/prometheus/data:/prometheus --add-host=host.docker.internal:host-gateway --name prometheus --restart always prom/prometheus:latest

Da ich von diversen Servern Daten sammeln will, muss ich von einer zentralen Grafana Instanz auf diese Server zugreiffen können. Dies bedeutet auch, dass ich den Port 9090 von Prometheus gegen aussen öffnen muss. Dadurch kann JEDER auf diese Daten zugreifen!
Deshalb öffne ich den Port 9090 nur für den Server auf dem die Grafana Instanz läuft.

Als Erstes muss ich wieder zum root User und dann Firewalld konfigurieren.

exit
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="__GRAFANA-IP__" port protocol="tcp" port="9090" accept'
firewall-cmd --reload

Um diese Regel wieder zu entfernen:

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="__GRAFANA-IP__" port protocol="tcp" port="9090" accept'
firewall-cmd --reload

Grafana

Gtafana lasse ich in einem Docker Container laufen.
Die Daten speichere ich im Verzeichnis ~/grafana/data

Da ich die Iptables deaktivieren musste um auch VMs betreiben zu können, muss ich den Container mit --network=host starten um Internetzugang zu haben.

mkdir -p ~/grafana/data
mkdir -p ~/grafana/config

Den Container starte ich dann wie folgt:

ID=$(id -u)
docker run -d --user $ID --volume "$PWD/grafana/data:/var/lib/grafana" --mount type=bind,source="$PWD/grafana/config/grafana.ini",target="/etc/grafana/grafana.ini",readonly -p 3000:3000 --name grafana --restart always --network=host grafana/grafana-oss:latest