Pipeline 测试
Elastic 包由数据流组成。 Pipeline 测试会运行为包的数据流定义的 Elasticsearch Ingest Node pipeline。
从概念上讲,运行 Pipeline 测试涉及以下步骤
- 部署 Elasticsearch 实例(Elastic Stack 的一部分)。 这一步需要时间,因此通常应该作为对多个数据流运行 Pipeline 测试的先决条件执行一次。
- 上传要测试的 Ingest pipeline。
- 使用 Simulate API 使用 Ingest pipeline 处理日志/指标。
- 将生成的结果与预期结果进行比较。
目前,Pipeline 测试有一些局限性。 主要包括
- 由于您只测试 Ingest pipeline,您可以准备包含假想字段的模拟文档,这些字段与 Beats 中收集的字段不同。 同样,您也可以跳过大多数示例字段,并使用包含最少字段的微型文档来满足 pipeline 验证。
- 有些集成可能主要使用 Beats 处理器而不是 Ingest pipeline 来转换数据。 在这种情况下,Ingest pipeline 相当简单。
包具有特定的文件夹结构(仅显示相关部分)。
<package root>/
data_stream/
<data stream>/
manifest.yml
manifest.yml
要定义 Pipeline 测试,我们必须在每个数据集级别定义配置
<package root>/
data_stream/
<data stream>/
_dev/
test/
pipeline/
(test case definitions, both raw files and input events, optional configuration)
manifest.yml
manifest.yml
有两种类型的测试用例定义 - 原始文件 和 输入事件。
原始文件简化了使用真实应用程序 .log
文件准备测试用例的过程。 示例日志(例如 test-access-sample.log
)文件可能如下所示(针对 Nginx)
127.0.0.1 - - [07/Dec/2016:11:04:37 +0100] "GET /test1 HTTP/1.1" 404 571 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36"
127.0.0.1 - - [07/Dec/2016:11:04:58 +0100] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:49.0) Gecko/20100101 Firefox/49.0"
127.0.0.1 - - [07/Dec/2016:11:04:59 +0100] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:49.0) Gecko/20100101 Firefox/49.0"
输入事件包含模拟的 JSON 事件,这些事件可以按原样传递给 Ingest pipeline。 在输入事件无法序列化为标准日志文件的情况下,例如 Redis 输入,此类事件可能会有所帮助。 包含输入事件的示例文件(例如 test-access-event.json
)如下所示
{
"events": [
{
"@timestamp": "2016-10-25T12:49:34.000Z",
"message": "127.0.0.1 - - [07/Dec/2016:11:04:37 +0100] \"GET /test1 HTTP/1.1\" 404 571 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36\"\n"
},
{
"@timestamp": "2016-10-25T12:49:34.000Z",
"message": "127.0.0.1 - - [07/Dec/2016:11:05:07 +0100] \"GET /taga HTTP/1.1\" 404 169 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:49.0) Gecko/20100101 Firefox/49.0\"\n"
}
]
}
在将日志事件发送到 Ingest pipeline 之前,会应用数据转换过程。 可以使用存储为带有后缀 -config.yml
(例如 test-access-sample.log-config.yml
)的 YAML 文件的可选配置来定制该过程。
multiline:
first_line_pattern: "^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}"
fields:
"@timestamp": "2020-04-28T11:07:58.223Z"
ecs:
version: "1.5.0"
event.category:
- "web"
dynamic_fields:
url.original: "^/.*$"
numeric_keyword_fields:
- network.iana_number
multiline
部分 仅限原始文件 配置日志文件读取器以使用 first_line_pattern
检测多行日志条目。 如果您可能将日志拆分为多行,请使用此属性,例如 Java 堆栈跟踪。
fields
部分允许自定义要添加到每个读取的日志条目的额外字段(例如 @timestamp
、ecs
)。 使用此属性可以通过无法从日志内容中提取的数据来扩展日志,但对于每个记录都具有相同的字段值(例如时区、主机名)是可以的。
dynamic_fields
部分允许将字段标记为动态字段(每次它们都具有不同的非静态值),以便应用模式匹配而不是严格的值检查。
numeric_keyword_fields
部分标识其值是数字但预计以 keyword
字段形式存储在 Elasticsearch 中的字段。
一旦 Simulate API 处理了输入数据,Pipeline 测试运行器将把它们与预期结果进行比较。 测试结果存储为带有后缀 -expected.json
的 JSON 文件。 示例测试结果文件如下所示。
{
"expected": [
{
"@timestamp": "2016-12-07T10:04:37.000Z",
"nginx": {
"access": {
"remote_ip_list": [
"127.0.0.1"
]
}
},
...
},
{
"@timestamp": "2016-12-07T10:05:07.000Z",
"nginx": {
"access": {
"remote_ip_list": [
"127.0.0.1"
]
}
},
...
}
]
}
可以从 Simulate API 的输出生成预期的测试结果。 为此,请使用 --generate
开关
elastic-package test pipeline --generate
一旦如上一节所述定义了配置,您就可以为包的数据流运行 Pipeline 测试了。
首先,您必须部署 Elasticsearch 实例。 这对应于 概念过程 部分中描述的步骤 1。
elastic-package stack up -d --services=elasticsearch
有关此命令的可用选项的完整列表,请运行 elastic-package stack up -h
或 elastic-package help stack up
。
接下来,您必须设置进一步 elastic-package
命令所需的环境变量。
$(elastic-package stack shellinit)
接下来,您必须调用 Pipeline 测试运行器。 这对应于 概念过程 部分中描述的步骤 2 到 4。
如果要为包中的所有数据流运行 Pipeline 测试,请导航到包的根文件夹(或其下的任何子文件夹)并运行以下命令。
elastic-package test pipeline
如果要为包中的特定数据流运行 Pipeline 测试,请导航到包的根文件夹(或其下的任何子文件夹)并运行以下命令。
elastic-package test pipeline --data-streams <data stream 1>[,<data stream 2>,...]
最后,在完成所有 Pipeline 测试后,关闭 Elastic Stack。 这对应于 概念过程 部分中描述的步骤 4。
elastic-package stack down