elasticsearch 如何从OpenShift EFK堆栈中的日志条目中提取和可视化值,elasticsearch,openshift,kibana,fluentd,elasticsearch,Openshift,Kibana,Fluentd" /> elasticsearch 如何从OpenShift EFK堆栈中的日志条目中提取和可视化值,elasticsearch,openshift,kibana,fluentd,elasticsearch,Openshift,Kibana,Fluentd" />

elasticsearch 如何从OpenShift EFK堆栈中的日志条目中提取和可视化值

elasticsearch 如何从OpenShift EFK堆栈中的日志条目中提取和可视化值,elasticsearch,openshift,kibana,fluentd,elasticsearch,Openshift,Kibana,Fluentd,如前所述,我有一个OKD集群设置,其中包含用于日志记录的EFK堆栈。我以前从未使用过其中一个组件 一个部署记录包含我感兴趣的特定值的请求。我只想提取这个值,并用Kibana中的面积图将其可视化,该图显示了请求的数量及其来源 消息字段的内容基本上如下所示: [fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someot

如前所述,我有一个OKD集群设置,其中包含用于日志记录的EFK堆栈。我以前从未使用过其中一个组件

一个部署记录包含我感兴趣的特定值的请求。我只想提取这个值,并用Kibana中的面积图将其可视化,该图显示了请求的数量及其来源

消息
字段的内容基本上如下所示:

[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}
PUT _ingest/pipeline/parse-plz
{
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          "%{POSINT:plz}"
        ]
      }
    }
  ]
}
这个
plz
是一个德国邮政编码,我想将其可视化,如前所述

我的问题是我不知道如何提取这个值

如果我能用一个regexp找到它,那么第一次的成功将是不错的,但是Kibana似乎不像我想的那样工作。在它的文档之后,我希望这个
/\“plz\”:\“[0-9]{5}\”/
能够向我传递结果,但是我得到了0个点击(时间间隔设置正确)。即使这个regexp匹配,我也只能找到包含它的日志条目,而不仅仅是指定的值。我该怎么办

我想我也需要一个外部地理编码服务,但在哪一点上我会包括它?或者Kibana自己知道如何将邮政编码映射到几何体吗


一个对初学者友好的分步指南是完美的,但我可以接受一些指导我的提示。

当文档被索引到ES中时,可以使用

首先,按如下方式创建摄取管道:

[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}
PUT _ingest/pipeline/parse-plz
{
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          "%{POSINT:plz}"
        ]
      }
    }
  ]
}
然后,在索引数据时,只需引用该管道:

PUT plz/_doc/1?pipeline=parse-plz
{
  "message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}"""
}
您将得到一个如下所示的文档,它现在有一个名为
plz
的字段,其中包含
12345
值:

{
  "message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""",
  "plz": "12345"
}
从Fluentd为文档编制索引时,您可以在配置中使用。如果您不能或不想修改Fluentd配置,还可以为索引定义默认管道,该管道将在每次为新文档编制索引时启动。只需在索引上运行此命令,在索引文档时就不需要指定
?pipeline=parse plz

PUT index/_settings
{
  "index.default_pipeline": "parse-plz"
}
如果您有多个索引,更好的方法可能是定义一个索引,这样每当创建一个名为
project.foo
-的新索引时,就会应用以下设置:

PUT _template/project-indexes
{
  "index_patterns": ["project.foo*"],
  "settings": {
     "index.default_pipeline": "parse-plz"
  }
}
现在,为了在地图上映射该PLZ,您首先需要找到一个数据集,该数据集为您提供每个PLZ的地理位置

然后,您可以在管道中添加第二个处理器,以便进行PLZ/ZIP到lat、lon映射:

PUT _ingest/pipeline/parse-plz
{
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          "%{POSINT:plz}"
        ]
      }
    },
    {
      "script": {
        "lang": "painless",
        "source": "ctx.location = params[ctx.plz];",
        "params": {
          "12345": {"lat": 42.36, "lon": 7.33}
        }
      }
    }
  ]
}
最终,您的文档将如下所示,您将能够利用Kibana可视化中的
位置
字段:

{
  "message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""",
  "plz": "12345",
  "location": {
    "lat": 42.36, 
    "lon": 7.33
  }
}
总之,这一切归结为两件事:

  • 创建一个摄取管道,以便在文档被索引时对其进行解析
  • 为设置包括步骤1中创建的管道的所有
    project*
    索引创建索引模板

  • 据我所知,您的消息字段是文本字段,而不是经过解析的JSON,对吗?在Kibana中,您可以尝试以下自由文本查询,它应该可以工作:
    plz\”:\“/[0-9]{5}/
    这将返回任何包含五个连续数字的日志条目。我的消息字段看起来像:
    [fooServiceClient#getStuff]{“多个键”:“多个值”}
    ,因此它可能是一个文本字段。是否有任何方法可以将
    消息
    字段上游解析并将其存储为JSON哈希而不是文本?通过这样做,查询您的数据将更容易,也不那么脆弱。我将对此进行研究,但我的理解是:这会改变什么?我无法想象从文本字段中提取值是多么的复杂。也许我的想法是完全错误的,因为你似乎需要结构化搜索而不是自由文本搜索。当所有的数据都被正确地解析和键入时,结构化搜索效果最佳。非常感谢!我已经成功地创建了摄取管道(至少用
    “acknowred”:true创建了ES答案),但我不确定接下来的步骤是什么意思。“当我索引我的数据时”-这到底是什么时候发生的?当它发生时,我如何引用管道?我看不出使用示例消息字段调用管道如何帮助我为传入的每个日志条目自动执行此步骤。另外,在第二个处理器步骤中:为什么我要在管道中为plz输入一个离散值?put请求只是作为如何索引数据的示例。最初如何创建索引?请参阅我更新的答案,了解如何在从Fluentd为文档编制索引时指定管道。将EFK堆栈部署到OpenShift群集时,会自动为每个项目创建索引。对于一个项目,我有几个索引总是在Kibana中聚合,比如
    project.foo.abc123-456.*
    *
    表示日期。我似乎无法通过一个PUT请求轻松引用一个项目的所有索引,可以吗(不编写shell脚本)?将索引模板用于援救!请参阅我的更新答案。哦,6.5中引入了
    索引.default\u管道
    设置。。。因此,要么升级ES,要么需要修改Fluentd配置,如我所述。