如何编写 Pipeline 脚本

前言Pipeline 编写较为麻烦,为此 , DataKit 中内置了简单的调试工具,用以辅助大家来编写 Pipeline 脚本 。
调试 grok 和 pipeline指定 pipeline 脚本名称,输入一段文本即可判断提取是否成功
Pipeline 脚本必须放在 /pipeline 目录下 。
$ datakit pipeline your_pipeline.p -T '2021-01-11T17:43:51.887+0800DEBUG ioio/io.go:458post cost 6.87021ms'Extracted data(cost: 421.705μs): # 表示切割成功{"code": "io/io.go: 458",# 对应代码位置"level": "DEBUG",# 对应日志等级"module" : "io",# 对应代码模块"msg": "post cost 6.87021ms", # 纯日志内容"time": 1610358231887000000# 日志时间(Unix 纳秒时间戳)"message": "2021-01-11T17:43:51.887+0800DEBUG ioio/io.g o:458post cost 6.87021ms"}提取失败示例(只有 message 留下了,说明其它字段并未提取出来):
$ datakit pipeline other_pipeline.p -T '2021-01-11T17:43:51.887+0800DEBUG ioio/io.g o:458post cost 6.87021ms'{"message": "2021-01-11T17:43:51.887+0800DEBUG ioio/io.g o:458post cost 6.87021ms"} 如果调试文本比较复杂 , 可以将它们写入一个文件(sample.log) , 用如下方式调试:
$ datakit pipeline your_pipeline.p -F sample.log更多 Pipeline 调试命令 , 参见 datakit help pipeline 。
Grok 通配搜索
由于 Grok pattern 数量繁多 , 人工匹配较为麻烦 。DataKit 提供了交互式的命令行工具 grokq(grok query):
datakit tool --grokqgrokq > Mon Jan 25 19:41:17 CST 2021# 此处输入你希望匹配的文本2 %{DATESTAMP_OTHER: ?}# 工具会给出对应对的建议 , 越靠前匹配月精确(权重也越大) 。前面的数字表明权重 。0 %{GREEDYDATA: ?}grokq > 2021-01-25T18:37:22.016+08004 %{TIMESTAMP_ISO8601: ?}# 此处的 ? 表示你需要用一个字段来命名匹配到的文本0 %{NOTSPACE: ?}0 %{PROG: ?}0 %{SYSLOGPROG: ?}0 %{GREEDYDATA: ?}# 像 GREEDYDATA 这种范围很广的 pattern , 权重都较低# 权重越高 , 匹配的精确度越大grokq > Q# Q 或 exit 退出Bye!Windows 下 , 请在 Powershell 中执行调试 。
多行如何处理在处理一些调用栈相关的日志时 , 由于其日志行数不固定,直接用 GREEDYDATA 这个 pattern 无法处理如下情况的日志:
1 2022-02-10 16:27:36.116 ERROR 1629881 --- [scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler: Unexpected error occurred in scheduled task 2 3java.lang.NullPointerException: null 4 5 at com.xxxxx.xxxxxxxxxxx.xxxxxxx.impl.SxxxUpSxxxxxxImpl.isSimilarPrize(xxxxxxxxxxxxxxxxx.java:442) 6 7 at com.xxxxx.xxxxxxxxxxx.xxxxxxx.impl.SxxxUpSxxxxxxImpl.lambda$getSimilarPrizeSnapUpDo$0(xxxxxxxxxxxxxxxxx.java:595) 8 9 at java.util.stream.ReferencePipeline$3$1.accept(xxxxxxxxxxxxxxxxx.java:193)1011 at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(xxxxxxxxx.java:1382)1213 at java.util.stream.AbstractPipeline.copyInto(xxxxxxxxxxxxxxxx.java:481)1415 at java.util.stream.AbstractPipeline.wrapAndCopyInto(xxxxxxxxxxxxxxxx.java:471)1617 at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(xxxxxxxxx.java:708)1819 at java.util.stream.AbstractPipeline.evaluate(xxxxxxxxxxxxxxxx.java:234)2021 at java.util.stream.ReferencePipeline.collect(xxxxxxxxxxxxxxxxx.java:499)22此处可以使用 GREEDYLINES 规则来通配,如(

    推荐阅读