数据加工(新版)指令

本文主要介绍数据加工(新版)指令的用法和示例。

pack-fields

将多个字段打包,以JSON序列化输出到新字段,适用于需要结构化传输的场景(如API请求体构建)。

重要
  • 默认不处理非Varchar类型的字段(包括__time____time_ns_part__)。

  • 默认不保留源数据。

语法

| pack-fields -keep -ltrim -include=<include> -exclude=<exclude> as <output>

参数说明

参数

类型

必填

说明

output

String

指定打包后输出的字段名称。字段值格式为JSON格式。

include

RegExp

白名单配置,符合正则表达式的字段会被打包。默认为".*" ,表示全部匹配。更多信息,请参见正则表达式

exclude

RegExp

黑名单配置(优先于白名单),符合正则表达式的字段不会被打包。默认为空,表示不进行匹配判断。更多信息,请参见正则表达式

ltrim

String

在输出字段名称中,去掉前缀。

keep

Bool

打包数据后是否保留被打包的源数据。

True:输出结果中保留被打包的原数据。

False(默认值):输出结果中不保留被打包的源数据。

示例

  • 示例1:将日志所有字段打包到test字段,默认删除被打包的原始字段。

    • SPL语句

      * | pack-fields -include='\w+' as test
    • 输入数据

      test1:123
      test2:456
      test3:789
    • 输出结果

      test:{"test1": "123", "test2": "456", "test3": "789"}
  • 示例2:将日志所有字段打包到test字段,不删除被打包的原始字段。

    • SPL语句

      * | pack-fields -keep -include='\w+' as test
    • 输入数据

      test1:123
      test2:456
      test3:789
    • 输出结果

      test:{"test1": "123", "test2": "456", "test3": "789"}
      test1:123
      test2:456
      test3:789
  • 示例3:打包testabcd字段到content字段,不删除被打包的原始字段。

    • SPL语句

      * | pack-fields -keep -include='\w+' as content
    • 输入结果

      abcd@#%:123
      test:456
      abcd:789
    • 输出结果

      abcd:789
      abcd@#%:123
      content:{"test": "456", "abcd": "789"}
      test:456
  • 示例4:不打包testabcd字段,其余字段打包到content字段,删除被打包的原始字段。

    • SPL语句

      * | pack-fields -exclude='\w+' as content
    • 输入数据

      abcd@#%:123
      test:456
      abcd:789
    • 输出结果

      abcd:789
      content:{"abcd@#%": "123"}
      test:456
  • 示例5:提取出字段值中满足正则表达式的所有KV结果,并打包赋值给name字段。

    • SPL语句

      * | parse-kv -prefix='k_' -regexp dict, '(\w+):(\w+)' | pack-fields -include='k_.*' -ltrim = 'k_' as name
    • 输入数据

      dict: x:123, y:456, z:789
    • 输出结果

      dict:x:123, y:456, z:789
      name:{"x": "123", "y": "456", "z": "789"}

log-to-metric

将日志格式转化为时序存储的格式。

重要
  • 默认忽略不符合时序数据(Metric)要求的日志数据。

  • 自动识别原始日志数据时间字段的时间单位,支持秒、毫秒、微秒、纳秒。

  • 默认Hash写。

语法

| log-to-metric -wildcard -format -names=<names> -labels=<labels> -time_field=<time_field>

参数说明

参数

类型

必填

说明

wildcard

Bool

nameslabels指定的字段名是否开启通配模式。

默认为字段精确匹配。您需要开启通配模式时,需添加该参数。

format

Bool

​否

是否开启自动format。

默认不开启,加工过程中跳过非法的label数据。

开启后对label的非法数据做 format 操作,label值不能含有 "|""#" "$" 等符号,如有的话使用 "_" 代替。

names

FieldList

日志字段列表,用于生成对应的Metric时序点。

如果输入数据中的字段,与至少一个指定的字段名、字段名通配模式匹配,则生成该字段对应的Metric时序点,指标名称即为字段名,指标值为字段值。

比如,[mem, "mem:pct"]表示生成两个时序点,名称分别为memmem:pct

重要
  • 输入字段名需遵循正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*,否则,将不生成该字段对应的时序点。

  • 输入字段值满足如下任一要求,否则,将不生成该字段对应的时序点:

    • 字段为数值类型TINYINT、SMALLINT、INTEGER、BIGINT、HUGEINT、REAL、或者DOUBLE。

    • 字段为文本类型VARCHAR,且其值可转换为合法的DOUBLE类型。

时序数据格式请参考时序数据(Metric)

labels

FieldList

​否

日志字段列表,用于构造对应的时序Label信息。

