配置 Elasticsearch 输出
编辑配置 Elasticsearch 输出编辑
Elasticsearch 输出使用 Elasticsearch HTTP API 将事件直接发送到 Elasticsearch。
示例配置
当通过 elasticsearch
输出将数据发送到安全集群时,Metricbeat 可以使用以下任何一种身份验证方法
- 基本身份验证凭据(用户名和密码)。
- 基于令牌(API 密钥)的身份验证。
- 公钥基础设施 (PKI) 证书。
基本身份验证
output.elasticsearch: hosts: ["https://myEShost:9200"] username: "metricbeat_writer" password: "YOUR_PASSWORD"
API 密钥身份验证
output.elasticsearch: hosts: ["https://myEShost:9200"] api_key: "ZCV7VnwBgnX0T19fN8Qe:KnR6yE41RrSowb0kQ0HWoA"
PKI 证书身份验证
output.elasticsearch: hosts: ["https://myEShost:9200"] ssl.certificate: "/etc/pki/client/cert.pem" ssl.key: "/etc/pki/client/cert.key"
有关每种身份验证方法的详细信息,请参阅 与 Elasticsearch 的安全通信。
兼容性编辑
此输出适用于所有兼容版本的 Elasticsearch。请参阅 Elastic 支持矩阵。
为了获得最佳体验,Metricbeat 只连接到与 Beat 版本相同的实例。可以通过设置 output.elasticsearch.allow_older_versions
禁用此检查。
配置选项编辑
您可以在 metricbeat.yml
配置文件中的 elasticsearch
部分指定以下选项
hosts
编辑
要连接的 Elasticsearch 节点列表。事件将以循环方式分发到这些节点。如果一个节点变得不可访问,则事件将自动发送到另一个节点。每个 Elasticsearch 节点可以定义为 URL
或 IP:PORT
。例如:http://192.15.3.2
、https://es.found.io:9230
或 192.24.3.2:9300
。如果未指定端口,则使用 9200
。
output.elasticsearch: hosts: ["10.45.3.2:9220", "10.45.3.1:9230"] protocol: https path: /elasticsearch
在前面的示例中,Elasticsearch 节点位于 https://10.45.3.2:9220/elasticsearch
和 https://10.45.3.1:9230/elasticsearch
。
compression_level
编辑
gzip 压缩级别。将此值设置为 0
将禁用压缩。压缩级别必须在 1
(最佳速度)到 9
(最佳压缩)范围内。
提高压缩级别将减少网络使用,但会增加 CPU 使用量。
默认值为 1
。
worker
或 workers
编辑
每个配置的将事件发布到 Elasticsearch 的主机的工作程序数量。这最适合与负载均衡模式一起使用。例如:如果您有 2 个主机和 3 个工作程序,则总共启动 6 个工作程序(每个主机 3 个)。
默认值为 1
。
loadbalance
编辑
当设置 loadbalance: true
时,Metricbeat 会连接到所有配置的主机,并通过所有连接并行发送数据。如果连接失败,数据将发送到其余主机,直到重新建立连接。只要 Metricbeat 可以连接到其配置的主机中的至少一个,数据仍将被发送。
当设置 loadbalance: false
时,Metricbeat 会一次将数据发送到一个主机。目标主机是随机从配置的主机列表中选择的,所有数据都发送到该目标主机,直到连接失败,此时会选择新的目标主机。只要 Metricbeat 可以连接到其配置的主机中的至少一个,数据仍将被发送。
默认值为 true
。
output.elasticsearch: hosts: ["localhost:9200", "localhost:9201"] loadbalance: true
api_key
编辑
您可以使用 API 密钥来保护与 Elasticsearch 的通信,而不是使用用户名和密码。该值必须是 API 密钥的 ID 和 API 密钥,以冒号分隔:id:api_key
。
有关更多信息,请参阅 使用 API 密钥授予访问权限。
password
编辑
连接到 Elasticsearch 的基本身份验证密码。
parameters
编辑
要与索引操作一起在 url 中传递的 HTTP 参数字典。
protocol
编辑
Elasticsearch 可访问的协议名称。选项包括:http
或 https
。默认值为 http
。但是,如果您为 hosts
指定 URL,则 protocol
的值将被您在 URL 中指定的任何方案覆盖。
path
编辑
附加到 HTTP API 调用的 HTTP 路径前缀。这对于 Elasticsearch 监听在将 API 导出到自定义前缀下的 HTTP 反向代理后面的情况很有用。
headers
编辑
要添加到 Elasticsearch 输出创建的每个请求的自定义 HTTP 标头。示例
output.elasticsearch.headers: X-My-Header: Header contents
可以通过逗号分隔多个标头值,以指定同一个标头名称的多个标头值。
proxy_disable
编辑
如果设置为 true
,则忽略所有代理设置,包括 HTTP_PROXY
和 HTTPS_PROXY
变量。
proxy_url
编辑
连接到 Elasticsearch 服务器时要使用的代理的 URL。该值必须是一个完整的 URL。如果没有通过配置文件指定值,则使用代理环境变量。有关环境变量的更多信息,请参阅 Go 文档。
proxy_headers
编辑
要在 CONNECT 请求期间发送到代理的附加标头。
index
编辑
当您使用每日索引时,要将事件写入的索引名称。默认值为 "metricbeat-%{[agent.version]}-%{+yyyy.MM.dd}"
,例如 "metricbeat-8.14.3-2024-07-18"
。如果您更改此设置,您还需要配置 setup.template.name
和 setup.template.pattern
选项(请参阅 Elasticsearch 索引模板)。
如果您使用的是预构建的 Kibana 仪表板,您还需要设置 setup.dashboards.index
选项(请参阅 Kibana 仪表板)。
当启用 索引生命周期管理 (ILM) 时,默认的 index
为 "metricbeat-%{[agent.version]}-%{+yyyy.MM.dd}-%{index_num}"
,例如 "metricbeat-8.14.3-2024-07-18-000001"
。启用 ILM 时,自定义 index
设置将被忽略。如果您将事件发送到支持索引生命周期管理的集群,请参阅 索引生命周期管理 (ILM),了解如何更改索引名称。
您可以通过使用格式字符串来访问任何事件字段来动态设置索引。例如,以下配置使用自定义字段 fields.log_type
来设置索引
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] index: "%{[fields.log_type]}-%{[agent.version]}-%{+yyyy.MM.dd}"
使用此配置,所有带有 log_type: normal
的事件都会发送到名为 normal-8.14.3-2024-07-18
的索引,所有带有 log_type: critical
的事件都会发送到名为 critical-8.14.3-2024-07-18
的索引。
要了解如何将自定义字段添加到事件,请参阅 fields
选项。
有关使用其他方法动态设置索引的说明,请参阅 indices
设置。
indices
编辑
索引选择器规则数组。每条规则指定要用于与规则匹配的事件的索引。在发布期间,Metricbeat 会使用数组中第一个匹配的规则。规则可以包含条件语句、基于格式字符串的字段和名称映射。如果 indices
设置缺失或没有规则匹配,则使用 index
设置。
与 index
相似,定义自定义的 indices
会禁用 索引生命周期管理 (ILM)。
规则设置
-
index
- 要使用的索引格式字符串。如果此字符串包含字段引用,例如
%{[fields.name]}
,则必须存在这些字段,否则规则将失败。 -
mappings
- 一个字典,它接受
index
返回的值并将其映射到一个新名称。 -
default
- 如果
mappings
未找到匹配项,则要使用的默认字符串值。 -
when
- 一个必须成功的条件,以便执行当前规则。这里也支持处理器支持的所有 条件。
以下示例根据 message
字段是否包含指定字符串来设置索引
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] indices: - index: "warning-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: message: "WARN" - index: "error-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: message: "ERR"
此配置将导致名为 warning-8.14.3-2024-07-18
和 error-8.14.3-2024-07-18
的索引(以及如果未找到匹配项,则使用默认索引)。
以下示例通过获取 index
格式字符串返回的名称并将其映射到用于索引的新名称来设置索引
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] indices: - index: "%{[fields.log_type]}" mappings: critical: "sev1" normal: "sev2" default: "sev3"
此配置将导致名为 sev1
、sev2
和 sev3
的索引。
mappings
设置简化了配置,但仅限于字符串值。您不能在映射对中指定格式字符串。
pipeline
edit
指定将事件写入的摄取管道格式字符串值。
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] pipeline: my_pipeline_id
有关更多信息,请参阅 使用摄取管道解析数据。
您可以通过使用格式字符串访问任何事件字段来动态设置摄取管道。例如,此配置使用自定义字段 fields.log_type
为每个事件设置管道
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] pipeline: "%{[fields.log_type]}_pipeline"
使用此配置,所有具有 log_type: normal
的事件将发送到名为 normal_pipeline
的管道,所有具有 log_type: critical
的事件将发送到名为 critical_pipeline
的管道。
要了解如何将自定义字段添加到事件,请参阅 fields
选项。
有关动态设置摄取管道的其他方法,请参阅 pipelines
设置。
pipelines
edit
管道选择器规则数组。每个规则指定要用于匹配该规则的事件的摄取管道。在发布期间,Metricbeat 将使用数组中第一个匹配的规则。规则可以包含条件、基于格式字符串的字段和名称映射。如果缺少 pipelines
设置或没有规则匹配,则使用 pipeline
设置。
规则设置
-
pipeline
- 要使用的管道格式字符串。如果此字符串包含字段引用,例如
%{[fields.name]}
,则必须存在这些字段,否则规则将失败。 -
mappings
- mappings
-
default
- 如果
mappings
未找到匹配项,则要使用的默认字符串值。 -
when
- 一个必须成功的条件,以便执行当前规则。这里也支持处理器支持的所有 条件。
一个字典,它接受 pipeline
返回的值并将其映射到一个新名称。
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] pipelines: - pipeline: "warning_pipeline" when.contains: message: "WARN" - pipeline: "error_pipeline" when.contains: message: "ERR"
以下示例根据 message
字段是否包含指定字符串将事件发送到特定管道
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] pipelines: - pipeline: "%{[fields.log_type]}" mappings: critical: "sev1_pipeline" normal: "sev2_pipeline" default: "sev3_pipeline"
以下示例通过获取 pipeline
格式字符串返回的名称并将其映射到用于管道的新的名称来设置管道
使用此配置,所有具有 log_type: critical
的事件将发送到 sev1_pipeline
,所有具有 log_type: normal
的事件将发送到 sev2_pipeline
,所有其他事件将发送到 sev3_pipeline
。
有关摄取管道的更多信息,请参阅 使用摄取管道解析数据。
max_retries
edit
在发布失败后尝试重新发布事件的次数。在指定的重试次数后,事件通常会被丢弃。
将 max_retries
设置为小于 0 的值,以便在所有事件发布之前一直重试。
默认值为 3。
bulk_max_size
edit
在单个 Elasticsearch 批量 API 索引请求中批量加载事件的最大数量。默认值为 1600。
事件可以收集到批次中。Metricbeat 将拆分从队列中读取的超过 bulk_max_size
的批次,并将它们分成多个批次。
指定更大的批次大小可以通过降低发送事件的开销来提高性能。但是,较大的批次大小也会增加处理时间,这可能导致 API 错误、终止连接、超时发布请求,并最终降低吞吐量。
将 bulk_max_size
设置为小于或等于 0 的值将禁用批次拆分。当禁用拆分时,队列将决定包含在批次中的事件数量。
backoff.init
edit
在网络错误后尝试重新连接到 Elasticsearch 之前等待的秒数。在等待 backoff.init
秒后,Metricbeat 将尝试重新连接。如果尝试失败,则回退计时器将呈指数级增加,直到达到 backoff.max
。在成功连接后,回退计时器将重置。默认值为 1s
。
backoff.max
edit
在网络错误后尝试连接到 Elasticsearch 之前等待的最大秒数。默认值为 60s
。
idle_connection_timeout
edit
空闲连接在关闭自身之前保持空闲的最大时间。零表示无限制。格式为 Go 语言持续时间(例如 60s 表示 60 秒)。默认值为 3s。
timeout
edit
Elasticsearch 请求的 HTTP 请求超时(以秒为单位)。默认值为 90。
allow_older_versions
edit
默认情况下,Metricbeat 要求 Elasticsearch 实例与它本身处于相同版本或更高版本,以提供最佳体验。我们建议您连接到相同版本,以确保 Metricbeat 使用的所有功能都在您的 Elasticsearch 实例中可用。
例如,您可以在更新 Elastic Stack 期间禁用检查,以便数据收集可以继续进行。
ssl
edit
用于 SSL 参数的配置选项,例如用于基于 HTTPS 的连接的证书颁发机构。如果缺少 ssl
部分,则主机 CA 用于与 Elasticsearch 的 HTTPS 连接。
有关更多信息,请参阅 Kerberos。
non_indexable_policy
edit
指定当 Elasticsearch 集群显式拒绝文档时的行为,例如在映射冲突时。
drop
edit
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] non_indexable_policy.drop: ~
默认行为,当事件被 Elasticsearch 显式拒绝时,它将被丢弃。
dead_letter_index
edit
此功能处于测试阶段,可能会发生变化。设计和代码不如官方 GA 功能成熟,按“原样”提供,不提供任何担保。测试版功能不受官方 GA 功能的支持 SLA 的约束。
- 在显式拒绝的情况下,此策略将在下一个批次中重试事件。但是,目标索引将更改为指定的索引。此外,事件的结构将更改为以下字段
- message
- 包含原始事件的转义 JSON。
- error.type
- 包含状态代码
- error.message
-
index
- 包含 Elasticsearch 返回的状态,描述原因
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] non_indexable_policy.dead_letter_index: index: "my-dead-letter-index"
要将被拒绝的事件发送到的索引。
preset
edit
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] preset: balanced
要应用于输出配置的性能预设。
性能预设根据所需的性能目标应用一组配置覆盖。如果设置,性能预设将覆盖其他配置标志,以匹配该预设的推荐设置。有效选项是:* balanced
:通用的良好起点 * throughput
:适用于高数据量,可能会增加 CPU 和内存需求 * scale
:在大型低吞吐量部署中减少环境资源使用 * latency
:最大限度地减少新数据在 Elasticsearch 中可见的时间 * custom
:直接应用用户配置,不进行覆盖
如果未指定,默认值为 custom
。
预设代表根据预期目标的当前建议;它们的效果可能会在不同版本之间发生变化,以更好地适应这些目标。目前,预设具有以下效果 | preset | balanced | throughput | scale |
---|---|---|---|---|
1600 |
1600 |
1600 |
50 |
|
1 |
4 |
1 |
1 |
|
3200 |
12800 |
3200 |
4100 |
|
1600 |
1600 |
1600 |
2050 |
|
|
|
|
|
|
1 |
1 |
1 |
1 |
|
|
|
|
|
60s
Elasticsearch APIedit
Metricbeat 将使用 Elasticsearch 的 _bulk
API,事件将按照它们到达发布管道的顺序发送,单个 _bulk
请求可能包含来自不同输入/模块的事件。临时故障将被重试。
- 将检查每个事件的状态代码并按以下方式处理
-
< 300
:事件被计为events.acked
-
429
(请求过多): 此事件被计为events.toomany
-
> 399 and < 500
: 应用了non_indexable_policy
策略。