Skip to content

日志数据转日志数据

背景

对象存储 OSS 是阿里云提供的云存储服务,能够以低成本为用户提供高可靠性的海量数据存储服务。作为基础服务,用户需要时刻关注 OSS 的使用状况,检测异常状态,从而及时作出响应。 阿里云日志服务(SLS)是云原生观测分析平台,为 Log/Metric/Trace 等数据提供大规模、低成本、实时平台化服务。一站式提供数据采集、加工、分析、告警可视化与投递功能,全面提升研发、运维、运营和安全等场景数字化能力。

用户在访问对象存储 OSS 的过程中,会产生大量的访问日志。SLS 允许一键接入 OSS 访问日志,方便用户完成操作审计、访问统计、异常事件回溯和问题定位等工作。

以 bucket、method 分组计算小时级流量特征为例:

* | select (__time__ - __time__ % 3600) as dt, bucket, http_method, sum(request_length)/1024.0/1024.0 as request_MB, sum(response_body_length)/1024.0/1024.0 as response_MB, avg(response_time) as avg_latency group by dt, bucket, http_method order by dt asc limit 10000

随着查询时间范围增加,计算引擎需要扫描更多的数据量做计算,增加了资源开销与分析延时。

数据查询范围扫描日志条数计算耗时
24 hours5,153,4261,767ms
30 days35,754,3844,636ms

问题与解决方法

问题一 : 随着 oss 访问日志存储在 sls 中时间越来越长,访问日志逐渐从温数据编程冷数据,这带来一笔不小的存储开销 . 以 1000 QPS 的请求量计算,每条日志 1500 Bytes,一个月累计后达到 3.8 TB . 问题二 : 随着时间推移,如果每次对全量数据进行及时分析,计算成本是巨大的 ,计算延时对增加也影响体验 . 为了达到降低存储成本, 加快数据分析的体验可以通过将数据聚合后存储到新的日志库,减少日志总量 . 因为对于历史数据而言, 聚合分析后的数据量更少,而且有更高的分析价值 .

目标

现在以 计算每分钟(时间按分钟做取整处理) OSS 响应数据量(response_size) 为例 演示定时 sql 功能 ,完成数据从日志数据转化为日志数据. 通过聚合 sql 运算,将原来的日志数据转化为新的日志数据, 新日志数据占用存储更少 , 更加突出关心的信息

原始日志

源日志库 oss_source

聚合操作前的日志字段较多 , 时间更加分散 , 日志总量也更多

目标日志

聚合 sql 操作后的 目标日志库 log2log

聚合处理后的数据更好地展示了 response_size 并且按分钟取整 , 减少了数据量

SQL

计算每分钟(时间按分钟做取整处理) OSS 响应数据量(response_size)

sql

*|select bucket, bucket_location, bucket_storage_type, http_method, http_status, object, operation, (__time__ - __time__ % 60) as __time__ , sum(content_length_out) as response_size from log group by bucket, bucket_location, bucket_storage_type, http_method, http_status, object, operation, __time__

计算配置

定时 SQL 任务链接 点击修改配置进入配置页面

image-47.png

写入模式 : 当源为日志库时,可以选择日志库导入日志库以及日志库导入时序库 , 这里选择日志库 . SQL 代码 : 计算每分钟(时间按分钟做取整处理) OSS 响应数据量(response_size)

sql

*|select bucket, bucket_location, bucket_storage_type, http_method, http_status, object, operation, (__time__ - __time__ % 60) as __time__ , sum(content_length_out) as response_size from log group by bucket, bucket_location, bucket_storage_type, http_method, http_status, object, operation, __time__
配置项描述
源 Project/Logstore日志数据源头,也是 SQL 代码的数据源
目标 Region目标所在的区域
目标 Project目标所在的项目名称
目标库 Logstore目标库的名称
写目标授权具备写目标 Logstore 权限的角色的 ARN
执行 SQL 授权具备执行 SQL 权限的角色的 ARN

详情请参考 授权文档

点击下一步进入调度配置

调度配置

image.png

配置项描述
调度间隔固定间隔 1 分钟执行一次 SQL
调度时间范围从指定时间开始的数据会被执行 SQL
SQL 时间窗口整点一分钟,表示只分析这一分钟内的数据 (@m-1m
~ @m)
SQL 超时最长时间 600 秒或最大次数 20 次

注意:

  1. 设置延迟执行参数,上游 Logstore 的数据到来可能延迟,建议设置大一些的值做等待来保证计算数据的完整性。
  2. SQL 运行超过指定次数或指定时间后,这一次的 SQL 实例会失败并继续下一个实例的调度

更多关于创建定时 SQL 任务时计算配置和调度配置的信息, 请参考官方文档

使用 sdk 创建定时 SQL 任务

如果您需要使用 SDK 创建定时 SQL 任务,可以参考官方文档: java sdk 创建定时 SQL 任务

任务管理

任务管理界面 在 SLS 控制台可以查看之前创建的定时 SQL 作业 image-51.png 在作业管理页面内,可以查看到每一次执行的实例列表。 image.png 每个实例信息中有 SQL 查询区间,如果任务失败(权限、SQL 语法等原因)或 SQL 处理行数指标为 0(数据迟到或确实没有数据),可以对指定实例做重试运行。

效果

日志量比较

源日志库一小时日志量为 18241 条, 17.27MB

目标日志库一小时日志量为 5752 条 , 1.62MB

查询某个 bucket 下的 response_size 随时间的变化情况

sql

* | select bucket,bucket_location ,bucket_storage_type ,http_method ,response_size,DATE_FORMAT(FROM_UNIXTIME(__time__), '%Y-%m-%d %H:%i:%s') AS datetime where bucket ='bucket6877'and bucket_storage_type = 'archive' order by datetime

定时 sql 任务的目标库 log2log 中查询最近 15 分钟内 , bucket 为 bucket6877 , bucket_storage_type 为 archive 的数据 , 并按照时间排序 , 并用统计图表展示 response_size 随时间的变化情况

image-56.png