Prometheus + Grafana + Node Exporter + Docker in Azure mit Benachrichtigungen im Telegramm

Bereiten Sie zunächst eine virtuelle Maschine vor. Dazu schreiben wir ein kleines Skript, das einige Routinevorgänge bereitstellt und automatisiert. Das Skript verwendet Azure Cli:


project.sh
#!/bin/bash echo "AZURE VM Create" echo "Azure Account:" echo "Azure name:" read AZ_NAME read -sp "Azure password: " AZ_PASS && echo && az login -u $AZ_NAME -p $AZ_PASS echo "Name Group VM" read GROUP_NAME az group create --name $GROUP_NAME --location eastus echo "VM name" read VM echo "Admin user name" read ADMIN az vm create --resource-group $GROUP_NAME --name $VM --image UbuntuLTS --admin-username $ADMIN --generate-ssh-keys --custom-data cloud-init.txt az vm open-port --resource-group $GROUP_NAME --name $VM --port 8080 --priority 1001 az vm open-port --resource-group $GROUP_NAME --name $VM --port 8081 --priority 1002 az vm open-port --resource-group $GROUP_NAME --name $VM --port 9090 --priority 1003 az vm open-port --resource-group $GROUP_NAME --name $VM --port 9093 --priority 1004 az vm open-port --resource-group $GROUP_NAME --name $VM --port 9100 --priority 1005 az vm open-port --resource-group $GROUP_NAME --name $VM --port 3000 --priority 1006 RESULT=$(az vm show --resource-group $GROUP_NAME --name $VM -d --query [publicIps] --o tsv) echo $RESULT echo "Whait 5 min" sleep 300 ssh $ADMIN@$RESULT -y << EOF sudo usermod -aG docker $ADMIN EOF sleep 10 echo "Connect to Azure..." 

Im Skript verwenden wir die Datei cloud-init.txt , mit der Docker und Docker-Compose automatisch auf der virtuellen Maschine installiert werden.


cloud-init.txt
 #cloud-config package_upgrade: true write_files: - path: /etc/systemd/system/docker.service.d/docker.conf content: | [Service] ExecStart= ExecStart=/usr/bin/dockerd - path: /etc/docker/daemon.json content: | { "hosts": ["fd://","tcp://127.0.0.1:2375"] } runcmd: - apt-get update && apt-get install mc -y - curl -sSL https://get.docker.com/ | sh - curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - chmod +x /usr/local/bin/docker-compose 

Erstellen Sie im Ausgangsverzeichnis einen Ordner für das Projekt und die Datei docker-compose.yaml


docker-compose.yaml
 version: '3.2' services: alertmanager-bot: image: metalmatze/alertmanager-bot:0.3.1 environment: - ALERTMANAGER_URL=http://<alertmngerURL>:9093 #    - LISTEN_ADDR=0.0.0.0:8080 - BOLT_PATH=/data/bot.db - STORE=bolt - TELEGRAM_ADMIN=<TelegramAdminID> # ID   - TELEGRAM_TOKEN=<TelegramBotToken> #   - TEMPLATE_PATHS=/templates/default.tmpl volumes: - /srv/monitoring/alertmanager-bot:/data ports: - 8080:8080 prometheus: image: prom/prometheus:latest volumes: - ./prometheus:/etc/prometheus/ command: - --config.file=/etc/prometheus/prometheus.yml ports: - 9090:9090 links: - cadvisor:cadvisor depends_on: - cadvisor restart: always node-exporter: image: prom/node-exporter volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - --path.procfs=/host/proc - --path.sysfs=/host/sys - --collector.filesystem.ignored-mount-points - ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/) ports: - 9100:9100 restart: always deploy: mode: global alertmanager: image: prom/alertmanager ports: - 9093:9093 volumes: - ./alertmanager/:/etc/alertmanager/ restart: always command: - --config.file=/etc/alertmanager/config.yml - --storage.path=/alertmanager cadvisor: image: google/cadvisor volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro ports: - 8081:8080 restart: always deploy: mode: global grafana: image: grafana/grafana depends_on: - prometheus ports: - 3000:3000 volumes: - ./grafana:/var/lib/grafana - ./grafana/provisioning/:/etc/grafana/provisioning/ restart: always 

