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

时间:2019-08-12 11:35:13

标签: elasticsearch openshift kibana fluentd

我有一个带有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本身知道如何将邮政编码映射到几何?

一个对初学者友好的循序渐进指南将是完美的,但是我可以满足一些指导我的建议。

1 个答案:

答案 0 :(得分:1)

当使用ingest pipeline with grok processor将文档索引到ES中时,可以解析Private Sub Worksheet_Change(ByVal Target As Range) ActiveSheet.Activate If Not Application.Intersect(Range("U13"), Range(Target.Address)) Is Nothing Then Select Case Target.Value Case Is = "Brand Health": Rows("19:39").EntireRow.Hidden = True Rows("40:60").EntireRow.Hidden = False Case Is = "Brand Imagery": Rows("38:60").EntireRow.Hidden = True Rows("61:81").EntireRow.Hidden = False Case Is = "NPS": Rows("30:82").EntireRow.Hidden = True Rows("83:102").EntireRow.Hidden = False Case Is = "Talent": Rows("35:103").EntireRow.Hidden = True Rows("104:126").EntireRow.Hidden = False Case Is = "Shows": Rows("37:127").EntireRow.Hidden = True Rows("128:148").EntireRow.Hidden = False End Select End If End Sub Private Sub Worksheet_Change(ByVal Target`enter code here` As Range) Sheets("Brand Tracking Dashboard").Rows("1:1000").EntireRow.Hidden = False ' Move this to the top If Target.Address = ("$U$13") And Target.Value = 1 Then Sheets("Brand Tracking Dashboard").Rows("19:39").EntireRow.Hidden = True Sheets("Brand Tracking Dashboard").Rows("59:1000").EntireRow.Hidden = True ElseIf Target.Address = ("$u$13") And Target.Value = 2 Then Sheets("Brand Tracking Dashboard").Rows("43:63").EntireRow.Hidden = True Sheets("Brand Tracking Dashboard").Rows("80:1000").EntireRow.Hidden = True ElseIf Target.Address = ("$u$13") And Target.Value = 3 Then Sheets("Brand Tracking Dashboard").Rows("32:84").EntireRow.Hidden = True Sheets("Brand Tracking Dashboard").Rows("101:1000").EntireRow.Hidden = True ElseIf Target.Address = ("$u$13") And Target.Value = 4 Then Sheets("Brand Tracking Dashboard").Rows("37:106").EntireRow.Hidden = True Sheets("Brand Tracking Dashboard").Rows("121:1000").EntireRow.Hidden = True ElseIf Target.Address = ("$u$13") And Target.Value = 5 Then Sheets("Brand Tracking Dashboard").Rows("37:129").EntireRow.Hidden = True Sheets("Brand Tracking Dashboard").Rows("145:1000").EntireRow.Hidden = True End If End Sub 字段。

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

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

从Fluentd为文档编制索引时,可以在配置中specify a pipeline to be used。如果您不能或不想修改Fluentd配置,还可以为索引定义默认管道,该管道将在每次索引新文档时启动。只需对索引运行此操作,就可以在为文档建立索引时无需指定{ "message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""", "plz": "12345" }

?pipeline=parse-plz

如果您有多个索引,则更好的方法可能是定义一个index template,以便无论何时创建名为PUT index/_settings { "index.default_pipeline": "parse-plz" } -的新索引时,都将应用设置: / p>

project.foo

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

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

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

最终,您的文档将如下所示,并且您将能够利用Kibana可视化中的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} } } } ] } 字段:

location

总而言之,归结为两点:

  1. 创建一个提取管道以对文档建立索引时进行解析
  2. 为所有{ "message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""", "plz": "12345", "location": { "lat": 42.36, "lon": 7.33 } } 索引创建索引模板,这些索引的设置包括在步骤1中创建的管道。