数据转换

script Transformer

针对指定的字段进行替换,执行指定字段的脚本,同时支持输入脚本内容或输入脚本路径进行执行。

  • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

  • 新的字段名(new): 将脚本执行结果存入一个新的字段,不改变原来字段所存的内容,如果不想改变 key 指定字段所存内容又想记录脚本执行结果,可以通过这个参数设置。默认情况下无需填写,脚本执行结果会替换 key 指定字段所存内容。

  • 脚本执行解释器:字段可以设置脚本执行解释器,默认为 bash。

  • 指定脚本路径(scriptpath):字段支持指定脚本文件路径,如果填写了该字段,会优先执行该脚本文件,不执行 key 指定字段的脚本。默认情况下无需填写,默认会执行 key 指定字段的脚本。

  • 指定脚本内容(script):字段支持指定所需执行脚本内容,如果填写了该字段,会优先执行该脚本内容,不执行 scriptpath 和 key 指定字段的脚本。默认情况下无需填写,默认会执行 key 指定字段的脚本。

script Transformer 可以对指定的 key 进行脚本执行结果的替换。 key 指定的字段里存的如果是具体脚本的路径,则支持执行该脚本并将脚本执行结果替换 key 指定字段的值,或者创建 new 指定的字段并将脚本执行结果存入该字段 key 指定的字段里存的如果不是路径,则需要填写 script 或者 scriptpath 内容,此时会执行 script 或者 scriptpath,并将脚本执行结果存入 key 或者 new 字段。

pandora_key_convert Transformer

将不符合 Pandora 字段类型的 key 字符转化为下划线,如 a.b/c 改为 a_b_c。

urlparam Transformer

将带有 url parameter 格式的字符串(如 uid=123&name=tom&age=10或/mytest?uid=123&name=tom&age=10),并将其转化为键值对填充到原数据中。

  • 要进行Transform变化的键(key): 指定要解析的数据所在字段,支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

示例:

parser 解析后的数据为:

  1. {
  2. "field1": "aaaa",
  3. "field2": "bbbb",
  4. "params": "/mytest?uid=123&name=tom&age=10"
  5. }

经过 urlparam transformer 变换后的数据将变为:

  1. {
  2. "field1": "aaaa",
  3. "field2": "bbbb",
  4. "params": "/mytest?uid=123&name=tom&age=10",
  5. "params_uid": "123",
  6. "params_name": "tom",
  7. "params_age": "10",
  8. "params_url_param_path": "/mytest",
  9. }

!>注意:当 url param 中扩展开来的字段名与数据中原有的字段名称冲突时,该 transformer 会在其扩展名后面添加数字以便区分。

示例:

  1. {
  2. "params_uid": "aaaa",
  3. "field2": "bbbb",
  4. "params": "uid=123&name=tom&age=10"
  5. }

解析后数据将变成:

  1. {
  2. "params_uid": "aaaa",
  3. "field2": "bbbb",
  4. "params": "uid=123&name=lily&age=10",
  5. "params_uid1": "233",
  6. "params_name": "lily",
  7. "params_age": "10"
  8. }

Cloudtrail Transformer

Cloudtrail Transformer 是针对 AWS CloudTrail 的数据做格式转换的 Transformer,可以将CloudTrail 的 json 格式中的 Records逐条变为数据。

示例:

