Project

General

Profile

Actions

Prometheus + Alertmanager +Grafana

Пролог

Описываем процесс развертывания системы мониторинга (сбора метрик) на базе компонентов:

  • Prometheus - сборщик (база данных) метрик от клиентов
  • Alertmanager - служба оповещений
  • Grafana - визуализатор метрик
  • XMPP-WebHook - коннектор для отправки уведомлений в Snikket
  • Node exporter - клиент Linux для Prometheus
  • Windows exporter -клиент Windows для Prometheus

1. Подготовка ОС

  1. Ставим Ubuntu 22.04
  2. Обновляем пакеты:
    sudo apt update
  3. Устанавливаем недостающие пакеты:
    sudo apt install openresolv wget ca-certificates curl
  4. Устанавливаем часовой пояс:
    sudo timedatectl set-timezone 'Asia/Yekaterinburg'
  5. Ставим Docker
    1. Даем права на директорию:
      sudo install -m 0755 -d /etc/apt/keyrings
    2. Скачиваем ключ:
      sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    3. Даем всем пользователям права на чтение:
      sudo chmod a+r /etc/apt/keyrings/docker.asc
    4. Добавляем репозиторий:
      sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
      Types: deb
      URIs: https://download.docker.com/linux/ubuntu
      Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
      Components: stable
      Architectures: $(dpkg --print-architecture)
      Signed-By: /etc/apt/keyrings/docker.asc
      EOF
    5. Снова обновляем список пакетов:
      sudo apt update
    6. Ставим докер:
      sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2. Устанавливаем, непосредственно, системы

  1. Создаем рабочие директории:
    sudo mkdir -p /opt/prometheus_stack/{prometheus,grafana,alertmanager,blackbox,jelmer-xmpp}
  2. Создаем файл docker-compose.yml:
    sudo touch /opt/prometheus_stack/docker-compose.yml
  3. Идем в рабочую директорию:
    cd /opt/prometheus_stack/
  4. Открываем файл на редактирование:
    sudo nano docker-compose.yml
    и приводим к следующему виду:
    services:

    prometheus:
    image: prom/prometheus:latest
    volumes:
    - ./prometheus/etc:/etc/prometheus/
    - ./prometheus/data:/prometheus
    container_name: prometheus
    hostname: prometheus
    command:
    - --config.file=/etc/prometheus/prometheus.yml
    ports:
    - "9090:9090"
    restart: unless-stopped
    environment:
    TZ: "Asia/Yekaterinburg"

    node-exporter:
    image: prom/node-exporter
    volumes:
    - /proc:/host/proc:ro
    - /sys:/host/sys:ro
    - /:/rootfs:ro
    container_name: node-exporter
    hostname: exporter
    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: unless-stopped
    environment:
    TZ: "Asia/Yekaterinburg"

    grafana:
    image: grafana/grafana
    user: root
    depends_on:
    - prometheus
    ports:
    - "3000:3000"
    volumes:
    - ./grafana:/var/lib/grafana
    - ./grafana/provisioning/:/etc/grafana/provisioning/
    container_name: grafana
    hostname: grafana
    restart: unless-stopped
    environment:
    TZ: "Asia/Yekaterinburg"

    alertmanager:
    image: prom/alertmanager:v0.31.1
    user: root
    ports:
    - "9093:9093"
    volumes:
    - ./alertmanager/:/etc/alertmanager/
    container_name: alertmanager
    hostname: alertmanager
    environment:
    TZ: "Asia/Yekaterinburg"
    restart: unless-stopped
    command:
    - '--config.file=/etc/alertmanager/config.yml'
    - '--storage.path=/etc/alertmanager/data'

    xmpp-bot:
    image: ghcr.io/jelmer/prometheus-xmpp-alerts
    container_name: xmpp-bot
    user: 1000:1000
    ports:
    - "9199:9199"
    volumes:
    - ./jelmer-xmpp/prometheus/config.yaml:/config.yaml:ro

  5. Создаем конфигурационный файл:
    sudo mkdir -p ./prometheus/etc
    sudo nano ./prometheus/etc/prometheus.yml
    со следующим содержанием:
    scrape_configs:
    - job_name: node
    scrape_interval: 5s
    static_configs:
    - targets: ['node-exporter:9100']
    - job_name: windows_servers
    scrape_interval: 5s
    static_configs:
    - targets: ['192.168.100.20:9182', '192.168.10.13:9182', '192.168.100.23:9182']
    rule_files:
    - 'alert.rules'
    alerting:
    alertmanagers:
    - scheme: http
    static_configs:
    - targets:
    - "alertmanager:9093"
  6. Создаем директорию для данных Prometheus:
    sudo mkdir -p ./prometheus/data
  7. Устанавливаем разрешения:
    sudo chown 65534:65534 ./prometheus/data
  8. Создаем файл с правилами для Promtheus:
    sudo mkdir - p ./prometheus/etc/alert.rules
    следующего содержания:
    groups:
    - name: InstanceState
    rules:
    - alert: PrometheusTargetMissing
    expr: up == 0
    for: 0m
    labels:
    severity: critical
    annotations:
    summary: "Prometheus target missing (instance {{ $labels.instance }})"
    description: "A Prometheus target has disappeared. An exporter might be crashed. VALUE = {{ $value }} LABELS: {{ $labels }}"
  9. Создаем конфигурационный файл для Alertmanager:
    sudo nano alertmanager/config.yml
    следующего содержания:
    global:
    route:
    group_by: ['alertname']
    group_wait: 30s
    group_interval: 1m
    repeat_interval: 2m
    receiver: 'team-alerts'
    receivers:
    - name: 'team-alerts'
    email_configs:
    - to: 'dkurnaev@krovelson.ru'
    from: 'informer@krovelson.ru'
    smarthost: 'mx01.krovelson.ru:465'
    auth_username: 'informer@krovelson.ru'
    auth_identity: 'informer@krovelson.ru'
    auth_password: 'Rjkj,jr-1'
    webhook_configs:
    - url: 'http://xmpp-bot:9199/alert'
  10. Создаем конфигурационный файл для XMPP-Hook:
    sudo nano ./jelmer-xmpp/prometheus/config.yaml
    следующего содержания:
    @jid: ''
    password: 'Vbrhj<bjkjubz'
    to_jid: ''
    listen_address: '0.0.0.0'
    listen_port: 9199
    text_template: | {{ status.upper() }}: {{ labels.alertname }} at {{ labels.host or labels.instance }}:\ {{ annotations.message }}. {{ generatorURL }}@
  1. Запускаем сборку контейнеров:
    sudo docker compose up -d
  2. Если все прошло удачно, то по адресам:

PS

Для Windows машин скачиваем программу Windows exporter и устанавливаем её в качестве службы, открыв соответствующий порт в брандмауэре.

PPS

Уведомления будут приходить в Snikket от имени alert-bot пользователю dkurnaev

Updated by Дмитрий Курнаев 27 days ago · 1 revisions