Vector splunk_hec Source 完全指南:Splunk HEC 协议接入与配置详解
2026/9/13 10:40:31 网站建设 项目流程

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/eventPOST接收 JSON 格式的 HEC 事件包(HEC envelope),一个请求可包含多个事件
/services/collector/rawPOST接收原始(raw)文本数据,默认将整个请求体作为一个事件
/services/collector/healthGET健康检查端点,返回{"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)。

eventraw(编解码配置,进阶特性)

  • 类型CodecConfig(含framingdecoding两个子项)。
  • 默认值:均未启用。
  • 行为
    • 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 命名空间,典型输出字段包括:

字段类型说明
messagestring事件消息内容,对应 Splunk envelope 中的_raw/event字段(源码引用fields._raw_line
splunk_channelstringSplunk channel 标识,取自X-Splunk-Request-Channel请求头或channel查询参数(头优先于查询参数,见 event_service 中 channel 解析)
splunk_sourcetypestring源类型名称(HEC envelope 中的sourcetype字段)
timestamptimestamp事件时间戳,默认取接收时刻(可用 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,核心流程如下:

  1. 客户端 POST 事件到/services/collector/event/services/collector/raw
  2. 请求必须携带 channel(否则返回MissingChannel错误)。
  3. source 为请求关联一个 batch(BatchNotifier),并注册一个 ack id 返回给客户端(响应体中的ackId字段)。
  4. 事件 batch 被投递到下游;当下游确认成功时,source 在内部登记该 ack id 的状态。
  5. 客户端随后 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_secondsHTTP handler 处理耗时直方图
http_server_requests_received_total接收到的 HTTP 请求总数
http_server_responses_sent_total已发送的 HTTP 响应总数

此外源码中还通过内部事件(internal_events)上报HttpBytesReceived(接收字节数)、EventsReceived(接收事件数)、SplunkHecRequestErrorSplunkHecRequestBodyInvalidError等,可用于构建告警与容量监控。需要注意:本组件不支持多行(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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询