-
Notifications
You must be signed in to change notification settings - Fork 259
Send Router
Andrewei edited this page Dec 14, 2017
·
9 revisions
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_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
},
{
"name": "file_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
}
],
"router" {
"router_key_name": "field1",
"router_match_type": "equal",
"router_default_sender": 0,
"router_routes": {
"value1": 0,
"value2": 1,
"value3": 2
}
}
- 字段说明:
| 参数名称 | 参数类型 | 是否必填 | 参数说明 |
|---|---|---|---|
| router_key_name | string | 必填 | 在发送数据的时候作为路由参照的字段名称 |
| router_match_type | string | 必填 | 匹配规则,目前支持的匹配规则有两种: equal 和 contains, 具体见下面的说明 |
| router_default_sender | int | 必填 | 默认选择哪个 sender 发送, 当要发送的数据无法匹配 router_routes 中的任何一个路由规则时,将使用该选项指定的 sender 发送, 填入的值应当为 senders 配置项中该 sender 的下标, 从 0 开始 |
| router_routes | map[string]int | 必填 | 具体的路由规则,以上面的配置为例,路由规则为: 1. 当 field1 这个字段的值为 value1 时,使用 senders 配置中下标为 0 的 sender 发送;2. 当 field1 的值为 value2 时,使用下标为 1 的 sender 发送;3. 当 field1 的值为 value3 时,使用下标为 2 的 sender 发送 |
匹配规则是指 router_key_name 的字段的值在作为路由参照的时候,它的值应该与 router_routes 中的路由规则进行怎样的匹配,最终完成路由.
目前支持的路由规则有两种 equal 和 contains:
该规则是指,当 router_key_name 的值与 router_routes 中的值完全相同时,进行路由.
- 例如要发送的数据为:
[
{
"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_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
},
{
"name": "file_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
}
]
- 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 中的值时,进行路由.
- 例如要发送的数据为:
[
{
"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_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
},
{
"name": "file_sender0",
"sender_type": "file",
"file_send_path": "sender/sender_file0"
}
]
- 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": "abc",
"field2": "X"
},
{
"field1": "a",
"field2": "X"
}
]
- sender_file1
[
{
"field1": "1234",
"field2": "X"
},
{
"field1": 1234,
"field2": "X"
},
{
"field1": 1.123,
"field2": "X"
},
{
"field1": 123,
"field2": "X"
}
]
- sender_file2
[
{
"field1": "B",
"field2": "X"
},
{
"field1": "23",
"field2": "X"
}
]
- 从上面的例子也可以看出,该规则在进行匹配时,会将非
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专业版