-
Notifications
You must be signed in to change notification settings - Fork 255
Send Router
Sender Router 是一个根据要发送的数据中某个字段的值来决定从哪个 sender 发送的功能。
比如收集 nginx
日志时,如果想要将 response code == 200
的日志与 response code != 200
的日志区分开来放到不同的地方进行分析,这个时候就可以使用这个功能,将 response code
作为路由参照字段,并配置路由规则,根据 response code
的值使用不同的 sender
发往不同的地方。
开启 Sender Router 功能需要在收集器的配置文件中添加 router
这个配置项。
- 一个典型的配置如下:
"senders": [
{
"name": "file_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
},
{
"name": "file_sender1",
"sender_type": "file",
"file_send_path": "sender/sender_file1"
},
{
"name": "file_sender2",
"sender_type": "file",
"file_send_path": "sender/sender_file2"
}
],
"router" {
"router_key_name": "response_code",
"router_match_type": "equal",
"router_default_sender": 2,
"router_routes": {
"200": 0,
"500": 1
}
}
- 字段说明:
参数名称 | 参数类型 | 是否必填 | 参数说明 |
---|---|---|---|
router_key_name | string | 必填 | 在发送数据的时候作为路由参照的字段名称, 比如上述场景中的 response code
|
router_match_type | string | 必填 | 匹配规则,目前支持的匹配规则有两种: equal 和 contains , 具体见下面的说明 |
router_default_sender | int | 必填 | 默认选择的 sender , 当要发送的数据无法匹配 router_routes 中的任何一个路由规则时,将使用该选项指定的 sender 发送, 填入的值应当为该 sender 在 senders 配置项数组中的下标, 从 0 开始 |
router_routes | map[string]int | 必填 | 具体的路由规则,以上面的配置为例,路由规则为: 1. 当 response_code 这个字段的值为 200 时,使用 senders 配置中下标为 0 的 sender 发送, 即发送到 sender/sender_file0 这个文件;2. 当 response_code 的值为 500 时,使用下标为 1 的 sender 发送, 即发送到 sender/sender_file1 这个文件;3. 其他的 response_code 值将使用下标为 2 的 sender 发送,即发送到 sender/sender_file2 这个文件 |
匹配规则是指 router_key_name
的字段的值在作为路由参照的时候,它的值应该与 router_routes
中的路由规则进行怎样的匹配,最终完成路由.
目前支持的路由规则有两种 equal
和 contains
:
该规则是指,当 router_key_name
的值与 router_routes
中的 key
值完全相同时,成功匹配路由。
- 例如要发送的数据为:
[
{
"field1": "a",
"field2": "X"
},
{
"field1": "B",
"field2": "X"
},
{
"field1": 1234,
"field2": "X"
},
{
"field1": 123,
"field2": "X"
},
{
"field1": "123",
"field2": "X"
},
{
"field1": "a",
"field2": "X"
},
{
"field1": "a",
"field2": "X"
}
]
- senders 的配置为:
"senders": [
{
"name": "file_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
},
{
"name": "file_sender1",
"sender_type": "file",
"file_send_path": "sender/sender_file1"
},
{
"name": "file_sender2",
"sender_type": "file",
"file_send_path": "sender/sender_file2"
}
]
- router 的配置为:
"router": {
"router_key_name": "field1",
"router_match_type": "equal",
"router_default_sender": 2,
"router_routes": {
"a": 0,
"123": 1,
}
}
在上述配置下,每个 sender_file
中接收的数据为:
- sender_file0
[
{
"field1": "a",
"field2": "X"
},
{
"field1": "a",
"field2": "X"
},
{
"field1": "a",
"field2": "X"
}
]
- sender_file1
[
{
"field1": 123,
"field2": "X"
},
{
"field1": "123",
"field2": "X"
}
]
- sender_file2
[
{
"field1": "B",
"field2": "X"
},
{
"field1": 1234,
"field2": "X"
}
]
- 从上面的例子也可以看出,该规则在进行匹配时,会将非
string
类型的数据,强制转换成string
进行比较。
该规则是指,当 router_key_name
的值包含 router_routes
中的某个 key
值时,成功匹配路由.
- 例如要发送的数据为:
[
{
"field1": "1234",
"field2": "X"
},
{
"field1": "B",
"field2": "X"
},
{
"field1": 1234,
"field2": "X"
},
{
"field1": 123,
"field2": "X"
},
{
"field1": 1.123,
"field2": "X"
},
{
"field1": "23",
"field2": "X"
},
{
"field1": "abc",
"field2": "X"
},
{
"field1": "a",
"field2": "X"
}
]
- senders 的配置为:
"senders": [
{
"name": "file_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
},
{
"name": "file_sender1",
"sender_type": "file",
"file_send_path": "sender/sender_file1"
},
{
"name": "file_sender2",
"sender_type": "file",
"file_send_path": "sender/sender_file2"
}
]
- router 的配置为:
"router": {
"router_key_name": "field1",
"router_match_type": "contains",
"router_default_sender": 2,
"router_routes": {
"a": 0,
"123": 1,
}
}
在上述配置下,每个 sender_file
中接收的数据为:
- sender_file0
[
{
"field1": "abc",
"field2": "X"
},
{
"field1": "a",
"field2": "X"
}
]
说明: field1
的 "abc"
和 "a"
都包含 "a"
, 所以匹配到下标为 0
的 sender
。
- sender_file1
[
{
"field1": "1234",
"field2": "X"
},
{
"field1": 1234,
"field2": "X"
},
{
"field1": 1.123,
"field2": "X"
},
{
"field1": 123,
"field2": "X"
}
]
说明: field1
的 "1234"
, 1234
, 1.123
, 123
包含 "123"
, 所以匹配到下标为 1
的路由。
- sender_file2
[
{
"field1": "B",
"field2": "X"
},
{
"field1": "23",
"field2": "X"
}
]
说明: 未匹配到任何路由,所以从默认 sender
发送。
- 从上面的例子也可以看出,该规则在进行匹配时,会将非
string
类型的数据,强制转换成string
进行比较。
- 与之前的配置的兼容性: 当配置文件中没有
router
项时,依然保持之前的处理逻辑,即每个sender
都会发送所有的数据; - 当
router_key_name
的值为空字符串时, 相当于router
功能没有启用; - 当
router
功能启用,且发送的数据中没有router_key_name
这个字段时,数据会从router_default_sender
指定的sender
发送; - 目前
sender router
仅支持匹配string
类型的数据,非string
的数据会尝试转化为string
类型的数据,然后进行路由匹配; -
router_key_name
只能选择采集的日志中的字段,不能选择logkit
自动添加的字段,包括但不限于logkit_send_time
、osinfo
、core
等; -
router
功能只适用于日志收集器
而不适用于系统信息收集器
;
快速开始 | Pandora | Readers | Parsers | Senders | Download | 七牛智能日志管理平台 | logkit-pro专业版