正在加载

Pipeline 测试

Elastic 包由数据流组成。 Pipeline 测试会运行为包的数据流定义的 Elasticsearch Ingest Node pipeline。

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

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

目前,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 部分允许自定义要添加到每个读取的日志条目的额外字段(例如 @timestampecs)。 使用此属性可以通过无法从日志内容中提取的数据来扩展日志,但对于每个记录都具有相同的字段值(例如时区、主机名)是可以的。

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 -helastic-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
© . All rights reserved.