输入配置中的变量和条件
编辑输入配置中的变量和条件
编辑在某些环境中运行 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 支持各种提供程序,例如 host
和 local
,这些提供程序向 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 数学运算:
+ - * / %
。 - 关系运算符
< <= >= > == !=
- 逻辑运算符
and
和or
函数
类型
- 布尔值
true
和false
条件示例
编辑仅当包含特定标签时运行。
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 的正则表达式语法。使用正则表达式的条件运行成本更高。如果速度至关重要,请考虑使用 endWiths
或 startsWith
。
用法
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 ---