本文档为您介绍如何使用搜索映射方式对数据进行富化。

普通映射方式不能满足富化需求时,可以使用搜索映射,搜索映射与普通映射的区别在于匹配方式不同。
  • 普通映射方式
    说明 普通映射包含两种DSL编排语法,分别是映射富化函数映射富化函数。两者的区别在于e_dict_map接收的是一个dict类型的数据,而e_table_map接收的是通过资源函数获取的table类型的数据。
    普通映射使用文本完全匹配方式来映射,例如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值是401404时,需要更新字典覆盖,否则会匹配不上。关于HTTP请求状态请参见HTTP请求状态码

  • 搜索映射方式
    说明 搜索映射包含两种DSL编排语法,分别是映射富化函数映射富化函数。两者的区别在于e_search_dict_map接收的是一个dict类型的数据,而e_search_table_map接收的是通过资源函数获取的table类型的数据。
    当需要一些灵活的针对特定值做匹配逻辑时的映射,例如:
    状态码 文本
    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"
    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_statusbody_bytes_sent的值的不同,为每个事件添加不同的type信息。
    • http_status2XX并且body_bytes_sent长度小于1000的日志事件,设置type正常
    • http_status2XX并且body_bytes_sent长度大于等于1000的日志事件,设置type过长警告
    • http_status3XX的日志事件,设置type重定向
    • http_status4XX的日志事件,设置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的具体语法请参见映射富化函数。其中映射的关键字字段是搜索查询字符串,可支持正则,完全匹配,模糊匹配等形式。
  • 基于字典的富化,除了可以使用通过{}直接构建的字典外,也可以基于任务配置资源、外部OSS资源、表格资源等来构建字典。具体请参见构建字典与表格做数据富化

使用搜索表格做数据富化

  • 原始日志
    "日志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_statusbody_bytes_sent等字段,映射出其他多个字段例如typewarning_levelwarning_email等。具体的规则样例存储于RDS-MySQL中。例如:
    content type warning_level warning_email
    http_status~="2\d+" and body_bytes_sent < 1000 正常 INFO normal@etl.com
    http_status~="2\d+" and body_bytes_sent >= 1000 过长警告 WARNING over-long@etl.com
    http_status~="3\d+" 重定向 WARNING redirect@etl.com
    http_status~="4\d+" 错误 ERROR error@etl.com
  • LOG DSL编排
    e_search_table_map(res_rds_mysql("...连接MySQL参数..."),"content",["type", "warning_level", "warning_email"])
    说明
    • 使用了e_search_table_map语法,详细请参见映射富化函数
    • res_rds_mysql()里填入的是从RDS MYSQl获取数据的配置,该函数会获取指定的mysql表格,具体语法请参见资源函数
    • content字段指定的是mysql表中的字段,会使用该字段的值的内容去匹配原始日志中的内容,具体匹配规则请参见事件检查函数,支持正则、完全匹配、模糊匹配等形式。
  • 加工后日志
    根据日志事件的http_statusbody_bytes_sent的值的不同,为每个事件添加不同的typewarning_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的具体语法请参见映射富化函数。其中映射的关键字字段是搜索查询字符串,可支持正则,完全匹配,模糊匹配等形式。
  • 基于表格的富化,构建表格的方式除了RDS-MySQl外,还有其他方式,例如动态构建、本地资源、OSS等。具体请参见构建字典与表格做数据富化