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:
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.