Vergessen Sie nicht, dass es in Yaml keine Tabulatoren geben sollte, sondern nur Leerzeichen. Beobachten Sie dies sorgfältig. Schauen wir uns die Datei docker-compose.yaml genauer an:


image: - Hier sind die Docker-Container-Images, die wir verwenden werden


Beginnen wir nun mit der Erstellung des Telegramm-Bots. Wir werden nicht im Detail darauf eingehen, das Internet ist voller Beschreibungen. Ich möchte nur sagen, dass die Erstellung über den @ BotFather- Bot erfolgt.


Wir benötigen das Token des Bots und Ihre TelegramID , um den Bot zu verwalten. Sie müssen diese Daten in die Datei docker-compose.yaml einsetzen


Lassen Sie uns die Dateien erstellen:
prometheus.yml im prometheus- Verzeichnis, das die Server zum Sammeln von Metriken und zum Senden von Warnungen beschreibt.


prometheus.yml
 scrape_configs: - job_name: node scrape_interval: 5s static_configs: - targets: ['ip_node_explorer:9100'] rule_files: - './con.yml' alerting: alertmanagers: - static_configs: - targets: ['ip_alertmanager:9093'] 

con.yml im selben Verzeichnis für die Beschreibung von Warnungen. Diese Warnung beschreibt eine Warnung, die prüft, ob unser Node Exporter aktiv ist.


con.yml
 groups: - name: ExporterDown rules: - alert: NodeDown expr: up{job='Node'} == 0 for: 1m labels: severity: Error annotations: summary: "Node Explorer instance ($instance) down" description: "NodeExporterDown" 

config.yml im Verzeichnis alertmanager, in dem wir eine Verbindung zum Telegramm-Bot hinzufügen


config.yml
 route: group_wait: 20s #  group_interval: 20s #  repeat_interval: 60s #   group_by: ['alertname', 'cluster', 'service'] receiver: alertmanager-bot receivers: - name: alertmanager-bot webhook_configs: - send_resolved: true url: 'http://ip_telegram_bot:8080' 

Führen Sie unser Bild aus und überprüfen Sie das Ergebnis:


 docker-compose up -d 

 docker-compose ps 

Sie sollten etwas Ähnliches bekommen:



Wenn wir den Status für alle Up- Container sehen, können wir das Protokoll mit dem folgenden Befehl anzeigen, wenn einer der Container aus irgendeinem Grund nicht gestartet wurde:


 docker logs < > 

beispielsweise:


 docker logs docker logs project_alertmanager_1 

wird uns dieses Ergebnis geben:



Erstellen Sie nun ein test.sh- Skript zum Überprüfen von Benachrichtigungen


test.sh
 #!/bin/sh curl \ --request POST \ --data '{"receiver":"telegram","status":"firing","alerts":[{"status":"firing","labels":{"alertname":"Fire","severity":"critical"},"annotations":{"message":"Something is on fire"},"startsAt":"2018-11-04T22:43:58.283995108+01:00","endsAt":"2018-11-04T22:46:58.283995108+01:00","generatorURL":"http://localhost:9090/graph?g0.expr=vector%28666%29\u0026g0.tab=1"}],"groupLabels":{"alertname":"Fire"},"commonLabels":{"alertname":"Fire","severity":"critical"},"commonAnnotations":{"message":"Something is on fire"},"externalURL":"http://localhost:9093","version":"4","groupKey":"{}:{alertname=\"Fire\"}"}' \ localhost:8080 

Nach dessen Start sollte der Bot eine Testnachricht senden.
Wir können auch den Betrieb unserer in con.yml beschriebenen Warnung überprüfen . Dazu stoppen wir Node Exporter mit dem Befehl


 docker stop <  node exporter> 

Nach zwei Minuten sendet Ihnen der Bot eine Benachrichtigung, dass der Server abgestürzt ist. Starten Sie Node Exporter mit dem Befehl


 docker start <  node exporter> 

Und nach einer bestimmten Zeit antwortet der Bot, dass der Server gestartet wurde.


Das ist alles, im nächsten Artikel werde ich Ihnen beibringen, zusätzliche Metriken zu verbinden und Benachrichtigungen in Prometheus zu erstellen.

Source: https://habr.com/ru/post/de439858/


All Articles