Vector splunk_hec Source 完全指南:Splunk HEC 协议接入与配置详解
【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector
导读
splunk_hec是 Vector 中用于接收 Splunk HTTP Event Collector(HEC)数据的日志源(source)。它在一个可配置地址上暴露三个 HTTP 端点,完整实现 Splunk HEC API 的/services/collector/event、/services/collector/raw与/services/collector/health,让现有 Splunk 客户端无需改造即可把数据接入 Vector 管道。读完本文你将掌握:splunk_hec source 的三个端点分别承担什么职责、全部配置项的含义与默认值、基于索引器确认(indexer acknowledgements)的端到端交付确认机制,以及该组件的源码级工作原理与事件字段映射。
本文依据 splunk_hec 组件文档(该页面由模板与 CUE 数据生成,Markdown 源文件见 splunk_hec.md)与 源码实现 撰写。
组件总览:一个地址,三个端点
按照组件元数据定义,splunk_hec source 默认监听0.0.0.0:8088(见 源码中的default_socket_address),通过 HTTP 协议对外提供服务。它在同一监听地址上暴露三条路由:
| 端点 | 方法 | 作用 |
|---|---|---|
/services/collector/event | POST | 接收 JSON 格式的 HEC 事件包(HEC envelope),一个请求可包含多个事件 |
/services/collector/raw | POST | 接收原始(raw)文本数据,默认将整个请求体作为一个事件 |
/services/collector/health | GET | 健康检查端点,返回{"text":"HEC is healthy","code":17} |
此外,从源码看还包含/services/collector/ack(POST)用于索引器确认查询,以及 OPTIONS 预检路由用于 CORS 场景下的Allow头协商(见 event_service / raw_service / health_service / ack_service 的构建代码)。
组件类属性(classes)定义了其在 Vector 中的定位:
- delivery:
at_least_once(至少一次交付语义) - deployment_roles:
aggregator(典型部署角色为聚合器) - development:
stable(稳定级组件) - egress_method:
batch(以批量方式向下游发送) - stateful:
false(无状态)
特性(features)方面:该组件支持自动生成配置、支持 acknowledgements(确认机制);TLS 支持开启但默认关闭(enabled_default: false),且可配置证书校验;多行(multiline)处理不支持。
快速上手:最小与进阶配置
组件文档与配置生成器提供了两档配置示例(生成于 website/generated/example-configs/sources/splunk_hec/)。
最小配置(minimal.yaml):
sources: my_source_id: type: splunk_hec最小配置下,source 使用默认监听地址0.0.0.0:8088,且不校验请求中的Authorization头(即任何请求都可写入)。
进阶配置(advanced.yaml):
sources: my_source_id: type: splunk_hec address: 0.0.0.0:8088 store_hec_token: false valid_tokens: - A94A8FE5CCB19BA61C4C08进阶配置显式指定监听地址,并通过valid_tokens启用 HEC token 认证。一个完整的接入示例通常形如:
sources: splunk_hec_in: type: splunk_hec address: 0.0.0.0:8088 valid_tokens: - A94A8FE5CCB19BA61C4C08 tls: enabled: true crt_file: /etc/vector/tls/server.crt key_file: /etc/vector/tls/server.key acknowledgements: enabled: true sinks: my_sink: type: console inputs: [splunk_hec_in] encoding: codec: json配置项逐项详解(含源码依据)
splunk_hec source 的全部配置选项定义于 SplunkConfig 结构体,下面逐项说明其含义、默认值与底层影响。
address(监听地址)
- 类型:
SocketAddr,必须包含端口。 - 默认值:
0.0.0.0:8088。 - 源码依据:字段标注 "The addressmustinclude a port",默认值由
default_socket_address()生成。该地址同时用于向拓扑系统声明占用的 TCP 资源(Resource::tcp(self.address))。
valid_tokens(有效认证令牌列表)
- 类型:
Vec<SensitiveString>(敏感字符串数组)。 - 默认值:
None,即不校验任何 token。 - 行为:配置后,客户端必须在
Authorization头携带Splunk <token>,与直接访问 Splunk HEC 端点的方式一致。认证逻辑见 authorization():当令牌列表为空时忽略Authorization头(不认证);列表非空时,缺失头返回MissingAuthorization,不匹配返回InvalidAuthorization。
token(单一令牌,已弃用)
- 类型:
Option<SensitiveString>。 - 说明:该字段已被标记为 deprecated,文档与代码均建议改用
valid_tokens。在SplunkSource::new中,token会被并入valid_tokens一并校验(见 构建 valid_credentials 的代码)。
store_hec_token(是否透传 HEC 令牌)
- 类型:
bool。 - 默认值:
false。 - 行为:设为
true时,若请求携带了 HEC token,该 token 会保存在事件元数据中,并在事件后续被发送到 Splunk HEC sink 时优先使用(sink 侧会读取set_splunk_hec_token写入的元数据)。源码中 token 仅在store_hec_token为真时才写入事件(见 raw_service 中的 token 透传)。
tls(TLS 配置)
- 类型:
Option<TlsEnableableConfig>。 - 默认值:
None(关闭)。 - 行为:开启后通过
MaybeTlsSettings::from_config构建 TLS 监听器。源码还支持通过build_with_tls_reloader注入TlsAcceptorReloader,在证书轮换时无需重启即可热更新 TLS 接受器(见 tls_config / build_with_tls_reloader)。
acknowledgements(索引器确认)
- 类型:
HecAcknowledgementsConfig,使用bool_or_struct反序列化——既可直接写true/false,也可写为结构体细粒度配置。 - 默认值:组件默认开启确认支持(
can_acknowledge()返回true,源码)。 - 行为:开启后启用 Splunk HEC indexer acknowledgements 协议,详见下文专节。
log_namespace(日志命名空间)
- 类型:
Option<bool>,默认None,即跟随全局设置。 - 说明:决定事件按 legacy 命名空间还是 Vector 命名空间组织,影响输出字段的元数据路径(
metadata_pathvsevent_path)。该字段在文档中标记为docs::hidden。
keepalive(连接保活)
- 类型:
KeepaliveConfig,包含 TCP keepalive 参数与max_connection_age_secs(连接最大存活时长)等。 - 行为:作用于监听器与每连接层,
max_connection_age_secs配合抖动因子实现连接老化回收(见 build_with_tls_reloader 中的 MaxConnectionAgeLayer)。
event与raw(编解码配置,进阶特性)
- 类型:
CodecConfig(含framing与decoding两个子项)。 - 默认值:均未启用。
- 行为:
event:作用于/services/collector/event。设置decoding后,Vector 在解析完 HEC envelope 后对event字段再做一次解码,单个 envelope 可扇出(fan out)为多个事件;解码失败会被吞掉,不会向 Splunk 客户端返回错误。raw:作用于/services/collector/raw。设置decoding后,整个(解压后的)请求体直接交给编解码器,而非作为一个整体事件发出。- 编解码器可访问 HEC envelope 元数据(host、sourcetype、channel 等),路径为
%splunk_hec.*;认证令牌可通过get_secret!("splunk_hec_token")读取。 - 未设置时各端点保持各自的默认行为(event 端点逐 envelope 解析 JSON;raw 端点每个请求体生成一个事件)。
输出事件字段
组件文档(output.logs.event.fields)与源码共同定义了事件的输出字段。对于 legacy 命名空间,典型输出字段包括:
| 字段 | 类型 | 说明 |
|---|---|---|
message | string | 事件消息内容,对应 Splunk envelope 中的_raw/event字段(源码引用fields._raw_line) |
splunk_channel | string | Splunk channel 标识,取自X-Splunk-Request-Channel请求头或channel查询参数(头优先于查询参数,见 event_service 中 channel 解析) |
splunk_sourcetype | string | 源类型名称(HEC envelope 中的sourcetype字段) |
timestamp | timestamp | 事件时间戳,默认取接收时刻(可用 envelope 中的time字段覆盖) |
除文档列出的字段外,源码还定义了四个与 Splunk 强相关的常量字段(CHANNEL / INDEX / SOURCE / SOURCETYPE 常量):
splunk_channel:channel 标识splunk_index:目标索引名splunk_source:数据来源(映射语义meaning::SERVICE)splunk_sourcetype:源类型
另外,host字段的取值优先级为:事件 payload 中的host字段 >X-Forwarded-For请求头 > warp 提供的远端 SocketAddr(见 EventIterator 的 extractors 构建)。当事件被配置了 decoder(编解码器)时,这些元数据字段的写入策略会从Overwrite切换为InsertIfEmpty,以保证解码器解析出的值优先。
端到端确认:Indexer Acknowledgements 深度解析
splunk_hec是 Vector 中支持 acknowledgements 的 source 之一(特性表中acknowledgements: true)。组件文档的how_it_works章节专门说明了该机制:
开启确认后,source 使用 Splunk HEC indexer acknowledgements 协议,让客户端能够验证数据是否已被投递到下游 sink。简言之,每个到达 source 的请求都会关联一个整数标识符(ack id),客户端拿到该 id 后可用于查询该请求的处理状态。
工作机制
对应源码实现位于 src/sources/splunk_hec/acknowledgements.rs,核心流程如下:
- 客户端 POST 事件到
/services/collector/event或/services/collector/raw。 - 请求必须携带 channel(否则返回
MissingChannel错误)。 - source 为请求关联一个 batch(
BatchNotifier),并注册一个 ack id 返回给客户端(响应体中的ackId字段)。 - 事件 batch 被投递到下游;当下游确认成功时,source 在内部登记该 ack id 的状态。
- 客户端随后 POST 到
/services/collector/ack,请求体携带待查询的 ack id 列表(HecAckStatusRequest),source 查询后返回每个 id 的完成状态(HecAckStatusResponse)。
在启用 decoder 的情况下,ack id 的注册时机有所调整:只有当编解码器成功产出事件、且没有任何帧被丢弃或发生错误时,才会注册 ack id——避免对 Vector 已静默丢弃的数据报告“成功”(见 event_service / raw_service 中的条件注册逻辑)。
使用前提
使用该协议需要客户端具备 HEC 索引器确认能力(如 Splunk Universal Forwarder 或支持该协议的采集器),且请求需携带 channel 标识。同时,只有确认已写入的 ack id 才会返回成功状态;如果下游 sink 不支持确认,source 将退化为尽力交付。
关键请求行为与错误语义
以下行为均可从源码验证:
- gzip 解压:请求头
Content-Encoding: gzip时,source 会对请求体解压,且使用CappedDecoder对解压输出做大小上限限制,以缓解 gzip-bomb 类型的拒绝服务攻击(见 event_service 中的 gzip 处理)。 - Content-Type 校验:
/services/collector/ack采用宽松的 JSON 类型检查——请求头缺失 Content-Type 时默认按 JSON 处理,若显式给出且不含application/json则返回UnsupportedContentType(见 lenient_json_content_type_check)。 - 健康检查:
/services/collector/health返回{"text":"HEC is healthy","code":17}。源码注释指出:虽然 Splunk 文档记载该端点对非法 token 返回 400,但实际实现忽略 token 校验(与 Splunk 8.2.4 行为一致,见 health_service)。 - 请求体上限:所有端点都通过
capped_body()对请求体大小做上限限制,防止超大请求耗尽内存。 - 认证格式:
Authorization头需形如Splunk <token>;代码会剥离Splunk前缀后再与配置的令牌比对(见 authorization())。
运维与监控
组件文档的 telemetry 部分声明了该 source 暴露的指标(复用 Vector 内部 HTTP 服务指标,定义于internal_metrics组件):
| 指标 | 含义 |
|---|---|
http_server_handler_duration_seconds | HTTP handler 处理耗时直方图 |
http_server_requests_received_total | 接收到的 HTTP 请求总数 |
http_server_responses_sent_total | 已发送的 HTTP 响应总数 |
此外源码中还通过内部事件(internal_events)上报HttpBytesReceived(接收字节数)、EventsReceived(接收事件数)、SplunkHecRequestError、SplunkHecRequestBodyInvalidError等,可用于构建告警与容量监控。需要注意:本组件不支持多行(multiline)解析,多行原始日志需在下游用其他 transform(如 VRLparse_regex或 multiline 相关能力)处理。
小结
splunk_hecsource 为 Vector 提供了与 Splunk HEC 生态的无缝对接能力:默认0.0.0.0:8088监听、三个核心端点 + ack 端点 + OPTIONS 路由、可选 token 认证与 TLS、gzip 解压与请求体限流、基于 indexer acknowledgements 的至少一次交付确认,以及event/raw两套可选的二次编解码通道。从 组件 CUE 文档 到 核心实现 与 确认协议实现,再到 生成的配置示例,这一组件链路清晰、行为可预期,是迁移或并存 Splunk HEC 工作负载时的首选接入点。
【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考