Skip to content

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_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 必填 匹配规则,目前支持的匹配规则有两种: equalcontains, 具体见下面的说明
router_default_sender int 必填 默认选择的 sender, 当要发送的数据无法匹配 router_routes 中的任何一个路由规则时,将使用该选项指定的 sender 发送, 填入的值应当为该 sendersenders 配置项数组中的下标, 从 0 开始
router_routes map[string]int 必填 具体的路由规则,以上面的配置为例,路由规则为:
1. 当 response_code 这个字段的值为 200 时,使用 senders 配置中下标为 0sender 发送, 即发送到 sender/sender_file0 这个文件;
2. 当 response_code 的值为 500 时,使用下标为 1sender 发送, 即发送到 sender/sender_file1 这个文件;
3. 其他的 response_code 值将使用下标为 2sender 发送,即发送到 sender/sender_file2 这个文件

匹配规则

匹配规则是指 router_key_name 的字段的值在作为路由参照的时候,它的值应该与 router_routes 中的路由规则进行怎样的匹配,最终完成路由.

目前支持的路由规则有两种 equalcontains:

equal:

该规则是指,当 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 进行比较。

contains:

该规则是指,当 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", 所以匹配到下标为 0sender

  • 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_timeosinfocore 等;
  • router 功能只适用于 日志收集器 而不适用于 系统信息收集器;
Clone this wiki locally