配置 Elasticsearch 输出
编辑配置 Elasticsearch 输出编辑
Elasticsearch 输出使用 Elasticsearch HTTP API 将事件直接发送到 Elasticsearch。
示例配置
当通过 elasticsearch
输出将数据发送到安全集群时,Packetbeat 可以使用以下任何一种身份验证方法
- 基本身份验证凭据(用户名和密码)。
- 基于令牌(API 密钥)的身份验证。
- 公钥基础设施 (PKI) 证书。
基本身份验证
output.elasticsearch: hosts: ["https://myEShost:9200"] username: "packetbeat_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 支持矩阵。
为了获得最佳体验,Packetbeat 仅连接到与 Beat 版本相同的实例。可以通过设置 output.elasticsearch.allow_older_versions
来禁用此检查。
配置选项编辑
您可以在 packetbeat.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
设置时,Packetbeat 连接到所有配置的主机,并通过所有连接并行发送数据。如果连接失败,数据将发送到剩余的主机,直到可以重新建立连接。只要 Packetbeat 可以连接到至少一个配置的主机,数据仍然会被发送。
当 loadbalance: false
设置时,Packetbeat 每次将数据发送到单个主机。目标主机是从配置的主机列表中随机选择的,所有数据都会发送到该目标主机,直到连接失败,此时会选择一个新的目标主机。只要 Packetbeat 可以连接到至少一个配置的主机,数据仍然会被发送。
默认值为 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 在 HTTP 反向代理后面监听并以自定义前缀导出 API 的情况很有用。
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
编辑
使用每日索引时要将事件写入的索引名称。默认值为 "packetbeat-%{[agent.version]}-%{+yyyy.MM.dd}"
,例如 "packetbeat-8.14.3-2024-07-18"
。如果您更改此设置,您还需要配置 setup.template.name
和 setup.template.pattern
选项(请参见 Elasticsearch 索引模板)。
如果您使用的是预构建的 Kibana 仪表板,您还需要设置 setup.dashboards.index
选项(请参见 Kibana 仪表板)。
当 索引生命周期管理 (ILM) 启用时,默认 index
为 "packetbeat-%{[agent.version]}-%{+yyyy.MM.dd}-%{index_num}"
,例如 "packetbeat-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
编辑
索引选择器规则数组。每个规则指定要用于匹配该规则的事件的索引。在发布期间,Packetbeat 使用数组中的第一个匹配规则。规则可以包含条件表达式、基于格式字符串的字段和名称映射。如果 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
一个管道选择器规则数组。每个规则指定要用于与规则匹配的事件的摄取管道。在发布期间,Packetbeat 使用数组中的第一个匹配规则。规则可以包含条件、基于格式字符串的字段和名称映射。如果缺少 pipelines
设置或没有规则匹配,则使用 pipeline
设置。
规则设置
-
pipeline
- 要使用的管道格式字符串。如果此字符串包含字段引用,例如
%{[fields.name]}
,则这些字段必须存在,否则规则将失败。 -
mappings
- 一个字典,它接受由
pipeline
返回的值并将其映射到一个新名称。 -
default
- 如果
mappings
未找到匹配项,则要使用的默认字符串值。 -
when
- 必须满足的条件,以便执行当前规则。处理器支持的所有 条件 在此处也受支持。
以下示例根据 message
字段是否包含指定的字符串将事件发送到特定管道
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] pipelines: - pipeline: "warning_pipeline" when.contains: message: "WARN" - pipeline: "error_pipeline" when.contains: message: "ERR"
以下示例通过获取由 pipeline
格式字符串返回的名称并将其映射到用作管道的名称来设置管道
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] pipelines: - pipeline: "%{[fields.log_type]}" mappings: critical: "sev1_pipeline" normal: "sev2_pipeline" default: "sev3_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。
事件可以收集到批次中。Packetbeat 将拆分从队列读取的超过 bulk_max_size
的批次,并将它们拆分为多个批次。
指定更大的批次大小可以通过降低发送事件的开销来提高性能。但是,大型批次大小也会增加处理时间,这可能导致 API 错误、断开连接、发布请求超时,最终导致吞吐量降低。
将 bulk_max_size
设置为小于或等于 0 的值将禁用批次拆分。当禁用拆分时,队列将决定批次中包含的事件数量。
backoff.init
edit
在网络错误后尝试重新连接到 Elasticsearch 之前等待的秒数。在等待 backoff.init
秒后,Packetbeat 会尝试重新连接。如果尝试失败,则回退计时器将以指数方式增加,直到达到 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
默认情况下,Packetbeat 预计 Elasticsearch 实例处于相同或更新的版本上以提供最佳体验。我们建议您连接到相同版本,以确保 Packetbeat 使用的所有功能都在您的 Elasticsearch 实例中可用。
例如,您可以在更新 Elastic Stack 期间禁用检查,以便数据收集可以继续。
ssl
edit
SSL 参数的配置选项,例如用于基于 HTTPS 的连接的证书颁发机构。如果缺少 ssl
部分,则主机 CA 用于与 Elasticsearch 的 HTTPS 连接。
有关详细信息,请参阅 与 Elasticsearch 的安全通信 指南或 SSL 配置参考。
non_indexable_policy
edit
指定 Elasticsearch 集群明确拒绝文档时的行为,例如映射冲突。
drop
edit
默认行为,当 Elasticsearch 明确拒绝事件时,事件将被丢弃。
output.elasticsearch: hosts: ["https://127.0.0.1:9200"] non_indexable_policy.drop: ~
dead_letter_index
edit
此功能处于测试阶段,可能会发生变化。设计和代码比官方 GA 功能不成熟,并且按现状提供,不提供任何保证。测试版功能不受官方 GA 功能的支持 SLA 的约束。
在显式拒绝时,此策略将在下一个批次中重试事件。但是,目标索引将更改为指定的索引。此外,事件的结构将更改为以下字段
- message
- 包含原始事件的转义 JSON。
- error.type
- 包含状态代码
- error.message
- 包含 Elasticsearch 返回的状态,描述原因
-
index
- 要将拒绝事件发送到的索引。
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 | latency |
---|---|---|---|---|
1600 |
1600 |
1600 |
50 |
|
1 |
4 |
1 |
1 |
|
3200 |
12800 |
3200 |
4100 |
|
1600 |
1600 |
1600 |
2050 |
|
|
|
|
|
|
1 |
1 |
1 |
1 |
|
|
|
|
|
Elasticsearch APIedit
Packetbeat 将使用 Elasticsearch 的 _bulk
API,事件将按照到达发布管道的顺序发送,单个 _bulk
请求可能包含来自不同输入/模块的事件。临时故障将被重试。
将检查每个事件的状态代码并进行处理,如下所示
-
< 300
:事件将计为events.acked
-
409
(冲突):事件将计为events.duplicates
-
429
(请求过多):事件将计为events.toomany
-
> 399 且 < 500
: 将应用non_indexable_policy
策略。