前言
很多情况下,反映一个服务的健康状态,单从其服务可用性并不完全准确,反而服务的某些日志可以准确的反映出这个服务是否处于亚健康状态,是否即将出现异常,从而达到提前发现服务问题进行解决的效果,那么这时候基于日志的告警功能就非常有必要
loki的告警对接
我们这里使用alertmanager对接loki的告警
在loki的配置文件中添加如下选项
# rules规则存储
# 主要支持本地存储(local)和对象文件系统(azure, gcs, s3, swift)
ruler:
storage:
type: local
local:
directory: /opt/loki/rules # Loki告警规则存储路径
rule_path: /opt/loki/rules-temp
alertmanager_url: http://alertmanager:9093 # alertmanager地址和端口
ring:
kvstore:
store: inmemory
enable_api: true
enable_alertmanager_v2: true
这里有几点需要注意的:
- loki会将ruler.storage.local.directory里指定的里面的规则文件加载到自己的文件目录: ruler.rule_path
- 修改完规则文件不需要重启loki,loki默认1分钟会加载一次规则文件到自己的文件临时目录
- 我们的规则文件地址要放到fake目录下,原因是
cortextool was intended to run against multi-tenant Loki, commands need an --id= flag set to the Loki instance ID or set the environment variable CORTEX_TENANT_ID. If Loki is running in single tenant mode, the required ID is fake (yes we know this might seem alarming but it’s totally fine, no it can’t be changed)
, loki是支持多租户的,如果我们是单租户的话,是需要在ruler.storage.local.directory指定的目录下面新建一个fake目录,我们的规则文件要存储到这个目录
loki规则做到页面上去统一操作
背景:
- 我们需要叫用户不需要登录环境去看配置文件就知道有哪些规则文件已经在生效
- 我们存在几十个环境,每个环境的规则配置都不完全一致,如果用普通文件的方式维护,维护人员工作量巨大
方案:
由于环境巨多,采用对象文件系统的话需要为每个环境配置不同的文件系统,所以使用本地local的方式进行管理,那么这时候就需要一个同步规则的工具来进行同步
以监控平台为中心的架构
我们以监控平台作为loki的告警规则管理中心,以同步工具为媒介连接监控平台与loki
通过k8s的边车模式在同一个pod中启动两个容器(loki and sync_rule_agent),两个容器挂载同一个volume用于同步告警规则
监控平台和规则同步工具的通信方式
最终效果:
- 将规则放到平台上管理既降低了管理难度同时由于规则在保存时会做校验,保证了规则的正确性
- 更好的做好规则的审计
- 可以做到在一到两分钟生效新增的规则