prometheus с нуля

За время настройки prometehus, научился писать его название быстро и без ошибок.

Я вдохновлялся несколькими статьями, чтобы развернуть в офисе где я работаю, мониторинг. На данный момент есть явный прогресс. Настроено и работает: prometheus, node_exporter, alert-manager.

Основную проблему я словил при настройке alert.rules и в понимании что формат файла .yml отличается от .txt — стыд и срам, но что поделать.

К делу, конкретные ссылки для хорошего и уверенного старта:
Первая статья о запуске прометея, доходчиво и с пояснениями
Вторая аналогичная первой, но в ней есть более новые данные
Третья статья от автора выше, еще не читал, пора бы
И самая свежая статья от автора выше
А эту статью я использовал чтобы настроить alert.rules и alerting
habr.com — Руководство Prometheus 2k19
Еще одна статья из которой можно что то подчеркнуть. Есть и др. см. сайт
Халявные конфиги alert.rules
И конечно же, офф документация прометеуса

Важно знать, что если основной конфиг прометея содержит синтаксическую ошибку, то прометей не запуститься. Даже если вы подгрузили не верный конфиг alert.rules в отдельном файле, и описали его расположение в основном конфиге, то при рестарте прометея, выдаст ошибку.

Важно: помнить о последних изменениях и умело откатывать их.
Иметь снапшот.

Еще одной важной составляющей хорошего конфига — это держать все в разных местах. Для каждой ноды (хоста. компа. сервиса) лучше держать свой отдельный конфигурационный файл и отдельно записывать его в основной конфиг прометея.

Важно:
не плодить файл на 300 строк, а плодить много файликов по 10.
соблюдать четкую упорядоченность файлов конфигов. чтобы было понятно, что где лежит и что к чему относится. использовать лейбы.

Если вопрос установки и настройки node_exporter с последующим сопряжением с локальным prometheus, кажется не таки уж и страшным делом, то связать внешние хосты задача поинтереснее.

Здесь нам предстоит настроить:

  • связку prometheus с внешним хостом
  • защитить сбор и передачу метрик при помощи https и nginx
  • заблокировать доступ к порту 9100 при помощи iptables

Настройка связи prometheus/external host

После успешной установки node_exporter на внешнем хосте (с внешним ip), node_exporter начнет отдавать метрики по http://localhost:9100/metrics — вы можете проверить его работу зайдя по этому адресу.
Так как http устаревший протокол и данные идут в незащищенном виде, нужно чтобы данные шли по протоколу https (prometheus умеет скрейпить по https).
Для этого воспользуемся nginx. — как установить и настроить nginx вы можете прочесть в др. моих статьях на tildaslash.sh.

У nginx есть отличный модуль: «proxy_pass». Он позволяет перенаправить запросы к одной страничке в другую. В данном случае он будет перенаправлять запросы на http://localhost:9100 в https://localhost:9100. Это позволит нам защитить метрики которые отдает node_exporter.

Пример конфиг файла nginx:

server {
listen 443;
server_name your.domain.name.or.ip;
root /var/www/your.domain.name.or.ip/html/;
#использовал acme.sh для получения сертификатов нашего сайта.
ssl on;
ssl_certificate /root/.acme.sh/your.domain.name.or.ip/fullchain.cer;
ssl_certificate_key /root/.acme.sh/your.domain.name.or.ip/your-domain-name-or-ip.key;

try_files $uri $uri/ =404;

location / {
  index index.html;
}

#проксируем страчнику метрик в your.domain.name.or.ip/metrics
location /metrics {
proxy_pass http://localhost:9101;
#здесь же можно заблочить подключения к https серверу
#разрешенные правила должны быть выше по иерархии
allow 111.111.111.111; #разрешено подключаться 
deny all; #остальным запрещено
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

Поздравляю, теперь страница с метриками доступна с https протокола.
Но http по прежнему доступен всему интернету. Чтобы это исправить, нам поможет iptables который идет по умолчанию с большинством *nix систем.
Введем в консоли команды iptables:

#первая команда добавляет правило в "chain" iptables.
#ей мы разрешаем определенному ip адресу подключаться по определенному #порту.
iptables -A INPUT -p tcp --dport 9100 -s 1.2.3.4 -j ACCEPT
#после чего, блокируем всему интернету подключение к ip:9100 порту. 
iptables -A INPUT -p tcp --dport 9100 -j DROP

Поздравляю, теперь node_exporter не светит метрики на ружу всем искушенным.

Осталось добавить в /etc/prometheus/prometheus.yml информацию о добавленном сервере:

#Будьте внимательны редактируя файл с форматом YML.

- job_name: 'yourjobname'
  metrics_path: /metrics
  #указываю, что будет использоваться https протокол
  scheme: https
  #я вынес информацию о подключении в отдельный файл и явно указал Прометею 
  #куда смотреть. Как будете делать вы, решать только вам. 
  file_sd_configs:
  - files:
    - 'nodes-conf/yournameserver.json'

Подключаемый файл «sd-config» выглядит так:

[
  {
    "labels": {
      "job": "yourjobname"
    },
    "targets": [
      "ip/domainname"
    ]
  }
]