普通映射 vs 搜索映射
典型映射方式不能满足富化需求时, 可以使用搜索映射, 搜索映射与传统方式映射的区别在于匹配方式不同.
普通映射方式
一般映射使用文本完全匹配方式来映射, 例如NGNIX日志中, 需要将状态码转换为一个文本表示:
状态码 | 文本 |
---|---|
200 | 成功 |
300 | 跳转 |
400 | 请求错误 |
500 | 服务器错误 |
下面规则调用e_dict_map
将字段status
中的http请求状态码转化为文本描述, 放入字段status_desc
.
e_dict_map({"400": "请求错误", "500": "服务器错误", "300": "跳转", "200": "成功"}, "status", "status_desc")
实际上, NGNIX的HTTP请求的状态是不止上述4种, 当status
值是401, 404时, 需要更新字典覆盖, 否则会匹配不上. 参考Http请求状态码
搜索映射方式
当需要一些灵活的针对特定值做匹配逻辑时的映射, 例如:
状态码 | 文本 |
---|---|
1XX-2XX | 成功 |
3XX | 跳转 |
4XX | 请求错误 |
5XX | 服务器错误 |
就需要使用搜索映射来实现, 这里的字典的关键字实际是一个搜索查询字符串.
状态码 | 文本 |
---|---|
status<=299 |
成功 |
status: [300, 399] |
跳转 |
status: [400, 499] |
请求错误 |
status: [500, 599] |
服务器错误 |
使用如下代码:
e_search_dict_map({"status: [400, 499]": "请求错误", "status: [500, 599]": "服务器错误", "status: [300, 399]": "跳转", "status<=200": "成功"}, "status", "status_desc")
场景样例1:使用搜索映射字典做复杂富化
这里以网络请求日志来距离做一个更复杂逻辑的映射:
需求
原始日志
"日志1"
http_host: m1.abcd.com
http_status: 200
request_method: GET
body_bytes_sent: 740
"日志2"
http_host: m2.abcd.com
http_status: 200
request_method: POST
body_bytes_sent: 1123
"日志3"
http_host: m3.abcd.com
http_status: 404
request_method: GET
body_bytes_sent: 711
"日志4"
http_host: m4.abcd.com
http_status: 504
request_method: GET
body_bytes_sent: 1822
加工需求
根据日志事件的http_status
和body_bytes_sent
的值的不同,为每个事件添加不同的type
信息。
-
http_status
为2XX
并且body_bytes_sent
长度小于1000的日志事件设置type
为正常
。 -
http_status
为2XX
并且body_bytes_sent
长度大于等于1000的日志事件设置type
为过长警告
。 -
http_status
为3XX
的日志事件设置type
为重定向
。 -
http_status
为4XX
的日志事件设置type
为错误
。 - 其他的日志事件设置
type
为其他
。
LOG DSL编排
e_search_dict_map({'http_status~="2\d+" and body_bytes_sent < 1000': "正常", 'http_status~="2\d+" and body_bytes_sent >= 1000': "过长警告", 'http_status~="3\d+"': "重定向", 'http_status~="4\d+"': "错误", "*": "其他"}, "http_status", "type")
加工后的日志
"日志1"
type: 正常
http_host: m1.abcd.com
http_status: 200
request_method: GET
body_bytes_sent: 740
"日志2"
type: 过长警告
http_host: m2.abcd.com
http_status: 200
request_method: POST
body_bytes_sent: 1123
"日志3"
type: 错误
http_host: m3.abcd.com
http_status: 404
request_method: GET
body_bytes_sent: 711
"日志4"
type: 其他
http_host: m4.abcd.com
http_status: 504
request_method: GET
body_bytes_sent: 1822
说明
- 上面使用了函数
e_search_dict_map
,具体语法参照e_search_dict_map函数. 其中映射的关键字字段是搜索查询字符串,可支持正则,完全匹配,模糊匹配等形式。 - 和基于表格来进行数据富化一样,基于字典的富化,除了可以使用通过
{}
直接构建的字典之外,也可以基于任务配置资源、外部OSS资源、表格资源等来构建字典,具体可参考字典构建。
场景样例2:使用搜索表格做数据富化
原始日志
"日志1"
http_host: m1.abcd.com
http_status: 200
request_method: GET
body_bytes_sent: 740
"日志2"
http_host: m2.abcd.com
http_status: 200
request_method: POST
body_bytes_sent: 1123
"日志3"
http_host: m3.abcd.com
http_status: 404
request_method: GET
body_bytes_sent: 711
"日志4"
http_host: m4.abcd.com
http_status: 504
request_method: GET
body_bytes_sent: 1822
需求
针对数据中的http_status
, body_bytes_sent
等字段, 映射出其他多个字段例如type
, warning_level
和warning_email
等. 具体的规则样例存储于RDS-MySQL中, 例如:
MYSQL 数据库表中数据
content | type | warning_level | warning_email |
---|---|---|---|
http_status~="2d+" and body_bytes_sent < 1000 | 正常 | INFO | normal@etl.com |
http_status~="2d+" and body_bytes_sent >= 1000 | 过长警告 | WARNING | over-long@etl.com |
http_status~="3d+" | 重定向 | WARNING | redirect@etl.com |
http_status~="4d+" | 错误 | ERROR | error@etl.com |
LOG DSL编排
e_search_table_map(res_rds_mysql("...连接MySQL参数..."),"content",["type", "warning_level", "warning_email"])
使用了e_search_table_map 语法,详细请参照e_search_table_map搜索表格语法,此处简单讲解,res_rds_mysql()里面填入的是去 RDS MYSQl 拉取数据的配置,该函数会拉取指定的mysql表格,具体语法请见res_rds_mysql函数用法,"content"字段指定的是mysql表中的字段,会使用该字段的值的内容去匹配原始日志中的内容,具体匹配规则请见e_search用法,可支持正则,完全匹配,模糊匹配等形式。
加工后日志
根据日志事件的http_status
和body_bytes_sent
的值的不同,为每个事件添加不同的type, warning_level以及warning_email信息。
"日志1"
type: 正常
warning_level: INFO
warning_email: normal@etl.com
http_host: m1.abcd.com
http_status: 200
request_method: GET
body_bytes_sent: 740
"日志2"
type: 过长警告
warning_level: WARNING
warning_email: over-long@etl.com
http_host: m2.abcd.com
http_status: 200
request_method: POST
body_bytes_sent: 1123
"日志3"
type: 错误
warning_level: ERROR
warning_email: error@etl.com
http_host: m3.abcd.com
http_status: 404
request_method: GET
body_bytes_sent: 711
"日志4"
type: 其他
warning_level: INFO
warning_email: others@etl.com
http_host: m4.abcd.com
http_status: 504
request_method: GET
body_bytes_sent: 1822
- 以上加工规则默认匹配到表中一行之后,立即返回。可以为
e_search_table_map
设置参数 multi_match=True和multi_join=",",分别表示开启多行匹配和匹配到多个值时候,多值使用逗号进行组合。
e_search_table_map(res_rds_mysql("...连接MySQL参数..."),"content",["type", "warning_level", "warning_email"], multi_match=True,multi_join=",")
- 以上加工规则默认使用表格中的列名作为添加的字段名称,也可以修改为新的字段名称。例如
warning_email
字段重命名为email
字段,把新字段和原字段写在一个原组里面即可,如下示例
e_search_table_map(res_rds_mysql("...连接MySQL参数..."),"content",["type", "warning_level", ("warning_email", "email")],multi_match=True,multi_join=",")
说明
- 上面使用了函数
e_search_table_map
,具体语法参照e_search_table_map函数. 其中映射的关键字字段是搜索查询字符串,可支持正则,完全匹配,模糊匹配等形式。 - 基于表格的富化,构建表格方式除了RDS-MySQl外, 还有其他方法, 例如动态构建, 本地资源, OSS等, 具体可参考表格构建。
进一步参考
欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持: