ruby - 如何从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
插件来实现这一点,但我对这方面的了解为零红宝石。任何帮助都将不胜感激。
解决方案
可以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(".", "" ) }
推荐阅读
- javascript - jQuery - 在锚点中转义特殊字符
- excel - 在特定位置插入行
- java - 在列表视图中保存复选框的状态
- java - 带有 Fragment 的 Fragment 中的 TabLayout
- xml - 如何在 XSLT 中应用多个导入以生成 xml
- javascript - Javascript 根据新日期仅获得偶数小时周期
- java - 如何获取队列中元素的位置
- javascript - opencv4nodejs 保存图像的描述符并加载备份
- java - Java 声纳违反“将三元运算符的这种用法转换为“if”/“else”结构”
- maven - 有没有办法控制 Surefire 插件的报告?