karabanov
@karabanov
Системный администратор

Как агрегировать незначительно различающиеся данные?

Здравствуйте.

Есть запрос с помощью которого можно посчитать перцентили длительности запроса к эндпоинту /api/v1/blabla
Запрос
POST /filebeat-nginx-*/_search
{
  "aggs": {
    "hosts": {
      "terms": {
        "field": "host.name",
        "size": 1000
      },
      "aggs": {
        "url": {
          "terms": {
            "field": "nginx.access.url",
            "size": 1000
          },
          "aggs": {
            "time_duration_percentiles": {
              "percentiles": {
                "field": "nginx.access.time_duration",
                "percents": [
                  50,
                  90
                ],
                "keyed": true
              }
            }
          }
        }
      }
    }
  },
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "should": [
              {
                "prefix": {
                  "nginx.access.url": "/api/v1/blabla" 
                }
              }
            ]
          }
        },
        {
          "range": {
            "@timestamp": {
              "gte": "now-10m",
              "lte": "now" 
            }
          }
        }
      ]
    }
  }
}

Есть проблема с тем, что этот в этот эндпоинт так же передаются некоторые аргументы, например /api/v1/blabla?lang=en&type=active, или /api/v1/blabla/?lang=en&type=history и т.д.

Соответсвенно в ответе видны перцентили по каждому такому "отдельному" эндпоинту:
Ответ
{
                "key" : "/api/v1/blabla?lang=ru",
                "doc_count" : 423,
                "time_duration_percentiles" : {
                  "values" : {
                    "50.0" : 0.21199999749660492,
                    "90.0" : 0.29839999079704277
                  }
                }
              },
              {
                "key" : "/api/v1/blabla?lang=en&type=active",
                "doc_count" : 31,
                "time_duration_percentiles" : {
                  "values" : {
                    "50.0" : 0.21699999272823334,
                    "90.0" : 0.2510000020265579
                  }
                }
              },
              {
                "key" : "/api/v1/blabla?lang=en",
                "doc_count" : 4,
                "time_duration_percentiles" : {
                  "values" : {
                    "50.0" : 0.22700000554323196,
                    "90.0" : 0.24899999797344208
                  }
                }
              }

Скажите пожалуйста можно ли как-то агрегировать похожие эндпоинты в один /api/v1/blabla* и получить общий перцентиль?
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
karabanov
@karabanov Автор вопроса
Системный администратор
В общем решил остановиться на таком решении:
"aggs": {
                        "uri": {
                          "terms": {
                            "script": {
                              "source": "def uri = /(\\/[^\\?]+)\\?.+/.matcher(doc['nginx.access.url'].value);if ( uri.matches() ) {return uri.group(1)}             else { return 'no_match'}"
                            }
                          }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы