背景介绍: 对于Kibana的一些数据我们有时候是想要对某些字段进行持续关注的,这时候通过报警的手段就可以大幅提升对这些信息状态了解的及时性及可靠性。使用Sentinl这个kibana开源插件,就可以帮助我们实现这个功能。这里记录一下我的实践过程,主要是对一些业务数据某些字段进行监控报警。

环境:

td-agent 1.0.2 elasticsearch 6.2.2 kibana 6.2.2

安装及简要说明

  • 安装 直接使用命令安装即可
1
/usr/share/kibana/bin/kibana-plugin install https://github.com/sirensolutions/sentinl/releases/download/tag-6.2.2/sentinl-v6.2.2.zip

1

  • 报警邮件配置 修改配置后重启kibana
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#vim /etc/kibana/kibana.yml
sentinl:
  settings:
    email:
      active: true
      user:  xxx.xxx.cn
      password: xxx
      host: smtp.xxx.org
      ssl: true
      timeout: 10000
    report:
      active: true
      tmp_path: /tmp/
  • 配置说明 说到配置结合kibana上自带的Dev Tools会对调试非常有帮助,另外推荐使用json验证的网站对编写好的input进行重新编排检测,方便查看维护

关于配置项简要说明

Type 描述
General 包含Title监控的名称及Schedule执行的时间间隔
INPUT 输入的数据源,可参照下面的例子
Condition 判断条件参考官网示例
Transform How to Adapt or Post-Process data(暂时没有这个需求)
ACTIONS 条件满足后执行的动作
Raw 一般不需要配置,这个是对前面的配置生成的json文件,当然你也可以直接编辑这个文件

配置注意点

  • Condition 我这里基本使用payload.hits.total,由于不怎么熟悉ES的查询语句,刚开始这里有点迷糊,其实通过Kibana的Dev tools写个ES的查询DSL输出一下结果就明白了

{ “script”: { “script”: “payload.hits.total > 1” } }

1
2
3
 我这里配置的意思是前面INPUT匹配到的log条数大于1就触发action
- **ACTIONS**
我这里使用Email,注意Throttle这个参数如名字所示节流阀,当连续报警在这个范围内时,不会发送邮件,很人性化的一个设计

Input配置示例

**提示:**指定index时可以使用*进行通配匹配,默认不指定index会匹配所有index

  • 过滤指定index时间戳是最近两小时的log
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "search": {
    "request": {
      "index": [
        "bilogs-logics-105*"
      ],
      "body": {
        "size": 100,
        "query": {
          "bool": {
            "filter": {
              "range": {
                "@timestamp": {
                  "from": "now-2h"
                }
              }
            }
          }
        }
      }
    }
  }
}
  • 过滤指定index最近2小时内不包含gid:101字段的log
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "search": {
    "request": {
      "index": [
        "bilogs-logics-105*"
      ],
      "body": {
        "size": 100,
        "query": {
          "bool": {
            "must_not": [
              {
                "match": {
                  "gid": 101
                }
              }
            ],
            "filter": {
              "range": {
                "@timestamp": {
                  "from": "now-2h"
                }
              }
            }
          }
        }
      }
    }
  }
}
  • 过滤指定时间范围内指定index中info.VIP为2-10且info.Type字段为VI_HC且info.Value字段小于1000的log
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
  "search": {
    "request": {
      "index": [],
      "body": {
        "size": 20,
        "query": {
          "bool": {
            "must": [
              {
                "range": {
                  "info.VIP": {
                    "gte": 2,
                    "lte": 10
                  }
                }
              },
              {
                "match": {
                  "info.Type": "VI_HC"
                }
              },
              {
                "range": {
                  "info.Value": {
                    "lt": 1000
                  }
                }
              },
              {
                "range": {
                  "@timestamp": {
                    "gte": "2018-03-14T02:42:26.704Z",
                    "lte": "2018-03-14T20:42:26.704Z"
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
}

参考文档

Sentinl 官方文档 Elasticsearch 权威指南 Elastic 官方文档