Сценарий Kibana, который проходит через массив - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь использовать http-модуль metricbeat для мониторинга пулов F5.

Я делаю запрос к API f5 и возвращаю json, который сохраняется в кибане. Но json содержит массив членов пула, и я хочу посчитать число, которое выросло.

Похоже, совет заключается в том, что это можно сделать с помощью скриптового поля. Тем не менее, я не могу получить скрипт для получения массива. например,

doc['http.f5pools.items.monitor'].value.length()

возвращает результаты предварительного просмотра с тем же «Дополнительным полем», добавленным для сравнения:

[
 {
  "_id": "rT7wdGsBXQSGm_pQoH6Y",
  "http": {
   "f5pools": {
    "items": [
     {
      "monitor": "default"
     },
     {
      "monitor": "default"
     }
    ]
   }
  },
  "pool.MemberCount": [
   7
  ]
 },

Если я попытаюсь

doc['http.f5pools.items']

Или похоже, я просто получаю сообщение об ошибке:

"reason": "No field found for [http.f5pools.items] in mapping with types []"

Google указывает, что конструкция doc не содержит массивов?

  1. Можно ли создать поле со сценарием, которое будет иметь доступ к набору значений? то есть мой код или то, как я индексирую данные, неверны.
  2. Если нет, есть ли альтернативный подход в метрических битах? Я не хочу делать совершенно новый API для расчета и добавить отдельное поле

- обновление.

Странно кажется, что числовые значения в массиве возвращают ожидаемые результаты. то есть.

doc['http.f5pools.items.ratio']

возвращается

 {
  "_id": "BT6WdWsBXQSGm_pQBbCa",
  "pool.MemberCount": [
   1,
   1
  ]
 },

- обновление 2

Хорошо, поэтому, если строки в поле имеют разные значения, вы получите все значения. если они одинаковы, вы просто получаете один. WTF?

Ответы [ 3 ]

1 голос
/ 22 июня 2019

Я добавляю другой ответ вместо того, чтобы удалить свой предыдущий, который не является актуальным вопросом, но все же может быть полезным для кого-то еще в будущем.

Я нашел подсказку в той же документации :

Значения документов - это столбчатое хранилище значений полей

При дальнейшем поиске я нашел это Doc Value Intro , в котором говорится, что документзначения по сути являются «необратимыми индексами», полезными для таких операций, как сортировка;моя гипотеза заключается в том, что при сортировке вы, по сути, не хотите повторять одни и те же значения, и, следовательно, структура данных, которую они используют, удаляет эти дубликаты.Это все еще не ответило относительно того, почему это работает иначе для строки чем число.Числа сохраняются, но строки являются фильтрами в уникальные.

Эту «неинвертированную» структуру часто называют «хранилищем столбцов» в других системах.По сути, он хранит все значения для одного поля вместе в одном столбце данных, что делает его очень эффективным для таких операций, как сортировка.

В Elasticsearch это хранилище столбцов известно как значения doc ивключен по умолчанию.Значения документа создаются во время индексации: когда поле индексируется, Elasticsearch добавляет токены в инвертированный индекс для поиска.Но он также извлекает термины и добавляет их к столбчатым значениям документа.

Еще немного глубокое погружение в значения документа открыло для него метод сжатия , который фактически де-дублирует значениядля эффективных и дружественных памяти операций.

Вот ссылка, приведенная по ссылке выше, которая отвечает на вопрос:

Вы можете подумать: «Ну, это здорово для цифр, но как насчетстроки?»Строки кодируются аналогично с помощью порядковой таблицы.Строки дедуплицируются и сортируются в таблицу, им присваивается идентификатор, а затем эти идентификаторы используются в качестве числовых значений документа.Это означает, что строки обладают многими из тех же преимуществ сжатия, что и числовые.

У самой порядковой таблицы есть некоторые приемы сжатия, такие как использование строк с фиксированной, переменной или префиксной кодировкой.

Кроме того, если вам не нужно это поведение, вы можете отключить doc-values ​​

0 голосов
/ 20 июня 2019

Ответ о том, почему doc не работает

Цитата ниже:

Значения Doc являются хранилищем значений столбчатых полей, включено по умолчанию для всех полей, кроме анализируемых текстовых полей.

Значения документа могут возвращать только «простые» значения поля, такие как числа, даты, географические точки, термины и т. д., или массивы этихзначения, если поле многозначно.Он не может возвращать объекты JSON

Также важно добавить нулевую проверку , как указано ниже:

Отсутствующие поля

Документ ['field'] выдаст ошибку, если в отображениях отсутствует поле.В случае безболезненного, сначала можно выполнить проверку с помощью doc.containsKey ('field') * для защиты доступа к карте документов.К сожалению, нет способа проверить наличие поля в отображениях в скрипте выражения.

Кроме того, вот почему _source работает

Цитата ниже:

Доступ к документу _source, который на самом деле является просто специальным сохраненным полем, можно получить с помощью синтаксиса _source.field_name._Source загружается как карта-карта, поэтому к свойствам в полях объекта можно получить доступ, например, _source.name.first.

.

Отвечая на вашкомментарий с примером:

Вот ключевое слово: Он не может возвращать объекты JSON .Поле doc ['http.f5pools.items'] представляет собой объект JSON

Попробуйте выполнить ниже и посмотрите, какое отображение оно создает:

PUT t5/doc/2
{
   "items": [
     {
      "monitor": "default"
     },
     {
      "monitor": "default"
     }
    ]
}


GET t5/_mapping

{
  "t5" : {
    "mappings" : {
      "doc" : {
        "properties" : {
          "items" : {
            "properties" : {
              "monitor" : {  <-- monitor is a property of items property(Object)
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
0 голосов
/ 20 июня 2019

ОК, решил.

https://discuss.elastic.co/t/problem-looping-through-array-in-each-doc-with-painless/90648

Итак, как я обнаружил, массивы предварительно фильтруются, чтобы возвращать только разные значения (кроме, очевидно, в случае целых чисел?)

Решение состоит в том, чтобы использовать params._source вместо doc[]

...