#elasticsearch #elasticsearch-aggregation
Вопрос:
Мой системный журнал содержит 2 поля: Имя службы и код ответа (000-999), ответ сохраняет результат обработки службы, 000 успешно. Мне нужно подсчитать количество успехов и неудач каждой службы и рассчитать показатель успеха.
"aggs": {
"group_by_service": {
"terms": {
"field": "ServiceName.keyword"
},
"aggs": {
"group_by_count": {
"value_count": {
"field": "ServiceName.keyword"
}
},
"group_by_success": {
"filter": {
"terms": {
"ResponseCode": "000"
}
},
"aggs": {
"group_by_count_succ": {
"value_count": {
"field": "ServiceName.keyword"
}
}
}
},
"success_percent": {
"bucket_script": {
"buckets_path": {
"numbersucess": "group_by_success>group_by_count_succ",
"totalRequests": "group_by_count"
},
"script": "params.numbersucess / params.totalRequests * 100",
"format": "0.00"
}
}
}
}
}
Возвращенные результаты:
"aggregations": {
"group_by_service": {
"doc_count_error_upper_bound": 1859,
"sum_other_doc_count": 94338,
"buckets": [
{
"doc_count": 34361,
"success_percent": {
"value_as_string": "100.00",
"value": 100
},
"group_by_count": {
"value": 34361
},
"group_by_success": {
"doc_count": 34361,
"group_by_count_succ": {
"value": 34361
}
},
"key": "AAA"
},
{
"doc_count": 20474,
"success_percent": {
"value_as_string": "89.27",
"value": 89.26931718276839
},
"group_by_count": {
"value": 20474
},
"group_by_success": {
"doc_count": 18277,
"group_by_count_succ": {
"value": 18277
}
},
"key": "BBB"
},
Мне нужно установить пороговое значение для каждого ключа в ведре:
- Если ключ = AAA, значение success_percent.должно быть больше 80
- Если ключ = BBB, значение success_percent.должно быть больше 90
…
Ключи, которые не соответствуют условиям, будут удалены из корзины, так что, когда я отправлю электронное письмо с предупреждением, я получу только действительные ключи, как я могу это сделать?
Комментарии:
1. можете ли вы добавить отображение и запрос, которые вы пробовали
2. Уважаемый @jaspreetchahal, я обновил пост, я рассчитал количество успехов и скорость каждой услуги, проблема в том, что количество услуг очень велико, мне нужно установить пороговое значение для каждой услуги, чтобы только оповещения по электронной почте для услуг, которые соответствуют условиям
Ответ №1:
Невозможно получить доступ к ключу корзины в агрегации bucket_Selector. Таким образом, мы не можем разместить чек на основе условий. Эта проблема должна быть решена на стороне клиента, или данные должны быть проиндексированы с предварительно рассчитанным значением success_percent
Есть один грязный способ сделать это, используя несколько терминов.
"aggs": {
"group_by_service_A": {
"terms": {
"field": "ServiceName.keyword",
"include":"A" ---> aggregation for "A" only, can also be replaced by filter
},
"aggs": {
"group_by_count": {
"value_count": {
"field": "ServiceName.keyword"
}
},
"group_by_success": {
"filter": {
"term": {
"ResponseCode": "000"
}
},
"aggs": {
"group_by_count_succ": {
"value_count": {
"field": "ServiceName.keyword"
}
}
}
},
"success_percent": {
"bucket_script": {
"buckets_path": {
"numbersucess": "group_by_success>group_by_count_succ",
"totalRequests": "group_by_count"
},
"script": "params.numbersucess / params.totalRequests * 100",
"format": "0.00"
}
},
"filter_bucket": {
"bucket_selector": {
"buckets_path": {
"percent":"success_percent"
},
"script": "if(params.percent > 20) return true;" --> percent for "A"
}
}
}
},
"group_by_service_B": {
"terms": {
"field": "ServiceName.keyword",
"include":"B"---> aggregation for "B" only, can also be replaced by filter
},
"aggs": {
"group_by_count": {
"value_count": {
"field": "ServiceName.keyword"
}
},
"group_by_success": {
"filter": {
"term": {
"ResponseCode": "000"
}
},
"aggs": {
"group_by_count_succ": {
"value_count": {
"field": "ServiceName.keyword"
}
}
}
},
"success_percent": {
"bucket_script": {
"buckets_path": {
"numbersucess": "group_by_success>group_by_count_succ",
"totalRequests": "group_by_count"
},
"script": "params.numbersucess / params.totalRequests * 100",
"format": "0.00"
}
},
"filter_bucket": {
"bucket_selector": {
"buckets_path": {
"percent":"success_percent"
},
"script": "if(params.percent > 30) return true;" --> percent for "B"
}
}
}
}
}