全部产品
业务实时监控服务 ARMS

自定义切分的使用

更新时间:2017-06-07 13:26:11   分享:   

除了智能切分器,ARMS 还提供了自定义清洗配置器,用于自定义日志清洗流程来处理复杂的切分需求。

自定义清洗配置器采用所见即所得的可视化配置方式,本文档将详细介绍如何使用自定义清洗配置器。

配置界面简介

自定义清洗配置界面包含三个部分:

  • 原始日志区域
  • 可视化清洗流程编辑区域
  • 清洗结果预览区域

interface

在可视化流程编辑区域(以下简称“编辑区”),可以使用一个或多个“积木块”组装出日志清洗的逻辑,将原始日志区域中的日志“清洗”为结构化的键值对(Key-Value Pair)。

在编辑区编辑的过程中,可以随时点击清洗结果预览区域上方的日志切分预览按钮,预览每一行原始日志通过当前编辑区的流程清洗后的键值对结果。

在通过预览结果确认清洗流程准确无误后,单击页面下方的下一步按钮启动任务。ARMS 将使用在编辑区保存的流程来处理每一条从数据源中消费的日志。

示例一

本示例演示如何配置一个简单的日志清洗流程。

假如某系统的样例交易日志如下:

  1. 2016-11-08 11:00:01|user_abc|123456|下单
  2. 2016-11-08 11:00:02|user_abc|123456|支付
  3. 2016-11-08 11:10:01|user_abc|123456|退货

以第一行数据为例,假设目标切分结果为如下几个键值对:

Key 类型 Key Value
Date date 2016-11-08 11:00:01
String username user_abc
Long userid 123456
String event 下单

通过观察发现,键值对之间均使用竖线(|)进行分隔,因此可以使用单分隔符切分器来切分键值对。

  1. 在编辑区左侧的工具栏中,将单分隔符切分器拖拽至编辑区,如下图所示。

    注意:切分器必须连接在开始清洗模块之后才能够生效。

    s1

    配置切分说明:

    • 以“|”为分隔符,“_line”作为入参(_line代表原始日志行本身);
    • 切分后0号位置的字符串按照 yyyy-MM-dd HH:mm:ss 的格式转为 date(内部实际将以 long 型保存);
    • 1号位置的字符串转为保存为 key 为 username 的 string;
    • 2号位置转为 key 为 userid 的 long;
    • 3号位置保存为 key 为 event 的 string。
  2. 点击日志切分预览,可以观察到每行日志的切分结果如下:

    s2

    最终生成的切分模型如下所示:

    444

  3. 单击保存下一步,清洗流程生效。

到此为止,一个简单日志切分就完成了。

示例二

本示例演示如何对复杂的日志进行切分清洗。

  1. 2016-11-08 11:00:01|下单|user_abc|123456
  2. 2016-11-08 11:00:02|支付|200
  3. 2016-11-08 11:10:01|退货

在此样例中,不同的日志由于操作类型不一样,字段的个数、同位置各字段的含义也不同(这在业务系统中非常常见)。这时可以通过 if-then/if-else(其语法参考aviator) 逻辑对不同类型的日志进行区分。

s10

配置切分说明:

  • 首先使用单分隔符切分器切分出 date 与 event 字段;
  • 接着使用逻辑模块中的 if-then 模块,在 event 为不同值时分别使用不同的单分隔符切分器配置切分出不同的字段。

    从右侧的预览结果中也可以看到,第一行与第二行切分出的键值对组合是不一样的。第一行中有 username 与 userid,而第二行中有 price。

注意:在自定义切分最下方的最终切分模型预览,包含的将是上图中右侧单行切分预览区域中所有字段的并集

s11

了解更多切分方式

以上两个例子仅使用了一种切分器(单分隔符切分器)。ARMS 内置了单分隔符、多分隔符、顺序、K-V、JSON 等多种切分器,针对不同的场景可以单独或组合使用。每个切分器的详细说明如下:

1. 单分隔符切分器

说明

将单一字符串作为输入,当匹配用户指定分隔字符串时进行切分,切分结果为多个 Key-Values。

实例

样例日志如下所示:

  1. 2016-11-08 11:00:01|user_abc|123456|下单
  2. 2016-11-08 11:00:02|user_abc|123456|支付
  3. 2016-11-08 11:10:01|user_abc|123456|退货

其自定义切分如下所示:

s1

配置说明:

  • 以“|”为分隔符;
  • 切分后0号位置的字符串按照 yyyy-MM-dd HH:mm:ss的格式转为 date(内部实际将以 long 型保存);
  • 1号位置的字符串转为保存为 key 为 username 的 string;
  • 2号位置转为 key 为 userid 的 long;
  • 3号位置保存为 key 为 event 的 string。

注意事项:

  • 对不可见字符的支持:本切分器支持不可见字符的切分,例如 \t,\u001f(ascii char=31)。一些不可见字符的切分将无法在页面测试中被正确验证(因为页面文本框内无法正确输入不可见字符),所以建议在测试页面先使用可见字符进行调试,然后换成不可见字符保存后进行部署。

  • 多字符分隔符:本切分器分隔符可以为多字符,如 a::b::c 为输入,以::为分隔符切分。

  • 切分模型包含 _line 字段与_hostIp 字段,具体参阅日志清洗中系统字段介绍

