Использовать синтаксис sprintf внутри синтаксиса logstash sprintf - PullRequest
0 голосов
/ 28 ноября 2018

Для приведенной ниже структуры данных:

{
  "sprints": [
    {
      "id": 17193,
      "name": "Sprint 12"
    },
    {
      "id": 16510,
      "name": "Sprint 11"
    }
  ],
  "velocityStatEntries": {
    "16510": {
      "estimated": {
        "value": 49
      },
      "completed": {
        "value": 36
      }
    },
    "17193": {
      "estimated": {
        "value": 52
      },
      "completed": {
        "value": 70
      }
    }
  }
}

Учитывая это, я хочу иметь возможность создавать объект Elasticsearch, который легче обрабатывать, добавляя значения полей Estimated и Completed к спринтам с помощьюих совпадающие идентификаторы.

В идеале я хотел бы справиться с этим без написания Ruby, но я не нахожу нативное решение logstash, которое обрабатывает этот сценарий.

Сначала я разбил данные наполе sprints использует split, поэтому у меня есть только один объект sprints, и я могу использовать [sprints] [id], чтобы узнать, какой спринт я обрабатываю.

Затем я попытался работать с *Фильтр 1010 * mutate одним из двух способов: - используя merge , чтобы добавить объект [speedStateEntries] [] к текущему спринту, - используя add_field , чтобы добавить два поляМне нужно

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

add_field => {
          "estimatedTime" => "%{[velocityStatEntries][%{[sprints][id]}][estimated][value]}"
}

, но, похоже, это работает только с жестко закодированным форматом, таким как"estimatedTime" => "%{[velocityStatEntries][1234][estimated][value]}"

Нужно ли для этого использовать формат Ruby?

1 Ответ

0 голосов
/ 28 ноября 2018

Как бы то ни было, решение Ruby очень просто:

  ruby {
    code => "
        sprintId = event.get('[sprints][id]');
        estimated = event.get('[velocityStatEntries]['+(sprintId).to_s+'][estimated][value]');
        completed = event.get('[velocityStatEntries]['+(sprintId).to_s+'][completed][value]');
        event.set('[sprints][estimatedUnits]', estimated);
        event.set('[sprints][completedUnits]', completed);
      "
  }
...