Как я могу удалить точку из вложенного объекта в logstash - PullRequest
0 голосов
/ 15 апреля 2020

У нас есть сложный объект с вложенными полями, имена которых могут быть динамическими c и содержат точку. Когда я пытаюсь ввести данные вasticsearch, он дает мне следующую ошибку

Object mapping for [x] tried to parse field [x.y] as object, but found a concrete value

Одна запись может иметь ключ / значения, такие как a.b.c:4, а в другой записи он может иметь a.b:3. У нас нет контроля над источником поступающих данных, поэтому единственной возможностью может быть изменение объекта в logsta sh. Вот пример приходящего объекта:

{
    "result": "https://www.yahoo.com",
    "tags": {
      "url": "https://www.yahoo.com",
      "projectName": "monitor",
      "host": "ttt",
      "dd": 12345,
      "vv": "kk"
    },
    "timestamp": 1586599441000,
    "runId": 12345,
    "performance": {
      "x.y.z": 31307

    },
    "channel": "clientperf",
    "asset": {
      "a.b.c": 5,
     "a.b":4
    }
  }

, поскольку вы видите значения внутри актива, а производительность имеет точку. Поля в корнях (такие как runId, performance и ...) в порядке. Как я могу решить это либо с заменой точки в logsta sh, либо с тем, что не дает мне ошибки. Я знаю о плагине de_dot, но чтобы использовать его, нам нужно конкретно указать, как называются вложенные поля, в то время как мы не можем принудительно назначить именование для будущих записей. Я также знаю, что мы, вероятно, можем добиться этого с помощью плагина ruby но у меня нулевое знание ruby. Любая помощь может быть оценена.

1 Ответ

0 голосов
/ 15 апреля 2020

Можно использовать Hash#deep_transform_keys из ActiveSupport:

class Hash
  def deep_transform_keys(&block)
    result = {}
    each do |key, value|
      result[yield(key)] = value.is_a?(Hash) ? value.deep_transform_keys(&block) : value
    end
    result
  end
end

puts hash.deep_transform_keys { |key| key.to_s.gsub(".", "" ) }

...