ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用 Loki 进行日志报警(二)

2022-06-24 15:05:52  阅读:217  来源: 互联网

标签:sum 报警 job nginx rate Loki 日志 1m


转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247492374&idx=1&sn=d09f6db62374dd793158f660f332a19d&chksm=fdbaec0bcacd651d765d415d9e0fc7e33aa52f056ad7444fb42af032240488f057091c914477&cur_album_id=1837018771652149250&scene=190#rd

前文我们通过 Promtail 的 metrics 阶段的方式虽然可以实现我们的日志报警功能,但是还是不够直接,需要通过 Promtail 去进行处理,那么我们能否直接通过 Loki 来实现报警功能呢?其实在 Loki2.0 版本就提供了报警功能,其中有一个 Ruler 组件可以持续查询一个 rules 规则,并将超过阈值的事件推送给 AlertManager 或者其他 Webhook 服务,这也就是 Loki 自带的报警功能了,而且是兼容 AlertManager 的。

首先我们需要开启 Loki Ruler 组件,同样更新 loki-stack 安装的 Values 文件(可以去掉 metrics 阶段的方式):

# values-prod.yaml
loki:
  enabled: true
  persistence:
    enabled: true
    accessModes:
    - ReadWriteOnce
    size: 2Gi
    storageClassName: nfs-storage
  # Needed for Alerting: https://grafana.com/docs/loki/latest/alerting/
  config:
    ruler:
      # rules规则存储
      # 主要支持本地存储(local)和对象文件系统(azure, gcs, s3, swift)
      storage:
        type: local
        local:
          directory: /rules
      rule_path: /tmp/scratch  # rules临时规则文件存储路径
      alertmanager_url: http://alertmanager-main.monitoring.svc:9093  # alertmanager地址
      ring:  # ruler服务的一致性哈希环配置,用于支持多实例和分片
        kvstore:
          store: inmemory
      enable_api: true
  # 配置报警规则
  alerting_groups:
  - name: nginx-rate
    rules:
    - alert: LokiNginxRate
      expr: sum(rate({app="nginx"} |= "error" [1m])) by (job)
            /
          sum(rate({app="nginx"}[1m])) by (job)
            > 0.01
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: loki nginx rate
        description: high request latency

promtail:
  enabled: true

grafana:
  enabled: true
  service:
    type: NodePort
  persistence:
    enabled: true
    storageClassName: nfs-storage
    accessModes:
      - ReadWriteOnce
    size: 1Gi

我们首先通过 loki.config.ruler 对 Ruler 组件进行配置,比如指定 Alertmanager 的地址,规则存储方式等,然后通过 loki.alerting_groups 配置了报警规则,Loki 的 rulers 规则和结构与 Prometheus 是完全兼容,唯一的区别在于查询语句(LogQL)不同,在Loki中我们用 LogQL 来查询日志,一个典型的 rules 配置文件如下所示:

groups:
  # 组名称
  - name: xxxx
    rules:
      # Alert名称
      - alert: xxxx
        # logQL查询语句
        expr: xxxx
        # 产生告警的持续时间 pending.
        [ for:  | default = 0s ]
        # 自定义告警事件的label
        labels:
        [ :  ]
        # 告警时间的注释
        annotations:
        [ :  ]

比如我们这里配置的规则 sum(rate({app="nginx"} |= "error" [1m])) by (job) / sum(rate({app="nginx"}[1m])) by (job) > 0.01 表示通过日志查到 nginx 日志的错误率大于1%就触发告警,同样重新使用上面的 values 文件更新 Loki:

更新完成后我们查看 Loki 的日志可以看到一些关于上面我们配置的报警规则的信息:

$ kubectl logs -f loki-0 -n logging
......
level=info ts=2021-05-15T08:52:48.25436331Z caller=metrics.go:83 org_id=..data traceID=7a526c23619c6b4e latency=fast query="sum by(job)(rate({app=\"nginx\"} |= \"error\"[1m])) / sum by(job)(rate({app=\"nginx\"}[1m])) > 0.01" query_type=metric range_type=instant length=0s step=0s duration=6.615062ms status=200 throughput=2.3MB total_bytes=15kB
level=info ts=2021-05-15T08:53:08.271608857Z caller=metrics.go:83 org_id=..2021_05_15_08_49_25.017497657 traceID=2d7b255ccae2692e latency=fast query="sum by(job)(rate({app=\"nginx\"} |= \"error\"[1m])) / sum by(job)(rate({app=\"nginx\"}[1m])) > 0.01" query_type=metric range_type=instant length=0s step=0s duration=55.011001ms status=200 throughput=297kB total_bytes=16kB

同样在1m之内如果持续超过阈值,则会真正触发报警规则,触发后我们在 Alertmanager 也可以看到对应的报警信息了:

到这里我们就完成了使用 Loki 基于日志的监控报警。

标签:sum,报警,job,nginx,rate,Loki,日志,1m
来源: https://www.cnblogs.com/sanduzxcvbnm/p/16408877.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有