ruby - 如何从Logstash中的嵌套对象中删除点

标签 ruby elasticsearch logstash elastic-stack logstash-configuration

我们有一个带有嵌套字段的复杂对象,该字段的名称可以是动态的并且包含点。当我尝试将数据提取到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
    }
  }

如您所见, Assets 和绩效中的值(value)都有点。根上的字段(如runId,performance和...)很好。我该如何解决此问题,方法是替换logstash中的点或任何不会给我错误的东西。我知道de_dot插件,但是要使用它,我们需要专门告诉嵌套字段的名称是什么,而我们不能为即将到来的记录强制命名。我也知道我们可以使用ruby插件来实现这一点,但是我零 ruby 知识。任何帮助,我们将不胜感激。

最佳答案

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

关于ruby - 如何从Logstash中的嵌套对象中删除点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61234551/

相关文章:

ruby - 我不明白 many_to_one <=> one_to_one 模型关联

elasticsearch - 使用 ansible 安装 elasticsearch 插件

spring - 通过使用Spring Data Elasticsearch查询多个字段来更新?

elasticsearch - 使 logstash 向不同的索引添加不同的输入

logstash - Logstash可以直接读取远程日志吗?

ruby - 使用 Ruby 将句子中每个单词的最后一个字符更改为大写

ruby - Symbol#to_proc 自定义方法

elasticsearch - Elastic 7.X Root 映射定义包含不受支持的参数

java - 安装Logstash报错JAVA(OpenJDK 64-Bit Server VM警告)

ruby - 如何打印语法高亮的 Ruby 代码?