本文主要介紹資料加工(新版)指令的用法和樣本。
pack-fields
將多個欄位打包,以JSON序列化輸出到新欄位,適用於需要結構化傳輸的情境(如API請求體構建)。
預設不處理非Varchar類型的欄位(包括
__time__和__time_ns_part__)。預設不保留來源資料。
文法
| pack-fields -keep -ltrim -include=<include> -exclude=<exclude> as <output>參數說明
參數 | 類型 | 必填 | 說明 |
output | String | 是 | 指定打包後輸出的欄位名稱。欄位值格式為JSON格式。 |
include | RegExp | 否 | 白名單配置,符合Regex的欄位會被打包。預設為".*" ,表示全部匹配。更多資訊,請參見Regex。 |
exclude | RegExp | 否 | 黑名單配置(優先於白名單),符合Regex的欄位不會被打包。預設為空白,表示不進行匹配判斷。更多資訊,請參見Regex。 |
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:提取出欄位值中滿足Regex的所有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> -buckets=<buckets>參數說明
參數 | 類型 | 必填 | 說明 |
wildcard | Bool | 否 |
預設為欄位精確匹配。您需要開啟通配模式時,需添加該參數。 |
format | Bool | 否 | 是否開啟自動format。 預設不開啟,加工過程中跳過非法的label資料。 開啟後對label的非法資料做 format 操作,label值不能含有 |
names | FieldList | 是 | 日誌欄位列表,用於產生對應的Metric時序點。 如果輸入資料中的欄位,與至少一個指定的欄位名、欄位名通配模式比對,則產生該欄位對應的Metric時序點,指標名稱即為欄位名,指標值為欄位值。 比如, 重要
時序資料格式請參考時序資料(Metric)。 |
labels | FieldList | 否 | 日誌欄位列表,用於構造對應的時序Label資訊。 如果輸入資料中的欄位,與至少一個指定的欄位名、欄位名通配模式比對,則將該欄位添加至時序點的label中,label名稱即為欄位名,label值為欄位值。 比如, 重要
時序資料格式請參考時序資料(Metric)。 |
time_field | String | 否 | 時序資料的時間欄位。預設使用日誌中 重要 輸入欄位格式為時間戳記,對應的數實值型別需為BIGINT、VARCHAR,若欄位為文本類型VARCHAR,其值可轉化為合法的BIGINT類型。 |
buckets | Integer | 否 | 預設值32,建議設定為目標的shard數量。調節hash的範圍,用於最佳化log-to-metric運算元的寫入效能。該參數控制hash bucket的數量,影響資料在MetricStore中的分布和查詢效能。 |
樣本
樣本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
對已有時序資料進一步加工(如添加/修改/刪除標籤)。
輸入欄位名需遵循Regex
[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> -buckets=<buckets>參數說明
參數 | 類型 | 必填 | 說明 |
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。預設不開啟,加工過程中跳過非法資料。 開啟後:
|
buckets | Integer | 否 | 預設值32,建議設定為目標的shard數量。調節hash的範圍,用於最佳化metric-to-metric運算元的寫入效能。該參數控制hash bucket的數量,影響資料在MetricStore中的分布和查詢效能。 |
樣本
樣本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