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