本文檔主要介紹資料加工功能的一些基本概念。
基本概念
ETL
ETL是指將對業務系統的資料進行抽取、清洗、轉換、載入的過程,從而整合零散、不標準、不統一的資料。Log Service支援載入源Logstore資料,將資料轉換後輸出到目標Logstore,同時也支援載入OSS、RDS或其他Logstore的資料。
事件、資料、日誌
在資料加工功能中,事件、資料都表示日誌,例如事件時間就是日誌時間,丟棄事件欄位函數
drop_event_fields就是用於丟棄特定日誌欄位的函數。日誌時間
日誌時間指事件所發生的時間,也稱事件時間。在Log Service中的保留欄位為
__time__,一般由日誌中的時間資訊直接提取產生。資料類型為整數字串,Unix標準時間格式,單位為秒,表示從1970-1-1 00:00:00 UTC計算起的秒數。日誌接收時間
日誌到達Log Service的伺服器被接收時的時間,預設不儲存在日誌中,但是如果Logstore開啟了記錄外網IP地址,則該時間會保留在日誌標籤欄位的
__receive_time__中。資料加工中時間的完整欄位名是__tag__:__receive_time__。資料類型為整型,Unix標準時間格式。單位為秒,表示從1970-1-1 00:00:00 UTC計算起的秒數。說明大部分情境下,日誌是即時發送給Log Service的,因此日誌時間與日誌接收時間基本相同。如果是匯入歷史日誌的情況,例如通過SDK匯入過去30天的日誌,那麼日誌接收時間就是目前時間,和日誌時間不一致。
日誌標籤
日誌存在標記,區別於其他欄位,在資料加工中,標籤欄位以
__tag__:作為首碼。包括:使用者自訂標籤:使用者通過API PutLogs寫入資料時添加的標籤。
系統標籤:Log Service為使用者添加的標籤,包括
__client_ip__和__receive_time__。
配置相關概念
源Logstore
資料加工中,從中讀取資料再進行加工的Logstore是源Logstore。
一個加工任務僅支援一個源Logstore,但可以對一個源Logstore配置多個加工任務。
目標Logstore
資料加工中,資料寫入的Logstore是目標Logstore。
一個加工任務可以配置多個目標Logstore,可以是靜態配置,也可以是動態配置。具體配置方法,請參見多目標Logstore資料分發。
SLS DSL
SLS DSL(Domain Specific Language)是Log Service資料加工使用的一種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
使用模式化文法代替複雜的Regex。
例如:
grok("%{IPV4}")表示一個匹配IPv4的Regex,等價於"(?<![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函數。正則捕獲
通過Regex捕獲指定內容並直接進行命名,可以更直觀地配置提取的欄位名。
例如
e_regex("content", "(?P<email>[a-zA-Z][a-zA-Z0-9_.+-=:]+@\w+\.com)")表示提取欄位content中的郵件地址並放入欄位email中。這裡郵件是一個通用Regex,推薦使用GROK進行簡化:e_regex("content", grok("%{EMAILADDRESS:email}"))。更多資訊,請參見Regex。