【问题标题】:How can I remove dot from a nested object in logstash如何从logstash中的嵌套对象中删除点
【发布时间】:2020-07-28 18:23:38
【问题描述】:

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

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 插件来实现这一点但我对红宝石的了解为零。任何帮助都将不胜感激。

【问题讨论】:

    标签: ruby elasticsearch logstash elastic-stack logstash-configuration


    【解决方案1】:

    可以使用来自ActiveSupportHash#deep_transform_keys

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

    【讨论】:

    • ActiveSupport 轨道的一部分吗?如何在logstash中使用它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2021-12-28
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多