Как создавать оповещения Loki через ресурс Prometheusrule

Как создавать оповещения Loki через ресурс Prometheusrule

9 июля 2025 г.

В современных стеклах наблюдаемости журнальные оповещения часто более непосредственно и действуют, чем на основе показателей, особенно когда вы отслеживаете аномалии, инциденты безопасности или внезапные сбои применения. В то время как инструменты, какЛокиУпростить агрегацию журнала, превращение этих журналов в значимые, автоматизированные оповещения остается проблемой.

В мире метрик многие инженеры знакомы с Прометеем и егоPrometheusRuleРесурс для Kubernetes. Но что, если бы вы могли применить ту же гибкую, декларативную модель оповещения о журналах Loki?

В этой статье мы рассмотрим, как использоватьГрафана сплаввместе сPrometheusRuleресурс для динамического генерирования правил оповещения дляЛоки, принесло мощное, основанное на правилах предупреждение о ваших журналах. В средах Kubernetes этот подход соединяет разрыв между журналами и метриками, что позволяет вам управлять журналами Loki с тем жеPrometheusRuleКонфигурация оповещения об оптимизации ресурсов.

Начнем!

Проблема в дикой природе

АPrometheusRuleПользовательское определение ресурсов (CRD) является де -факто стандартом для управления правилами оповещения в экосистеме Прометея. Он поддерживается многими инструментами, включая Графана Аллея, Таноса и других. Тем не менее, изначально он не был предназначен для обработки оповещений на основе журналов Loki. Это прискорбно, какЛокиПравила оповещения имеют одну и ту же структуру - единственная разница заключается в выражениях, которые используютLogqlвместо promql.

Со временем некоторые члены сообщества попытались расширить этот шаблон, введя такие пользовательские ресурсы, какLokiRuleиGlobalLokiRuleПолем Однако,Выпуск Grafana/Loki #3456Чтобы добавить эти ресурсы в экосистему, была отклонена командой Графана, так какОпсги/Локи-Руле-Операторне поддерживается Графана.

АЛоки оператордействительно предоставляет свои собственныеAlertingRuleиRecordingRuleРесурсы, но они работают только в том случае, если Локи развернут через оператора. Если вы установили Loki, используя другой метод - например, очень популярныйLoki Helm Dicart- Эти ресурсы несовместимы.

К счастью, Grafana Alloy (ранее агент Grafana) предлагает путь вперед. Он поддерживает специальный блок конфигурацииloki.rules.kubernetes, что позволяет вам определить правила оповещения Loki, используя стандартPrometheusRuleКрдс Это пробивает разрыв, но он не работает без ящика. Из -за разреженной документации и необходимой дополнительной конфигурации может быть сложно настроить. Мы пройдем через необходимые шаги в этой статье.

Пошаговое руководство по настройке loki.rules.kubernetes

Это руководство предполагает, что сплав Локи и Графана уже развернуты и работают в вашем кластере Kubernetes.

Шаг I: добавитьloki.rules.kubernetesк конфигурации сплава графана

Чтобы включить правила оповещения Loki, настройте сплав, чтобы найтиPrometheusRuleРесурсы, предназначенные для Локи:

loki.rules.kubernetes "kvendingoldo_demo" {
  address    = "http://loki-ruler.loki.svc.cluster.local:3100"
  tenant_id  = "17"
   rule_selector {
    match_labels = { 
      loki = "enabled" 
    }
  }
}

Этот блок сообщает Графана Сплав сканироватьPrometheusRuleРесурсы помеченыloki=enabledПолем Вы можете использовать любую метку по вашему выбору - просто будьте последовательны на протяжении всей конфигурации.

Примечания:

  • Одной только этой конфигурации недостаточно. Если вы попытаетесь применитьPrometheusRuleсодержащий специфическое выражение выражения локи на этом этапе,он будет отклоненПо допускам Prometheus webhook из -за неудачной проверки выражения.
  • Не забудьте обновитьЛокиaddressиtenant_idЧтобы соответствовать вашей среде.
  • Если вы также используетеmimir.rules.kubernetesнаправлять правилаМимир, Обязательно исключите любые LOKI-специфические правила из отправки туда. Поскольку Локи используетLogqlвместоPromqlМимир не сможет правильно их проанализировать и бросить ошибки. Пример фрагмента:

mimir.rules.kubernetes "kvendingoldo_demo" {

  ...

  rule_selector {
    match_expression {
      key      = "loki"
      operator = "DoesNotExist"
    }
  }
}

Шаг II: Настройте Prometheus приема Webhook, чтобы пропустить проверку правил Loki

По умолчанию оператор Prometheus проверяет всеPrometheusRuleОбъекты с использованием promql. Поскольку локи по правилам использования используютсяLogql, эта проверка потерпит неудачу, если не будет четко обойти. Чтобы избежать этого, настройтеПрием WebhookВ операторе PromeTheus пропустить проверку для правил, помеченных для Loki:

admissionWebhooks:
  matchConditions:
    # Skip PrometheusRule validation when the "loki" label is present
    - name: ignore-loki-rules
      expression: '!("loki" in object.metadata.labels)'

Это правило рассказывает о приеме WebHook:Еслиlokiэтикетка присутствует наPrometheusRule, пропустить проверку своих выражений.

Это важно для предотвращения сбоев проверки при применении правил, которые содержат запросы LogQL.

