Как отправлять оповещения о каждой ошибке в моих журналах с помощью Promtail / Loki - AlertManager?

Я использую Promtail + Loki для сбора журналов, и я не могу понять, как я могу предупреждать о каждой ошибке в моих файлах журналов. Я также использую Prometheus, Alertmanager и Grafana. Я видел, как некоторым людям это удавалось, но никто из них не объяснил деталей. Чтобы быть ясным, я не ищу оповещения, которые остаются в состоянии FIRING, или панели инструментов Grafana со статусом «Alerting». Все, что мне нужно, это знать каждый раз, когда в одном из моих журналов возникает ошибка. Если это невозможно сделать именно таким образом, следующим лучшим решением будет очистить каждые X секунд, а затем предупредить что-то вроде: «6 новых сообщений об ошибках».


person EnTm    schedule 07.06.2020    source источник


Ответы (3)


В Loki v2.0 появился новый способ оповещения: https://grafana.com/docs/loki/latest/alerting/

Теперь вы можете настроить его прямо в Loki и отправить в Alertmanager.

Обновлять:

В соответствии с запросом простой пример предупреждения:

  groups:
  - name: NumberOfErrors
    rules:
    - alert: logs_error_count_kube_system
      expr: rate({namespace="kube-system"} |~ "[Ee]rror"[5m]) > 5
      for: 5m
      labels:
        severity: P4
        Source: Loki
person Christian    schedule 20.11.2020
comment
На самом деле это не отвечает на вопрос - в документации по предупреждению Loki не объясняется, как создавать предупреждения для каждого журнала ошибок, а только для метрических запросов. Удалось ли вам написать такое правило оповещения? - person Isaac van Bakel; 18.12.2020

У меня такой же вопрос.

Немного изучив, я обнаружил, что AlertManager просто получает предупреждения и направляет их. Если у вас есть служба, которая может переводить поисковые запросы Loki в вызовы AlertManager API, это готово. И, наверное, у вас их уже двое.

Я нашел эту тему: https://github.com/grafana/loki/issues/1753

В котором содержится это видео: https://www.youtube.com/watch?v=GdgX46KwKqo

Вариант 1. Использование графаны

Они показывают, как создать оповещение из поиска в Grafana. Если вы просто добавите канал уведомлений о предупреждениях с типом Prometheus Alertmanager, вы его получите.

Итак, Grafana активирует оповещение, а Prometheus-AlertManager будет управлять им.

Вариант 2. Использование подсказки

Есть другой способ: добавить подсказку pipeline_stage, чтобы создать метрику Prometheus с вашим поиском и управлять ею, как любой другой метрикой: просто добавьте оповещение Prometheus и управляйте им из AlertManager.

Вы можете просто прочитать пример по предыдущей ссылке:

pipeline_stages:
  - match:
      selector: '{app="promtail"} |= "panic"'
  - metrics:
      panic_total:
        type: Counter
        description: "total number of panic"
        config:
          match_all: true
          action: inc

И у вас будет метрика Prometheus, которой можно будет управлять как обычное предупреждение.

person MagMax    schedule 03.08.2020
comment
Не идеальное решение, потому что вы не можете получить полный текст сообщения о панике, когда графана отправляет предупреждение. - person Serko; 01.10.2020
comment
Вопрос заключался в том, как получить содержимое записи журнала срабатывания предупреждения внутри сообщения с предупреждением. - person Greg Z.; 24.02.2021

Для оповещения в Loki добавьте файлы правил в папку, указанную в разделе линейки в вашем файле конфигурации.

ruler:
  storage:
    type: local
    local:
      directory: /etc/loki/rules
  rule_path: /tmp/loki/rules-temp
  alertmanager_url: http://alertmanager:9093
  ring:
    kvstore:
      store: inmemory
  enable_api: true
  enable_alertmanager_v2: true

Если ваша конфигурация такая же, как указано выше, добавьте файлы правил в /etc/loki/rules/, например /etc/loki/rules/app/rules1.yaml

(/tmp/loki/rules/<tenant id>/rules1.yaml)

Чтобы предупредить что-то вроде: 6 новых сообщений об ошибках, вы можете использовать сумму (count_over_time ()) или count_over_time ().

Если у вас есть метки, такие как job="error" и job="info", и общая метка для обоих заданий как app="myapp", тогда count_over_time({app="myapp"}) будет перечислять значения для отдельных заданий. sum(count_over_time({app="myapp"})) отобразит сумму всех значений в обоих заданиях.

Пример конфигурации для rules1.yaml:

groups:
  - name: logs
    rules:
      - alert: ErrorInLogs
        expr: sum(count_over_time({app="myapp"}|~ "[Ee]rror"[1m]) >= 1
        for: 10s
        labels:
          severity: critical
          category: logs
        annotations:
          title: "{{$value}} Errors occurred in application logs"

Здесь {{$value}} даст счет, возвращенный из expr.

person Sahit    schedule 24.03.2021