loki+alertmanager(webhook)+telegram告警
1、软件环境:
loki:2.4.1,alertmanager:0.24
2、loki配置
loki的全部配置,主要看告警配置
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
path_prefix: /data/loki
storage:
filesystem:
chunks_directory: /data/loki/chunks
rules_directory: /data/loki/rules
replication_factor: 1
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
schema_config:
configs:
- from: 2022-08-08
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
#告警配置
ruler:
storage:
type: local
local:
directory: /data/loki/rules
rule_path: /data/loki/rules/tmp
alertmanager_url: http://172.20.20.169:9093
ring:
kvstore:
store: inmemory
enable_api: true
enable_alertmanager_v2: true
limits_config:
reject_old_samples: true # 是否拒绝旧样本
reject_old_samples_max_age: 72h # 72小时之前的样本被拒绝
chunk_store_config:
max_look_back_period: 72h # 为避免查询超过保留期的数据,必须小于或等于下方的时间值
table_manager:
retention_deletes_enabled: true # 保留删除开启
retention_period: 72h # 超过72h的块数据将被删除
directory: /data/loki/rules 这个目录是保存告警规则配置文件的,需要在这个目录下创建一个fake目录,为什么是fake而不是其他名字,查了资料说是单服务的loki是使用fake这个用户起的服务,而分布式的不需要此目录,需要将告警规则配置文件放在fake目录下:
[root@centos fake]# pwd
/data/loki/rules/fake
[root@centos fake]# ls
alert.yml
[root@centos fake]# cat alert.yml
groups:
- name: nginx500状态太多了
rules:
- alert: nginx500状态太多了2
expr: sum by (host,job,status) (count_over_time({host~="20.161"} | json |status = 200 | __error__="" [1m])) > 0
for: 1m
labels:
severity: warnning
instance: "{{ $labels.host }}"
annotations:
summary: "{{ $labels.status }} 状态码多了111"
description: "1分钟内 {{ $labels.job }} 状态码 {{ $labels.host }} 增多111"
[root@centos fake]#
#$labels变量的使用:需要在查询语句by后面加入要使用的标签,之后才可以在通过类似$labels.host的方式调用,instance、summary、description这些项目的内容需要写在引号内""单双都可以
上面的告警规则是测试监控nginx状态码为500和304在1分钟内的数量大于100机会触发
rule_path: /data/loki/rules/tmp 这个是告警规则临时目录
3、alertmanager配置
配置文件:
[root@centos alertmanager]# ls
alertmanager alertmanager.yml amtool data LICENSE nohup.out NOTICE restart.sh
[root@centos alertmanager]# cat alertmanager.yml
route:
# 报警分组
group_by: ['alertname']
# 在组内等待所配置的时间,如果同组内,10秒内出现相同报警,在一个组内出现。
group_wait: 10s
# 如果组内内容不变化,合并为一条警报信息,1m后发送。
group_interval: 1m
# 发送报警间隔,如果指定时间内没有修复,则重新发送报警。
repeat_interval: 1m
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://172.20.20.169:9119/alert'
send_resolved: true
#这里要根据下一步中web认证来配置
http_config:
basic_auth:
username: 'alert'
password: '123456'
# 抑制器配置
inhibit_rules:
# 源标签警报触发时抑制含有目标标签的警报,在当前警报匹配 severity: 'critical'
- source_match:
severity: 'critical'
# 目标标签值正则匹配,可以是正则表达式如: ".*MySQL.*"
target_match:
severity: 'warning'
# 确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。
equal: ['alertname', 'dev', 'instance']
[root@centos alertmanager]#
告警使用webhook方式,url地址为python版的telegram接口
4、alertmanager-webhook-telegram-python
脚本下载地址:
https://github.com/nopp/alertmanager-webhook-telegram-python
下载后脚本需要修改的地方
#配置web访问认证,true为开启,如果这里开启了认证需要在alertmanager配置中添加认证的配置,见上一步配置文件中的说明
app.config['BASIC_AUTH_FORCE'] = True
app.config['BASIC_AUTH_USERNAME'] = 'alert'
app.config['BASIC_AUTH_PASSWORD'] = '123456'
# bot机器人的id
bot = telegram.Bot(token="56XXXXXXXXXXXXXXXXXXXXXU")
#监听地址和端口
app.run(host='0.0.0.0', port=9119)
安装需要的依赖,首先需要使用python3版本,需要用的模块如下:
[root@centos ~]# pip3 list
certifi (2022.6.15)
Flask (2.0.3)
Flask-BasicAuth (0.2.0)
python-dateutil (2.8.2)
python-telegram-bot (13.12)
telegram (0.0.1)
[root@centos ~]#
没有的可以通过pip3 install安装,启动程序
[root@centos alertmanager-telegram]# pwd
/data/alertmanager-telegram
[root@centos alertmanager-telegram]# ls
docker nohup.out README.md requirements.txt telegramalert.py
[root@centos alertmanager-telegram]# python3 ./telegramalert.py
telegramalert.py这个文件是被我改了名字,可以使用默认的名字
[root@centos alertmanager-telegram]# netstat -tunlap| grep python3
tcp 0 0 0.0.0.0:9119 0.0.0.0:* LISTEN 93847/python3
[root@centos alertmanager-telegram]#
5、测试
当有告警触发时可以通过alertmanager管理页面看到此告警
同时在telegram中也会收到告警信息
完活