Alertmanager对接Loki实现日志告警 | 坑我已经帮你们踩好了

前言

很多情况下,反映一个服务的健康状态,单从其服务可用性并不完全准确,反而服务的某些日志可以准确的反映出这个服务是否处于亚健康状态,是否即将出现异常,从而从一定程度进行故障预测和干预。

如下图所检索出来的WARNING 日志,大量的WARNINGERROR或者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

总结

好了,运维的工作目的无非就是解放双手,不要等问题出现再来手忙脚乱,应该节约出更多时间投入到系统优化和运维智能化上面去。

合智互联客户成功服务热线:400-1565-661

admin
admin管理员

上一篇:YARN的机架感知功能
下一篇:

留言评论

暂无留言