将数据由一条:

  1. {"Records": [{
  2. "eventVersion": "1.04",
  3. "userIdentity": {
  4. "type": "IAMUser",
  5. "principalId": "EX_PRINCIPAL_ID",
  6. "arn": "arn:aws:iam::123456789012:user/Alice",
  7. "accountId": "123456789012",
  8. "accessKeyId": "EXAMPLE_KEY_ID",
  9. "userName": "Alice"
  10. },
  11. "eventTime": "2016-07-14T19:15:45Z",
  12. "eventSource": "cloudtrail.amazonaws.com",
  13. "eventName": "UpdateTrail",
  14. "awsRegion": "us-east-2",
  15. "sourceIPAddress": "205.251.233.182",
  16. "userAgent": "aws-cli/1.10.32 Python/2.7.9 Windows/7 botocore/1.4.22",
  17. "errorCode": "TrailNotFoundException",
  18. "errorMessage": "Unknown trail: myTrail2 for the user: 123456789012",
  19. "requestParameters": {"name": "myTrail2"},
  20. "responseElements": null,
  21. "requestID": "5d40662a-49f7-11e6-97e4-d9cb6ff7d6a3",
  22. "eventID": "b7d4398e-b2f0-4faa-9c76-e2d316a8d67f",
  23. "eventType": "AwsApiCall",
  24. "recipientAccountId": "123456789012"
  25. },{
  26. "eventVersion": "1.0",
  27. "userIdentity": {
  28. "type": "IAMUser",
  29. "principalId": "EX_PRINCIPAL_ID",
  30. "arn": "arn:aws:iam::123456789012:user/Alice",
  31. "accountId": "123456789012",
  32. "accessKeyId": "EXAMPLE_KEY_ID",
  33. "userName": "Alice"
  34. },
  35. "eventTime": "2014-03-24T21:11:59Z",
  36. "eventSource": "iam.amazonaws.com",
  37. "eventName": "CreateUser",
  38. "awsRegion": "us-east-2",
  39. "sourceIPAddress": "127.0.0.1",
  40. "userAgent": "aws-cli/1.3.2 Python/2.7.5 Windows/7",
  41. "requestParameters": {"userName": "Bob"},
  42. "responseElements": {"user": {
  43. "createDate": "Mar 24, 2014 9:11:59 PM",
  44. "userName": "Bob",
  45. "arn": "arn:aws:iam::123456789012:user/Bob",
  46. "path": "/",
  47. "userId": "EXAMPLEUSERID"
  48. }}
  49. }]}

转变为两条:

  1. {
  2. "eventVersion": "1.04",
  3. "userIdentity": {
  4. "type": "IAMUser",
  5. "principalId": "EX_PRINCIPAL_ID",
  6. "arn": "arn:aws:iam::123456789012:user/Alice",
  7. "accountId": "123456789012",
  8. "accessKeyId": "EXAMPLE_KEY_ID",
  9. "userName": "Alice"
  10. },
  11. "eventTime": "2016-07-14T19:15:45Z",
  12. "eventSource": "cloudtrail.amazonaws.com",
  13. "eventName": "UpdateTrail",
  14. "awsRegion": "us-east-2",
  15. "sourceIPAddress": "205.251.233.182",
  16. "userAgent": "aws-cli/1.10.32 Python/2.7.9 Windows/7 botocore/1.4.22",
  17. "errorCode": "TrailNotFoundException",
  18. "errorMessage": "Unknown trail: myTrail2 for the user: 123456789012",
  19. "requestParameters": {"name": "myTrail2"},
  20. "responseElements": null,
  21. "requestID": "5d40662a-49f7-11e6-97e4-d9cb6ff7d6a3",
  22. "eventID": "b7d4398e-b2f0-4faa-9c76-e2d316a8d67f",
  23. "eventType": "AwsApiCall",
  24. "recipientAccountId": "123456789012"
  25. }
  1. {
  2. "eventVersion": "1.0",
  3. "userIdentity": {
  4. "type": "IAMUser",
  5. "principalId": "EX_PRINCIPAL_ID",
  6. "arn": "arn:aws:iam::123456789012:user/Alice",
  7. "accountId": "123456789012",
  8. "accessKeyId": "EXAMPLE_KEY_ID",
  9. "userName": "Alice"
  10. },
  11. "eventTime": "2014-03-24T21:11:59Z",
  12. "eventSource": "iam.amazonaws.com",
  13. "eventName": "CreateUser",
  14. "awsRegion": "us-east-2",
  15. "sourceIPAddress": "127.0.0.1",
  16. "userAgent": "aws-cli/1.3.2 Python/2.7.5 Windows/7",
  17. "requestParameters": {"userName": "Bob"},
  18. "responseElements": {"user": {
  19. "createDate": "Mar 24, 2014 9:11:59 PM",
  20. "userName": "Bob",
  21. "arn": "arn:aws:iam::123456789012:user/Bob",
  22. "path": "/",
  23. "userId": "EXAMPLEUSERID"
  24. }}
  25. }

