Page tree
Skip to end of metadata
Go to start of metadata

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

NOC умеет отдавать ему метрики в нативном для него формате по ссылке http://daemon_ip:port/metrics

Настройка всех схемы самомониторинга довольно проста

prom_noc

Запускать сам Prometheus можно как самостоятельно, так и через docker-compose.yml. Лучше второе.

Типовой файл docker-compose.yml, располагается в предварительно созданной папке
`mkdir /etc/docker-compose/mon -p`
`cd /etc/docker-compose/mon`
`mkdir /var/lib/prometheus -p ; chown -R 65534:65534 /var/lib/prometheus`

Создаём docker-compose.yml со след. содержимым:

version: '2.2'
services:

  prom:
    image: prom/prometheus:v2.4.3
    restart: always
    ports:
      - 9090:9090
    volumes:
      - "$PWD/prom:/etc/prometheus:ro"
      - "/var/lib/prometheus:/prometheus-data" # не забываем добавить права на директорию или создать отдельного пользователя для запуска контейнера с соответствующими правами на директорию
    command: 
      - --log.level=debug
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus-data
      - --storage.tsdb.retention=30d
      - --web.external-url=https://prom.XXXXXXXXXX.ru
      - --query.max-concurrency=40
      - --query.timeout=20s

  alertmanager:
    image: prom/alertmanager:v0.15.3
    restart: always
    ports:
      - 9093:9093
    volumes:
      - "$PWD/prom:/alertmanager"
    command: 
      - --config.file=/alertmanager/alertmanager.yml
      - --web.external-url=https://alertmanager.XXXXXXXXXX.ru
      - --log.level=debug

# по одному на каждый отдельный сервер кх
  mon_server1:
    image: f1yegor/clickhouse-exporter
    command: -scrape_uri=http://readonly:noc@192.168.1.1:8123/

# bot для отправки сообщений в телегам
  alertmanager-bot:
    image: metalmatze/alertmanager-bot:0.2
    environment:
      TELEGRAM_TOKEN: XXX
      TELEGRAM_ADMIN: 'XXX' # admin user
      ALERTMANAGER_URL: http://alertmanager:9093
      LISTEN_ADDR: 0.0.0.0:8080
      STORE: bolt
      BOLT_PATH: /data/db.db
    volumes:
      - /data/prom_bot:/data


Настройка для большинства случаев будет выглядеть довольно одинаково, изменить надо только noc_bootstrap_ip_role в файле "/etc/prometheus/prometheus.yml" или "$PWD/prom/prometheus.yml" (в зависимости от типа инсталляции).
Меняем на адрес ноды, где живёт consul с ролью bootstrap (вы это делали в башне)
`mkdir prom; cd prom`

Типовой файл prometheus.yml

# my global config
# собирать будем раз в 10 секунд
global:
  scrape_interval:     10s # By default, scrape targets every 15 seconds.
  evaluation_interval: 10s # By default, scrape targets every 15 seconds.

