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

标签 elasticsearch kubernetes logstash kubernetes-helm fluent-bit

我正在尝试将日志从 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/

相关文章:

elasticsearch - 我可以在同一台服务器上运行Logstash的多个实例吗?

elasticsearch - 在复杂文档中进行 Elasticsearch

amazon-web-services - AWS EKS Kubernetes Pod 需要花费大量时间才能准备就绪

elasticsearch - 大数据分析。 Elasticsearch 、Logstash、Kibana、MRTG

kubernetes - Helm删除发布并清除关联的存储

tcp - 如何将 TCP 流量从外部路由到 Kubernetes 集群内的服务?

elasticsearch - ELK(elasticsearch,logstash,kibana,filbeat用于代理)土耳其语字符问题

elasticsearch - 在ES 2.3中我在哪里设置index.merge.scheduler.max_thread_count?

json - 合并具有日期/字符串类型的动态字段会引发冲突

elasticsearch - 类似 GROUP BY AND HAVING 的 SQL