IP Transformer

对 ip 字段进行数据的扩展,扩展出如下字段:

  1. "Region" 区域信息
  2. "City":城市信息
  3. "Country":国家信息
  4. "Isp":运营商信息
  • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

  • IP 数据库路径(data_path):你拥有的 ip 数据库文件路径,可以在 ipip.net 下载,也可以使用logkit 源码包中的 ip 数据库。

arrayexpand Transformer

解析数组类型,并将其转化为键值对填充到原数据中。

  • 要进行Transform变化的键(key):要解析的数据所在字段名称,支持多级嵌套,多级间用.符号连接,如abc.xyz,表示 data[“abc”][“xyz”]中的数据。

示例:
parser 解析后的数据为:

  1. {
  2. "field1": "aaaa",
  3. "field2": "bbbb",
  4. "arrayfield": ["a", 1, 3.0, "d", "e"]
  5. }

经过 arrayexpand 后的数据将变为:

  1. {
  2. "field1": "aaaa",
  3. "field2": "bbbb",
  4. "arrayfield": ["a", 1, 3.0, "d", "e"],
  5. "arrayfield0": "a",
  6. "arrayfield1": 1,
  7. "arrayfield2": 3.0,
  8. "arrayfield3": "d",
  9. "arrayfield4": "e"
  10. }

!>注意:若 arrayexpand 解析生成的字段与数据中原有字段冲突,则会再加一个数字位进行重命名。 例如:

  1. {
  2. "field1": "aaaa",
  3. "field2": "bbbb",
  4. "arrayfield3": "xxx",
  5. "arrayfield": ["a", "b", "c", "d", "e"]
  6. }

经过 arrayexpand 后的数据将变为:

  1. {
  2. "field1": "aaaa",
  3. "field2": "bbbb",
  4. "arrayfield3": "xxx",
  5. "arrayfield": ["a", "b", "c", "d", "e"]
  6. "arrayfield0": "a",
  7. "arrayfield1": "b",
  8. "arrayfield2": "c",
  9. "arrayfield3_0": "b",
  10. "arrayfield4": "e"
  11. }

Convert Transformer

除了通过可视化界面配置以外,logkit 还支持手动书写 dsl: 针对 dsl 指定的字段和类型做数据格式转换,dsl 中可以包含多个数据字段和类型。如将 field1 转为 long、field2 转为 string 则写为 “field1 long, field2 string”。

DSL 语法

DSL 规则为<字段名称> <类型>,字段名称和类型用空格符隔开,不同字段用逗号隔开。若字段必填,可以转换的类型包括:

  • long 类型(int64): long,LONG,l,L
  • float 类型(float64): float,FLOAT,F,f
  • string 类型: string,STRING,S,s
  • bool 类型: bool,BOOL,B,b,boolean
  • array 类型: array,ARRAY,A,a;括号中跟具体array元素的类型,如a(l),表示array里面都是long。同时,也可以省略小括号前的array类型申明,直接写(l),表示 array 类型,里面的元素是long
  • map 类型: map,MAP,M,m;使用花括号表示具体类型,表达map里面的元素,如map{a l,b map{c b,x s}}, 表示map结构体里包含a字段,类型是long,b字段又是一个map,里面包含c字段,类型是bool,还包含x字段,类型是string。同时,也可以省略花括号前面的map类型,直接写{s l},表示map类型,里面的元素s为long类型。

Discard Transformer

删除指定的数据字段, 如数据{“a”:123,”b”:”xx”}, 指定删除 a,变为{“b”:”xx”}

要进行 Transform 变化的键(key):

  • 支持多级嵌套,多级间用.符号连接,如abc.xyz,表示 data[“abc”][“xyz”]中的数据。
  • 也支持写多个,用逗号分隔,比如 field1,field2 表示删除field1和field2 2个key。

应用场景

数据解析完后,有一些字段是不需要的,就可以用来做反选,去掉这些字段,节省传输和存储成本。

Date Transformer

