Установите пороговое значение для каждого ключа из агрегации elasticsearch в сегменте

#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"
          }
        }
      }
    }
  }