- 数据转换
- script Transformer
- pandora_key_convert Transformer
- urlparam Transformer
- Cloudtrail Transformer
- IP Transformer
- arrayexpand Transformer
- Convert Transformer
- Discard Transformer
- Date Transformer
- Replace Transformer
- Trim Transformer
- UserAgent Transformer
- k8stag Transformer
- JSON Transformer
- label Transformer
- rename Transformer
- split Transformer
- xml Transformer
数据转换
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 解析后的数据为:
{
"field1": "aaaa",
"field2": "bbbb",
"params": "/mytest?uid=123&name=tom&age=10"
}
经过 urlparam transformer 变换后的数据将变为:
{
"field1": "aaaa",
"field2": "bbbb",
"params": "/mytest?uid=123&name=tom&age=10",
"params_uid": "123",
"params_name": "tom",
"params_age": "10",
"params_url_param_path": "/mytest",
}
!>注意:当 url param 中扩展开来的字段名与数据中原有的字段名称冲突时,该 transformer 会在其扩展名后面添加数字以便区分。
示例:
{
"params_uid": "aaaa",
"field2": "bbbb",
"params": "uid=123&name=tom&age=10"
}
解析后数据将变成:
{
"params_uid": "aaaa",
"field2": "bbbb",
"params": "uid=123&name=lily&age=10",
"params_uid1": "233",
"params_name": "lily",
"params_age": "10"
}
Cloudtrail Transformer
Cloudtrail Transformer 是针对 AWS CloudTrail 的数据做格式转换的 Transformer,可以将CloudTrail 的 json 格式中的 Records逐条变为数据。
示例:
将数据由一条:
{"Records": [{
"eventVersion": "1.04",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::123456789012:user/Alice",
"accountId": "123456789012",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
},
"eventTime": "2016-07-14T19:15:45Z",
"eventSource": "cloudtrail.amazonaws.com",
"eventName": "UpdateTrail",
"awsRegion": "us-east-2",
"sourceIPAddress": "205.251.233.182",
"userAgent": "aws-cli/1.10.32 Python/2.7.9 Windows/7 botocore/1.4.22",
"errorCode": "TrailNotFoundException",
"errorMessage": "Unknown trail: myTrail2 for the user: 123456789012",
"requestParameters": {"name": "myTrail2"},
"responseElements": null,
"requestID": "5d40662a-49f7-11e6-97e4-d9cb6ff7d6a3",
"eventID": "b7d4398e-b2f0-4faa-9c76-e2d316a8d67f",
"eventType": "AwsApiCall",
"recipientAccountId": "123456789012"
},{
"eventVersion": "1.0",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::123456789012:user/Alice",
"accountId": "123456789012",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
},
"eventTime": "2014-03-24T21:11:59Z",
"eventSource": "iam.amazonaws.com",
"eventName": "CreateUser",
"awsRegion": "us-east-2",
"sourceIPAddress": "127.0.0.1",
"userAgent": "aws-cli/1.3.2 Python/2.7.5 Windows/7",
"requestParameters": {"userName": "Bob"},
"responseElements": {"user": {
"createDate": "Mar 24, 2014 9:11:59 PM",
"userName": "Bob",
"arn": "arn:aws:iam::123456789012:user/Bob",
"path": "/",
"userId": "EXAMPLEUSERID"
}}
}]}
转变为两条:
{
"eventVersion": "1.04",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::123456789012:user/Alice",
"accountId": "123456789012",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
},
"eventTime": "2016-07-14T19:15:45Z",
"eventSource": "cloudtrail.amazonaws.com",
"eventName": "UpdateTrail",
"awsRegion": "us-east-2",
"sourceIPAddress": "205.251.233.182",
"userAgent": "aws-cli/1.10.32 Python/2.7.9 Windows/7 botocore/1.4.22",
"errorCode": "TrailNotFoundException",
"errorMessage": "Unknown trail: myTrail2 for the user: 123456789012",
"requestParameters": {"name": "myTrail2"},
"responseElements": null,
"requestID": "5d40662a-49f7-11e6-97e4-d9cb6ff7d6a3",
"eventID": "b7d4398e-b2f0-4faa-9c76-e2d316a8d67f",
"eventType": "AwsApiCall",
"recipientAccountId": "123456789012"
}
{
"eventVersion": "1.0",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::123456789012:user/Alice",
"accountId": "123456789012",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
},
"eventTime": "2014-03-24T21:11:59Z",
"eventSource": "iam.amazonaws.com",
"eventName": "CreateUser",
"awsRegion": "us-east-2",
"sourceIPAddress": "127.0.0.1",
"userAgent": "aws-cli/1.3.2 Python/2.7.5 Windows/7",
"requestParameters": {"userName": "Bob"},
"responseElements": {"user": {
"createDate": "Mar 24, 2014 9:11:59 PM",
"userName": "Bob",
"arn": "arn:aws:iam::123456789012:user/Bob",
"path": "/",
"userId": "EXAMPLEUSERID"
}}
}
IP Transformer
对 ip 字段进行数据的扩展,扩展出如下字段:
"Region": 区域信息
"City":城市信息
"Country":国家信息
"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 解析后的数据为:
{
"field1": "aaaa",
"field2": "bbbb",
"arrayfield": ["a", 1, 3.0, "d", "e"]
}
经过 arrayexpand 后的数据将变为:
{
"field1": "aaaa",
"field2": "bbbb",
"arrayfield": ["a", 1, 3.0, "d", "e"],
"arrayfield0": "a",
"arrayfield1": 1,
"arrayfield2": 3.0,
"arrayfield3": "d",
"arrayfield4": "e"
}
!>注意:若 arrayexpand 解析生成的字段与数据中原有字段冲突,则会再加一个数字位进行重命名。 例如:
{
"field1": "aaaa",
"field2": "bbbb",
"arrayfield3": "xxx",
"arrayfield": ["a", "b", "c", "d", "e"]
}
经过 arrayexpand 后的数据将变为:
{
"field1": "aaaa",
"field2": "bbbb",
"arrayfield3": "xxx",
"arrayfield": ["a", "b", "c", "d", "e"]
"arrayfield0": "a",
"arrayfield1": "b",
"arrayfield2": "c",
"arrayfield3_0": "b",
"arrayfield4": "e"
}
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类似如下。
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
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 字符串,假设为:
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
得到的数据为:
"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",
"UA_Family": "Amazon Silk",
"UA_Major": "1",
"UA_Minor": "1",
"UA_Patch": "0-80",
"UA_OS_Family": "Android",
"UA_Device_Family": "Kindle",
"UA_Device_Brand": "Amazon",
"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 解析后的数据为:
{
"field1": "aaaa",
"field2": "bbbb",
"myOldKey": "{"uid":123,"name":"tom","age":10}"
}
经过 json 变换后的数据将变为:
{
"field1": "aaaa",
"field2": "bbbb",
"myOldKey": "{\"uid\":123,\"name\":\"tom\",\"age\":10}"
"myNewKey": {"uid":123,"name":"tom","age":10}
}
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 解析后的数据为:
{
"key1": "value1",
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>"
}
经过 xml 变换后的数据将变为:
{
"key1": "value1",
"xml":{
"note": {
"heading": "Reminder",
"body": "Don't forget me this weekend!",
"to": "Tove",
"from": "Jani",
},
},
},