【问题标题】:How to send alert for every error in my logs using Promtail / Loki - AlertManager?如何使用 Promtail / Loki - AlertManager 为我的日志中的每个错误发送警报?
【发布时间】:2020-09-26 13:32:58
【问题描述】:

我正在使用 Promtail + Loki 来收集我的日志,但我不知道如何对我的日志文件中的每个错误发出警报。我也在使用 Prometheus、Alertmanager 和 Grafana。我见过一些人已经设法实现了这一点,但没有一个人解释了细节。为了清楚起见,我不是在寻找保持在 FIRING 状态的警报或具有“Alerting”状态的 Grafana 仪表板。我所需要的只是每次在我的一个日志上出现错误时都知道。 如果不能完全以这种方式完成,下一个最佳解决方案是每 X 秒抓取一次,然后发出类似“6 条新错误消息”的警告。

【问题讨论】:

    标签: prometheus prometheus-alertmanager grafana-loki


    【解决方案1】:

    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
    

    【讨论】:

    • 这并不能真正回答问题 - Loki 警报文档没有解释如何为每个错误日志 发出警报,只是度量查询。你能写出这样的警报规则吗?
    【解决方案2】:

    我也有同样的问题。

    调查了一下,我发现 AlertManager 只是接收警报并路由它们。如果您有一项服务可以将 Loki 搜索转换为对 AlertManager API 的调用,那么它就完成了。而且可能你已经有两个了。

    我找到了这个帖子:https://github.com/grafana/loki/issues/1753

    其中包含此视频:https://www.youtube.com/watch?v=GdgX46KwKqo

    选项 1:使用 grafana

    他们展示了如何通过 Grafana 中的搜索创建警报。如果你只是添加一个类型为“Prometheus Alertmanager”的警报通知通道,你会得到它。

    因此,Grafana 将触发警报,Prometheus-AlertManager 将管理它。

    选项 2:使用 promtail

    还有其他方法:添加 promtail 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 指标。

    【讨论】:

    • 不是理想的解决方案,因为当 grafana 发送警报时,您无法获得“恐慌消息”的全文。
    • 问题是如何在警报消息中获取警报触发日志条目的内容
    【解决方案3】:

    要在 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 条新错误消息”的警报,您可以使用 sum(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返回的计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-28
      • 2023-02-10
      • 2023-02-07
      • 2022-06-18
      • 2022-07-13
      • 1970-01-01
      • 2019-04-03
      • 2021-05-11
      相关资源
      最近更新 更多