Как получить единственное значение и выполнить условную проверку в синтаксисе запроса asticsearch для процентов с помощью плагина sentinl
Я использую Elasticsearch 6.4 и Kibana 6. Также я использую плагин Sentinl.
https://github.com/sirensolutions/sentinl
Этот плагин является бесплатной альтернативой наблюдателям и мониторингу xpact. Однако, я испытываю затруднения в правильном написании запросов наблюдателя. Я хочу просто получить последнее значение процента и предупредить, когда установленный процент выше 90%.
Мой запрос:
{
"actions": {
"email_html_alarm_4b1479be-5e70-492e-9e02-fb08412510ee": {
"name": "Check CPU Usage Usage for ip-172-0-0-0",
"throttle_period": "1m",
"email_html": {
"stateless": false,
"to": "g@g.com",
"from": "g@g.com",
"subject": "Critical CPU Usage Percent over 90% : {{ payload.aggregations.cpu_used.value }}",
"priority": "high",
"html": "<p>Your elasticsearch is using more than 90% of its CPU: {{ payload.aggregations.cpu_used.value }}. Please scale the cluster. found by the watcher <i>{{watcher.title}}</i>.</p>"
}
}
},
"input": {
"search": {
"request": {
"index": [
"metricbeat-*"
],
"body": {
"from": 0,
"size": 1,
"query": {
"bool": {
"must": [
{
"exists": {
"field": "system.cpu.total.pct"
}
}
],
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-20s"
}
}
},
{
"query_string": {
"query": "beat.name:ip-172-0-0-0"
}
}
]
}
},
"aggs": {
"cpu_used": {
"terms": {
"field": "system.cpu.total.pct",
"size": 1
}
}
}
}
}
}
},
"condition": {
"array_compare": {
"payload.aggregations.cpu_used.buckets": {
"path": "key",
"gt": {
"value": 0.9
}
}
}
},
"trigger": {
"schedule": {
"later": "every 2 minutes"
}
},
"disable": true,
"report": true,
"title": "CPU Check for ip-172-0-0-0",
"wizard": {},
"save_payload": false,
"spy": false,
"impersonate": false
}
Проблема с этим наблюдателем заключается в том, что он сработает, когда значение будет равно 0,1445555, и оно не будет больше или равно 0,9000, что означает gte.
Когда я запускаю свой запрос в инструментах разработчика в kibana, он возвращает следующее:
{
"took": 86,
"timed_out": false,
"_shards": {
"total": 354,
"successful": 354,
"skipped": 331,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "metricbeat-production-6.4.2-2018.10.25",
"_type": "doc",
"_id": "T4KBrGYBIGbF3wm-Wgpd",
"_score": 1,
"_source": {
"@timestamp": "2018-10-25T18:34:09.872Z",
"host": {
"name": "ip-172-0-0-0"
},
"metricset": {
"name": "cpu",
"module": "system",
"rtt": 153
},
"system": {
"cpu": {
"user": {
"pct": 0.1235
},
"idle": {
"pct": 1.4769
},
"nice": {
"pct": 0
},
"irq": {
"pct": 0
},
"steal": {
"pct": 0.002
},
"total": {
"pct": 0.1406
},
"cores": 2,
"softirq": {
"pct": 0.001
},
"system": {
"pct": 0.0141
},
"iowait": {
"pct": 0.3825
}
}
},
"beat": {
"hostname": "ip-172-0-0-0",
"version": "6.4.2",
"name": "ip-172-0-0-0"
}
}
}
]
},
"aggregations": {
"cpu_used": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 1,
"buckets": [
{
"key": 0.14100000000000001,
"doc_count": 1
}
]
}
}
}
Учитывая логику сравнения массивов, это не должно срабатывать при срабатывании аварийного сигнала, поскольку значение ключа составляет всего 0,14, а не gte0,90, так что это заставляет меня поверить, что я не получаю правильное значение.
Sentinl описывает сравнение массивов как:
Условие сравнения массива Используйте array_compare для сравнения массива значений. Например, следующее условие array_compare возвращает true, если в агрегации есть хотя бы один сегмент, у которого значение doc_count больше или равно 25:
"condition": {
"array_compare": {
"payload.aggregations.top_amounts.buckets" : {
"path": "doc_count" ,
"gte": {
"value": 25,
}
}
}
}
Опции
Имя Описание array.path Путь к массиву в контексте выполнения, указанный в точечной нотации array.path.path Путь к полю в каждом элементе массива, который вы хотите оценить array.path.operator.quantifier Сколько требуется совпадений для сравнения оценить как истинное: some
или же all
, По умолчанию some
должно быть хотя бы одно совпадение. Если массив пуст, сравнение оценивается как false array.path.operator.value Значение, с которым сравнивать
Может ли кто-нибудь помочь мне с тем, что я делаю не так с моим наблюдателем и / или запросом... Кажется, я не могу получить его, чтобы получить процент и проверить значение процента.
0 ответов
Это запросы, которые в итоге работали с метрической долей.
{
"actions": {
"email_html_alarm_4b1479be": {
"name": "Check Disk Usage for ip-0-0-0-0",
"throttle_period": "1m",
"email_html": {
"stateless": false,
"to": "test@test.com",
"from": "test@test.com",
"subject": "Critical /dev/xvda1 Available Bytes: {{ payload.aggregations.disk_used.value }}",
"priority": "high",
"html": "<p>Your elasticsearch node only has: {{ payload.aggregations.disk_used.value }} bytes available. Please snapshot and clean old indexes. found by the watcher <i>{{watcher.title}}</i>.</p>"
}
}
},
"input": {
"search": {
"request": {
"index": [
"metricbeat-*"
],
"body": {
"from": 0,
"size": 1,
"query": {
"bool": {
"must": [
{
"exists": {
"field": "system.filesystem.used.pct"
}
},
{
"match": {
"system.filesystem.device_name": "/dev/xvda1"
}
}
],
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-1m"
}
}
},
{
"query_string": {
"query": "beat.name:ip-0-0-0-0"
}
}
]
}
},
"aggs": {
"disk_used": {
"avg": {
"field": "system.filesystem.available"
}
}
}
}
}
}
},
"condition": {
"script": {
"script": "payload.aggregations.disk_used.value < 490497080832"
}
},
"trigger": {
"schedule": {
"later": "every 2 minutes"
}
},
"disable": false,
"report": true,
"title": "ESDisk",
"wizard": {},
"save_payload": false,
"spy": false,
"impersonate": false
}
######CPUCHECK
Второй запрос
{
"actions": {
"email_html_alarm_4b1479be": {
"name": "Check CPU Usage Usage for ip-0-0-0-0",
"throttle_period": "1m",
"email_html": {
"stateless": false,
"to": "test@test.com",
"from": "test@test.com",
"subject": "Critical CPU Usage Percent over 90% : {{ payload.aggregations.cpu_used.value }}",
"priority": "high",
"html": "<p>Your elasticsearch is using more than 90% of its CPU: {{ payload.aggregations.cpu_used.value }}. Please scale the cluster. found by the watcher <i>{{watcher.title}}</i>.</p>"
}
}
},
"input": {
"search": {
"request": {
"index": [
"metricbeat-*"
],
"body": {
"from": 0,
"size": 1,
"query": {
"bool": {
"must": [
{
"exists": {
"field": "system.cpu.total.pct"
}
}
],
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-20s"
}
}
},
{
"query_string": {
"query": "beat.name:ip-0-0-0-0"
}
}
]
}
},
"aggs": {
"cpu_used": {
"terms": {
"field": "system.cpu.total.pct",
"size": 1
}
}
}
}
}
}
},
"condition": {
"array_compare": {
"payload.aggregations.cpu_used.buckets": {
"path": "key",
"gte": {
"value": 0.90
}
}
}
},
"trigger": {
"schedule": {
"later": "every 2 minutes"
}
},
"disable": true,
"report": true,
"title": "CPU Check for ip-0-0-0-0",
"wizard": {},
"save_payload": false,
"spy": false,
"impersonate": false
}