管道测试
编辑管道测试
编辑Elastic 包包含数据流。管道测试会测试为包的数据流定义的 Elasticsearch Ingest Node 管道。
概念流程
编辑从概念上讲,运行管道测试包含以下步骤:
- 部署 Elasticsearch 实例(Elastic Stack 的一部分)。此步骤需要时间,因此您通常应将其作为先决条件执行一次,以便在多个数据流上运行管道测试。
- 上传要测试的摄取管道。
- 使用 模拟 API 通过摄取管道处理日志/指标。
- 将生成的結果与预期结果进行比较。
限制
编辑目前,管道测试存在一些限制。主要限制包括:* 由于您只测试摄取管道,因此您可以使用虚构字段准备模拟文档,这些字段与 Beats 中收集的字段不同。此外,反过来,您可以跳过大多数示例字段,并使用包含最少字段集的微型文档来满足管道验证。* 可能存在主要使用 Beats 处理器而不是摄取管道转换数据的集成。在这种情况下,摄取管道相当简单。
定义管道测试
编辑包具有特定的文件夹结构(仅显示相关部分)。
<package root>/ data_stream/ <data stream>/ manifest.yml manifest.yml
要定义管道测试,我们必须在每个数据集级别定义配置。
<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
文件准备测试用例的过程。对于 Nginx,示例日志(例如 test-access-sample.log
)文件可能如下所示:
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 事件,这些事件可以直接传递到摄取管道。在输入事件无法序列化为标准日志文件(例如 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" } ] }
测试配置
编辑在将日志事件发送到摄取管道之前,会应用数据转换过程。可以使用存储为 YAML 文件(后缀为 -config.yml
,例如 test-access-sample.log-config.yml
)的可选配置来自定义此过程。
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
部分标识其值为数字但预期在 Elasticsearch 中存储为 keyword
字段的字段。
预期结果
编辑模拟 API 处理输入数据后,管道测试运行程序会将它们与预期结果进行比较。测试结果存储为后缀为 -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" ] } }, ... } ] }
可以根据模拟 API 的输出生成预期的测试结果。为此,请使用 --generate
开关。
elastic-package test pipeline --generate
运行管道测试
编辑一旦按照上一节中所述定义了配置,您就可以为包的数据流运行管道测试。
首先,您必须部署 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)
接下来,您必须调用管道测试运行程序。这对应于 概念流程 部分中描述的步骤 2 到 4。
如果您想为包中的所有数据流运行管道测试,请导航到包的根文件夹(或其下的任何子文件夹),然后运行以下命令。
elastic-package test pipeline
如果您想为包中的特定数据流运行管道测试,请导航到包的根文件夹(或其下的任何子文件夹),然后运行以下命令。
elastic-package test pipeline --data-streams <data stream 1>[,<data stream 2>,...]
最后,完成所有管道测试后,请关闭 Elastic Stack。这对应于 概念流程 部分中描述的步骤 4。
elastic-package stack down