本文档主要介绍数据加工功能的一些基本概念。
基本概念
ETL
ETL是指将对业务系统的数据进行抽取、清洗、转换、加载的过程,从而整合零散、不标准、不统一的数据。日志服务支持加载源Logstore数据,将数据转换后输出到目标Logstore,同时也支持加载OSS、RDS或其他Logstore的数据。
事件、数据、日志
在数据加工功能中,事件、数据都表示日志,例如事件时间就是日志时间,丢弃事件字段函数
drop_event_fields
就是用于丢弃特定日志字段的函数。日志时间
日志时间指事件所发生的时间,也称事件时间。在日志服务中的保留字段为
__time__
,一般由日志中的时间信息直接提取生成。数据类型为整数字符串,Unix标准时间格式,单位为秒,表示从1970-1-1 00:00:00 UTC计算起的秒数。日志接收时间
日志到达日志服务的服务器被接收时的时间,默认不保存在日志中,但是如果Logstore开启了记录外网IP地址,则该时间会保留在日志标签字段的
__receive_time__
中。数据加工中时间的完整字段名是__tag__:__receive_time__
。数据类型为整型,Unix标准时间格式。单位为秒,表示从1970-1-1 00:00:00 UTC计算起的秒数。说明大部分场景下,日志是实时发送给日志服务的,因此日志时间与日志接收时间基本相同。如果是导入历史日志的情况,例如通过SDK导入过去30天的日志,那么日志接收时间就是当前时间,和日志时间不一致。
日志标签
日志存在标记,区别于其他字段,在数据加工中,标签字段以
__tag__:
作为前缀。包括:用户自定义标签:用户通过API PutLogs写入数据时添加的标签。
系统标签:日志服务为用户添加的标签,包括
__client_ip__
和__receive_time__
。
配置相关概念
源Logstore
数据加工中,从中读取数据再进行加工的Logstore是源Logstore。
一个加工任务仅支持一个源Logstore,但可以对一个源Logstore配置多个加工任务。
目标Logstore
数据加工中,数据写入的Logstore是目标Logstore。
一个加工任务可以配置多个目标Logstore,可以是静态配置,也可以是动态配置。具体配置方法,请参见多目标Logstore数据分发。
SLS DSL
SLS DSL(Domain Specific Language)是日志服务数据加工使用的一种Python兼容的脚本语言。SLS DSL基于Python提供内置两百多个函数,简化常见的数据加工模式。也支持用户自定义的扩展Python脚本。更多信息,请参见语言简介。
加工规则
数据加工脚本,SLS DSL编排的逻辑代码的集合。
加工任务
数据加工最小调度单元,由源Logstore、目标Logstore、加工规则、加工时间范围以及其他配置项组成。
规则相关概念
资源
除源Logstore外,数据加工中做某些配置或者富化引用的第三方数据源叫做资源,包括但不限于本地资源,OSS,RDS,其他Logstore(除源和目标Logstore外)等。更多信息,请参见资源函数。
维表
用于做富化的数据的某些维度信息的外部表格叫做维表。例如公司用户账户列表、产品列表、地理位置信息库等。维表一般存在于资源中,可能会动态更新。
富化/映射
日志包含的信息不完整时,需要借助外部信息进行完善,对日志的一个或多个字段通过映射完善出更多信息的过程叫做富化或者映射。
例如某个请求包含HTTP状态码status,可以通过如下表格富化出新字段HTTP状态描述status_desc:
富化前
富化后
status
status_desc
200
成功
300
跳转
400
权限错误
500
服务器错误
或者源数据中有user_id字段,使用外部账户维表,映射出其对应用户名、性别、注册时间、邮箱等信息,放入到日志字段中并写入目标Logstore中。更多信息,请参见映射富化函数。
分裂
日志信息比较复杂,同时包含多条信息时,将一条日志分裂成多条日志的过程叫做事件分裂。
例如某一条日志的字段内容如下:
__time__: 1231245 __topic: "win_logon_log" content: [ { "source": "192.0.2.1", "dest": "192.0.2.1" "action": "login", "result": "pass" },{ "source": "192.0.2.2", "dest": "192.0.2.1" "action": "logout", "result": "pass" } ]
可以分裂成如下2条日志:
__time__: 1231245 __topic: "win_logon_log" content: { "source": "192.0.2.1", "dest": "192.0.2.1" "action": "login", "result": "pass" }
__time__: 1231245 __topic: "win_logon_log" content: { "source": "192.0.2.2", "dest": "192.0.2.1" "action": "logout", "result": "pass" }
GROK
使用模式化语法代替复杂的正则表达式。
例如:
grok("%{IPV4}")
表示一个匹配IPv4的正则表达式,等价于"(?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])"
。更多信息,请参见GROK函数。正则捕获
通过正则表达式捕获指定内容并直接进行命名,可以更直观地配置提取的字段名。
例如
e_regex("content", "(?P<email>[a-zA-Z][a-zA-Z0-9_.+-=:]+@\w+\.com)")
表示提取字段content
中的邮件地址并放入字段email
中。这里邮件是一个通用正则表达式,推荐使用GROK进行简化:e_regex("content", grok("%{EMAILADDRESS:email}"))
。更多信息,请参见正则表达式。