首页 > 解决方案 > 如何从logstash中的嵌套对象中删除点

问题描述

我们有一个带有嵌套字段的复杂对象,字段名称可以是动态的并包含点。当我尝试将数据摄取到弹性搜索时,它给了我以下错误

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

一条记录可以具有类似的键/值,a.b.c:4而在另一条记录中它可以具有a.b:3. 我们无法控制传入数据的来源,因此唯一的选择是更改 logstash 中的对象。这是一个即将到来的对象的例子:

{
    "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、性能和...)很好。如何通过替换logstash中的点或任何不会给我错误的东西来解决这个问题。我知道de_dot插件,但要使用它,我们需要明确告诉嵌套字段的名称是什么,而我们不能强制为即将到来的记录命名。我也知道我们可能可以使用ruby插件来实现这一点,但我对这方面的了解为零红宝石。任何帮助都将不胜感激。

标签: rubyelasticsearchlogstashelastic-stacklogstash-configuration

解决方案


可以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(".", "" ) }


推荐阅读