基本概念
ETL, Data Transformation
ETL (Extract, Transform, Load)是数据分析领域中数据加载、转换、输出的的意思,日志服务中主要加载源Logstore与输出到其他Logstore, 也会加载OSS, RDS, 其他Logstore做数据富化. 但主要是对数据进行Data Transformation的工作.
事件、数据、日志
在数据加工的上下文中, 事件、数据都是表示日志, 例如事件时间就是日志时间,丢弃事件字段函数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计算起的秒数。
注意: 数据加工日志作业的配置项高级选项
的时间范围
, 是以日志接收时间为准的.
日志时间 vs. 日志接收时间
大部分场景下, 日志是实时发送给日志服务的, 因此日志的时间与接收日志的基本相同或者接近. 如果日志不是实时发送的, 日志时间与接收时间会不一致, 这种情况一般发生在导入历史时间的情况. 例如通过SDK导入了过去30天的日志. 那么日志时间就是上个月的, 而日志接收时间就是当前.
日志标签
日志的标签TAG,包括:
- 用户自定义标签:您通过API PutLogs写入数据时添加的标签。
- 系统标签:服务端为您添加的标签,包括__client_ip__和__receive_time__。
在数据加工中, 标签字段以__tag__:
作为前缀.
具体参考日志字段
配置相关
源Logstore
数据加工中, 读取数据的logstore再进行加工的是源logstore. 一个作业只支持一个源logstore. 但可以对一个源logstore配置多个加工作业.
目标Logstore
数据加工中数据写入的logstore叫目标logstore. 一个作业可以是一个或者多个. 可以是静态配置的, 也可以是动态配置的.
LOG DSL
日志服务领域专用语言LOG DSL (Domain Specific Language)是日志服务数据加工使用的编排语言, 一种Python兼容的脚本语言. LOG DSL基于Python提供内置200个函数简化常见数据加工模式. 也支持用户自由定义的Python扩展(目前仅针对特定客户开放). 详情请参考日志服务DSL
加工规则
也叫加工脚本, 是使用ETL语言编排的逻辑代码集合.
加工作业
由源logstore、目标logstore、加工规则以及其他配置项如加工时间范围、权限参数等组成的任务, 叫做加工作业. 也是数据加工的最小调度单元.
规则相关
资源
除了数据源的logstore外的, 数据加工中会引用的第三方数据源叫做资源做某种配置或者富化, 包括但不限于本地资源, OSS, 外部Logstore, RDS等.
维表
用于做数据富化的数据某些维度信息的外部表格叫做维表. 例如公司用户账户列表, 产品列表, 地理位置信息库等. 维表可能会动态更新, 维表一般存在于资源中.
富化、映射
日志包含的信息不全时, 需要借助外部信息进行完善. 对日志一个或多个字段通过映射完善出更多信息的过程叫做富化或者映射.
例如某个请求包含HTTP状态码status
, 可以通过如下表格富化出新字段HTTP状态描述status_desc
:
status | status_desc |
---|---|
200 | 成功 |
300 | 跳转 |
400 | 权限错误 |
500 | 服务器错误 |
或者源数据中有user_id
字段, 使用外部账户维表, 映射出其对应用户名、性别、注册时间、邮箱等信息放入到事件字段中并写入目标logstore中。
分裂
日志信息非常复杂, 同时包含了多条信息时, 对一条日志分裂成多条日志时的过程叫做事件分裂.
例如某一条日志的字段content
内容如下:
__time__: 1231245
__topic: "win_logon_log"
content:
[ {
"source": "1.2.3.4",
"dest": "1.2.3.4"
"action": "login",
"result": "pass"
},{
"source": "1.2.3.5",
"dest": "1.2.3.4"
"action": "logout",
"result": "pass"
}
]
可以分裂成2条日志:
__time__: 1231245
__topic: "win_logon_log"
content:
{
"source": "1.2.3.4",
"dest": "1.2.3.4"
"action": "login",
"result": "pass"
}
和
__time__: 1231245
__topic: "win_logon_log"
content:
{
"source": "1.2.3.5",
"dest": "1.2.3.4"
"action": "logout",
"result": "pass"
}
GROK
使用模式化语法代替复杂的正则表达式.
例如grok("%{IPV4}")
表示一个匹配IP v4的正则表达式,等价于: "(?<![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
中更直观的配置提取的字段名.
例如e_regex("content", "(?P<email>[a-zA-Z][a-zA-Z0-9_.+-=:]+@\w+\.com")
表示提取字段content
中的邮件地址并放入到字段email
中. 这里邮件是一个通用正则表达式, 推荐使用GROK进行简化: e_regex("content", grok("%{EMAILADDRESS:email}")
.
进一步详情,请参考用户手册。
进一步参考
欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持: