gpt4 book ai didi

Elasticsearch 动态字段映射和 JSON 点表示法

转载 作者:行者123 更新时间:2023-12-02 12:13:54 24 4
gpt4 key购买 nike

我正在尝试将日志从 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 安装,较新的应用程序遵循标签和选择器约定,如 here 所示。 .标签和选择器的命名约定于 2018 年 12 月更新,见 here ,并且并非所有图表都已更新以反射(reflect)这一点。

这样做的最终结果是,根据哪种类型的标签格式首先使其成为弹性索引,尝试将其他类型发送进来将引发映射异常。如果我创建一个新的空索引并首先发送命名空间标签,尝试记录简单的 app label 会抛出这个异常:
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 点符号,并试图将其充实为一个对象。我找到了 this PR从 2015 年开始,明确禁止在字段名称中使用句点,但似乎在 2016 年被 this PR 逆转了.还有这个多年 thread从 2015-2017 年讨论这个问题,但我找不到任何涉及最新版本的最新信息。

我目前对前进的想法是标准化我们正在使用的 Helm 图表,让所有标签使用相同的约定。这似乎是对潜在问题的创可贴,尽管我觉得我在 Elasticsearch 和动态字段映射的配置中遗漏了一些明显的东西。

任何帮助在这里将不胜感激。

最佳答案

我选择将 Logstash mutate 过滤器与 rename 一起使用此处描述的选项:

https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-rename

最终结果如下所示:

filter {
mutate {
'[kubernetes][labels][app]' => '[kubernetes][labels][app.kubernetes.io/name]'
'[kubernetes][labels][chart]' => '[kubernetes][labels][helm.sh/chart]'
}
}

关于Elasticsearch 动态字段映射和 JSON 点表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59472323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com