-
Couldn't load subscription status.
- Fork 261
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专业版