在我之前的文章“X-Pack:创建阈值检查警报”,我介绍了如何在Kibana中创建一个阈值的警报。这个在很多的情况下是非常有用的,比如我们监控的一个指标,当它超过或低过一个阈值时,那么它就会发生一个警报。但是在实际的生活中,我们也有很多的情况下,我们想动态地设置一个阈值,而不是一个固定的阈值。比如,我们炒股的时候,我们想我们的股票5分钟之内涨幅超过10%,或者跌过10%,这个时候我们想得到一个警报。这意味着可能有人在操盘我们的股票,需要我们人工的干预。
在今天的文章中,我们来介绍如何创建一个动态的阈值。我们还是可以通过我们电脑的metricbeat数据为例。
安装
如果大家还没有安装好自己的自己的环境的话,请参阅我之前的文章“Elastic:创建你的第一个Elastic alert”来设置自己的环境。在今天的练习中,我们需要在Ubuntu OS里安装metricbeat来收集电脑的指标信息。
安装Metricbeat
我们首先打开我们的Kibana:
我们点击上面的Add metric data 按钮:
我们点击上面的System metrics:
我们选择DEB平台,这是因为Ubuntu是Debian平台。我们按照上面的步骤进行按照。在这里需要指出的是,我们必须对metricbeat.yml进行配置,以使得metricbeat可以连接到我们的Kibana及Elasticsearch。我们在metricbeat.yml文件中做如下的修改:
及
等我们启动完metricbeat后,我们可以在Kibana中看到数据了:
如果我们能够看到上面的数据,则表明我们的metricbeat安装正确。
查询数据
接下来,我们想对我们的metricbeat数据进行查询:
- 只对过去的10分钟的数据感兴趣
- 我们对每隔5分钟的数据做一个聚合,如果上一个5分钟的数据和接下来的5分钟的数据的指标数据有10%的上升,我们将发送警报
我们仿照之前的我文章“X-Pack:创建阈值检查警报”,我们还是以字段system.memory.used.pct (percentage of CPU time)为例。我们来创建如下的搜索:
GET metricbeat-7.6.0/_search
{
"size": 0,
"query": {
"bool": {
"filter": {
"range": {
"@timestamp": {
"from": "now-10m",
"to": "now"
}
}
}
}
},
"aggs": {
"five_min": {
"filters": {
"filters": {
"latest5" : {
"range": {
"@timestamp": {
"gte": "now-5m",
"lte": "now"
}
}
},
"previous5": {
"range": {
"@timestamp": {
"gte": "now-10m",
"lte": "now-5m"
}
}
}
}
},
"aggs": {
"avg_pct": {
"avg": {
"field": "system.memory.used.pct"
}
}
}
}
}
}
上面的查询的结果显示:
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 926,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"five_min" : {
"buckets" : {
"latest5" : {
"doc_count" : 462,
"avg_pct" : {
"value" : 0.18
}
},
"previous5" : {
"doc_count" : 464,
"avg_pct" : {
"value" : 0.18
}
}
}
}
}
}
在上面我们可以看到有两个桶:lastest5及previous5。对应于这两个bucket来看,分别及算出来它们的avg_pct。从数据显示来看,目前,我的电脑的load并不是太重。
创建watcher
根据我们之前文章的教程“Elastic:创建你的第一个Elastic alert”,我们重复之前的步骤。
简单地说,为了配置一个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": [
"metricbeat-*"
],
"body": {
"size": 0,
"query": {
"bool": {
"filter": {
"range": {
"@timestamp": {
"from": "now-10m",
"to": "now"
}
}
}
}
},
"aggs": {
"five_min": {
"filters": {
"filters": {
"latest5": {
"range": {
"@timestamp": {
"gte": "now-5m",
"lte": "now"
}
}
},
"previous5": {
"range": {
"@timestamp": {
"gte": "now-10m",
"lte": "now-5m"
}
}
}
}
},
"aggs": {
"avg_pct": {
"avg": {
"field": "system.memory.used.pct"
}
}
}
}
}
}
}
}
}
我们把我们上面的search的语句拷贝过来。这样就可以了。
condition
在这里,我们想如果CPU的使用在过去5分钟之内上升了10%,那么我就发生警报。在这里我们使用过script来完成这个工作:
"condition": {
"script": {
"source": "return ctx.payload.aggregations.five_min.buckets.latest5.avg_pct.value > 1.1* ctx.payload.aggregations.five_min.buckets.previous5.avg_pct.value"
}
},
请查看我们之前的那个查询的语句。我们不难理解上面的判断。
actions
这个是定义当上面的condition被满足时,需要采取的一些行动。这些行动可以在地址找到。目前Watcher支持的action为: email,
webhook,
index,
logging,
slack及
pagerduty。
在今天的练习中,我们使用最简单的logging:
"actions": {
"log": {
"logging": {
"text": "WARNING: CPU usage has increased by 10% in the past 5 mins"
}
}
}
经过上面的配置过后,我们完整的system_memory_watcher的设计就完成了:
PUT _watcher/watch/system_memory_watcher
{
"trigger": {
"schedule": {
"cron": "0 0/1 * * * ?"
}
},
"input": {
"search": {
"request": {
"indices": [
"metricbeat-*"
],
"body": {
"size": 0,
"query": {
"bool": {
"filter": {
"range": {
"@timestamp": {
"from": "now-10m",
"to": "now"
}
}
}
}
},
"aggs": {
"five_min": {
"filters": {
"filters": {
"latest5": {
"range": {
"@timestamp": {
"gte": "now-5m",
"lte": "now"
}
}
},
"previous5": {
"range": {
"@timestamp": {
"gte": "now-10m",
"lte": "now-5m"
}
}
}
}
},
"aggs": {
"avg_pct": {
"avg": {
"field": "system.memory.used.pct"
}
}
}
}
}
}
}
}
},
"condition": {
"script": {
"source": "return ctx.payload.aggregations.five_min.buckets.latest5.avg_pct.value > 1.1* ctx.payload.aggregations.five_min.buckets.previous5.avg_pct.value"
}
},
"actions": {
"log": {
"logging": {
"text": "WARNING: CPU usage has increased by 10% in the past 5 mins"
}
}
}
}
运行上面的命令。
监视电脑的运行情况
我们可以打开我们的电脑开始看一些视频,做一些事情。比如下载一些东西之类的。当然这些必须发生在我们的Ubuntu OS里。我们也可以打开Metricbeat的Dashboard:
从上面,我们可以看出来在操作一些东西后CPU的使用率上来了。我们也可以使用如下的指令来运行我们的watcher而不用等每隔1分钟运行一次:
PUT _watcher/watch/system_memory_watcher/_execute
依赖于你系统的使用情况,我们可以在某个时间点上,watcher将被触发: