Наблюдатель за Elastic APM в курсе групп
Недавно мы перешли от Opbeat к Elastic APM. К сожалению, у нас нет предыдущего опыта в Elastic Search или X-Pack. Мы пытались создать наблюдателя, который отправлял бы по электронной почте только в том случае, если за последние 6 часов не было сообщено ни о какой другой ошибке той же группы.
Я пытался сделать это, следуя одному примеру, который я нашел в Github, но кажется, что он не работает должным образом, поскольку я использую цепочечные запросы для сравнения одного и другого, и я получаю одинаковые результаты для обоих, даже когда, в теории оба работают для разных диапазонов:
{
"trigger": {
"schedule": {
"interval": "2m"
}
},
"input": {
"chain": {
"inputs": [
{
"raised_errors": {
"search": {
"request": {
"indices": [
"<apm-6.3.0-error-*>"
],
"body": {
"query": {
"bool": {
"must": {
"range": {
"@timestamp": {
"gte": "now-{{ctx.metadata.window_period}}"
}
}
}
}
},
"aggs": {
"grouping_key": {
"terms": {
"field": "error.grouping_key",
"size": 1000
}
}
},
"size": 0
}
}
}
}
},
{
"history_raised_errors": {
"search": {
"request": {
"indices": [
"<apm-6.3.0-error-*>"
],
"body": {
"query": {
"bool": {
"must": [
{
"terms": {
"grouping_key": [
"{{#ctx.payload.raised_errors.aggregations.grouping_key.buckets}}{{key}}",
"{{/ctx.payload.raised_errors.aggregations.grouping_key.buckets}}"
]
}
},
{
"range": {
"@timestamp": {
"lt": "now-{{ctx.metadata.window_period}}",
"gte": "now-{{ctx.metadata.window_period}}-{{ctx.metadata.window_period}}"
}
}
}
]
}
},
"aggs": {
"grouping_key": {
"terms": {
"field": "error.grouping_key",
"size": 10
}
}
},
"size": 0
}
}
}
}
}
]
}
},
"condition": {
"script": {
"source": "return ctx.payload.raised_errors.aggregations.grouping_key.buckets.size() != ctx.payload.history_raised_errors.aggregations.grouping_key.buckets.size();",
"lang": "painless"
}
},
"metadata": {
"window_period": "6h"
},
"transform": {
"script": {
"source": "def history=ctx.payload.history_raised_errors.aggregations.grouping_key.buckets.stream().map(p -> p.key).collect(Collectors.toList()); def new_starts=ctx.payload.raised_errors.aggregations.grouping_key.buckets.stream().map(e -> e.key).filter(p -> !history.contains(p)); return new_starts.map(p -> p.replace('-',' on server ')).collect(Collectors.toList());",
"lang": "painless"
}
},
"actions": {
"log": {
"logging": {
"text": "Processes started:{{#ctx.payload._value}}{{.}}:{{/ctx.payload._value}}"
}
}
}
}
Любой намек на то, что мы делаем неправильно, будет высоко оценен.