转载自: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 阶段的方式):

  1. # values-prod.yaml
  2. loki:
  3. enabled: true
  4. persistence:
  5. enabled: true
  6. accessModes:
  7. - ReadWriteOnce
  8. size: 2Gi
  9. storageClassName: nfs-storage
  10. # Needed for Alerting: https://grafana.com/docs/loki/latest/alerting/
  11. config:
  12. ruler:
  13. # rules规则存储
  14. # 主要支持本地存储(local)和对象文件系统(azure, gcs, s3, swift)
  15. storage:
  16. type: local
  17. local:
  18. directory: /rules
  19. rule_path: /tmp/scratch # rules临时规则文件存储路径
  20. alertmanager_url: http://alertmanager-main.monitoring.svc:9093 # alertmanager地址
  21. ring: # ruler服务的一致性哈希环配置,用于支持多实例和分片
  22. kvstore:
  23. store: inmemory
  24. enable_api: true
  25. # 配置报警规则
  26. alerting_groups:
  27. - name: nginx-rate
  28. rules:
  29. - alert: LokiNginxRate
  30. expr: sum(rate({app="nginx"} |= "error" [1m])) by (job)
  31. /
  32. sum(rate({app="nginx"}[1m])) by (job)
  33. > 0.01
  34. for: 1m
  35. labels:
  36. severity: critical
  37. annotations:
  38. summary: loki nginx rate
  39. description: high request latency
  40. promtail:
  41. enabled: true
  42. grafana:
  43. enabled: true
  44. service:
  45. type: NodePort
  46. persistence:
  47. enabled: true
  48. storageClassName: nfs-storage
  49. accessModes:
  50. - ReadWriteOnce
  51. size: 1Gi

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

  1. groups:
  2. # 组名称
  3. - name: xxxx
  4. rules:
  5. # Alert名称
  6. - alert: xxxx
  7. # logQL查询语句
  8. expr: xxxx
  9. # 产生告警的持续时间 pending.
  10. [ for: | default = 0s ]
  11. # 自定义告警事件的label
  12. labels:
  13. [ : ]
  14. # 告警时间的注释
  15. annotations:
  16. [ : ]

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

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

  1. $ kubectl logs -f loki-0 -n logging
  2. ......
  3. 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
  4. 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 基于日志的监控报警。

使用 Loki 进行日志报警(二)的更多相关文章

  1. 使用 Loki 进行日志报警(一)

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247492352&idx=1&sn=9c0cc7927b ...

  2. 学习Coding-iOS开源项目日志(二)

    继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...

  3. yhd日志分析(二)

    yhd日志分析(二) 继续yhd日志分析,统计数据 日期 uv pv 登录人数 游客人数 平均访问时长 二跳率 独立ip数 1 分析 登录人数 count(distinct endUserId) 游客 ...

  4. SpringBoot初始教程之日志处理(二)

    SpringBoot初始教程之日志处理(二) 1.介绍 SpringBoot默认是采用logback进行日志处理.Logback是由log4j创始人设计的又一个开源日志组件.Logback是由log4 ...

  5. Docker 部署ELK之Sentinl日志报警

    前篇文章简单介绍了Docker 部署ELK,以及使用filebeat收集java日志.这篇我们介绍下日志报警配置,这里我们使用Sentinl插件. 1.修改kibana参数 进入elk容器,修改对应参 ...

  6. 基于Flask框架搭建视频网站的学习日志(二)

    基于Flask框架搭建视频网站的学习日志(二)2020/02/02 一.初始化 所有的Flask程序都必须创建一个程序实例,程序实例是Flask类的对象 from flask import Flask ...

  7. docker容器使用loki收集日志

    docker-compose安装loki套件(loki+promtail+grafana) loki进行日志聚合处理  类似elk中的es promtail是日志收集,类似elk中的logstash ...

  8. ELK日志报警插件ElastAlert并配置钉钉报警

    文章转载自:https://www.cnblogs.com/uglyliu/p/13118386.html ELK日志报警插件ElastAlert 它通过将Elasticsearch与两种类型的组件( ...

  9. 安装 loki 轻量级日志监控系统

    文章转载自:https://www.cnblogs.com/flypig666/archive/2004/01/13/14151801.html 从本文中学习到的是docker-compose相关命令 ...

随机推荐

  1. 数据结构-二叉树(Binary Tree)

    1.二叉树(Binary Tree) 是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成.  2.特数二 ...

  2. Mac上安装proxychains4

    brew install proxychains-ng vim /usr/local/etc/proxychains.conf proxychains4 wget www.google.com

  3. Linux环境下ProxyChains应用网络代理

    1.下载源码 git clone https://github.com.cnpmjs.org/rofl0r/proxychains-ng.git 或者 https://hub.fastgit.org/ ...

  4. JAVA解压.Z及.ZIP文件

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress --> <dependency ...

  5. APISpace 分钟级降水预报API接口 免费好用

    各种不同类型的降水对国民经济和国防建设会产生不同的影响.无论农业生产.航空.航海.交通运输.水利建设.防涝防旱等都需要以及准确的降水预报.   分钟级降水预报API,支持国内任一经纬度的预报数据,实时 ...

  6. ApiDay001 __02 Java_StringBuilder

    Java 核心API StringBuilder String 类型的连接性能不好,Java提供了StringBuilder解决字符串连接性能问题. 简单理解 StringBuilder性能好!(重点 ...

  7. Solution -「2020.12.26」 模拟赛

    0x00 前言 一些吐槽. 考得很变态诶,看每道题平均两秒的时限就知道了... T1 降智了想到后缀懒得打. T2 口胡了假优化,结果和暴力分一样?? T3 黑题还绑点?? \(50 + 80 + 0 ...

  8. Linux综合运用

    一. Linux用户和组及其权限管理 请根据以下项目要求,写出操作过程和命令并进行相应的验证测试操作. 项目要求: 某软件开发公司即将开始在Linux系统上进行项目的开发.要实现的环境是:公司有软件开 ...

  9. 第十六天python3 文件IO(二)

    BytesIO操作 io模块中的类 from io import BytesIO 内存中,开辟的一个二进制模式的buffer,可以像文件对象一样操作它: 当close方法被调用的时候,这个buffer ...

  10. 从零开始Blazor Server(1)--项目搭建

    项目介绍 本次项目准备搭建一个使用Furion框架,Blazor的UI使用BootstrapBlazor.数据库ORM使用Freesql的后台管理系统. 目前的规划是实现简单的注册,登录.增加管理员跟 ...