簡介
【數據加工】是一個可託管、高可用、可擴展的數據處理服務,廣泛適用於數據的規整、富化、分發、彙總、重建索引等場景。這裡詳細介紹如何通過數據加工實現數據的分發與彙總,從而實現統一存儲管理或分類精細化查詢分析,以及存儲成本優化等目的。
分發與彙總
場景
數據分發
從源 logstore 中讀取數據,進行加工後,根據給定條件分別輸出到多個不同的目標 logstore 中。
數據彙總
將多個源 logstore 中讀取數據,彙集到同一個目標 logstore 中。需要在每一個源 logstore 中配置一個數據加工任務。
跨賬號數據流轉
通過數據加工實現跨賬號數據流轉,主要涉及的問題是如何授權:RAM 賬號授權、STS 角色授權。請參考另一篇文章 SLS【數據加工】授權配置
跨區域數據流轉
跨區域數據流轉支持直接走公網,也可以選擇阿里雲 DCDN。請參考 數據加工 - 跨Region傳輸功能介紹
相關算子
- e_output/e_coutput:輸出事件,不再繼續加工。e_coutput 會對數據進行拷貝
- e_keep/e_drop:指定條件,保留/丟棄事件
- e_search:事件檢查,輸入查詢語句,比如
e_search("field=value")
- e_if/e_if_else/e_switch:流程控制
案例
我們的測試服務器部署在上海和北京,對應的訪問日誌採集到了上海區域的 project/logstore:test-app-sh/access-log,和北京區域的project/logstore:test-app-bj/access-log,數據保存時間是30天。訪問日誌樣例如下:
{
"__time__": 1607655081,
"bytes_sent": "666",
"host": "xxxx.com.cn",
"hostname": "xxxx.ali.dm",
"http_referer": "https,//xxxx.com.cn/",
"http_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
"remote_addr": "10.0.0.0",
"remote_user": "-",
"request_method": "GET",
"request_protocol": "HTTP/1.1",
"request_time": "0.035",
"request_trace_id": "xxxx-9092-7974215498-0-1596182547.188",
"request_uri": "/xxx/type?id=203298390015668&name=yyyy",
"status": "200",
"time_local": "11/Dec/2020,10,51,21",
"upstream_addr": "10.0.0.0,8080"
}
我們需要實現兩個目標:
- 將北京區域的訪問日誌彙集到上海的 logstore,做統一存儲和查詢分析,需要標記日誌的service區域“app-bj”
- 拆分出返回狀態碼 status 為4xx(客戶端錯誤)和5xx(服務端錯誤)的訪問日誌,保存到獨立的 logstore 中,保存時間分別為90天和180天,以保證能夠長時間檢索。
彙集北京的數據到上海 logstore
在北京的logstore:test-app-bj/access-log 配置數據加工,腳本為:
e_set("__service__", "app-bj")
e_output("logstore-sh")
保存配置為:
這裡的“目標名稱”與 e_output 所填的名稱保持一致,project/logstore 選定為上海數據存儲的logstore。
數據彙集後,在上海logstore可看到:
分發錯誤訪問日誌
在access-log中,可以看到status字段的統計信息如下圖,可以看出我們的數據中,返回4xx和5xx的數據佔比是很小的(這是模擬數據,實際線上業務會更小),也就是說只有很少一部分數據需要長期存儲。所以,根據時間條目重要程度將其分發,並做差異化存儲,除了可以做精細分析,還可以實現存儲成本優化。
在上海的 logstore:test-app-bj/access-log 配置數據加工,腳本如下:
- 首先判斷事件是否滿足status>=500,如果滿足則直接輸出到目標access-5xx
- 否則繼續往下執行,判斷事件是否滿足status>=400,如果滿足則直接輸出到目標access-4xx
- 如果都沒有滿足,則丟棄事件(不會輸出到任何目標)
e_if(e_search("status>=500"), e_output("access-5xx"))
e_if(e_search("status>=400"), e_output("access-4xx"))
e_drop()
加工完成以後的數據如下圖,在 logstore:access-5xx 裡面,只保存返回狀態碼為5xx的訪問日誌。
後記
以上就是使用 SLS【數據加工】功能,實現數據的分發和彙集的詳細步驟。如果您在使用 SLS 過程中有任何問題,請加入我們釘釘服務群,也歡迎關注 SLS 的微信技術公眾號和B站視頻號。