SLS DSL基于Python语言开发,提供两百多个内置函数来简化数据加工任务。本文介绍DSL的语言模式、分类和运行原理等。
语言模式
SLS DSL兼容Python,标准模式下,SLS DSL可视为Python的子集。除基本的数据结构与表达方式外,语法规则是以函数方式进行编排。如果您有特定UDF的需求,请提交工单。
| 类别 | Python语法 | 标准模式 | 
| 数据结构 | 数字、字符串、布尔 | 支持。 不支持 | 
| 元组、列表、集合、字典 | 支持。 不支持集合 | |
| 对象 | 仅支持内置扩展数据结构,如表格、日期时间对象等。 | |
| 基本语法 | 操作符,如加减乘除等 | 支持比较运算符( | 
| 注释 | 支持。 | |
| 变量定义赋值 | 不支持,需使用函数调用传递。 | |
| 条件 | 支持。例如e_if、e_if_else、e_switch函数。 | |
| 循环 | 不直接支持,可通过内置函数嵌套实现。例如如下遍历数组:  | |
| 函数 | 标准Python内置函数 | 不支持。使用200+内置函数。 | 
| 函数调用 | 支持。解包调用不支持。 | |
| 自定义函数def或lambda | 不支持,提供两百多个全局操作函数与表达式函数,且支持基于现有函数的自由组合调用。 | |
| 模块 | 导入与使用Python标准库 | 不支持。 | 
| 线程与进程创建 | 不支持。 | |
| 导入第三方库 | 不支持。 | |
| 外部网络连接或命令调用 | 支持内置的资源连接器。 | 
函数分类
标准模式的SLS DSL是通过调用函数的方式完成的,其内置两百多个函数,主要分为两类:
- 全局操作函数 - 主要用来接收日志、处理并返回日志的函数。且只有全局操作函数才能构建加工规则的每个步骤。 
- 表达式函数 - 通用型函数,接受特定参数,组合调用后作为参数传递给全局操作函数以定义更加灵活的逻辑。 
两类函数功能对比:
| 函数类型 | 全局步骤 | 接收 | 返回 | 修改日志 | 组合调用 | 
| 全局操作函数 | 支持 | 自动接收日志 | 0到多条日志 | 支持大部分情况 | 支持 | 
| 表达式函数 | 不支持 | 除个别函数支持,大部分不直接处理日志。 | 特定数据结构 | 不支持 | 支持 | 
全局操作函数
接收日志并返回日志的函数。
除全局函数外,其他内置函数不能放在每个步骤的第一行。
一个SLS DSL规则的形式如下:
全局函数1(..参数....)
全局函数2(..参数....)
全局函数3(..参数....)
全局函数4(..参数....)全局操作函数可以分为两类:
| 函数分类 | 描述 | 样例 | 
| 流程控制函数 | 用于步骤流程控制,接收日志,基于条件控制调用其他日志函数完成日志处理。 | 
 | 
| 事件处理函数 | 对日志进行加工的函数 。返回0到多条日志。 | 函数样例如下: 
 | 
加工逻辑:
- 基本处理: - 数据加工会以流式方式读取源Logstore的数据,并将每一条日志以字典的数据结构传递给加工规则,然后根据加工规则中定义的日志函数顺序处理日志数据,并将最终的数据加工结果输出到目标Logstore。 说明- 在传递的过程中日志的字段和值始终都是字符串形式。例如:原日志是 - {"__time__": "1234567", "__topic__": "", "k1": "test"},函数- e_set("f1", 200)设置字段- f1的值为200,经过这个函数处理后,原日志会变成:- {"__time__": "1234567", "__topic__": "", "k1": "test", "f1": "200"},其中- f1和200都是字符串类型。- 规则中定义的每个日志函数会顺序执行,每个函数会对每个日志进行处理和修改,最后返回修改后的日志。 - 例如 - e_set("type", "test")会对每个日志添加一个字段- type,值为test,下一个函数接收到的就是修改后的日志。
- 条件判断: - 条件判断e_if:某些日志可以增加条件判断,不满足条件的日志就会跳过本次操作,相当于一个 - if的逻辑。- 例如 - e_if(e_match("status", "200"), e_regex("data", "ret: \d+", "result")),会首先判断字段- status是否为200,如果条件判断为真,则会对字段- data用正则表达式提取出新字段- result;如果条件判断为否,则不会执行任何操作。
- e_if_else:与- if_else操作类似。
 
- 停止处理: - 某些步骤可能返回0个日志,表示删除日志。 - 例如 - e_if(str_islower(v("result")), e_drop()),如果每个- result字段的值是小写字符串,则丢弃这条日志,后续的操作将不再进行,自动重新开始下一条日志。
- 输出日志可以视为一种特殊的停止处理,例如 - e_output提前输出日志到目标并删除日志,其后续的操作也不会再进行。说明- 函数 - e_coutput会复制一份当前的日志输出,并继续处理后续。
 
- 分裂并行: - 某些步骤也可能返回多个日志,表示分裂日志。 - 例如 - e_split(data),表示根据字段- data的值将原本的一条日志分裂成两条日志。假如- data的值是- "abc, xyz",则分裂后两条日志字段- data的值分别是abc和xyz。- 分裂后的每条日志都会继续进行后续的步骤。 
更多关于全局函数的说明,请参见全局操作函数概览。
表达式函数
除了全局操作函数外,SLS DSL还提供200个表达式函数,接收特定参数,返回特定的值,一般是单个表达式函数或其调用组合。形式如下:
全局操作1(表达式函数1(...), ....)
全局操作2(..., 表达式函数2(...), 表达式函数3(...),...)表达式函数大概可以分为四类:
| 函数分类 | 描述 | 样例 | 
| 事件检查函数 | 接收日志,提取或检索返回特定信息的函数,不会修改传递的日志。 | 函数 | 
| 资源函数 | 连接本地或外部资源,接收特定参数配置并返回数据,一般是字典、表格等类型。 | OSS、RDS、Logstore资源函数。 | 
| 控制函数 | 用于表达式的逻辑操作,接收特定参数并基于条件做控制,调用其他表达式函数返回结果。 | 
 | 
| 其他表达式函数 | 接受固定或者其他函数的调用结果,返回特定的值。 | 字符串、时间、类型转换函数等。 | 
更多关于表达式函数的说明,请参见表达式函数概览。