【圖文教程】五分鐘內搞一個雙十一資料大屏_實時看到自己的業務訪問情況
提到雙十一人人都會想到天貓霸氣的實時大屏。說起實時大屏,都會想到最典型的流式計算架構:
- 資料採集:將來自各源頭資料實時採集
- 中間儲存:利用類Kafka Queue進行生產系統和消費系統解耦
- 實時計算:環節中最重要環節,訂閱實時資料,通過計算規則對視窗中資料進行運算
- 結果儲存:計算結果資料存入SQL和NoSQL
- 視覺化:通過API呼叫結果資料進行展示
在阿里集團內,有大量成熟的產品可以完成此類工作,一般可供選型的產品如下:
除這種方案外,今天給大家介紹一種新的方法:通過日誌服務(LOG,原SLS)查詢分析LogSearch/Analytics API 直接對接DataV進行大屏展示。
兩種方式差別
計算一般根據資料量、實時性和業務需求會分為兩種方式:實時計算(流計算)、離線計算(資料倉庫+離線計算),日誌服務(原SLS)對實時採集資料提供兩種方式對接。
除此之外,對於資料量偏大,對實時性有要求的日誌分析場景,我們提供實時索引LogHub中資料機制,之後可通過LogSearch/Anlaytics直接進行查詢分析。這種方法好處是什麼:
- 快速:API傳入Query立馬拿到結果,無需等待和預計算結果
- 實時:日誌產生到反饋大屏99.9%情況下1秒內
- 動態:無論修改統計方法、補資料能立馬重新整理結果,不需要等待重新計算
當然沒有一個計算系統是萬能的,這種方式限制如下:
- 資料量:單次計算資料量在百億以下,超過需要限定時間段
- 計算靈活度:目前計算限於SQL92語法,不支援自定義UDF
實際案例:不斷調整統計口徑下實時大屏
雲棲大會期間有個臨時需求,統計線上(網站)在全國各地訪問量。由於之前採集全量日誌資料並且在日誌服務中打開了查詢分析,所以只要寫一個查詢分析Query即可。以統計UV為例子:我們對所有訪問日誌中nginx下forward欄位獲取10月11日到目前唯一計數:
* | select approx_distinct(forward) as uv
線上已跑了1天需求變更了,只需要統計yunqi這個域名下的資料。我們增加了一個過濾條件(host),立馬拿到結果:
host:yunqi.aliyun.com | select approx_distinct(forward) as uv
後來發現Nginx訪問日誌中有多個IP情況,預設情況下只要第一個ip即可,在查詢中對Query進行處理
host:yunqi.aliyun.com | select approx_distinct(split_part(forward,',',1)) as uv
到第三天接到需求,針對訪問計算中需要把uc中廣告訪問去掉,於是我們加上一個過濾條件(not …)既馬上算到最新結果:
host:yunqi.aliyun.com not url:uc-iflow | select approx_distinct(split_part(forward,',',1)) as uv
最後大屏效果如下:
使用說明:SLS對接DataV
主要分3個步驟:
- 資料採集,參考文件
- 對接DataV外掛,將實時查詢SQL轉化為檢視
我們主要演示步驟3,在做完1、2步驟後,在查詢頁面可以看到原始日誌:
建立dataV資料來源
型別指定『簡單日誌服務-SLS』
名稱自定義
AK ID和AK Secret填寫主賬號,或者有許可權讀取日誌服務的子帳號的AK。
Endpoint填寫 日誌服務的project所在region的地址。圖中為杭州的region地址。
建立一個折線圖
建立一個折線圖,在折線圖的資料配置中,資料來源型別選擇『簡單日誌服務-SLS』,然後選擇剛剛建立的資料來源『log_service_api』在查詢中輸入引數。
查詢引數樣例如下:
{
"projectName": "dashboard-demo",
"logStoreName": "access-log",
"topic": "",
"from": ":from",
"to": ":to",
"query": "*| select approx_distinct(remote_addr) as uv ,count(1) as pv , date_format(from_unixtime(date_trunc('hour',__time__) ) ,'%Y/%m/%d %H:%i:%s') as time group by date_trunc('hour',__time__) order by time limit 1000" ,
"line": 100,
"offset": 0
}
projectName填寫自己的project。
logstoreName填寫日誌的logstore。
from和to分別是日誌的起始和結束時間。
注意,上文的我們填寫的是:from和:to。 在測試時,可以先填寫unix time,例如1509897600。等釋出之後,換成:from和:to這種形式,然後我們可以在url引數裡控制這兩個數值的具體時間範圍。例如,預覽是的url是
http://datav.aliyun.com/screen/86312
, 開啟http://datav.aliyun.com/screen/86312?from=1510796077&to=1510798877
後,會按照指定的時間進行計算。
query填寫查詢的條件,query的語法參考分析語法文件。樣例中是展示每分鐘的pv數。 query中的時間格式,一定要是2017/07/11 12:00:00這種,所以採用date_format(from_unixtime(date_trunc('hour',__time__) ) ,'%Y/%m/%d %H:%i:%s') 把時間對齊到整點,再轉化成目標格式。
其他引數採用預設值。
配置完成後,點選『檢視資料響應結果』:
點選上方『使用過濾器』,然後新建一個過濾器:
過濾器內容填寫:
return Object.keys(data).map((key) => {
let d= data[key];
d["pv"] = parseInt(d["pv"]);
return d;
}
)
在過濾器中,要把y軸用到的結果變成int型別,上述樣例中,y軸是pv,所以需要轉換pv列。
能看到在結果中有t和pv兩列,那麼我們在x軸配置為t,y軸配置成pv。