Elasticsearch 动态字段映射与 JSON 点符号表示法

5
我正在尝试从 Kubernetes 集群将日志写入 Elasticsearch 索引。使用 Fluent-bit 读取标准输出并使用元数据(包括 Pod 标签)丰富日志。简化的示例日志对象如下:
{
  "log": "This is a log message.",
  "kubernetes": {
    "labels": {
      "app": "application-1"
    }
  }
}

问题在于集群中部署的其他一些应用程序具有以下格式的标签:
{
  "log": "This is another log message.",
  "kubernetes": {
    "labels": {
      "app.kubernetes.io/name": "application-2"
    }
  }
}

这些应用是通过Helm charts安装的,较新的应用程序遵循标签和选择器约定,如此处所述。标签和选择器的命名约定已在2018年12月进行更新,可在此处中查看,并且并非所有图表都已更新以反映此更改。
最终结果是,根据哪种类型的标签格式首先进入Elastic索引,尝试发送另一种类型将引发映射异常。如果我创建一个新的空索引并首先发送带有命名空间的标签,尝试记录简单的app标签将抛出此异常:
object mapping for [kubernetes.labels.app] tried to parse field [kubernetes.labels.app] as object, but found a concrete value

反之,先发布命名空间标签再发布标签名称会导致此异常:
Could not dynamically add mapping for field [kubernetes.labels.app.kubernetes.io/name]. Existing mapping for [kubernetes.labels.app] must be of type object but found [text].

我怀疑的情况是Elasticsearch将字段名称中的句点视为JSON点符号,并尝试将其扩展为对象。 我能够找到2015年的this PR,其中明确禁止在字段名称中使用句点,但似乎在2016年被撤销了this PR。 还有这个跨越2015-2017年的thread多年讨论此问题,但我无法找到任何涉及最新版本的内容。
我目前考虑的是规范我们使用的Helm图表,使所有标签使用相同的约定。 不过,这似乎只是掩盖了底层问题,即我觉得在Elasticsearch的配置和动态字段映射方面缺少明显的东西。
在这里任何帮助都将不胜感激。
2个回答

4

0

虽然我个人从未遇到过完全相同的问题,但当我索引一些测试数据并随后更改应该被索引的文档结构时(特别是在“展开”数据结构时),我遇到了类似的问题。

您对错误消息的解释是正确的。当您首次索引文档时

{
  "log": "This is another log message.",
  "kubernetes": {
    "labels": {
      "app.kubernetes.io/name": "application-2"
    }
  }
}

Elasticsearch会因为动态映射而将app识别为一个对象/结构。

当您尝试索引文档时

{
  "log": "This is a log message.",
  "kubernetes": {
    "labels": {
      "app": "application-1"
    }
  }
}

之前动态创建的映射将字段app定义为具有子字段的对象,但是Elasticsearch遇到了一个具体值,即"application-1"。

我建议您设置索引模板来定义正确的映射。对于“过时”的日志版本,我建议通过Elasticsearch摄取管道或例如Logstash预处理特定文档,以使文档格式正确。

希望这可以帮助您。


我认为使用mutate过滤器的Logstash管道将是最直接的方法。 我唯一担心的是复制/删除操作需要在明确定义的标签集上进行,而不是通用解决方案。 我会尝试您的建议,并在此处更新结果。 谢谢 - rpf3
你�以使用 Ruby 过滤器���通用化处�,例如针对�个字段应用正则表达�进行解�。如�该字段包�点�,则��其值并根�点�的�置确定所�新创建的字段是值字段还是对象字段。我�家�会开始�手��这一功能,�起�很有趣哦 😉 - apt-get_install_skill
请问您能否给我更多需要转换为目标结构的字段的示例? - apt-get_install_skill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接