如果输入数据中的字段,与至少一个指定的字段名、字段名通配模式匹配,则将该字段添加至时序点的label中,label名称即为字段名,label值为字段值。

比如,[host, ip]表示添加两个时序Label,分别为hostip及其原始字段值。

重要
  • 输入字段名需遵循正则表达式[a-zA-Z_][a-zA-Z0-9_]*,否则,生成的时序点label将不包含该字段。

  • 输入字段值需不包含竖线|,否则,生成的时序点Label不覆盖该字段。

  • 输入字段类型为文本类型VARCHAR,否则,不生成对应label。

时序数据格式请参考时序数据(Metric)

time_field

String

时序数据的时间字段。默认使用日志中__time__字段作为时序数据的时间字段。

重要

  • 输入字段格式为时间戳,对应的数值类型需为BIGINT、VARCHAR,若字段为文本类型VARCHAR,其值可转化为合法的BIGINT类型

示例

  • 示例1:将rt字段所在的日志转换为时序数据格式。

    • SPL语句

      * | log-to-metric -names='["rt"]'
    • 输入数据

      __time__: 1614739608
      rt: 123
    • 输出结果

      __labels__:
      __name__:rt
      __time_nano__:1614739608
      __value__:123
  • 示例2:将rt字段所在的日志转换为时序数据格式,并将host字段作为新增labels信息字段。

    • SPL语句

      * | log-to-metric -names='["rt"]' -labels='["host"]'
    • 输入数据

      __time__: 1614739608
      rt: 123
      host: myhost
    • 输出结果

      __labels__:host#$#myhost
      __name__:rt
      __time_nano__:1614739608
      __value__:123
  • 示例3:将rtqps字段所在的日志转换为时序数据格式,并将host字段作为新增labels信息字段。

    • SPL语句

      * | log-to-metric -names='["rt", "qps"]' -labels='["host"]'
    • 输入数据

      __time__: 1614739608
      rt: 123
      qps: 10
      host: myhost
    • 输出结果

      __labels__:host#$#myhost
      __name__:rt
      __time_nano__:1614739608
      __value__:123
      
      __labels__:host#$#myhost
      __name__:qps
      __time_nano__:1614739608
      __value__:10

  • 示例4:模糊匹配将rt1rt2字段所在的日志转换为时序数据格式,并将host字段作为新增labels信息字段。

    • SPL语句

      * | log-to-metric -wildcard -names='["rt*"]' -labels='["host"]'
    • 输入数据

      __time__: 1614739608
      rt1: 123
      rt2: 10
      host: myhost
    • 输出结果

      __labels__:host#$#myhost
      __name__:rt1
      __time_nano__:1614739608
      __value__:123
      
      __labels__:host#$#myhost
      __name__:rt2
      __time_nano__:1614739608
      __value__:10
  • 示例5:将rtqps字段所在的日志转换为时序数据格式,并将host字段作为新增labels信息字段,同时自动格式化新增label值。

    • SPL语句

      * | log-to-metric -format -names='["rt", "qps"]' -labels='["host"]'
    • 输入数据

      __time__: 1614739608
      rt: 123
      qps: 10
      host: myhost1|myhost2
    • 输出结果

      __labels__:host#$#myhost1_myhost2
      __name__:rt
      __time_nano__:1614739608
      __value__:123
      
      __labels__:host#$#myhost1_myhost2
      __name__:qps
      __time_nano__:1614739608
      __value__:10
  • 示例6:将rtqps字段所在的日志转换为时序数据格式,替换字段名称为max_rttotal_qps,并将host字段作为新增labels信息字段。

    • SPL语句

      * | project-rename max_rt = rt, total_qps = qps| log-to-metric -names='["max_rt", "total_qps"]' -labels='["host"]'
    • 输入数据

      __time__: 1614739608
      rt: 123
      qps: 10
      host: myhost
    • 输出结果

      __labels__:host#$#myhost
      __name__:max_rt
      __time_nano__:1614739608
      __value__:123
      
      __labels__:host#$#myhost
      __name__:total_qps
      __time_nano__:1614739608
      __value__:10
  • 示例7:将rtqps字段所在的日志转换为时序数据格式,替换字段名称为max_rttotal_qps,并将host字段重命名为hostname后作为新增labels信息字段。

    • SPL语句

      * | project-rename max_rt = rt, total_qps = qps, hostname=host| log-to-metric -names='["max_rt", "total_qps"]' -labels='["hostname"]'
    • 输入数据

      __time__: 1614739608
      rt: 123
      qps: 10
      host: myhost
    • 输出结果

      __labels__:hostname#$#myhost
      __name__:max_rt
      __time_nano__:1614739608
      __value__:123
      
      __labels__:hostname#$#myhost
      __name__:total_qps
      __time_nano__:1614739608
      __value__:10
  • 示例8:将remote_user字段所在的日志转换为时序数据格式,将status字段作为新增labels信息字段,将time字段作为时序数据的时间字段,并指定原始日志数据时间单位为纳秒。

    • SPL语句

      * | log-to-metric -names='["remote_user"]' -labels='["status"]' -time_field='time'
    • 输入数据

      time:1652943594
      remote_user:89
      request_length:4264
      request_method:GET
      status:200
    • 输出结果

      __labels__:status#$#200
      __name__:remote_user
      __time_nano__:1652943594
      __value__:89

