本文主要介绍数据加工(新版)指令的用法和示例。
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:打包test和abcd字段到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:不打包test和abcd字段,其余字段打包到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 | 否 |
默认为字段精确匹配。您需要开启通配模式时,需添加该参数。 |
format | Bool | 否 | 是否开启自动format。 默认不开启,加工过程中跳过非法的label数据。 开启后对label的非法数据做 format 操作,label值不能含有 |
names | FieldList | 是 | 日志字段列表,用于生成对应的Metric时序点。 如果输入数据中的字段,与至少一个指定的字段名、字段名通配模式匹配,则生成该字段对应的Metric时序点,指标名称即为字段名,指标值为字段值。 比如, 重要
时序数据格式请参考时序数据(Metric)。 |
labels | FieldList | 否 | 日志字段列表,用于构造对应的时序Label信息。 如果输入数据中的字段,与至少一个指定的字段名、字段名通配模式匹配,则将该字段添加至时序点的label中,label名称即为字段名,label值为字段值。 比如, 重要
时序数据格式请参考时序数据(Metric)。 |
time_field | String | 否 | 时序数据的时间字段。默认使用日志中 重要
|
示例
示例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:将
rt
和qps
字段所在的日志转换为时序数据格式,并将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:模糊匹配将rt1和rt2字段所在的日志转换为时序数据格式,并将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:将
rt
和qps
字段所在的日志转换为时序数据格式,并将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:将
rt
和qps
字段所在的日志转换为时序数据格式,替换字段名称为max_rt
和total_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:将
rt
和qps
字段所在的日志转换为时序数据格式,替换字段名称为max_rt和total_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类型。 比如, |
del_labels | Array | 否 | 需要减少的Label字段列表,用于构造新的时序Label信息。 如果输入数据中的字段,原始Label中的字段名匹配,则将原始Label中的对应字段删除。 比如,原始的Label值为 |
rename_labels | Map | 否 | 需要重命名的Label字段列表,用于构造新的时序Label信息。 将原始时序点的Label根据Map信息进行更新,key名称即为字段名,value值为新字段名。 比如, |
format | Bool | 否 | 是否开启自动format。默认不开启,加工过程中跳过非法数据。 开启后:
|
示例
示例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