我正在尝试从 Kubernetes 集群将日志写入 Elasticsearch 索引。使用 Fluent-bit 读取标准输出并使用元数据(包括 Pod 标签)丰富日志。简化的示例日志对象如下:
问题在于集群中部署的其他一些应用程序具有以下格式的标签:
这些应用是通过Helm charts安装的,较新的应用程序遵循标签和选择器约定,如此处所述。标签和选择器的命名约定已在2018年12月进行更新,可在此处中查看,并且并非所有图表都已更新以反映此更改。
最终结果是,根据哪种类型的标签格式首先进入Elastic索引,尝试发送另一种类型将引发映射异常。如果我创建一个新的空索引并首先发送带有命名空间的标签,尝试记录简单的
反之,先发布命名空间标签再发布标签名称会导致此异常:
我怀疑的情况是Elasticsearch将字段名称中的句点视为JSON点符号,并尝试将其扩展为对象。 我能够找到2015年的this PR,其中明确禁止在字段名称中使用句点,但似乎在2016年被撤销了this PR。 还有这个跨越2015-2017年的thread多年讨论此问题,但我无法找到任何涉及最新版本的内容。
我目前考虑的是规范我们使用的Helm图表,使所有标签使用相同的约定。 不过,这似乎只是掩盖了底层问题,即我觉得在Elasticsearch的配置和动态字段映射方面缺少明显的东西。
在这里任何帮助都将不胜感激。
{
"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的配置和动态字段映射方面缺少明显的东西。
在这里任何帮助都将不胜感激。