对指定的 key 转换为指定的时间格式,这个 key 里面存的实际值可以是一个字符串,也可以是一个 timestamp 数字。 也可以对时间进行变换,如解析的时间没有带时区,被默认作为了 UTC 时间,但是又想变换为东八区时间,这样就只要在 Offset 处设置为 -8 即可。

  • 要进行Transform变化的键(key): 支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

  • 时间样式(time_layout_before): 设置自己的时间类型的样式,在你的数据无法自动解析的情况下,可以通过这个参数设置。默认情况下无需填写,系统会自动解析。

  • 解析后时间样式(time_layout_after): 设置解析后的时间,Pandora接受的时间类型(date)类型本质上是RFC3339的字符串,所以此处如果不填,默认转为RFC3339的字符串,也可根据需要转为其他样式。

时间格式(layout)的写法

时间格式的写法符合 golang 的时间格式定义方法,具体参见https://golang.org/pkg/time/#pkg-constants类似如下。

  1. ANSIC = "Mon Jan _2 15:04:05 2006"
  2. UnixDate = "Mon Jan _2 15:04:05 MST 2006"
  3. RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
  4. RFC822 = "02 Jan 06 15:04 MST"
  5. RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
  6. RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
  7. RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
  8. RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
  9. RFC3339 = "2006-01-02T15:04:05Z07:00"
  10. RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
  11. Kitchen = "3:04PM"
  12. // Handy time stamps.
  13. Stamp = "Jan _2 15:04:05"
  14. StampMilli = "Jan _2 15:04:05.000"
  15. StampMicro = "Jan _2 15:04:05.000000"
  16. StampNano = "Jan _2 15:04:05.000000000"

简单来说,年份必须是 2006,月份必须是 1 或者 Jan,日必须是 2, 时必须是 3(两位数必须是 15,一位数时后面要跟 PM,类似 Kitchen 的描述),分必须是 4,秒必须是 5,时区必须是 +7。比如 RFC3339 的格式定义为2006-01-02T15:04:05+07:00,又或者我们自己定义一个简单版的时间 2006|01|02|03|04|05,年月日时分秒分别用竖线|分隔,假设当前时间为 2017 年 6 月 6 日 20 时 38 分 12 秒,则按我们定义的格式显示为 2017|06|06|20|38|12。

Replace Transformer

  • 要进行Transform变化的键(key): 支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

  • 是否启用正则匹配(regex): Replace Transformer 支持正则表达式,当 regex 标志位为 true 时,把 old 字段对应的字符串当作正则表达式处理。

Trim Transformer

去掉字符串前后多余的字符,如 abc123, 设置 trim 的字符为 abc,变化后为 123。

  • 修整位置(place):只去掉前缀(prefix)、后缀(suffix)或者前缀后缀都去掉(both)。

UserAgent Transformer

解析 User Agent 中的用户信息,如下:

  • UA_Family: 族信息,通常一个公司的一系列产品会形成一个族。
  • UA_Major:大版本号
  • UA_Minor: 小版本号
  • UA_Patch:补丁版本
  • UA_Device_Family:设备族信息
  • UA_Device_Brand: 设备品牌
  • UA_Device_Model: 设备类型
  • UA_OS_Family: 操作系统族信息
  • UA_OS_Patch: 操作系统补丁版本
  • UA_OS_Major: 操作系统大版本号
  • UA_OS_Minor: 操作系统小版本号
  • UA_OS_PatchMinor: 操作系统补丁的小版本号
  • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

  • UserAgent 解析正则表达式文件路径(regex_yml_path):默认可以不填,也可以填写你拥有的 useragent 正则表达式 yaml 文件,最新的文件可以在ua-parser/uap-core上获取。

示例:

传入一个 useragent 字符串,假设为:

  1. Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true

得到的数据为:

  1. "ua": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true",
  2. "UA_Family": "Amazon Silk",
  3. "UA_Major": "1",
  4. "UA_Minor": "1",
  5. "UA_Patch": "0-80",
  6. "UA_OS_Family": "Android",
  7. "UA_Device_Family": "Kindle",
  8. "UA_Device_Brand": "Amazon",
  9. "UA_Device_Model": "Kindle"

k8stag Transformer

