输入配置中的变量和条件编辑

在某些环境中运行 Elastic Agent 时,您可能无法事先知道所有输入配置详细信息。为了解决这个问题,输入配置接受在运行时使用来自运行环境的信息进行评估的变量和条件。类似于自动发现,这些功能允许您动态地应用配置。

让我们考虑一个部署在两台机器上的唯一代理策略:一台名为“linux-app”的 Linux 机器和一台名为“winapp”的 Windows 机器。请注意,配置中有一些变量引用:${host.name}${host.platform}

inputs:
 - id: unique-logfile-id
   type: logfile
   streams:
    - paths: /var/log/${host.name}/another.log
      condition: ${host.platform} == "linux"
    - path: c:/service/app.log
      condition: ${host.platform} == "windows"

在运行时,Elastic Agent 会根据环境提供的值解析变量并评估条件,生成两种可能的输入配置。

在 Windows 机器上

inputs:
 - id: unique-logfile-id
   type: logfile
   streams:
    - path: c:/service/app.log

在 Linux 机器上

inputs:
 - id: unique-logfile-id
   type: logfile
   streams:
    - paths: /var/log/linux-app/another.log

使用变量替换以及条件,您可以创建简洁但灵活的输入配置,这些配置可以适应其部署环境。

变量替换编辑

变量替换的语法为 ${var},其中 var 是由提供者定义的变量的名称。提供者定义用于变量替换和条件的键值对。

Elastic Agent 支持各种提供者,例如 hostlocal,它们为 Elastic Agent 提供变量。例如,您之前看到 ${host.name} 用于根据 {host.platform} 值解析主机日志文件路径。这两个值都是由 host 提供者提供的。

Elastic Agent 启动时默认启用所有提供者。如果无法配置提供者,则会忽略其变量。

有关更多详细信息,请参阅 提供者

以下代理策略使用名为 foo 的自定义键来解析由本地提供者定义的值

inputs:
 - id: unique-logfile-id
   type: logfile
   streams:
    - paths: /var/log/${foo}/another.log

providers:
  local:
    vars:
      foo: bar

此配置生成的策略如下所示

inputs:
 - id: unique-logfile-id
   type: logfile
   streams:
    - paths: /var/log/bar/another.log

当输入使用当前正在评估的键值映射中不存在的变量替换时,该输入将在结果中被删除。

例如,此代理策略使用未知键

inputs:
  - id: logfile-foo
    type: logfile
    path: "/var/log/foo"
  - id: logfile-unknown
    type: logfile
    path: "${ unknown.key }"

此配置生成的策略如下所示

inputs:
  - id: logfile-foo
    type: logfile
    path: "/var/log/foo"

备用变量和常量编辑

变量替换还可以定义备用变量或常量。

要定义常量,请使用 '"。当在变量评估期间遇到常量时,将忽略任何剩余的变量,因此常量应为替换中的最后一个条目。

要定义备用项,请使用 | 后跟下一个变量或常量。其强大之处在于允许输入通过将多个变量链接在一起,来定义替换的优先级顺序。

例如,以下代理策略将多个变量链接在一起,以根据运行容器环境提供的的信息设置日志路径。常量 /var/log/other 用于路径的末尾,这两种提供者都使用它

inputs:
  - id: logfile-foo
    type: logfile
    path: "/var/log/foo"
  - id: logfile-container
    type: logfile
    path: "${docker.paths.log|kubernetes.container.paths.log|'/var/log/other'}"

条件编辑

条件是一个布尔表达式,您可以在代理策略中指定它,以控制是否将配置应用于正在运行的 Elastic Agent。您可以在输入、流甚至处理器上设置条件。

在此示例中,如果主机平台为 Linux,则应用输入

inputs:
  - id: unique-logfile-id
    type: logfile
    streams:
      - paths:
         - /var/log/syslog
    condition: ${host.platform} == 'linux'

在此示例中,如果主机平台不为 Windows,则应用流

inputs:
  - id: unique-system-metrics-id
    type: system/metrics
    streams:
      - metricset: load
        data_stream.dataset: system.cpu
        condition: ${host.platform} != 'windows'

在此示例中,如果主机平台不为 Windows,则应用处理器

inputs:
  - id: unique-system-metrics-id
    type: system/metrics
    streams:
      - metricset: load
        data_stream.dataset: system.cpu
    processors:
      - add_fields:
          fields:
            platform: ${host.platform}
          to: host
        condition: ${host.platform} != 'windows'
条件语法编辑

Elastic Agent 支持的条件基于 EQL 的布尔语法,但增加了对来自提供者的变量和用于操作值的函数的支持。

支持的操作符

  • + - * / % 的完整 PEMDAS 数学支持。
  • 关系运算符 < <= >= > == !=
  • 逻辑运算符 andor

函数

类型

  • 布尔值 truefalse
条件示例编辑

仅在包含特定标签时运行。

arrayContains(${docker.labels}, 'monitor')

