输入配置中的变量和条件

编辑

在某些环境中运行 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'}"

转义变量

编辑

在某些情况下,${var} 语法会导致在使用实际想要的变量是 ${var} 的值时出现问题。在这种情况下,可以为变量提供双 $$

$$ 会导致变量被忽略,并且额外的 $ 会从开头删除。

例如,以下代理策略使用转义的变量,因此使用实际值。

inputs:
  - id: logfile-foo
    type: logfile
    path: "/var/log/foo"
    processors:
      - add_tags:
          tags: [$${development}]
          target: "environment"

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

inputs:
  - id: logfile-foo
    type: logfile
    path: "/var/log/foo"
    processors:
      - add_tags:
          tags: [${development}]
          target: "environment"

条件

编辑

条件是您可以在代理策略中指定的布尔表达式,用于控制是否将配置应用于正在运行的 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(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

---