本文檔主要介紹數據加工功能的一些基本概念。
基本概念
ETL
ETL是指將對業務系統的數據進行抽取、清洗、轉換、加載的過程,從而整合零散、不標準、不統一的數據。日志服務支持加載源Logstore數據,將數據轉換后輸出到目標Logstore,同時也支持加載OSS、RDS或其他Logstore的數據。
事件、數據、日志
在數據加工功能中,事件、數據都表示日志,例如事件時間就是日志時間,丟棄事件字段函數
drop_event_fields
就是用于丟棄特定日志字段的函數。日志時間
日志時間指事件所發生的時間,也稱事件時間。在日志服務中的保留字段為
__time__
,一般由日志中的時間信息直接提取生成。數據類型為整數字符串,Unix標準時間格式,單位為秒,表示從1970-1-1 00:00:00 UTC計算起的秒數。日志接收時間
日志到達日志服務的服務器被接收時的時間,默認不保存在日志中,但是如果Logstore開啟了記錄外網IP地址,則該時間會保留在日志標簽字段的
__receive_time__
中。數據加工中時間的完整字段名是__tag__:__receive_time__
。數據類型為整型,Unix標準時間格式。單位為秒,表示從1970-1-1 00:00:00 UTC計算起的秒數。說明大部分場景下,日志是實時發送給日志服務的,因此日志時間與日志接收時間基本相同。如果是導入歷史日志的情況,例如通過SDK導入過去30天的日志,那么日志接收時間就是當前時間,和日志時間不一致。
日志標簽
日志存在標記,區別于其他字段,在數據加工中,標簽字段以
__tag__:
作為前綴。包括:用戶自定義標簽:用戶通過API PutLogs寫入數據時添加的標簽。
系統標簽:日志服務為用戶添加的標簽,包括
__client_ip__
和__receive_time__
。
配置相關概念
源Logstore
數據加工中,從中讀取數據再進行加工的Logstore是源Logstore。
一個加工任務僅支持一個源Logstore,但可以對一個源Logstore配置多個加工任務。
目標Logstore
數據加工中,數據寫入的Logstore是目標Logstore。
一個加工任務可以配置多個目標Logstore,可以是靜態配置,也可以是動態配置。具體配置方法,請參見多目標Logstore數據分發。
SLS DSL
SLS DSL(Domain Specific Language)是日志服務數據加工使用的一種Python兼容的腳本語言。SLS DSL基于Python提供內置兩百多個函數,簡化常見的數據加工模式。也支持用戶自定義的擴展Python腳本。更多信息,請參見語言簡介。
加工規則
數據加工腳本,SLS DSL編排的邏輯代碼的集合。
加工任務
數據加工最小調度單元,由源Logstore、目標Logstore、加工規則、加工時間范圍以及其他配置項組成。
規則相關概念
資源
除源Logstore外,數據加工中做某些配置或者富化引用的第三方數據源叫做資源,包括但不限于本地資源,OSS,RDS,其他Logstore(除源和目標Logstore外)等。更多信息,請參見資源函數。
維表
用于做富化的數據的某些維度信息的外部表格叫做維表。例如公司用戶賬戶列表、產品列表、地理位置信息庫等。維表一般存在于資源中,可能會動態更新。
富化/映射
日志包含的信息不完整時,需要借助外部信息進行完善,對日志的一個或多個字段通過映射完善出更多信息的過程叫做富化或者映射。
例如某個請求包含HTTP狀態碼status,可以通過如下表格富化出新字段HTTP狀態描述status_desc:
富化前
富化后
status
status_desc
200
成功
300
跳轉
400
權限錯誤
500
服務器錯誤
或者源數據中有user_id字段,使用外部賬戶維表,映射出其對應用戶名、性別、注冊時間、郵箱等信息,放入到日志字段中并寫入目標Logstore中。更多信息,請參見映射富化函數。
分裂
日志信息比較復雜,同時包含多條信息時,將一條日志分裂成多條日志的過程叫做事件分裂。
例如某一條日志的字段內容如下:
__time__: 1231245 __topic: "win_logon_log" content: [ { "source": "192.0.2.1", "dest": "192.0.2.1" "action": "login", "result": "pass" },{ "source": "192.0.2.2", "dest": "192.0.2.1" "action": "logout", "result": "pass" } ]
可以分裂成如下2條日志:
__time__: 1231245 __topic: "win_logon_log" content: { "source": "192.0.2.1", "dest": "192.0.2.1" "action": "login", "result": "pass" }
__time__: 1231245 __topic: "win_logon_log" content: { "source": "192.0.2.2", "dest": "192.0.2.1" "action": "logout", "result": "pass" }
GROK
使用模式化語法代替復雜的正則表達式。
例如:
grok("%{IPV4}")
表示一個匹配IPv4的正則表達式,等價于"(?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])"
。更多信息,請參見GROK函數。正則捕獲
通過正則表達式捕獲指定內容并直接進行命名,可以更直觀地配置提取的字段名。
例如
e_regex("content", "(?P<email>[a-zA-Z][a-zA-Z0-9_.+-=:]+@\w+\.com)")
表示提取字段content
中的郵件地址并放入字段email
中。這里郵件是一個通用正則表達式,推薦使用GROK進行簡化:e_regex("content", grok("%{EMAILADDRESS:email}"))
。更多信息,請參見正則表達式。