# у нас есть правила алертинга для системы
rule_files:
  - rules/*.rules.yml

# у нас есть алертменеджер живет там то
alerting:
  alertmanagers:
    - static_configs:
      - targets:
        - alertmanager:9093

# важная секция. сбор метрик
scrape_configs:
  # самомониторинг прометея
  - job_name: 'prometheus'
    static_configs:
      - targets: ['127.0.0.1:9090']
        labels:
           env: 'infrastructure'

  # собираем метрики с ноковских демонов. ищем их через консул
  - job_name: 'noc'
    consul_sd_configs:
      - server: 'noc_bootstrap_ip_role:8500' # если вы выбрали тип инсталляции при помощи docker и хотите использовать имя вместо ip-адреса, то необходимо дать доступ контейнеру на чтение файла "/etc/hosts"
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*,noc,.*
        action: keep
      - source_labels: [__meta_consul_service]
        target_label: job
      - source_labels: [env]
        target_label: env
        replacement: "dev" # указываем тут тип инсталляции нока 

  # собираем метрики с телеграфа 
  - job_name: 'noc_telegraf'
    consul_sd_configs:
      - server: 'noc_bootstrap_ip_role:8500' # если вы выбрали тип инсталляции при помощи docker и хотите использовать имя вместо ip-адреса, то необходимо дать доступ контейнеру на чтение файла "/etc/hosts"
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*,telegraf,.*
        action: keep
      - source_labels: [env]
        target_label: env
        replacement: "dev" # указываем тут тип инсталляции нока 


  # собираем метрики с кликхауса
  - job_name: 'ch'
    scrape_interval:     30s 
    static_configs:
      - targets:
        - mon_server1:9116 # если вы выбрали тип инсталляции при помощи docker и хотите использовать имя вместо ip-адреса, то необходимо дать доступ контейнеру на чтение файла "/etc/hosts"
        - mon_server2:9116 # если вы выбрали тип инсталляции при помощи docker и хотите использовать имя вместо ip-адреса, то необходимо дать доступ контейнеру на чтение файла "/etc/hosts"
        labels:
           env: 'dev' # указываем тут тип инсталляции нока 


Скорее всего вы захотите иметь какие-то правила для алертов:

cd /etc/docker-compose/mon/prom/rules
git clone https://code.getnoc.com/noc/noc-prometheus-alerts.git .
chown -R 65534:65534 /etc/docker-compose/mon/prom


В цепочке так же есть сервис alertmanager. Его задача – отправить сообщение об аварии. Для отправки можно воспользоваться таким вот конфигом:
`prom/alertmanager.yml` :

global:
  resolve_timeout: 5m
  smtp_from: alertmanager@prometheus.example.com
  smtp_smarthost: mx1.example.com:25
  smtp_require_tls: false

route:
  receiver: 'alertmananger-bot'
  routes: 
    - receiver: 'alertmananger-bot'
      group_interval: 10m

receivers:
- name: 'alertmananger-bot'
  webhook_configs:
   - url: 'http://alertmanager-bot:8080'
   
- name: email
  email_configs:
  - send_resolved: false
    to: XXX@example.com
    headers:
      From: alertmanager@prometheus.example.com
      Subject: '{{ template "email.default.subject" . }}'
      To: XXXXXXX@example.com
    html: '{{ template "email.default.html" . }}'
   
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'instance']

Со стороны башни надо сказать, что мониторинг будет через прометей, указав этот факт в сервисе telegraf. (Дополнительный сервис, поставить на все ноды)

Необходимо убедиться, что сервис selfmon будет собирать все метрики, которые нас интересуют.
По-дефолту, некоторые отключены. Необходимо сделать так, чтобы значения в конфиг-дампе были true, а не false. Можно в Consul или в файлах etc/settings.yml

./noc config dump selfmon
selfmon:
  enable_fm: true
  enable_inventory: true
  enable_task: true


После изменений в башне надо

  • запустить деплой
  • убедится что после деплоя создан файл /etc/telegraf/telegraf.d/prometheus.conf
    Содержимое файла:

    # Configuration for the Prometheus client to spawn
    [[outputs.prometheus_client]]
      ## Address to listen on
      listen = "0.0.0.0:9126"
      expiration_interval = "10s"
  • удалить лишние файлы мониторинга. самый важный пожалуй пункт. на всех нодах!
    • /etc/consul-template/config/noc_*
    • /etc/consul-template/templates/noc_*
    • /etc/telegraf/telegraf.d/noc-*
  • перезапустить consul-template и telegraf

Данные для графиков можно найти по адресу http://IP:9090
http://IP:9090/targets – здесь будут все источники метрик, вы должны увидеть различные сервисы нока

Так вот https://prometheus.io/docs/visualization/grafana/ он прикручивается к графане. Внимание картинки там от довольно старой графаны.

  • No labels