elasticsearch 如何按Docker实例对弹性堆栈警报进行分组?
某项定期任务应该每分钟发生一次。在阈值警报中,我可以在以下情况下发送警报elasticsearch 如何按Docker实例对弹性堆栈警报进行分组?,elasticsearch,kibana,elastic-stack,elasticsearch,Kibana,Elastic Stack,某项定期任务应该每分钟发生一次。在阈值警报中,我可以在以下情况下发送警报 WHEN count() GROUPED OVER top 1 'periodicTaskLog' IS BELOW 1 FOR THE LAST 2 minutes (使用基本的手表创建GUI。如果需要,我可以使用高级手表JSON。) 我的复杂之处:此任务在两个或多个Docker实例中单独发生,我想检查它们是否都被阻止。(这是在谷歌AppEngine灵活的环境中。) 我想说“在每个实例中,keyperiodicTask
WHEN count() GROUPED OVER top 1 'periodicTaskLog' IS BELOW 1 FOR THE LAST 2 minutes
(使用基本的手表创建GUI。如果需要,我可以使用高级手表JSON。)
我的复杂之处:此任务在两个或多个Docker实例中单独发生,我想检查它们是否都被阻止。(这是在谷歌AppEngine灵活的环境中。)
我想说“在每个实例中,keyperiodicTaskLog
必须每分钟出现一次,否则发送警报。”
我有字段instance\u name
。每个实例的名称都是一个任意值,如“a58hgh12g2”
或“h9mm48dfh”
,在每个部署中都不同。因此,我无法将条件编码为将这些名称作为文本包含
那么,我如何以这种方式分组呢?请参见答案
首先,您想知道如何用Elastic编写此查询?(我不明白Kibana与您的问题有什么关系)。其次,字段
instance\u name
是一个字段,该字段仅包含您希望检查的Docker实例?“in Elastic”。好的,我做了更正。我可以做一个搜索,只收集这组2-3个实例。因此,将这些实例与其他实例区分开来并不是一个问题。但是查询必须在给定实例中聚合,以分别告诉我每个实例中是否在最后一分钟发生了事件。您不想硬编码实例名称,对吗?但是查询如何知道您有哪些实例呢?在大多数查询语言中,这可以通过在最后一分钟为日志行选择唯一instanceName的子查询来完成
{
"trigger": {
"schedule": {
"interval": "10s"
}
},
"input": {
"search": {
"request": {
"search_type": "query_then_fetch",
"indices": [
"packetbeat-*"
],
"types": [],
"body": {
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"unique_beat_names": {
"terms": {
"field": "ip",
"size": 5
},
"aggs": {
"response_code": {
"filter": {
"exists": {
"field": "dns.response_code"
}
}
}
}
}
}
}
}
}
},
"condition": {
"script": {
"source": "ctx.vars.missing=false;for (def beat_name : ctx.payload.aggregations.unique_beat_names.buckets){if(beat_name.doc_count == 0 || beat_name.response_code.doc_count == 0){ctx.vars.missing=true;}}return ctx.vars.missing;",
"lang": "painless"
}
},
"actions": {
"my-logging-action": {
"logging": {
"level": "info",
"text": "Oh yea"
}
}
}
}