本文档主要介绍数据加工功能的一些基本概念。

基本概念

  • ETL,Data Transformation

    ETL(Extract,Transform,Load)是数据分析领域中对数据进行加载、转换、输出,主要是对数据进行数据转换。在日志服务中指加载源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,可以是静态配置,也可以是动态配置。

  • LOG DSL

    日志服务专用语言LOG DSL(Domain Specific Language),是日志服务数据加工使用的一种Python兼容的脚本语言。LOG DSL基于Python提供内置两百多个函数,简化常见的数据加工模式。也支持用户自定义的扩展Python脚本。详情请参见语言简介

  • 加工规则

    数据加工脚本,日志服务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": "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}")表示一个匹配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])"

  • 正则捕获

    通过正则表达式捕获指定内容并直接进行命名,数据加工中主要用于传递给正则相关的函数如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}"))