2. 多分隔符切分器

说明

将单一字符串作为输入,当匹配任意一个用户指定分隔字符时进行切分,切分结果为多个 Key-Values。

实例

样例日志:

  1. 2014-07-25 17:25:00,aaa|b~1
  2. 2014-07-25 17:26:00,aaa|b~1

自定义切分如下所示:

s3

每行日志的切分如下:

s4

切分模型如下所示:

7777

3. 顺序分隔符切分器

说明

对于较复杂的切分场景(如 accesslog),ARMS 提供顺序分隔符切分器,以 O(n) 的复杂度将日志进行切分。

实例

样例日志:

  1. 117.74.77.48 835158 - [26 May 2014:14:05:28 +0800] "GET http://trade.taobao.com/trade/detail/trade_snap.htm?spm=a1z0f.2.100003.9.8BpicQ&trade_id=664793864233811" 302 0
  2. 117.74.87.58 835158 - [26 May 2014:14:05:28 +0800] "GET http://trade.taobao.com/trade/detail/trade_snap.htm?spm=a1z0f.2.100003.9.8BpicQ&trade_id=664793864233811" 302 0

我们希望切出 IP 字段、平均响应时间、时间、请求的 URL:

=> [ url - http://trade.taobao.com/trade/detail/trade_snap.htm?spm=a1z0f.2.100003.9.8BpicQ&trade_id=664793864233811 ] [ _hostIp - 127.0.0.1 ] [ ip - 117.74.77.48 ] [ date - 1401084328000 ] [ rt - 835158 ]

我们会发现:

  • 用单分隔符切分器显然无法满足需求;

  • 用多分隔符切分器也不能满足需求:我们如果想切出 rt=835158 这组 KV,必须以” “(空格)作为切分字符之一,但是这样做会错误地把26 May 2014:14:05:28 +0800这个字符串给切成几段,因此我们将无法得到 date - 1401084328000;

  • 如果使用正则表达式来匹配 KV,效率太低,需要遍历多次。

ARMS 提供了”顺序分隔符切分”的方式,使用如下配置,就可以得到本示例正确的结果。具体配置方式如下图:

s5

先定义了5个分隔符字符串,并依次将输入字符串切分为了6段子串,随后将指定的子串分别赋给不同的 key,即可完成目标切分效果。

4. KV 切分器

如果需要切分如下多组 key=value 形式的日志:

  1. key1=aaaa;key2=bbbb;key3=cccc;key4=dddd;....
  2. key1=aaaa;key2=bbbb;key3=cccc;key4=dddd;....

且各个 key-value 的位置不固定时,可以使用 KV 切分器:

切分配置如下:

s6

注意:

  • 在没有配置文本字符<->Key 映射时,KV 切分器将视所有的 key 为“未定义key”,所有 key 对应的 value 将被切为 StringKey 类型;

  • 如果选择取消勾选是否切分未定义的 Key,那么未定义 Key 将不会被切分。也就是说如果没有配置文本字符 <->Key 映射,并且未勾选是否切分未定义的 Key,本切分器将不做任何事。

这里展示一个需要将制定的 Key 转换成对应类型的例子:

假设有日志如下:

  1. name=abc;item=iphone6;quantity=15;date=2014-07-25 17:25:00;....
  2. name=abc;item=iphone6;quantity=15;date=2014-07-25 17:25:00;....

需要将 quantity 变为 LongKey,date 变为 DateKey:

s7

5. JSON 切分器

如果日志中包含 JSON 字符串,使用 JSON 切分器可以快速切分出该 JSON 中的“叶子节点”。

例一:全自动切分

  1. {
  2. "title": "Example Schema",
  3. "type": "object",
  4. "quantity": 200,
  5. "date":"2015-12-12 12:12:12",
  6. "properties": {
  7. "firstName": {
  8. "type": "string"
  9. },
  10. "lastName": {
  11. "type": "string"
  12. },
  13. "age": {
  14. "description": "Age in years",
  15. "type": "integer",
  16. "minimum": 0
  17. }
  18. },
  19. "required": ["firstName", "lastName"]
  20. }

将该 JSON 放在一行文本中,使用 JSON 切分器进行切分:

s8

切分结果如下:

2222

由于勾选了切分未定义字段,JSON 切分器将自动切出所有的“非 array 类型的叶子节点”,并自动转成对应的类型(stringkey 或 longkey)。

注意:本例中的 required 字段由于是 array 类型所以没有切分。另外,date 这个字段默认转化为 string 类型。

例二:自定义切分

如果只想切分 JSON 中指定的某些字段,可以这样配置:

s9

其切分模型如下:

4444

本例中取消了对切分未定义字段选项的勾选,自定义了 title、date 和 quantity 三个字段,并指定了类型。ARMS 会只切分自定义的字段,并转成对应的类型(本例中 date 字段被转成了 ARMS 内置的 long 型)。

6. 自定义切分其他问题

1) 自定义清洗中的系统字段请参阅 日志清洗中系统字段介绍

2) 自定义切分遇到的问题请参阅 自定义清洗常见的问题

3) if-then/if-else 的语法请参阅 aviator

本文导读目录
本文导读目录
以上内容是否对您有帮助?