管道测试编辑

Elastic 包包含数据流。管道测试会对为包的数据流定义的 Elasticsearch Ingest 节点管道进行测试。

概念过程编辑

从概念上讲,运行管道测试涉及以下步骤

  1. 部署 Elasticsearch 实例(Elastic Stack 的一部分)。此步骤需要时间,因此您通常应该将其作为先决条件在多个数据流上运行管道测试时执行一次。
  2. 上传要测试的 Ingest 管道。
  3. 使用 模拟 API 通过 Ingest 管道处理日志/指标。
  4. 将生成的結果与预期的結果进行比较。

限制编辑

目前,管道测试存在一些限制。主要限制包括:* 由于您只测试 Ingest 管道,因此您可以使用虚构字段准备模拟文档,这些字段与 Beats 中收集的字段不同。此外,反过来,您可以跳过大多数示例字段,并使用包含最小字段集的微型文档来满足管道验证。* 可能存在主要使用 Beats 处理器而不是 Ingest 管道转换数据的集成。在这种情况下,Ingest 管道相当简单。

定义管道测试编辑

包具有特定的文件夹结构(仅显示相关部分)。

<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 事件,这些事件已准备好按原样传递给 Ingest 管道。在无法将输入事件序列化为标准日志文件的情况下(例如 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 管道之前,会应用数据转换过程。可以使用一个可选的配置来自定义此过程,该配置存储为一个具有后缀 -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 部分允许自定义要添加到每个读取的日志条目中的额外字段(例如 @timestampecs)。使用此属性扩展您的日志,使其包含无法从日志内容中提取的数据,但对于每个记录而言,拥有相同的字段值是可以的(例如时区、主机名)。

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 -helastic-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