为 Kubernetes 用户量身定做的 Transformer,对于收集的 Kubernetes 用户,其日志路径信息就带有包括 k8s_pod_name,k8s_namespace,k8s_container_name,k8s_container_id 在内的信息,所以 logkit Pro 通过收集到 Kubernetes 日志的路径,获取这些标签。

在 File Reader 的配置中,datasource_tag 这个选项会记录文件路径。logkit Pro 默认开启这个选项,并记录为 datasource 字段。

JSON Transformer

解析 json 并加入到数据中,如 json 为 {“a”:123},加入后变为 {“myNewKey”:{“a”:123}}。

  • 要进行 Transform 变化的键(key):指定要解析的json数据所在的字段,支持多级嵌套,多级间用. 符号连接,表示data[“abc”][“xyz”] 中的数据。

  • 解析后数据的字段名(new):指定要解析 json 数据字段的新字段,必须指定新字段。

示例:

例如, parser 解析后的数据为:

  1. {
  2. "field1": "aaaa",
  3. "field2": "bbbb",
  4. "myOldKey": "{"uid":123,"name":"tom","age":10}"
  5. }

经过 json 变换后的数据将变为:

  1. {
  2. "field1": "aaaa",
  3. "field2": "bbbb",
  4. "myOldKey": "{\"uid\":123,\"name\":\"tom\",\"age\":10}"
  5. "myNewKey": {"uid":123,"name":"tom","age":10}
  6. }

label Transformer

增加标签, 如设置标签 {key:a,value:b}, 则数据中加入 {“a”:”b”}

  • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如abc.xyz,表示 data[“abc”][“xyz”]中的数据。

  • 要添加的数据值(仅限string类型)(value):要填充的label值,值的类型只能是string类型。

高级选项

  • 要进行 Transform 变化的键已存在时,是否覆盖原有的值(override):默认为 false,选择 true 就表示如果原来有值,覆盖原有值,此处如果覆盖,原来该字段的数据就丢失了

rename Transformer

用新的字段重命名旧的字段, 如 {a:123} 改为 {b:123}。

  • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据,重命名后会删除该字段,并将数据赋予到新的字段名称。

  • 修改后的字段名(new_key_name):支持多级嵌套,多级间用.符号连接,如 abc1.xyz1,表示 data[“abc1”][“xyz1”] 中的数据。

split Transformer

针对 key 指定的字段做数据切割,按 step 指定的字符切分,转换为一个字符串数组,并填充到 newfield 指定的字段中。例如 “a,b,c” 切割为 [“a”,”b”,”c”]。

  • 要进行 Transform 变化的键(key): 指定要切分的数据所在字段,支持多级嵌套,多级间用.符号连接,如abc.xyz,表示 data[“abc”][“xyz”]中的数据。

  • 分隔符(sep): 指定切分的分隔符,通常情况下分隔符为逗号(“,”)、空格(“ “)、横线(“-“)、制表符(“\t”)等等。

  • 解析后数据的字段名(newfield): 指定切分后的数据进的新字段,可以指定为新的字段,如果指定新的字段跟key字段名称相同,则相当于替换原始字段。

xml Transformer

解析 xml, 将 xml 格式转变为 map 结构。

  • 要进行 Transform 变化的键(key): 指定要解析的 xml 数据所在的字段,支持多级嵌套,多级间用 . 符号连接,表示 data[“abc”][“xyz”] 中的数据。

  • 解析后数据的字段(new): 指定要解析 xml 数据字段的新字段,必须指定新字段。

示例:

例如, parser 解析后的数据为:

  1. {
  2. "key1": "value1",
  3. "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  4. <note>
  5. <to>Tove</to>
  6. <from>Jani</from>
  7. <heading>Reminder</heading>
  8. <body>Don't forget me this weekend!</body>
  9. </note>"
  10. }

经过 xml 变换后的数据将变为:

  1. {
  2. "key1": "value1",
  3. "xml":{
  4. "note": {
  5. "heading": "Reminder",
  6. "body": "Don't forget me this weekend!",
  7. "to": "Tove",
  8. "from": "Jani",
  9. },
  10. },
  11. },