在 Linux 平台或 macOS 上跳过。

${host.platform} != "linux" and ${host.platform} != "darwin"

仅针对特定标签运行。

arrayContains(${docker.labels}, 'monitor') or arrayContains(${docker.label}, 'production')
函数参考编辑

条件语法支持以下函数。

add编辑

add(Number, Number) Number

用法

add(1, 2) == 3
add(5, ${foo}) >= 5
arrayContains编辑

arrayContains(Array, String) Boolean

用法

arrayContains(${docker.labels}, 'monitor')
concat编辑

concat(String, String) String

参数在连接之前被强制转换为字符串。

用法

concat("foo", "bar") == "foobar"
concat(${var1}, ${var2}) != "foobar"
divide编辑

divide(Number, Number) Number

用法

divide(25, 5) > 0
divide(${var1}, ${var2}) > 7
endsWith编辑

endsWith(String, String) Boolean

用法

endsWith("hello world", "hello") == true
endsWith(${var1}, "hello") != true
hasKey编辑

hasKey(Dictionary, String) Boolean

用法

hasKey(${host}, "platform")
indexOf编辑

indexOf(String, String, Number?) Number

如果未找到字符串,则返回 -1。

用法

indexOf("hello", "llo") == 2
indexOf(${var1}, "hello") >= 0
length编辑

length(Array|Dictionary|string)

用法

length("foobar") > 2
length(${docker.labels}) > 0
length(${host}) > 2
match编辑

match(String, Regexp) boolean

Regexp 支持 Go 的正则表达式语法。使用正则表达式的条件运行起来更昂贵。如果速度至关重要,请考虑使用 endWithsstartsWith

用法

match("hello world", "^hello") == true
match(${var1}, "world$") == true
modulo编辑

modulo(number, number) Number

用法

modulo(25, 5) > 0
modulo(${var1}, ${var2}) == 0
multiply编辑

multiply(Number, Number) Number

用法

multiply(5, 5) == 25
multiple(${var1}, ${var2}) > x
number编辑

number(String) Integer

用法

number("42") == 42
number(${var1}) == 42
startsWith编辑

startsWith(String, String) Boolean

用法

startsWith("hello world", "hello") == true
startsWith(${var1}, "hello") != true
string编辑

string(Number) String

用法

string(42) == "42"
string(${var1}) == "42"
stringContains编辑

stringContains(String, String) Boolean

用法

stringContains("hello world", "hello") == true
stringContains(${var1}, "hello") != true
subtract编辑

subtract(Number, Number) Number

用法

subtract(5, 1) == 4
subtract(${foo}, 2) != 2
调试编辑

要调试包含变量替换和条件的配置,请使用 inspect 命令。此命令显示在替换变量并应用条件后生成的配置。

首先运行 Elastic Agent。对于此示例,我们将使用以下代理策略

outputs:
  default:
    type: elasticsearch
    hosts: [127.0.0.1:9200]
    apikey: <my-api-key>

providers:
  local_dynamic:
    items:
      - vars:
          key: value1
        processors:
          - add_fields:
              fields:
                custom: match1
              target: dynamic
      - vars:
          key: value2
        processors:
          - add_fields:
              fields:
                custom: match2
              target: dynamic
      - vars:
          key: value3
        processors:
          - add_fields:
              fields:
                custom: match3
              target: dynamic

inputs:
  - id: unique-logfile-id
    type: logfile
    enabled: true
    streams:
      - paths:
          - /var/log/${local_dynamic.key}

然后运行 elastic-agent inspect --variables 以查看生成的配置。例如

$ ./elastic-agent inspect --variables
inputs:
- enabled: true
  id: unique-logfile-id-local_dynamic-0
  original_id: unique-logfile-id
  processors:
  - add_fields:
      fields:
        custom: match1
      target: dynamic
  streams:
  - paths:
    - /var/log/value1
  type: logfile
- enabled: true
  id: unique-logfile-id-local_dynamic-1
  original_id: unique-logfile-id
  processors:
  - add_fields:
      fields:
        custom: match2
      target: dynamic
  streams:
  - paths:
    - /var/log/value2
  type: logfile
- enabled: true
  id: unique-logfile-id-local_dynamic-2
  original_id: unique-logfile-id
  processors:
  - add_fields:
      fields:
        custom: match3
      target: dynamic
  streams:
  - paths:
    - /var/log/value3
  type: logfile
outputs:
  default:
    apikey: <my-api-key>
    hosts:
    - 127.0.0.1:9200
    type: elasticsearch
providers:
  local_dynamic:
    items:
    - processors:
      - add_fields:
          fields:
            custom: match1
          target: dynamic
      vars:
        key: value1
    - processors:
      - add_fields:
          fields:
            custom: match2
          target: dynamic
      vars:
        key: value2
    - processors:
      - add_fields:
          fields:
            custom: match3
          target: dynamic
      vars:
        key: value3

---