1. 程式人生 > >【圖文教程】五分鐘內搞一個雙十一資料大屏_實時看到自己的業務訪問情況

【圖文教程】五分鐘內搞一個雙十一資料大屏_實時看到自己的業務訪問情況

點選有驚喜

提到雙十一人人都會想到天貓霸氣的實時大屏。說起實時大屏,都會想到最典型的流式計算架構:

  • 資料採集:將來自各源頭資料實時採集
  • 中間儲存:利用類Kafka Queue進行生產系統和消費系統解耦
  • 實時計算:環節中最重要環節,訂閱實時資料,通過計算規則對視窗中資料進行運算
  • 結果儲存:計算結果資料存入SQL和NoSQL
  • 視覺化:通過API呼叫結果資料進行展示

在阿里集團內,有大量成熟的產品可以完成此類工作,一般可供選型的產品如下:

image.png

​ 除這種方案外,今天給大家介紹一種新的方法:通過日誌服務(LOG,原SLS)查詢分析LogSearch/Analytics API 直接對接DataV進行大屏展示。

image.png

兩種方式差別

計算一般根據資料量、實時性和業務需求會分為兩種方式:實時計算(流計算)、離線計算(資料倉庫+離線計算),日誌服務(原SLS)對實時採集資料提供兩種方式對接。

image.png

除此之外,對於資料量偏大,對實時性有要求的日誌分析場景,我們提供實時索引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

Nov-16-2017 14-10-49.gif

最後大屏效果如下:

image.png

使用說明:SLS對接DataV

主要分3個步驟:

  1. 資料採集,參考文件
  2. 對接DataV外掛,將實時查詢SQL轉化為檢視

我們主要演示步驟3,在做完1、2步驟後,在查詢頁面可以看到原始日誌:

image.png

建立dataV資料來源

image.png

image.png

型別指定『簡單日誌服務-SLS』

名稱自定義

AK ID和AK Secret填寫主賬號,或者有許可權讀取日誌服務的子帳號的AK。

Endpoint填寫 日誌服務的project所在region的地址。圖中為杭州的region地址。

建立一個折線圖

建立一個折線圖,在折線圖的資料配置中,資料來源型別選擇『簡單日誌服務-SLS』,然後選擇剛剛建立的資料來源『log_service_api』在查詢中輸入引數。

image.png

查詢引數樣例如下:

{
    "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') 把時間對齊到整點,再轉化成目標格式。

其他引數採用預設值。

配置完成後,點選『檢視資料響應結果』:

image.png

點選上方『使用過濾器』,然後新建一個過濾器:

image.png

過濾器內容填寫:

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。

配置一個餅狀圖

image.png


點選有驚喜