OSS訪問日誌分析(1):概念+巨集觀指標
OSS(Object Storage Service)是阿里雲提供的海量、安全、低成本、高可靠的物件儲存服務,提供非常高的可用性、可永續性。由於使用RESTful API 可以在網際網路任何位置儲存和訪問,容量和處理能力彈性擴充套件等特點,在雲場景上OSS被大量使用。常見的場景有:
- 網站的靜態資料:存放今天資料
- 多媒體資料處理:例如圖片、視訊等
- 雲端資料處理:例如處理日誌、多媒體檔案等
- 支援多種儲存型別:標準、低頻、備份等降低儲存成本
由於使用範圍廣,而儲存又是各業務開展的基礎,OSS在各場景中扮演了重要的角色。為能夠用好OSS,如何瞭解線上使用者的行為和體驗變得非常重要。我們需要用到OSS訪問日誌功能,以下是OSS一條訪問日誌:
bucket:xxxxoper-img-16 bucket_location: oss-cn-beijing-h bucket_storage_type: standard client_ip: 10.111.23.179 content_length_in: - content_length_out: 21835 delta_data_size: - error_code: - host: xxxoper-img-16.oss-cn-beijing-internal.aliyuncs.com http_method: GET http_status: 200 http_type: http logging_flag: true object: 1526920607501476%xxxx.jpg object_size: 21835 operation: GetObject owner_id: 1020833216692xxxx referer: - request_id: 5B02FCB08293F4BCF409C5A8 request_length: 117 request_uri: /1526920607501xxx/697.jpg HTTP/1.0 requester_id: - response_body_length: 21835 response_time: 6 server_cost_time: 4 sign_type: NotSign sync_request: - time: 22/May/2018:01:06:56 user_agent: - vpc_addr: 121271xxx vpc_id: 7923xxx
熟悉的人應該知道,訪問日誌和Nginx類似,記錄了時間、地點,人物、訪問物件、延時以及一些重要附帶資訊(可參見:OSS訪問日誌欄位描述)。OSS訪問日誌有兩種手段可以獲得,在這裡,我們主要講述通過第二種方法:日誌服務進行日誌查詢與分析的用法。
時效性 | 費用(每GB) | 功能 | |
---|---|---|---|
儲存OSS | <2 Hour | 儲存0.148元/M | OSS處理 |
日誌服務(SLS) | <10 S | 儲存0.35元/M | 實時查詢分析+視覺化 |
OSS下的訪問日誌已和日誌服務打通,可以在控制檯上開通使用,開通後可以提供:
- 通過關鍵詞、區間、模糊查詢等對日誌進行篩選排查
- 通過SQL語句進行實時日誌分析、視覺化、配置告警等
該方案具有如下特點:
除此之外,可以通過日誌服務:
- 整合視覺化:自定義Dashboard、Grafana,DataV,Jaeger,JDBC等
- 與各種流計算引擎與服務對接:Storm、Spark Streaming、Flink、StreamCompute、Consumer Library (Go、Java)、CloudMonitor、ARMS
- 與資料倉儲、資料處理服務打通:OSS、MaxCompute
整體統計
在開通OSS日誌分析後,使用者對應Logstore下會有如下兩類資料:
1. 整體流量(PV、UV等)
PV:一天請求次數是多少?
__topic__: oss_access_log and http_status < 400 | SELECT count(1) AS PV
UV:有多少獨立訪客來訪問資源?
__topic__: oss_access_log and http_status < 400 | SELECT approx_distinct(client_ip) AS UV
吞吐量:
__topic__: oss_access_log and http_status < 400 | SELECT sum(if(content_length_in IS NULL, 0, content_length_in) + if(content_length_out IS NULL, 0, content_length_out))/1024/1024 AS "Total throughput (MB)"
進入流量:根據同樣方式我們可以計算出流量。
__topic__: oss_access_log and http_status < 400 | SELECT sum(if(content_length_in IS NULL, 0, content_length_in))/1024/1024 AS "Inbound throughput"
最後關於整體流量的監控如下:
2. 整體業務趨勢(PV、UV等跟隨時間變化)
物件儲存追求大業務吞吐量,如果希望統計吞吐量和時間分佈,我們需要用到基於時間視窗函式對每個視窗內的流量進行統計。視窗函式原理如下:
1. 通過時間欄位聚合到一個視窗,例如我們以300秒進行聚合:"__time__ - __time__% 300" 作為一個統計時段
2. 根據該時間段對視窗流量進行聚合
3. 根據時間視窗進行排序輸出
例如構建以下SQL獲得24小時內,每5分鐘的流量圖
__topic__: oss_access_log and http_status < 400 | select sum(if(content_length_in is null, 0, content_length_in))/1024/1024 + sum(if(content_length_out is null, 0, content_length_out))/1024/1024 as "Total throughut (MB)", sum(content_length_in)/1024/1024 as "Inbound throughut (MB)", sum(content_length_out)/1024/1024 as "Outbound throughut (MB)", date_format(from_unixtime(__time__ - __time__% 300), `%m/%d %H:%i`) as "Time per 5 min" group by "Time per 5 min" order by "Time per 5 min" limit 1000
掌握該技能後,統計PV、UV隨時間的分佈就不在話下了:
__topic__: oss_access_log and http_status < 400 | select count(*) as PV, approx_distinct(client_ip) as UV, date_format(from_unixtime(__time__ - __time__% 300), `%m/%d %H:%i`) as "Time per 5 min" group by "Time per 5 min" order by "Time per 5 min" limit 1000
3. 使用者來源
每條訪問日誌中會有IP欄位,可以使用IP解析函式來判斷國家、地域、來源等。
我們可以用ip_to_country函式結合世界地圖拿到分佈:
__topic__: oss_access_log and http_status < 400 | select count(*) as PV, ip_to_country(client_ip) as "國家" group by "國家" limit 100
要更細節的分佈時,可以使用ip_to_province, ip_to_geo獲得更精確的位置,例如省份,地理位置座標等:
__topic__: oss_access_log and http_status < 400 | select ip_to_geo(client_ip) as geo, count(1) as PV group by geo limit 1000
也可以通過ip_to_provider獲得運營商分佈:
__topic__: oss_access_log and http_status < 400 | (select round(sum(if(content_length_in is null, 0, content_length_in) + if(content_length_out is null, 0, content_length_out))/1024.0/1024.0, 3) as throughput, ip_to_provider(client_ip) as provider group by provider having ip_to_provider(client_ip) <> `` limit 1000)
也可以根據城市、位置來統計整體的流量分佈。
__topic__: oss_access_log and http_status < 400 | select country as "國家", province as "省份", throughput as "總流量 (MB)", round(throughput*100.0/sum(throughput) over(), 2) as "百分比 (%)" from (select round(sum(if(content_length_in is null, 0, content_length_in) + if(content_length_out is null, 0, content_length_out))/1024.0/1024.0, 1) as throughput, sum(if(content_length_in is null, 0, content_length_in))/1024/1024 as throughput_in, sum(if(content_length_out is null, 0, content_length_out))/1024/1024 as "Throughput Out (MB)", ip_to_country(client_ip) as country, ip_to_province(client_ip) as province from log group by country, province having ip_to_country(client_ip) <> `` order by throughput desc limit 1000) order by throughput desc
日誌服務提供的完整IP識別函式如下,能夠滿足絕大部分需求:
函式名 | 含義 | 樣例 |
---|---|---|
ip_to_domain(ip) |
判斷IP所在的域,是內網還是外網。返回intranet或internet。 | SELECT ip_do_domain(ip) |
ip_to_country(ip) |
判斷IP所在的國家。 | SELECT ip_to_country(ip) |
ip_to_province(ip) |
判斷IP所在的省份,如果是外國,則返回國家名稱。 | SELECT ip_to_province(ip) |
ip_to_city(ip) |
判斷IP所在的城市,如果是外國,則返回國家名稱。 | SELECT ip_to_city(ip) |
ip_to_geo(ip) |
判斷IP所在的經緯度,返回的是高精度經緯度資料,範圍結果格式為緯度,經度 。 |
SELECT ip_to_geo(ip) |
ip_to_city_geo(ip) |
判斷IP所在的城市的經緯度,返回的是城市經緯度,每個城市只有一個經緯度,範圍結果格式為緯度,經度 。 |
SELECT ip_to_city_geo(ip) |
ip_to_provider(ip) |
獲取IP對應的網路運營商。 | SELECT ip_to_provider(ip) |
ip_to_country(ip,`en`) |
判斷IP所在的國家,返回國際碼。 | SELECT ip_to_country(ip,`en`) |
ip_to_country_code(ip) |
判斷IP所在的國家,返回國際碼。 | SELECT ip_to_country_code(ip) |
ip_to_province(ip,`en`) |
判斷IP所在的省份,返回英文省名或者中文拼音。 | SELECT ip_to_province(ip,`en`) |
ip_to_city(ip,`en`) |
判斷IP所在的城市,返回英文城市名或者中文拼音。 | SELECT ip_to_city(ip,`en`) |
最後
最後我們可以構建成一張酷炫的實時日誌分析儀表盤,是不是很酷炫?對了,如果開通OSS訪問日誌分析,這張儀表盤已經預設幫你建立好了,可以在此基礎上擴充套件哦。
相關文章
- Apche日誌系列(1):訪問日誌(轉)
- WEB訪問日誌自動化分析淺談Web
- FeignClient配置日誌訪問client
- 網站資料的背後——網站日誌的分析指標網站指標
- 日誌服務之分析使用者訪問行為
- Tomcat訪問日誌淺析Tomcat
- 使用Fluentd + Elasticsearch收集訪問日誌Elasticsearch
- nginx自動切割訪問日誌Nginx
- Nginx 訪問日誌格式設定Nginx
- 日誌分析(1)常見命令
- 日誌分析-apache日誌分析Apache
- 巨集_變數_函式_指標_標頭檔案變數函式指標
- Nginx 訪問日誌實時解析 ngxtopNginx
- AWK應用之統計訪問日誌
- 使用外部表訪問監聽日誌
- python視覺化文字分析(1)—分析QQ班群聊天記錄巨集觀Python視覺化
- RocketMQ 5.0 可觀測能力升級:Metrics 指標分析MQ指標
- PHP 效能分析與實驗:效能的巨集觀分析PHP
- 使用外部表訪問警告日誌檔案
- awk統計訪問nginx日誌次數Nginx
- go fiber: 增加訪問日誌accesslogGo
- 一個旅遊網站日誌的分析指標:網路資料的背後網站指標
- 無人車與巨集觀交通:從微觀模型到巨集觀模型模型
- [日誌分析篇]-利用ELK分析jumpserver日誌-日誌拆分篇Server
- Nginx訪問日誌、Nginx日誌切割、靜態檔案不記錄日誌和過期時間Nginx
- mysql audit-訪問日誌記錄應用MySql
- 使用apache日誌進行訪問ip的排序Apache排序
- websphere日誌分析——程式隱患問題Web
- 處理nginx訪問日誌,篩選時間大於1秒的請求Nginx
- Elasticsearch的基本概念和指標Elasticsearch指標
- 分析Oracle資料庫日誌檔案(1)Oracle資料庫
- Linux下使用GoAccess監控Nginx訪問日誌LinuxGoNginx
- 如何訪問Docker容器中的Spring Boot日誌DockerSpring Boot
- Apache訪問日誌access.log按天歸檔Apache
- 玄機-第二章日誌分析-apache日誌分析Apache
- Apche日誌系列(4):日誌分析(轉)
- 在Linux中,如何統計ip訪問情況?分析 nginx 訪問日誌?如何找出訪問頁面數量在前十位的ip?LinuxNginx
- NGINX巨集觀手記Nginx