metric-to-metric

对已有时序数据进一步加工(如添加/修改/删除标签)。

重要
  • 输入字段名需遵循正则表达式[a-zA-Z_][a-zA-Z0-9_]*,否则,生成的时序点Label将不包含该字段。

  • 如果三个option参数包含同一个字段,优先级为:add_labels > del_labels > rename_labels 。

输出时序数据格式请参考时序数据(Metric)

语法

| metric-to-metric -format -add_labels=<add_labels> -del_labels=<del_labels> -rename_labels=<rename_labels>

参数说明

参数

类型

必填

说明

add_labels

Array

需要增加的Label字段列表,用于构造新的时序Label信息。

将原始数据添加至时序点的Label中,仅支持VARCHAR类型。

比如,{"host":"http://www.xxx.com", "ip":"127.0.0.1"}是原始数据,输入["host", "ip"],原始的label中增加|host#$#http://www.xxx.com|ip#$#127.0.0.1 ,如果原始的label中存在host字段,会覆盖原字段的值。

del_labels

Array

需要减少的Label字段列表,用于构造新的时序Label信息。

如果输入数据中的字段,原始Label中的字段名匹配,则将原始Label中的对应字段删除。

比如,原始的Label值为 host#$#http://www.xxx.com|ip#$#127.0.0.1,输入["ip"]表示删除一个时序Label,原始的label中更新为host#$#http://www.xxx.com ,如果原始的label中存在ip字段,不做处理。

rename_labels

Map

需要重命名的Label字段列表,用于构造新的时序Label信息。

将原始时序点的Label根据Map信息进行更新,key名称即为字段名,value值为新字段名。

比如,{"host":"host_new", "ip":"ip_new"}"host"重命名为"host_new""ip"重命名为"ip_new"。如果原始的label中不存在对应字段,不做处理。

format

Bool

是否开启自动format。默认不开启,加工过程中跳过非法数据。

开启后:

  • 对__labels__做排序。

  • LabelKey 和 LabelValue 做 format 操作。

    • LabelKey:需满足正则 “[a-zA-Z_][a-zA-Z0-9_]”,非法字符使用" "代替。

    • LabelValue:不能含有 "|", "#","$" 等符号,如有的话使用 "_" 代替。

  • 将__labels__中 LabelValue 为空字符串的Label给 drop 掉,但该条数据仍保留。

  • 去除__labels__字段中的重复 Label,保留逻辑按LabelValue的字母序。

示例

  • 示例1:增加label。

    • SPL语句

      * | extend qps = '10'|metric-to-metric -add_labels='["qps"]'
    • 输入数据

      __labels__:host#$#myhost
      __name__:rt
      __time_nano__:1614739608
      __value__:123
    • 输出结果

      __labels__:host#$#myhost|qps#$#10
      __name__:rt
      __time_nano__:1614739608
      __value__:123
  • 示例2:删除label。

    • SPL语句

      * | metric-to-metric -del_labels='["qps"]'
    • 输入数据

      __labels__:host#$#myhost|qps#$#10
      __name__:rt
      __time_nano__:1614739608
      __value__:123
    • 输出结果

      __labels__:host#$#myhost
      __name__:rt
      __time_nano__:1614739608
      __value__:123
  • 示例3:重命名label。

    • SPL语句

      * | metric-to-metric -rename_labels='{"host":"etl_host"}'
    • 输入数据

      __labels__:host#$#myhost|qps#$#10
      __name__:rt
      __time_nano__:1614739608
      __value__:123
    • 输出结果

      __labels__:etl_host#$#myhost|qps#$#10
      __name__:rt
      __time_nano__:1614739608
      __value__:123
  • 示例4:一键format非法数据。

    • SPL语句

      * | metric-to-metric -format
    • 输入数据

      __labels__:host#$#myhost|qps#$#10|asda$cc#$#j|ob|schema#$#|#$#|#$#xxxx
      __name__:rt
      __time_nano__:1614739608
      __value__:123
    • 输出结果

      __labels__:asda_cc#$#j|host#$#myhost|qps#$#10
      __name__:rt
      __time_nano__:1614739608
      __value__:123