概述
使用全局富化函数做富化时, 需要传递一个字典或者表格结构做富化. 参考构建字典与表格做数据富化的各种途径比较.
本篇介绍从使用资源函数 res_log_logstore_pull
从其他 logstore 拉取数据的做富化的详细实践. 关于 res_log_logstore_pull
的参数说明, 参考这里. 该语法目前支持两种模式去 logstore 拉取数据,一种是拉取指定时间间隔内的 logstore 的数据内容,另外一种是不设置结束时间,持续的拉取目标 logstore 内容
背景
这里我们有两个 logstore,一个是存储个人信息的 source_logstore,一个是酒店存储客人入住信息的 target_logstore,我们现在将酒店的入住信息拿来做富化。
注意: 这里采用 pull_log 接口拉取数据, 富化的 logstore 并不依赖索引.
个人信息 source_logstore
topic:xxx
city:xxx
cid:12345
name:maki
topic:xxx
city:xxx
cid:12346
name:vicky
topic:xxx
city:xxx
cid:12347
name:mary
酒店入住信息 logstore
time:1567038284
status:check in
cid:12345
name:maki
room_number:1111
time:1567038284
status:check in
cid:12346
name:vicky
room_number:2222
time:1567038500
status:check in
cid:12347
name:mary
room_number:3333
time:1567038500
status:leave
cid:12345
name:maki
room_number:1111
基本语法
res_log_logstore_pull(
endpoint,
ak_id,
ak_secret,
project,
logstore,
fields,
from_time=None,
to_time=None,
fetch_include_data=None,
fetch_exclude_data=None,
primary_keys=None,
delete_data=None,
refresh_interval_max=60,
fetch_interval=2):
具体的参数说明请参考 res_log_logstore_pull,需要注意 的地方是,res_log_logstore_pull 是一个单独的语法,只负责从目标 logstore 拉取数据下来,本身自己并没有做任何富化的操作,所以 请不要单独使用 res_log_logstore_pull 语法,结合 e_table_map 和 e_search_table_map 语句一起使用才是有意义的,本篇也会结合 e_table_map 和 e_search_map_table 的使用给出一些例子进行演示。
场景 1: 获取指定时间内所有的数据
注意: 这里的时间是日志获取时间.
DSL 编排语法
res_log_logstore_pull(..., ["cid","name","room_number"],from_time=1567038284,to_time=1567038500)
获取到的数据
# 这里我们的语法中 field 填入了 cid,name,room_number 三个字段,,并且指定了时间范围,将会获取这个时间范围内的 logstore 的所有数据的这三个字段的值
cid:12345
name:maki
room_number:1111
cid:12346
name:vicky
room_number:2222
cid:12347
name:mary
room_number:3333
cid:12345
name:maki
room_number:1111
场景 2: 设置黑白名单参数来过滤拉取的数据
1.DSL 编排语法(只设置白名单)
# 设置白名单,只有 room_number 值等于 1111 的的数据会被拉去下来
res_log_logstore_pull(..., ["cid","name","room_number","status"],from_time=1567038284,to_time=1567038500,fetch_include_data="room_number:1111")
获取到的数据
# 设置了 ferch_include_data 白名单,只有包含 room_numver:1111 的数据会被拉去下来,其他数据不会被拉取。status: check in
cid:12345
name:maki
room_number:1111
status:leave
cid:12345
name:maki
room_number:1111
2.DSL 编排语法(只设置黑名单)
res_log_logstore_pull(..., ["cid","name","room_number","status"],from_time=1567038284,to_time=1567038500,fetch_exclude_data="room_number:1111")
获取到的数据
# 设置黑名单 fetch_exclude_data 当数据包含 room_number:1111 的时候丢弃这条数据。status:check in
cid:12346
name:vicky
room_number:2222
status:check in
cid:12347
name:mary
room_number:3333
3.DSL 编排语法(同时设置黑白名单)
res_log_logstore_pull(..., ["cid","name","room_number","status"],from_time=1567038284,to_time=1567038500,fetch_exclude_data="status:leave",fetch_include_data="status:check in")
获取到的数据
# 黑白名单同时存在的情况下,优先进行黑名单数据的匹配,这里我们填入的是 status:leave 的值,当数据包含 status:leave 的值时候,数据会被直接丢弃,而后匹配白名单,白名单我们填入的是 status:check in 当数据包含 status: check in 的值时候,该数据才会被拉取下来.
status:check in
cid:12345
name:maki
room_number:1111
status:check in
cid:12346
name:vicky
room_number:2222
status:check in
cid:12347
name:mary
room_number:3333
场景 3: 开通持续拉取目标 logstore 数据
DSL 编排语法
如果目标 logstore 的数据是持续写入,我们需要持续的去拉取时候,设置 to_time 参数为 None 就可以,同时可以设置 fetch_interval 设置拉取的时间间隔,和 refresh_interval_max 当拉取遇到错误的时候退火重试的最大时间间隔
res_log_logstore_pull(..., ["cid","name","room_number","status"],from_time=1567038284,to_time=None,fetch_interval=15,refresh_interval_max=60)
# 需要注意的是,在持续拉取的过程中,如果遇到错误,服务器会一直退火重试,直到成功为止,不会停止数据加工进程。
场景 4: 开启主键维护拉取的目标 logstore 数据(暂时不推荐)
注意事项
目前该功能仅限使用所有数据存储在 logstore 的同一个 shard 中,所以暂时不推荐使用该功能。
背景
以我们的个人信息 logstore 和 酒店信息 logstore 的数据进行举例,因为 logstore 和数据库不同,logstore 中的数据只能写入,无法删除,所以有的时候我们希望匹配的时候将已经删除的数据不要进行匹配,这时候就需要开启主键维护功能。
需求演示
现在我们想拉取酒店信息 logstore 中,所有入住还没有离开的客人信息,当 status=leave 的时候,表示客人已经离开酒店,所以不需要将该信息进行拉取。
DSL 编排语法
res_log_logstore_pull(..., ["cid","name","room_number","status","time"],from_time=1567038284,to_time=None,primary_keys="cid",delete_data="status:leave")
得到的数据
## 可以看到 name 为 maki 的客人的最后更新 status 为 leave , 已经离开酒店,所以并没有将 maki 的数据拉取下来,time:1567038284
status:check in
cid:12346
name:vicky
room_number:2222
time:1567038500
status:check in
cid:12347
name:mary
room_number:3333
注意
需要注意的是 primary_keys 目前只支持设置单字符串,这个需要设置 logstore 数据中 值为唯一的字段,比如样例中的 cid , 类似数据库的唯一主键,并且当设置 primary_keys 的时候,delete_data 也必须不为 None,这样才有意义。
进一步参考
- 日志服务最佳实践汇总(持续更新)
- 完整 DSL 语法介绍与参考 PDF 下载(持续更新)
-
数据加工指南
-
介绍:
- 功能概述
- 概念
- 原理
-
快速开始:
- 快速开始(SLB 日志加工实战)
- 控制台操作
- 源与目标访问秘钥配置
- 作业诊断指南
- 性能指南
- 成本优化指南
-
语法:
- DSL 语法介绍
- 查询字符串语法
- JMES 语法介绍
-
管理配置:
- 子账号授权配置
-
本文作者:成喆
阅读原文
本文为云栖社区原创内容,未经允许不得转载。