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

How to extract and visualize values from a log entry in OpenShift EFK stack

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

一个部署记录包含我感兴趣的特定值的请求。我想仅提取此值并使用 Kibana 中显示请求数量及其来源的区域地图将其可视化。

message字段的内容基本上是这样的:

[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}

这个 plz 是德国邮政编码,我想按照描述对其进行可视化。

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

如果我能用正则表达式找到它,那将是一个很好的第一次成功,但 Kibana 似乎并不像我想的那样工作。按照它的文档,我希望这个 /\"plz\":\"[0-9]{5}\"/ 能给我结果,但我得到 0 次点击(时间间隔设置正确)。即使这个正则表达式匹配,我也只会找到包含它的日志条目,而不仅仅是特定的值。我该如何继续?

我想我还需要一个外部地理编码服务,但我应该在什么时候包括它?或者 Kibana 本身知道如何将邮政编码映射到几何图形吗?

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

当文档被索引到 ES 时,可以使用 ingest pipeline with grok processor.

解析 message 字段

首先,像这样创建摄取管道:

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 索引文档时,您可以在配置中 specify a pipeline to be used。如果您不能或不想修改您的 Fluentd 配置,您还可以为您的索引定义一个默认管道,该管道将在每次为新文档编制索引时启动。只需 运行 在您的索引上,您在索引文档时不需要指定 ?pipeline=parse-plz

PUT index/_settings
{
  "index.default_pipeline": "parse-plz"
}

如果您有多个索引,更好的方法可能是定义一个 index template,这样每当创建一个名为 project.foo-something 的新索引时,就会应用这些设置:

PUT _template/project-indexes
{
  "index_patterns": ["project.foo*"],
  "settings": {
     "index.default_pipeline": "parse-plz"
  }
}

现在,为了在地图上绘制该 PLZ,您首先需要找到一个数据集,为您提供每个 PLZ 的地理位置。

然后您可以在管道中添加第二个处理器,以便执行 PLZ/ZIP 到纬度、经度的映射:

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 可视化中的 location 字段:

{
  "message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""",
  "plz": "12345",
  "location": {
    "lat": 42.36, 
    "lon": 7.33
  }
}

总而言之,归结为两件事:

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