摘要:?CDN是互聯(lián)網(wǎng)網(wǎng)站、應(yīng)用上極其重要的基礎(chǔ)設(shè)施,通過CDN可有效降低訪問延時、提升體驗有很大幫助,也有助于源站降低負載,容應(yīng)對流量高峰,保證服務(wù)的穩(wěn)定。CDN日志可實時導(dǎo)入日志服務(wù),基于日志服務(wù)靈活、快捷的統(tǒng)計分析能力,用戶對于CDN的數(shù)據(jù)分析將變得極其簡單和方便。
CDN(Content Delivery Network),內(nèi)容分發(fā)網(wǎng)絡(luò))是互聯(lián)網(wǎng)網(wǎng)站、應(yīng)用上極其重要的基礎(chǔ)設(shè)施,通過CDN,終端用戶可直接從邊緣節(jié)點訪問各種圖片、視頻資源,避免直接訪問源站。這對于降低訪問延時、提升體驗有很大幫助,也有助于源站降低負載,容應(yīng)對流量高峰,保證服務(wù)的穩(wěn)定。在(短)視頻、直播等對網(wǎng)絡(luò)流量很大需求的領(lǐng)域,CDN作用尤其重要。
CDN對于網(wǎng)站、應(yīng)用如此重要,對于CDN訪問的統(tǒng)計分析必不可少,先看一下以下幾個場景:
當(dāng)前服務(wù)狀態(tài)是否正常
訪問PV、UV是否有波動
帶寬、訪問延時是否正常
緩存命中率,訪問健康度如何
有人反饋服務(wù)訪問異常
異常來源是否有地域特性
是否和運營商有關(guān)
錯誤訪問和終端應(yīng)用版本是否有關(guān)聯(lián)
流量上漲
是正常訪問還是攻擊
哪些是熱點資源
是否有異常客戶
是否由于客戶端緩存策略導(dǎo)致
用戶行為分析
當(dāng)前在線人數(shù)、訪問次數(shù)
熱門資源
訪問來源、agent、分布等
傳統(tǒng)分析流程
現(xiàn)在各家CDN廠商,通常會提供基礎(chǔ)的監(jiān)控指標(biāo),比如請求次數(shù)、帶寬等信息,然后,在進行定制化分析場景下,默認指標(biāo)往往不能解決所有問題,需要對原始日志進行更深入的挖掘。以下是常見的處理方式:
定期下載CDN離線日志
將數(shù)據(jù)導(dǎo)入Hadoop 這樣的數(shù)倉系統(tǒng)
跑各類job(或hive)對數(shù)據(jù)進行分析,將最終結(jié)果導(dǎo)入Mysql
對分析結(jié)果進行實時展示
對于報表場景,以上流程沒有太大問題,可以處理海量CDN的日志,但是在實時問題定位,快速驗證、試錯等交互式分析強烈的場景下, 該方案的弊端就顯露出來:
離線模式下,數(shù)據(jù)產(chǎn)出實時性無法保證,延時從半小時到幾小時不等
需要維護多級Pipeline,需要有腳本或工具將其串聯(lián),有開發(fā)代價
環(huán)境維護,有運維代價,任意一個環(huán)節(jié)出問題,結(jié)果都不能產(chǎn)出
靈活性欠佳,無法快速響應(yīng)實時交互查詢需求
針對這種情況, 阿里云CDN和日志服務(wù)進行了打通,CDN日志可實時導(dǎo)入日志服務(wù),使用SLS的查詢和SQL分析能力,來滿足用戶個性化、實時、交互式的分析需求:
CDN的訪問日志,1分鐘內(nèi)可投遞至日志服務(wù)
直接在日志服務(wù)控制臺進行SQL查詢,無需任何代碼維護
秒級查詢分析1億~10億數(shù)據(jù)
使用日志服務(wù)的Dashboard功能,制定靈活的報表
接下來,對于CDN數(shù)據(jù)各類分析需求,看看如何在日志服務(wù)上實現(xiàn)。在這之前,我們先看一下CDN主要的字段說明。
CDN日志格式說明
字段名字類型說明client_iptext客戶端ipcontent_typetext數(shù)據(jù)類型domaintext域名hit_infotext緩存命中信息 HIT 或者 MISSmethodtext請求方法refer_domaintext請求來源域名refer_paramtext請求來源url 參數(shù)refer_uritext請求來源uriremote_iptextremote ipremote_portlongremote 端口request_sizelong請求輸入大小,單位byterequest_timelong響應(yīng)延時,單位毫秒response_sizelong請求返回大小,單位bytereturn_codelonghttp 狀態(tài)碼schemetext請求協(xié)議, 如httpuritext請求uriuri_paramtext請求參數(shù)user_agenttext請求Agent信息uuidtext標(biāo)識請求的唯一idxforwordfortextforword ip 地址CDN質(zhì)量和性能分析
CDN提供日志中,包含了豐富的內(nèi)容,我們可以從多個維度對CDN的整體質(zhì)量和性能進行全方位的統(tǒng)計和分析
健康度
統(tǒng)計return_code小于500的請求占所有請求的百分比
*?|?select?sum(s)?*?100.0/count(*)?as?health_ratio?from?(select?case?when?return_code?500?then?1?else?0?end?as?s?from?log)
緩存命中率
統(tǒng)計return_code小于400的請求中, hit_info 為 HIT的請求百分比
return_code?400?|?select?sum(s)?*?100.0/count(*)?as?Hit_ratio?from?(select?case?when?hit_info?=?'HIT'?then?1?else?0?end?as?s?from?log)
平均下載速度
統(tǒng)計一段時間內(nèi),總體下載量除以整體耗時獲得平均下載速度
*?|?select??sum(response_size)?*?1.0?/sum(request_time)
訪問次數(shù)Top域名
按照訪問域名次數(shù)進行Top排序
*?|?select?Domain?,?count(*)?as?count??group?by?Domain?order?by?count?desc??limit?100
下載流量Top域名
按照各個域名下載數(shù)據(jù)量大小進行Top排序
*?|?select?Domain?,??sum(response_size)?as??"下載總量"?group?by?Domain?order?by??"下載總量"??desc??limit?100
接下來,我們從省份和運營商的角度,來做實時統(tǒng)計:
各省訪問次數(shù)、下載流量、速度
使用ip_to_province函數(shù),將client_ip轉(zhuǎn)化成對應(yīng)的省份,統(tǒng)計各個省份的訪問次數(shù),下載的總量,以及下載平均速度
*?|?select?ip_to_province(client_ip)?as?province?,count(*)?as?"訪問次數(shù)",??sum(response_size)/1024.0/1024.0/1024.0?as?"下載流量(GB)"?,?sum(response_size)?*?1.0?/sum(request_time)?as?"下載速度(KB/s)"?group?by?province??having?ip_to_province(client_ip)?!=?''?order?by?"下載流量(GB)"?desc??limit?200
運營商的下載次數(shù)、下載流量、速度
原理同上,使用ip_to_provider函數(shù),將client_ip轉(zhuǎn)化成對應(yīng)的運營商
*?|?select?ip_to_provider(client_ip)?as?isp?,count(*)?as?"訪問次數(shù)",??sum(response_size)/1024.0/1024.0/1024.0?as?"下載流量(GB)"?,?sum(response_size)?*?1.0?/sum(request_time)?as?"下載速度(KB/s)"?group?by?isp??having?ip_to_provider(client_ip)?!=?''?order?by?"下載流量(GB)"?desc??limit?200
請求響應(yīng)延時
將訪問延時按照各窗口進行統(tǒng)計,可根據(jù)應(yīng)用實際的情況來劃分合適的延時時間窗口
*?|?select??case?when?request_time?50?then??'~50ms'??when?request_time?100?then?'50~100ms'??when?request_time?200?then?'100~200ms'?when?request_time?500?then?'200~500ms'?when?request_time?5000?then?'500~5000ms'??else?'5000ms~'?end?as??latency?,?count(*)?as?count?group?by?latency
訪問PV、UV統(tǒng)計
統(tǒng)計每分鐘內(nèi),訪問次數(shù)和獨立的client ip數(shù)
*?|?select?date_format?(from_unixtime(__time__?-?__time__?%?60),?'%H:%i')??as?date?,??count(*)?as?pv,??approx_distinct(client_ip)?as?uv??group?by??__time__?-?__time__?%?60??order?by?__time__?-?__time__?%?60
數(shù)據(jù)流量類型分布
統(tǒng)計各數(shù)據(jù)類型的訪問分布
*?|?select?content_type?,??sum(response_size)?as?sum_res??group?by?content_type???order?by?sum_res??desc?limit?10
CDN錯誤診斷
訪問錯誤一直是影響服務(wù)體驗的重要一環(huán),當(dāng)出現(xiàn)錯誤的時候,需要快速定位當(dāng)前錯誤QPS和比例是多少,哪些域名和URI影響最大,是否和地域、運營商有關(guān),是不是發(fā)布的新版本導(dǎo)致。
4xx、5xx錯誤百分比和分布
根據(jù)return_code的值,將錯誤分為4xx和5xx兩類,從下面的錯誤百分比和分布圖來看,主要的錯誤都是發(fā)生了403錯誤,說明被服務(wù)器拒絕請求,這個時候就需要檢查是不是資源使用超過限制。
*?|?select?date_format?(from_unixtime(m_time),?'%H:%i')??as?date,??sum(?ct?)?*?100.0/max(total)?as?error_ratio?,??case?when?return_code/100?5?then?'4xx'?else?'5xx'?end?as?code?from?(select?m_time,?return_code,?ct,?(sum(ct)?over(partition?by?m_time)?)?as?total??from????????(select???__time__?-?__time__?%?60?as?m_time,?return_code??,?count(*)?as?ct??from?log?group?by?m_time,?return_code)??)?group?by?m_time,?return_code/100?having(return_code/100?>=?4)?order?by?m_time??limit?100000
return_code?>=?400?|??select??return_code?,?count(*)?as?c?group?by?return_code?order?by?c??desc
錯誤Top域名和Uri
對于return_code > 400的請求,按照域名和uri的維度進行top 排序
return_code?>?400|??select??domain?,?count(*)?as?c???group?by?domain??order?by?c?desc?limit?10
return_code?>?400|??select??uri?,?count(*)?as?c???group?by?uri??order?by?c?desc?limit?10
運營商和各省錯誤統(tǒng)計
return_code?>?400?|?select????ip_to_provider(client_ip)?as?isp?,??count(*)?as?c??group?by?isp??having??ip_to_provider(client_ip)??!=?''?order?by?c?desc?limit?10
return_code?>?400?|?select????ip_to_province(client_ip)?as?province?,??count(*)?as?c??group?by?province?order?by?c?desc?limit?50
錯誤詳情
對于錯誤數(shù)據(jù),我們還可以從省份、運營商組合的角度來查看錯誤的次數(shù)和百分比。
return_code?>=?400?and?return_code?500??|?select?province?as?"省份",?isp?as?"運營商",?c?as?"錯誤次數(shù)",??round(c?*?100.0/?sum(c)?over(),?2)?as?"錯誤比率(%)"?from?(select?ip_to_province(client_ip)?as?province?,?ip_to_provider(client_ip)?as?isp?,?count(*)?as?c?from?log?group?by?province,?isp??having(ip_to_provider(client_ip))?!=?''??order?by?c?desc)
return_code?>=?500??|?select?province?as?"省份",?isp?as?"運營商",?c?as?"錯誤次數(shù)",??round(c?*?100.0/?sum(c)?over(),?2)?as?"錯誤比率(%)"?from?(select?ip_to_province(client_ip)?as?province?,?ip_to_provider(client_ip)?as?isp?,?count(*)?as?c?from?log?group?by?province,?isp??having(ip_to_provider(client_ip))?!=?''??order?by?c?desc)
客戶端分布
很多時候,錯誤的發(fā)生是由于新的版本發(fā)布引入的bug,下圖中的例子,可以看到大部分錯誤都是出現(xiàn)在新發(fā)布的版本上,有這個維度的信息后,問題調(diào)查的范圍可以大大縮小
return_code?>?400??|?select?user_agent?as?"客戶端版本",?count(*)?as?"錯誤次數(shù)"??group?by?user_agent?order?by?"錯誤次數(shù)"?desc?limit?10
用戶行為分析
基于CDN的訪問日志,我們也可以對用戶的訪問行為進行分析, 如:
大部分用戶是從哪里過來,是內(nèi)部還是外部
哪些資源用戶是熱門資源
是否有用戶在瘋狂下載資源,行為是否符合預(yù)期
針對這些問題,我們舉例來說明,用戶也可以根據(jù)自己的業(yè)務(wù)場景進行定制化的分析
訪問來源統(tǒng)計
not?refer_domain:""??|?select?refer_domain?as?"來源",?c?as?"次數(shù)"?,?round(c?*?100.0/(sum(c)?over())?,?2)?as?"百分比%"?from?(?select?refer_domain?as?refer_domain?,?count(*)?as?c?from?log?group?by?refer_domain????order?by?c?desc?limit?100?)
訪問Top uri
return_code?400?|?select?uri?,count(*)?as??"訪問次數(shù)",?round(sum(response_size)/1024.0/1024.0/1024.0,?2)?as?"下載總量(GB)"?group?by?uri?order?by?"訪問次數(shù)"?desc?limit?100
Top用戶統(tǒng)計
*?|?SELECT?CASE?WHEN?ip_to_country(client_ip)='香港'?THEN?concat(client_ip,?'?(?Hong?Kong?)')?WHEN?ip_to_province(client_ip)=''?THEN?concat(client_ip,?'?(?Unknown?IP?)')?WHEN?ip_to_provider(client_ip)='內(nèi)網(wǎng)IP'?THEN?concat(client_ip,?'?(??????Private?IP?)')?ELSE?concat(client_ip,?'?(?',?ip_to_country(client_ip),?'/',?ip_to_province(client_ip),?'/',?if(ip_to_city(client_ip)='-1',?'Unknown?city',?ip_to_city(client_ip)),?'?',ip_to_provider(client_ip),?'?)')?END?AS?client,?pv?as??????"總訪問數(shù)",?error_count?as?"錯誤訪問數(shù)"?,?throughput?as?"下載總量(GB)"??from??(select??client_ip?,?count(*)?as?pv,?round(sum(response_size)/1024.0/1024/1024.0,?1)?AS?throughput?,?sum(if(return_code??>?400,?1,?0))?AS?error_count?from?log???group?by?client_ip?order?by?throughput?desc?limit?100)
*?|?SELECT?CASE?WHEN?ip_to_country(client_ip)='香港'?THEN?concat(client_ip,?'?(?Hong?Kong?)')?WHEN?ip_to_province(client_ip)=''?THEN?concat(client_ip,?'?(?Unknown?IP?)')?WHEN?ip_to_provider(client_ip)='內(nèi)網(wǎng)IP'?THEN?concat(client_ip,?'?(??????Private?IP?)')?ELSE?concat(client_ip,?'?(?',?ip_to_country(client_ip),?'/',?ip_to_province(client_ip),?'/',?if(ip_to_city(client_ip)='-1',?'Unknown?city',?ip_to_city(client_ip)),?'?',ip_to_provider(client_ip),?'?)')?END?AS?client,?pv?as??????"總訪問數(shù)",?(pv?-?success_count)??as?"錯誤訪問數(shù)"?,?throughput?as?"下載總量(GB)"??from??(select??client_ip?,?count(*)?as?pv,?round(sum(response_size)/1024.0/1024/1024.0,?1)?AS?throughput?,?sum(if(return_code??400,?1,?0))?AS??????????????success_count?from?log???group?by?client_ip?order?by?success_count?desc?limit?100)
后續(xù)
阿里云CDN和日志服務(wù)打通之后,依托CDN強大的數(shù)據(jù)分發(fā)能力,和日志服務(wù)靈活、快捷的統(tǒng)計分析能力,用戶對于CDN的數(shù)據(jù)分析將變得極其簡單和方便。現(xiàn)在CDN底層日志已經(jīng)能導(dǎo)入日志服務(wù),產(chǎn)品上的打通也在進行中,預(yù)計8月份用戶可以直接在CDN控制臺上開通使用。
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
評論
查看更多