文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/105340379
在Elasticsearch可以提供给我们数据的存储及快速的搜索,但是如果能够实时地根据一些条件来发送警报则对我们的应用来说将会非常地有用。在今天的文章中,我们将讲述如何使用API的方法利用Elasticsearch来生成警报。
我们今天的配置环境如下:
在上面,我们使用一个MacOS来安装我们的Elasticsearch及Kibana,同时在一个虚机上安装我们的Filebeat。在下面的配置中,我们将讲述该如何进行安装。
安装
Elasticsearch
在安装完后,我们需要做如下的调整。打开config/elasticsearch.yml文件,并修改:
cluster.name: elasticsearch
network.host: 0.0.0.0
discovery.type: single-node
在这里我们配置一个节点的Elasticsearch,同时我们配置network.host: 0.0.0.0,这样保证我们的Elasticsearch绑定于每一个网路接口上。
修改完上面的配置后,我们重新启动Elasticsearch:
我们可以在Elasticsearch启动的Log里找到相应的启动地址。我们在浏览器中打入上面显示的地址:192.168.0.100:9200
如果我们能够看到上面的输出,那么则表明我们的Elasticsearch安装是成功的。
Kibana安装
为了能够使得我们的Kibana能访问Elasticsearch及被我们的Beats所访问到,我们必须修改config/kibana的相应的配置:
server.host: "192.168.0.100"
elasticsearch.hosts: ["http://192.168.0.100:9200"]
我们在自己的浏览器中打入如下地址:
如果你能发现上面的界面,则表明你的Kibana的安装是成功的。
为了能够实现对log的监控,我们必须使用Start a 30-day trial授权:
Filebeat安装
打开我们的Kibana界面:
我们点击Add log data:
找到System logs:
Ubuntu OS是Debian系统。我们选择DEB平台,让后严格地安照上面的信息来进行安装。在这里我必须指出的是:我们必须修改/etc/filebeat/filebeat.yml文件的配置以使得filebeat能够连接上我们的Kibana及Elasticsearch。为此,我们打开filebeat.yml配置文件,对该文件进行如下的修改:
sudo vi /etc/filebeat/filebeat.yml
在这里,我们必须注意的是:替换上面的IP地址为你自己电脑上的IP地址。这个IP地址是你的Elasticsearch及Kibana的运行IP地址。你可以通过ifconfig命令来获得。
一旦完成上面的配置后,我们安装Kibana中的命令:
sudo service filebeat start
来启动filebeat这个服务。如果我们安装正确的话,我们可以在Kibana中看到数据进来:
如果我们能够看到有数据在上面的Discover中来,则表明我们的Filebeat的安装是成功的。
我们可以在Ubuntu的terminal中打入如下的命令:
sudo logger -t JUSTME this is message 2
等过一点时间,我们通过Kibana来查询我们的数据:
上面的命令生成一个process.name为JUSTME的log信息。我们可以在Kibana中查询到这个信息。
Watcher API
我们将使用Watcher API来进行监控。请大家参考Elastic的官方文档https://www.elastic.co/guide/en/elasticsearch/reference/current/watcher-api.html。简单地说,为了配置一个Watcher,我们必须配置如下的几个:
PUT _watcher/watch/my-justme-watcher
{
"trigger": {},
"input": {},
"condition": {},
"actions": {}
}
我们下面来分别进行描述:
trigger
这个定义多次实践watcher运行一次。比如我们可以定义如下:
"trigger": {
"schedule" : {
"interval": "1h"
}
},
上面表明,我们希望watcher每一个小时运行一次。针对我们的情况,我们定义为:
"trigger": {
"schedule": {
"cron": "0 0/1 * * * ?"
}
},
上面表明,我们希望每一分钟运行一次。
input
这个是定义alert想搜索的index,及针对多长时间的index来进行的搜索的:
"input": {
"search": {
"request": {
"indices": [
"filebeat-*"
],
"body": {
"query": {
"bool": {
"must": {
"match": {
"process.name": "JUSTME"
}
},
"filter": {
"range": {
"@timestamp": {
"from": "{{ctx.trigger.scheduled_time}}||-5m",
"to": "{{ctx.trigger.triggered_time}}"
}
}
}
}
}
}
}
}
},
在上面,我们想针对filebeat-*的索引来进行搜索。如果process.name含有JUSTME,则表明有一个匹配。同时我们针对在过去5分钟内发生的事件来进行查询。
condition
我们定义如下:
"condition" : {
"compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
},
上面显示如果在查询结果中,有至少一个的结果,那么就会发送出alert。
actions
这个是定义当上面的condition被满足时,需要采取的一些行动。这些行动可以在地址找到。目前Watcher支持的action为: email,webhook,index,logging,slack及pagerduty。
我们使用最简单的logging:
"actions": {
"log": {
"logging": {
"text": "WARNING: find JUSTME(s) in filebeat in the last 5 minutes"
}
}
}
如果大家想如何实现Slack的通知,请参考文章X-Pack:创建阈值检查警报 。
经过上面的配置后,我们alert配置如下:
PUT _watcher/watch/my-justme-watcher
{
"trigger": {
"schedule": {
"cron": "0 0/1 * * * ?"
}
},
"input": {
"search": {
"request": {
"indices": [
"filebeat-*"
],
"body": {
"query": {
"bool": {
"must": {
"match": {
"process.name": "JUSTME"
}
},
"filter": {
"range": {
"@timestamp": {
"from": "{{ctx.trigger.scheduled_time}}||-5m",
"to": "{{ctx.trigger.triggered_time}}"
}
}
}
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 0
}
}
},
"actions": {
"log": {
"logging": {
"text": "WARNING: find JUSTME(s) in filebeat in the last 5 minutes"
}
}
}
}
执行上面的命令。显示结果:
{
"_id" : "my-justme-watcher",
"_version" : 1,
"_seq_no" : 6,
"_primary_term" : 1,
"created" : true
}
测试Watcher
在很多情况下,如果我们设置的时间比较久,我们可能等不了那么久才做一个测试。Elastic为了方便我们的测试,提供了_execute接口:
PUT _watcher/watch/my-justme-watcher/_execute
通过上面的接口,我们不需要等在schedule中设置的那么久的时间才运行一下我们的watcher。上面的命令可以直接帮我们运行watcher。
针对我们的情况,我们在Ubuntu OS的terminal中运行如下的命令:
sudo logger -t JUSTME this is message 3
我们切换到Elasticsearch的运行terminal中,等一小会,我们可以看到:
上面显示,我们已经有一个事情发生了:在filebeat的log里找到含有JUSTME的事件。上面的信息虽然显示了有JUSTME的事件发生了,但是它并没有显示有多少个事件发生了。为此,我们需要修改一下我们的watcher:
PUT _watcher/watch/my-justme-watcher
{
"trigger": {
"schedule": {
"cron": "0 0/1 * * * ?"
}
},
"input": {
"search": {
"request": {
"indices": [
"filebeat-*"
],
"body": {
"query": {
"bool": {
"must": {
"match": {
"process.name": "JUSTME"
}
},
"filter": {
"range": {
"@timestamp": {
"from": "{{ctx.trigger.scheduled_time}}||-5m",
"to": "{{ctx.trigger.triggered_time}}"
}
}
}
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 0
}
}
},
"actions": {
"log": {
"logging": {
"text": "WARNING: find {{ctx.payload.hits.total}} JUSTME(s) in filebeat in the last 5 minutes"
}
}
}
}
在上面,我们使用ctx.payload.hits.total来展示发生了几次。再次我们在Ubuntu的terminal中连续打入如下的几个log信息:
我们连续地生成5个含有JUSTME的事件,我们再次回到Elasticsearch运行的terminal中查看:
在这一次,我们正确地显示了有5个这样的事件。