日誌服務CLIETL-擴充套件UDF

成喆發表於2019-01-19

背景

CLI的命令中,可以看到有一個重要的引數config進行ETL的規則配置。這其實是一個Python模組,通過import其他Python模組,或者直接編寫符合協議的UDF來擴充套件ETL的規則。本篇介紹CLI ETL規則的擴充套件協議與機制。

擴充套件與UDF

條件式事件轉換UDF

在轉換列表中支援UDF擴充套件:

UDF (Python):
@support_event_list_simple     # 自動支援多事件處理
def update_fields(e):
    e["some_field_x"] = "100"
    del e["some_feild_y"]
    return e   # 也可以返回None(表示丟棄), 返回列表(表示分裂)

TRANSFORM_LIST_data = [  ({"data": "^LTE_Information "},update_fields), "..."]

欄位提取&轉換UDF

在轉換列表中,支援基於("欄位名", UDF)方式擴充套件:

@support_event_list_simple         # 自動支援多事件處理
def remove_fields(e, filed_input):
    del e[filed]
    return e

TRANSFORM_LIST_data = [ 
         ({"data": "^LTE_Information "}, ("internal",remove_fields)  ),
       ({"data": "^Status,"}, ("field_x", V("field_y")  ),
        "…"]

內建方法: V, CSV, TSV, LOOKUP, KV, JSON等,都是通過這種方式構建的。

全域性UDF

基於全域性的UDF以及協議

注意:

  • sls_en_xxx 表示返回一個新的事件(替換),後續日誌將使用這個處理
  • sls_eu_xxx 表示返回事件部分資訊(更新),日誌會和這個部分內容合併成給一個新的日誌後處理。
  1. 事件丟棄: 返回None
def sls_en_xxx(event):
    return None if event.get("error") else event
  1. 事件替換: 返回一個新的事件 (返回None表示丟棄)
def sls_en_xxx(event):
    event["hello"] = "world"
    return event
  1. 事件更新: 返回一個欄位集合進行補充
def sls_eu_xxx(event):
    return { "field_x": "my value"}
  1. 事件分裂: 返回一個事件列表
def sls_en_xxx(event):
    return [event, event]

基於條件的全域性UDF

支援基於特定條件的轉換,UDF必須以sls_en_或者sls_eu_開頭。

@condition(條件列表 查考#10)
def sls_eu_/sls_en_xxx(event):
    return "…"

樣例:

@condition({"http_user_agent": r".+Linux.+"})
def sls_en_windows(event):
    event["is_linux"] = "1"
    return event
@condition(NO_EMPTY("real_client_ip"))
def sls_eu_anoymouse_ip(event):
    return {"real_client_ip":
    event["real_client_ip"][:3] + "*****" + event["real_client_ip"][-3:]}

函式變數式UDF

也可以直接構造以sls_eu_或者sls_en_開頭的變數函式,如下:

from aliyun.log.etl_core import *
sls_en_ke1 = keep_event({"__topic__": "ddos_access_log","cc_phase": r".+"})
sls_en_de1 = drop_event([EMPTY("status"),EMPTY("http_user_agent"),{"http_user_agent": "-"},{"status": r"2d+"}])
sls_en_kf1 = KEEP_F(["http_user_agent","real_client_ip","remote_addr","status","cc_phase"])
sls_en_kv1 = KV_F([”request_uri",” cookies"])
sls_en_dse1 = dispatch_event([
({"status": lambda x: int(x) // 100 == 3},{"error_type": "challenge"}),
({"status": lambda x: int(x) // 100 == 4},{"error_type": "auth"}),
 ({"status": lambda x: int(x) // 100 == 5},{"error_type": "internal"}),
 (True,DROP)
 ])
sls_en_df1 = DROP_F(["remote_addr"])
sls_en_df2 = DROP_F("http_user_agent")

UDF輸入引數說明

以上UDF都有一個event引數,其格式是Python dict格式,所有值都是Unicode字串(包括時間)

部分特殊關鍵字:
TAG: __tag__:host,__tag__:source,等
時間: __time__
主題: __topic__

進一步資料

相關連結


相關文章