简介
【数据加工】是一个可托管、高可用、可扩展的数据处理服务,广泛适用于数据的规整、富化、分发、汇总、重建索引等场景。这里详细介绍如何通过数据加工实现数据的分发与汇总,从而实现统一存储管理或分类精细化查询分析,以及存储成本优化等目的。
分发与汇总
场景
数据分发
从源 logstore 中读取数据,进行加工后,根据给定条件分别输出到多个不同的目标 logstore 中。
数据汇总
将多个源 logstore 中读取数据,汇集到同一个目标 logstore 中。需要在每一个源 logstore 中配置一个数据加工任务。
跨账号数据流转
通过数据加工实现跨账号数据流转,主要涉及的问题是如何授权:RAM 账号授权、STS 角色授权。请参考另一篇文章 SLS【数据加工】授权配置
跨区域数据流转
跨区域数据流转支持直接走公网,也可以选择阿里云 DCDN。请参考 数据加工 - 跨Region传输功能介绍
相关算子
- e_output/e_coutput:输出事件,不再继续加工。e_coutput 会对数据进行拷贝
- e_keep/e_drop:指定条件,保留/丢弃事件
- e_search:事件检查,输入查询语句,比如
e_search("field=value")
- e_if/e_if_else/e_switch:流程控制
案例
我们的测试服务器部署在上海和北京,对应的访问日志采集到了上海区域的 project/logstore:test-app-sh/access-log,和北京区域的project/logstore:test-app-bj/access-log,数据保存时间是30天。访问日志样例如下:
{
"__time__": 1607655081,
"bytes_sent": "666",
"host": "xxxx.com.cn",
"hostname": "xxxx.ali.dm",
"http_referer": "https,//xxxx.com.cn/",
"http_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
"remote_addr": "10.0.0.0",
"remote_user": "-",
"request_method": "GET",
"request_protocol": "HTTP/1.1",
"request_time": "0.035",
"request_trace_id": "xxxx-9092-7974215498-0-1596182547.188",
"request_uri": "/xxx/type?id=203298390015668&name=yyyy",
"status": "200",
"time_local": "11/Dec/2020,10,51,21",
"upstream_addr": "10.0.0.0,8080"
}
我们需要实现两个目标:
- 将北京区域的访问日志汇集到上海的 logstore,做统一存储和查询分析,需要标记日志的service区域“app-bj”
- 拆分出返回状态码 status 为4xx(客户端错误)和5xx(服务端错误)的访问日志,保存到独立的 logstore 中,保存时间分别为90天和180天,以保证能够长时间检索。
汇集北京的数据到上海 logstore
在北京的logstore:test-app-bj/access-log 配置数据加工,脚本为:
e_set("__service__", "app-bj")
e_output("logstore-sh")
保存配置为:
这里的“目标名称”与 e_output 所填的名称保持一致,project/logstore 选定为上海数据存储的logstore。
数据汇集后,在上海logstore可看到:
分发错误访问日志
在access-log中,可以看到status字段的统计信息如下图,可以看出我们的数据中,返回4xx和5xx的数据占比是很小的(这是模拟数据,实际线上业务会更小),也就是说只有很少一部分数据需要长期存储。所以,根据时间条目重要程度将其分发,并做差异化存储,除了可以做精细分析,还可以实现存储成本优化。
在上海的 logstore:test-app-bj/access-log 配置数据加工,脚本如下:
- 首先判断事件是否满足status>=500,如果满足则直接输出到目标access-5xx
- 否则继续往下执行,判断事件是否满足status>=400,如果满足则直接输出到目标access-4xx
- 如果都没有满足,则丢弃事件(不会输出到任何目标)
e_if(e_search("status>=500"), e_output("access-5xx"))
e_if(e_search("status>=400"), e_output("access-4xx"))
e_drop()
加工完成以后的数据如下图,在 logstore:access-5xx 里面,只保存返回状态码为5xx的访问日志。
后记
以上就是使用 SLS【数据加工】功能,实现数据的分发和汇集的详细步骤。如果您在使用 SLS 过程中有任何问题,请加入我们钉钉服务群,也欢迎关注 SLS 的微信技术公众号和B站视频号。