输入配置中的变量和条件
编辑输入配置中的变量和条件编辑
在某些环境中运行 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'}"
条件编辑
条件是一个布尔表达式,您可以在代理策略中指定它,以控制是否将配置应用于正在运行的 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 ---