Примечания:

  • Убедитесь, что выPrometheusRuleПользовательское определение ресурса (CRD) является актуальным.
  • Если вы используетеKube-Prometheus-StackHelm Chart, вам понадобится хотя бы версия75.3.6использоватьmatchConditionsполе вadmissionWebhooksПолем

Шаг III: Настройте линейку Loki

Для поддержки динамических правил оповещения для компонента линейки требуется дополнительная конфигурация:

  • Обеспечить настойчивость: Это необходимо для хранения и управления динамически загруженными правилами.
  • Используйте S3 (или любое другое хранилище объекта) для хранения линейки: По умолчаниюlocalБэкэнд хранения не поддерживает динамические правила, так как файловая система обычно только считывается в контейнерных средах.
  • Включить API правителя: Это позволяет Loki динамически получать определения правил - например, от сплава через CRD.

loki:
…
 rulerConfig:
   enable_api: true
   storage:
     type: s3
     s3:
       s3: "<YOUR_BUCKET_URL>"
       s3forcepathstyle: true
       insecure: true
…
ruler:
…
 persistence:
   enabled: true

Примечания:

После того, как стек журналов настроен с постоянностью и доступом к API, Loki выставит конечные точки для динамической загрузки правил оповещения, независимо от того, происходят ли они из:

  • Монтированные файлы yaml
  • Kubernetes configmaps
  • PrometheusRuleCRD черезГрафана сплав

Чтобы узнать больше, проверитьhttps://grafana.com/docs/loki/latest/alert/

Шаг IV: Создайте ресурс Prometheusrule

Как только все будет подключено, вы можете определить правила оповещения на основе журналов, используяPrometheusRuleCRD - даже если они используютLogqlвместоPromqlПолем

Вот примерPrometheusRuleпредупреждение об этом триггера, когда сплав Grafana генерирует более 100 линий бревна в минуту, поддерживается в течение 10 минут:

---
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
 name: kvendingoldo_demo
 labels:
   loki: enabled
spec:
 groups:
   - name: AlloyPrometheusRuleTest
     rules:
       - alert: AlloyLogLineCount
         expr: count_over_time({namespace="grafana", container="alloy"}[1m]) > 100
         for: 10m
         labels:
           severity: warn
         annotations:
           summary: Grafana Alloy is logging more than usual

Шаг V: Убедитесь, что все работает

Прежде всего, создайте капсул Kubernetes, который непрерывно излучает журналы. Сообщение POD предназначено для точно соответствовать правилу оповещения.

---
apiVersion: v1
kind: Pod
metadata:
  name: kvendingoldo-log-generator
  labels:
    app: kvendingoldo-log-generator
spec:
  containers:
  - name: logger
    image: busybox
    command:
    - /bin/sh
    - -c
    - >
      while true; do
        echo "how-to-create-loki-alerts-kvendingoldo-article";
        sleep 10;
      done

pod output example

ОпределитьPrometheusRuleЭто запустит, если строка журнала появится более одного раза в минуту:

---
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
 name: kvendingoldo-loki-log-alerts
 labels:
   loki: enabled
spec:
 groups:
 - name: log-generator-alerts
   rules:
   - alert: ErrorLogsDetected
     expr: |
       sum by(pod) (
         count_over_time(
           {app="kvendingoldo-log-generator"} |= "how-to-create-loki-alerts-kvendingoldo-article"
           [1m]
         )
       ) > 1
     for: 1m
     labels:
       severity: warning
     annotations:
       summary: "High error rate in kvendingoldo-log-generator pod"
       description: "More than one error log in the past minute from pod {{ $labels.pod }}"

Это правило:

  • ИспользованиеLogqlЧтобы найти конкретные сообщения в журналах из стручки.
  • Триггеры, если в течение минуты видны более одного такого журнала.
  • Ждет 1 минуту, прежде чем стрелять в предупреждение (for: 1m)

Наконец, пришло время убедиться, что правило было загружено, а оповещение функционирует правильно.

ОткрытьGrafana ui, затем перейдите к:Оповещения → Правила оповещения

Вы должны увидеть перечисленное правило логариста-генератора. Если POD сгенерировал достаточно подходящих журналов, предупреждение будет показывать какУвольнениеПолем В противном случае это будетНормальныйПолем

Это подтверждает, что:

  • Правило было успешно поднято правителем Локи через сплав Графана.
  • Локи оценивает правило на основе данных журнала в реальном времени.

Grafana UI with Loki alert

Последние мысли

Объединив Kubernetes-NationalPrometheusRuleCRD с селекторами метки иloki.rules.kubernetesБлокируйте в сплаве Grafana, вы получаете мощный и гибкий способ управления оповещениями на основе журналов в вашем кластере. Это позволяет вам:

  • Динамически предоставление оповещений через ресурсы K8S.
  • Сохраняйте все правила оповещения, управляемые CRD, контролируемые версией и Kubernetes-National
  • Используйте полный logQL, чтобы поймать все от простых ошибок до сложных шаблонов журнала
  • Централизовать все оповещения - журналы и метрики - в одном интерфейсе Grafana

Короче говоря, эта настройка объединяет лучшие из DevOps и наблюдение: автоматизированное, масштабируемое и полностью интегрированное предупреждение о журнале, все в вашей экосистеме Kubernetes.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE