OSS访问日志分析(1):概念+宏观指标

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: OSS访问日志分析教程第一篇,宏观介绍+宏观指标构建

OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高可靠的对象存储服务,提供非常高的可用性、可持久性。由于使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展等特点,在云场景上OSS被大量使用。常见的场景有:

  • 网站的静态数据:存放今天数据
  • 多媒体数据处理:例如图片、视频等
  • 云端数据处理:例如处理日志、多媒体文件等
  • 支持多种存储类型:标准、低频、备份等降低存储成本

image.png

由于使用范围广,而存储又是各业务开展的基础,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下的访问日志已和日志服务打通,可以在控制台上开通使用,开通后可以提供:

  1. 通过关键词、区间、模糊查询等对日志进行筛选排查
  2. 通过SQL语句进行实时日志分析、可视化、配置告警等

image.png

该方案具有如下特点:

  • 实时:访问在秒级即可分析
  • 所见即所得:自定义仪表盘+控制台查询
  • 灵活:基于SQL语法查询分析
  • 丰富:与10+主流计算引擎,存储格式互通,免去繁琐对接过程

除此之外,可以通过日志服务:

整体统计

在开通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"

最后关于整体流量的监控如下:

image.png

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

image.png

掌握该技能后,统计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

image.png

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

image.png

也可以通过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

image.png

日志服务提供的完整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访问日志分析,这张仪表盘已经默认帮你创建好了,可以在此基础上扩展哦。

2018-05-24_22-59-26.png

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
10天前
|
存储 SQL 监控
|
10天前
|
运维 监控 安全
|
13天前
|
监控 关系型数据库 MySQL
分析慢查询日志
【10月更文挑战第29天】分析慢查询日志
33 3
|
13天前
|
监控 关系型数据库 数据库
怎样分析慢查询日志?
【10月更文挑战第29天】怎样分析慢查询日志?
32 2
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1625 14
|
1月前
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
5435 16
|
1月前
|
存储 消息中间件 大数据
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
35 4
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
43 2
|
1月前
|
存储 网络安全 对象存储
缺乏中间证书导致通过HTTPS协议访问OSS异常
【10月更文挑战第4天】缺乏中间证书导致通过HTTPS协议访问OSS异常
86 4
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
45 2

相关产品