Prometheus + Grafana + Node Exporter + Docker dans Azure avec notifications dans Telegram

Tout d'abord, préparez une machine virtuelle, pour cela nous allons écrire un petit script qui déploie et automatise certaines opérations de routine, le script utilise 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..." 

Dans le script, nous utilisons le fichier cloud-init.txt qui installera automatiquement Docker et Docker-Compose sur la machine virtuelle.


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 

Dans le répertoire personnel, créez un dossier pour le projet et le fichier 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 

N'oubliez pas que dans yaml il ne devrait pas y avoir de tabulations, seulement des espaces, regardez attentivement. Examinons le fichier docker-compose.yaml plus en détail:


image: - voici les images du conteneur docker que nous utiliserons


Commençons maintenant à créer le bot Telegram. Nous ne nous attarderons pas sur cela en détail, Internet est plein de descriptions, je dirai juste que la création se fait via le bot @BotFather .


Nous avons besoin du Token du bot et de votre TelegramID pour gérer le bot, vous devez remplacer ces données dans le docker-compose.yaml


Créons les fichiers:
prometheus.yml dans le répertoire prometheus qui décrit les serveurs pour collecter les métriques et envoyer des alertes.


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 dans le mĂȘme rĂ©pertoire pour la description des alertes. Cette alerte dĂ©crit une alerte qui vĂ©rifie si notre exportateur de nƓuds est actif.


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 dans le répertoire alertmanager dans lequel nous ajoutons une connexion au bot Telegram


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' 

Exécutez notre image et vérifiez le résultat:


 docker-compose up -d 

 docker-compose ps 

Vous devriez obtenir quelque chose de similaire Ă  ceci:



Comme nous voyons État pour tous les conteneurs Up , si pour une raison quelconque l'un des conteneurs n'a pas dĂ©marrĂ©, nous pouvons consulter le journal avec la commande:


 docker logs < > 

par exemple:


 docker logs docker logs project_alertmanager_1 

nous donnera ce résultat:



Créez maintenant un script test.sh pour vérifier les notifications


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 

aprÚs avoir lancé lequel, le bot devrait envoyer un message de test.
Nous pouvons Ă©galement vĂ©rifier le fonctionnement de notre alerte dĂ©crite dans con.yml , pour cela nous arrĂȘtons Node Exporter avec la commande


 docker stop <  node exporter> 

aprÚs deux minutes, le bot vous enverra une notification que le serveur est tombé en panne, lancez Node Exporter avec la commande


 docker start <  node exporter> 

Et aprÚs un certain temps, le bot répondra que le serveur a démarré.


C'est tout, dans le prochain article, je vais vous apprendre à connecter des métriques supplémentaires et à créer des notifications dans Prometheus.

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


All Articles