@NIKA_R

Как правильно подключить rules в prometheus?

64c2c931bd80c140191762.png

prometheus.yml
# my global config
global:
  scrape_interval: 5s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 'oncall_alertmanager_1:9093'

 rule_files:
 - $PWD/alert.rules.yml


Конфигурационный файл находится в одной папке с проектом alert.rules.yml
alert.rules.yml
groups:
- name: alert.rules
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 1m
    labels:
      severity: "critical"
    annotations:
      summary: "Endpoint {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
  
  - alert: HostOutOfMemory
    expr: node_memory_MemAvailable / node_memory_MemTotal * 100 < 25
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Host out of memory (instance {{ $labels.instance }})"
      description: "Node memory is filling up (< 25% left)\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"


  - alert: HostOutOfDiskSpace
    expr: (node_filesystem_avail{mountpoint="/"}  * 100) / node_filesystem_size{mountpoint="/"} < 50
    for: 1s
    labels:
      severity: warning
    annotations:
      summary: "Host out of disk space (instance {{ $labels.instance }})"
      description: "Disk is almost full (< 50% left)\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"


  - alert: HostHighCpuLoad
    expr: (sum by (instance) (irate(node_cpu{job="node_exporter_metrics",mode="idle"}[5m]))) > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Host high CPU load (instance {{ $labels.instance }})"
      description: "CPU load is > 80%\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"


docker-compose.yml
version: '3'
services:
  prometheus:
    image: prom/prometheus
    volumes:
      - $PWD/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    depends_on:
      - cadvisor
      - blackbox
    networks:
      - iris

  alertmanager:
    image: prom/alertmanager:latest
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml  
    ports:
      - 9093:9093
    depends_on:
      - prometheus  
    networks:
      - iris


64c2c9cfc0c17438741096.png

P.S.
prometheus.yml
rule_files:
- "/etc/prometheus/aler-rules/test.rules"
- "test.rules"
alerting:
alertmanagers:
- static_configs:
- targets:
- 'oncall_alertmanager_1:9093'


docker-compose.yml
prometheus:
image: prom/prometheus
volumes:
- $PWD/prometheus.yml:/etc/prometheus/prometheus.yml
- $PWD/aler-rules/test.rules:/etc/prometheus/alert-rules/test.rules
ports:
- "9090:9090"
depends_on:
- cadvisor
- blackbox
- alertmanager
networks:
- iris
alertmanager:
image: prom/alertmanager:latest
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
ports:
- 9093:9093
networks:
- iris


Конфигурационны файл prometheus загружается, файл с тестовыми правилами тоже. Мне начинает казаться, что проблема в валидности самих правил в фйле test.rules.

64c3a89411878943111285.png

тестовое правило
groups:
- name: test_rules
rules:
- record: scrape_samples
- alert: PrometheusJobMissing
expr: absent(up{job="prometheus"})
for: 0m
labels:
severity: warning
annotations:
summary: Prometheus job missing (instance {{ $labels.instance }})
description: "A Prometheus job has disappeared\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
  • Вопрос задан
  • 263 просмотра
Решения вопроса 1
karabanov
@karabanov Куратор тега Docker
Системный администратор
rule_files:
- $PWD/alert.rules.yml

Странная конструкция надо указать полный или относительный путь - такие переменные в своём конфиге Prometheus не понимает.

volumes:
- $PWD/prometheus.yml:/etc/prometheus/prometheus.yml

Плохое решение прокидывать файл, внутрь контейнера - это можно сделать один раз в момент старта контейнера и в случае если файл изменился придётся перезапускать контейнер, чтобы это снова произошло. Лучше как Volume монтировать директорию в которую поместить файл, тогда файл в контейнере тоже измениться и достаточно будет послать SIGHUP процессу, чтобы он перечитал конфиг. Переменная $PWD здесь может быть, но её надо предварительно определить, например в .env файле или в одном из семи мест, где их можно определять.

Пример нормального подключени файла с правилами выглядит как-то так:

prometheus.yml
# Load and evaluate rules in this file every 'evaluation_interval' seconds.
rule_files:
  - '/etc/prometheus/alert-rules/*'
  # - 'first.rules'
  # - 'second.rules'


docker-compose.yml
volumes:
  - ./prometheus:/etc/prometheus
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы