1、软件环境:
loki:2.4.1,alertmanager:0.24,alertmanager-webhook-telegram-python:0.4
2、loki配置
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目录下:
[[email protected] fake]# pwd /data/loki/rules/fake [[email protected] fake]# ls alert.yml [[email protected] fake]# cat alert.yml groups: - name: nginx500状态太多了 rules: - alert: nginx500状态太多了 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 }} 状态码多了" description: "1分钟内 {{ $labels.job }} 状态码 {{ $labels.host }} 增多" [[email protected] fake]# #$labels变量的使用:需要在查询语句by后面加入要使用的标签,之后才可以在通过类似$labels.host的方式调用,instance、summary、description这些项目的内容需要写在引号内""单双都可以
上面的告警规则是测试监控nginx状态码为500和304在1分钟内的数量大于100机会触发
rule_path: /data/loki/rules/tmp 这个是告警规则临时目录
3、alertmanager配置
配置文件:
[[email protected] alertmanager]# ls alertmanager alertmanager.yml amtool data LICENSE nohup.out NOTICE restart.sh [[email protected] 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'] [[email protected] 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版本,需要用的模块如下:
[[email protected] ~]# 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)
[[email protected] ~]#
没有的可以通过pip3 install安装,启动程序
[[email protected] alertmanager-telegram]# pwd
/data/alertmanager-telegram
[[email protected] alertmanager-telegram]# ls
docker nohup.out README.md requirements.txt telegramalert.py
[[email protected] alertmanager-telegram]# python3 ./telegramalert.py
telegramalert.py这个文件是被我改了名字,可以使用默认的名字
[r[email protected] alertmanager-telegram]# netstat -tunlap| grep python3
tcp 0 0 0.0.0.0:9119 0.0.0.0:* LISTEN 93847/python3
[[email protected] alertmanager-telegram]#
5、测试
当有告警触发时可以通过alertmanager管理页面看到此告警

同时在telegram中也会收到告警信息

完活