Alertmanager对接Loki实现日志告警 | 坑我已经帮你们踩好了
前言
很多情况下,反映一个服务的健康状态,单从其服务可用性并不完全准确,反而服务的某些日志可以准确的反映出这个服务是否处于亚健康状态,是否即将出现异常,从而从一定程度进行故障预测和干预。
如下图所检索出来的WARNING
日志,大量的WARNING
、ERROR
或者OOM
这样的日志可能预示着应用即将出现异常,这时候基于日志的告警功能就非常有必要。
Alertmanager对接Loki
我们知道Alertmanager是可以查询Loki的
修改Loki配置文件,在loki-local-config.yml
添加以下内容:
# rules规则存储
# 主要支持本地存储(local)和对象文件系统(azure, gcs, s3, swift)
ruler:
storage:
type: local
local:
directory: /monitor/loki/rules # Loki告警规则存储路径
rule_path: /monitor/loki/rules-temp
alertmanager_url: http://192.168.x.x:9093 # alertmanager地址和端口
ring:
kvstore:
store: inmemory
enable_api: true
enable_alertmanager_v2: true
rule_path: /monitor/loki/rules-temp
为rules临时规则存储目录。
然后在/monitor/loki/rules
下创建名为fake的文件夹,将rule放在该文件夹下。为什么要创建名为fake的文件夹,这个因为Loki中定义单租户的Loki系统中,fake为其默认租户名,如果是多租户系统,则/monitor/loki/rules
下多个其他名字的文件夹也可以。
配置告警规则
这里以下面rule文件为例
# cat election-log-alert.yml
groups:
- name: Too-many-election-logs-alert
rules:
- alert: Too-many-election-logs-alert
expr: count_over_time({host=~"db01|db02|db03|db04"}|~"election"[10m]) > 10
for: 2m
labels:
severity: warnning
instance: " 主机{{ $labels.host }}的日志: {{ $labels.filename }}"
annotations:
summary: Too many election logs in dolphindb logs
description: 10分钟之内DolphinDB日志内election日志出现10次以上
重启Loki,重启脚本在上一篇推文中有写到。看下企业微信,现在可以收到告警啦!
值得注意的是,修改rule配置文件并不需要重启Loki,在Loki的运行日志里面可以看到如下日志,提示rule文件正在被修改
如果不确定rule中的表达式写的是否正确,可以在Grafana先进行预跑,如下图所示:
Loki告警消息格式
Loki告警消息内容示例如下:
{
'receiver': 'wechat-bot',
'status': 'firing',
'alerts': [
{
'status': 'firing',
'labels': {
'alertname': '大量报错日志',
'filename': '/ssd/ssd0/agentlog/P1-node1.log',
'host': 'db01',
'instance': 'logs',
'severity': 'page'
},
'annotations': {
'description': 'Too many error logs',
'summary': 'Too many error logs'
},
'startsAt': '2022-03-24T12:15:50.94Z',
'endsAt': '0001-01-01T00:00:00Z',
'generatorURL': '/graph?g0.expr=%28count_over_time%28%7Bhost%3D%22db01%22%7D%5B1m%5D%29+%3E%3D+0%29&g0.tab=1',
'fingerprint': '84a77cf1f548f633'
},
上面labels的元素包含了rule所定义的元素和Promtail收集时候定义的元素。filename即是path下的文件名。相关配置文件如下所示:
[root@db15 fake]# cat rate-alert.yml
groups:
- name: rate-alerting
rules:
- alert: 大量报错日志
expr: count_over_time(({host="db01"})[2m]) <0
for: 30m
labels:
severity: warnning
instance: "logs"
annotations:
summary: Too many error logs
description: Too many error logs
[root@db01 promtail]# cat promtail-local-config.yml
...
- job_name: dolphindb-datanodelog
static_configs:
- targets:
- localhost
labels:
# #job: datanodelog
host: db01
__path__: /ssd/ssd0/agentlog/P*node*.log
...
如果想知道Loki有哪些告警,他们的详细信息是什么,可以查询其API:
curl -s http://localhost:3100/prometheus/api/v1/alerts
相关文档在这里:https://grafana.com/docs/loki/latest/api
总结
好了,运维的工作目的无非就是解放双手,不要等问题出现再来手忙脚乱,应该节约出更多时间投入到系统优化和运维智能化上面去。