介绍
对日志的异常内容进行邮件报警,是因为在上周公司的线上业务多次出现锁表,开发在优化sql的同时,我也在想是不是可以对日志的异常内容进行检测并实现邮件预警。
使用插件sentinl,sentinl原名KaaE,sentinl这个插件完全可以满足我们的实际需求,接下来我们开始进行安装这个插件。
首先得知道我们的kibana的版本,因为我们安装的插件需要与我们的kibana版本一致。历史版本位置:https://github.com/sirensolutions/sentinl/releases ,我们选择对应版本后复制该版本的zip的链接。例如我5.6.3版本的对应版本的链接是:https://github.com/sirensolutions/sentinl/releases/download/tag-5.6.2/sentinl-v5.6.3.zip
安装插件:
/usr/share/kibana/bin/kibana-plugin install https://github.com/sirensolutions/sentinl/releases/download/tag-5.6.2/sentinl-v5.6.3.zip
安装完成后我们需要重启kibana,才可以让插件生效。
systemctl restart kibana
在kibana主页的左边可以找到sentinl.
安装完之后我们需要先了解一下sentinl的界面里的各个设置的功能。主界面如下图所示。
注意:Watchers表示的是监控计划,Alarms表示的是预警事件,Reports是记录。
创建一个监控计划,具体步骤是:在Watchers 界面——》点击右上角的New——》选择watcher后就可以进入监控计划设置界面了。
General界面:是设置这个监控任务的名称和设置任务运行间隔的时间,图中的设置是每五分钟运行计划任务一次。第一个空是小时,第二个是分钟,最后一个是秒,大家按需设置。
Input界面是设置报警触发源,这里需要重点说下这个,因为这个也是我踩的坑。这边我复制我的Input,大家根据自己的需求改下。
{
"search": {
"request": {
"index": [
"amazon-log-*"//索引名称,我们要在哪个索引日志里进行预警。(这里大家注意对索引名称加上双引号,不加的话会报错)
],
"body": {
"query": {
"bool": {
"must": [
{
"query_string": {
"analyze_wildcard": true,
"query": "\"nested exception is org.hibernate.exception.LockTimeoutException: could not execute statement\""//这里我们也是要注意的点, //黄色部分是转义双引号,因为我的匹配内容里面有特殊符号,两个黄色部分的内容就是我们要预警的内容。
}
},
{
"range": {
"@timestamp": {
"gte": "now-5m",//因为我前面的全局设置是5分钟轮询一次任务,那么我在这里只需要设置检查的范围是过去5分钟的内容
"lte": "now",
"format": "epoch_millis"
}
}
}
],
"must_not": []
}
}
}
}
}
}
在上面的Input的结果就是:在索引"amazon-log-*"里过去五分钟查询包含“nested exception is org.hibernate.exception.LockTimeoutException: could not execute statement
”的日志。
Condition为报警触发条件,当我们在前面匹配到我们的预警内容后,我们在这可以设置一个阈值,比如我们设置为0时,就意味着只要匹配到就会触发,设置为1时,只有出现大于1才会触发。
Transform是一个附属条件,暂时没有发现他的用处。
接下来就是:Action也就是触发后的动作,我们这里选择的是邮件。
Raw是对所有的设置进行展示,我们如果在此次修改的内容只有点击右上角的保存后重新打开才可以在Raw里看到所有的配置。
在这边设置好了我们需要在服务器上配置邮件发送服务。
这里分为三步,第一就是对邮箱开启POP3/SMTP/IMAP服务,并获得授权码或者密码,第二是kibana的邮件设置,第三步就是mailx的邮件设置。
首先我们来解决的对发件邮箱设置POP3/SMTP/IMAP服务,这边我们建议使用163邮箱,因为我在使用QQ邮箱作为发件箱的时候发现是发不出去的,QQ邮箱需要SSL协议的支持,但是我使用163邮箱是可以正常发出邮件的。(虽然我们也可以设置SSL,但是我们这里为了方便就没有使用)
第一登录163邮箱,在163邮箱-----》设置----》选择POP3/SMTP/IMAP。获取授权码。(保存好,是等下我们在邮件配置的时候需要填入的内容)
第二是kibana的邮件设置。编辑kibana.yml在末尾加入以下内容。
sentinl:
settings:
email:
active: true
user: 发件邮箱
password: 密码
host: smtp.163.com
ssl: false
report:
active: true
tmp_path: /tmp/
因为我是不使用ssl协议,所以我将ssl设置为false。
第三是mailx的设置。首先我们需要安装mailx,使用它来发送邮件。
yum install -y mailx
然后我们需要配置mailx。在/etc/mail.rc配置文件的末尾加上以下内容。
set from=demo@163.com
set smtp=smtp.163.com
set smtp-auth-user=demo
set smtp-auth-password=demopass
set smtp-auth=login
配置好了后我们试试我们是否可以发送邮件。测试邮件发送:
echo "this is test" |mailx -v -s "Test" "收件邮箱"
然后我们可以看看收件邮箱有没有收到,如果没有收到看看发件过程中是否有error,也可以看看我们的垃圾邮件里面有没有。
有的时候有的服务器厂商是会将邮件服务的某些端口屏蔽的,所以我们可以在发送失败后用telnet邮件服务器看看是否被屏蔽。
如果上面是成功发送的话,那么我们将进行最后一步了。就是重启kibana,然后手动触发下,看看能不能接收到预警邮件。(一定要重启让配置生效)
以上就是我在安装kibana插件 sentinl实现邮件报警的整个过程。
kibana sentinl webhook实现自定义报警
背景:
目前每个应用都有各自的负责人,现有的报警机制无法满足 根据应用不同发送给不同的人,kibana的默认报警无法灵活的去展示报警信息。经过一段时间的预研,还是决定选择webhook的形式 中转之后展示自定义的信息。
报警邮件效果如图:
点击详情跳转到上下文:
在有安装sentinl的kibana里配置webhook日志报警:
{
"actions": {
"Webhook_86ccf137-5981-402e-bb04-a3d7b1ea6fa6": {
"name": "Webhook",
"webhook": {
"priority": "high",
"stateless": false,
"method": "POST",
"host": "192.168.10.190",
"port": "8002",
"path": "/api/logs/mail/error_logs_notify",
"body": "[{{#payload.results}}{\"appName\": \"{{appName}}\", \"errors\": [{{#errors}}{\"type\": \"{{type}}\",\"index\": \"{{index}}\",\"id\": \"{{id}}\", \"message\": \"{{message}}\"}{{#comma_e}},{{/comma_e}}{{/errors}}]}{{#comma_b}},{{/comma_b}}{{/payload.results}}]",
"headers": {
"Content-Type": "application/json"
}
}
}
},
"input": {
"search": {
"request": {
"index": [
"isys*"
],
"body": {
"query": {
"bool": {
"must": [
{
"match": {
"loglevel": "ERROR"
}
},
{
"range": {
"@timestamp": {
"gte": "now-10m",
"lt": "now"
}
}
}
]
}
},
"aggs": {
"app_errors": {
"terms": {
"field": "appname.keyword"
},
"aggs": {
"errors": {
"top_hits": {
"size": 10,
"_source": {
"includes": [
"message"
]
}
}
}
}
}
}
}
}
}
},
"condition": {
"script": {
"script": "payload.hits.total > 0"
}
},
"transform": {
"script": {
"script": "payload.results=[];payload.aggregations.app_errors.buckets.forEach(function(b,bi){var r={};r.appName=b.key;r.errors=[];if(bi!=payload.aggregations.app_errors.buckets.length-1){r.comma_b=true}b.errors.hits.hits.forEach(function(h,hi){var v={};v.id=h._id;v.type=h._type;v.index = h._index;v.message=escape(h._source.message);if(hi!=b.errors.hits.hits.length-1){v.comma_e=true}r.errors.push(v)});payload.results.push(r)})"
}
},
"trigger": {
"schedule": {
"later": "every 10 minutes"
}
},
"disable": true,
"report": false,
"title": "isyscore_error_watcher",
"save_payload": false,
"spy": false,
"impersonate": false
}
webhook的项目
"kibana-sentinl-mail"
使用kibana Sentinl webhook 实现日志报警功能
Sentin-config 为kibana Sentinl的配置文件
安装依赖包 pip3 install -r requirements.txt
启动:
先设置环境变量:
EMAIL_HOST:SMTP服务地址:默认值:smtp.exmail.qq.com
EMAIL_PORT: SMTP 端口: 默认值:465
EMAIL_HOST_USER: 发件人邮箱
EMAIL_HOST_PASSWORD: 邮箱登录密码
EMAIL_USE_SSL: 是否开启HTTPS 默认为True
EMAIL_FROM: 邮件别名
KIBANA_URL: kibana的URL地址
KIBANA_DATE_TIME: kibana查询时间范围默认now-1h
EMAIL_TO 类型为JSON 串 在setting.py里设置,key为项目名,value为json类型 key为名称,value为邮箱地址 设置方法例如: export EMAIL_HOST=smtp.exmail.qq.com
python3 manager runserver 192.168.10.190:8002
参考链接 :
kibana sentinl webhook实现自定义报警 :https://blog.csdn.net/qq_22543991/article/details/103034895