> ## Documentation Index
> Fetch the complete documentation index at: https://docs.automq.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Splunk Sink Connector

> 介绍如何在 AutoMQ Connect 中配置和运行 Splunk Sink Connector，包括前置条件、配置、监控和故障排查。

## 概述

Splunk Sink Connector 消费 Kafka Topic 中的记录，并通过 Splunk HTTP Event Collector（HEC）将记录写入 Splunk。它位于 Kafka 与 Splunk 之间，适合把应用日志、审计事件、指标明细和业务事件持续送入 Splunk，以便检索、分析和告警。

Connector 默认使用 HEC `/event` 端点，将记录值包装为事件，并可为不同 Topic 设置 index、source 和 sourcetype。也可以切换到 `/raw` 端点发送原始内容，或通过 Kafka Header 动态覆盖 Splunk 元数据。任务会批量发送记录；默认未启用 HEC 确认时，成功的 HTTP 响应用于判定批次完成，启用确认后则等待 Splunk 返回对应的 indexer acknowledgement 再推进 Kafka Offset。故障恢复仍可能重放尚未提交的记录，因此下游应允许重复事件。

## 前置条件

* Splunk 已启用 HEC，并准备可用的 HEC URI 和 Token；Token 对默认或显式配置的 index 具有写入权限。
* 使用 HTTPS 并校验证书时，每个可能运行 Task 的 Worker 都能读取包含所需 CA 链的信任库文件。
* 启用 HEC 确认时，Splunk 中对应 Token 已启用 indexer acknowledgement。

## 授权许可

使用 Apache License 2.0。

## 快速开始

提前准备 Connect Cluster、Kafka 输入 Topic 和 Splunk HEC，确认网络连通、Token 权限以及 Worker 对信任库的读取权限；创建和管理操作参见[管理 Connector](../manage-connectors)。以下配置使用 HTTPS `/event` 端点，并由 HEC Token 的默认设置决定 index、source 和 sourcetype。

```properties theme={null}
connector.class=com.splunk.kafka.connect.SplunkSinkConnector
topics=<input-topic>
splunk.hec.uri=https://<splunk-host>:8088
splunk.hec.token=<hec-token>
splunk.hec.ssl.trust.store.path=<trust-store-path>
splunk.hec.ssl.trust.store.password=<trust-store-password>
```

替换输入 Topic、HEC 地址、Token 和 Worker 本地信任库信息。信任库默认类型为 `JKS`；使用其他受 JVM 支持的类型时添加 `splunk.hec.ssl.trust.store.type`。Token 和信任库密码应通过受控的配置管理方式提供。示例继承 Worker 的 Converter，实际记录编码不一致时应显式配置 `key.converter` 和 `value.converter`。

## 配置

### HEC 连接与身份认证

#### `splunk.hec.token`

访问 Splunk HEC 的 Token。

* **类型**：`password`
* **默认值**：无，必填
* **重要级别**：高
* **有效值 / 注意事项**：使用已启用且有权写入目标 index 的 Token；按敏感配置管理，不写入日志或共享示例。

#### `splunk.hec.uri`

Splunk HEC 基础 URI。

* **类型**：`string`
* **默认值**：无，必填
* **重要级别**：高
* **有效值 / 注意事项**：可使用逗号分隔多个 HTTP 或 HTTPS URI；默认强制 HTTPS。避免在 URI 项目前后加入空白。

#### `splunk.validation.disable`

控制 Connector 配置校验时是否跳过对 Splunk 的实时请求。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：`false` 会使用第一个 HEC URI 对配置的 index 发送校验事件；`true` 仅跳过该远程校验，不跳过必填项、URI、Kerberos 或 Task 配置检查。

#### `kerberos.user.principal`

用于 HEC HTTP 请求的 Kerberos Principal。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：启用 Kerberos 时必须与 `kerberos.keytab.path` 同时设置；Kerberos 不替代 HEC Token。

#### `kerberos.keytab.path`

Kerberos Keytab 的 Worker 本地路径。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：启用 Kerberos 时必须与 `kerberos.user.principal` 同时设置，并确保每个 Task 所在 Worker 可读取该文件。

### TLS 安全

#### `splunk.hec.ssl.enforced`

控制是否强制 HEC URI 使用 HTTPS。

* **类型**：`boolean`
* **默认值**：`true`
* **重要级别**：高
* **有效值 / 注意事项**：`true` 拒绝 HTTP；设为 `false` 仍只接受 HTTP 或 HTTPS。使用 HTTP 会明文传输事件和 Token。

#### `splunk.hec.ssl.validate.certs`

控制 HTTPS 连接是否校验证书和主机名。

* **类型**：`boolean`
* **默认值**：`true`
* **重要级别**：中
* **有效值 / 注意事项**：保持 `true` 时必须配置非空的 `splunk.hec.ssl.trust.store.path`；仅在受控诊断或明确接受风险时关闭。

#### `splunk.hec.ssl.trust.store.path`

用于校验 Splunk 证书的信任库文件路径。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：高
* **有效值 / 注意事项**：HTTPS 且启用证书校验时必填；路径必须对每个 Task 进程可见且可读。

#### `splunk.hec.ssl.trust.store.type`

信任库类型。

* **类型**：`string`
* **默认值**：`JKS`
* **重要级别**：低
* **有效值 / 注意事项**：常见值包括 `JKS` 和 `PKCS12`，实际支持范围取决于 JVM 安全提供程序。

#### `splunk.hec.ssl.trust.store.password`

加载信任库所需的密码。

* **类型**：`password`
* **默认值**：空字符串
* **重要级别**：高
* **有效值 / 注意事项**：按信任库实际设置填写并作为敏感配置管理；空字符串是 ConfigDef 默认值。

### 端点与事件格式

#### `splunk.hec.raw`

选择 HEC `/raw` 或 `/event` 端点。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：`false` 使用 JSON `/event`；`true` 使用 `/raw`，此时元数据按整个请求批次应用，事件字段增强和自定义 Header 字段不适用。

#### `splunk.hec.raw.line.breaker`

为 `/raw` 模式的每条记录追加分隔符。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：仅在 `splunk.hec.raw=true` 时使用，并应与 Splunk sourcetype 的换行和事件切分规则一致。

#### `splunk.hec.json.event.formatted`

尝试把记录值解析为完整的 HEC JSON Event 对象。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：低
* **有效值 / 注意事项**：仅用于 `/event`；解析失败时记录值会回退为普通事件内容，而不是保持预格式化对象语义。

### Splunk 元数据路由

#### `splunk.indexes`

为显式订阅的 Topic 指定 Splunk index。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：空值使用 HEC Token 默认 index；可提供一个值供所有 Topic 共用，或按 `topics` 顺序提供等数量的逗号分隔值。`topics.regex` 不支持这种位置映射。

#### `splunk.sources`

为显式订阅的 Topic 指定 Splunk source。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：可提供一个共用值，或按 `topics` 顺序提供等数量的逗号分隔值；空值使用 HEC 默认设置，`topics.regex` 不支持位置映射。

#### `splunk.sourcetypes`

为显式订阅的 Topic 指定 Splunk sourcetype。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：可提供一个共用值，或按 `topics` 顺序提供等数量的逗号分隔值；空值使用 HEC 默认设置，`topics.regex` 不支持位置映射。

### Kafka Header 映射

#### `splunk.header.support`

启用 Kafka Header 到 Splunk 元数据和字段的映射。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：启用后，配置的 Header 可覆盖 index、host、source 和 sourcetype；`/raw` 会按这四类元数据对记录分组。

#### `splunk.header.custom`

指定写入 `/event` 字段的自定义 Kafka Header 名称。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：使用逗号分隔 Header 名称，需同时启用 `splunk.header.support`；不用于 `/raw` 的索引字段。

#### `splunk.header.index`

指定覆盖 Splunk index 的 Kafka Header 名称。

* **类型**：`string`
* **默认值**：`splunk.header.index`
* **重要级别**：中
* **有效值 / 注意事项**：仅在 `splunk.header.support=true` 时使用，存在多个同名 Header 时使用最后一个值。

#### `splunk.header.source`

指定覆盖 Splunk source 的 Kafka Header 名称。

* **类型**：`string`
* **默认值**：`splunk.header.source`
* **重要级别**：中
* **有效值 / 注意事项**：仅在 `splunk.header.support=true` 时使用，Header 值会转换为字符串。

#### `splunk.header.sourcetype`

指定覆盖 Splunk sourcetype 的 Kafka Header 名称。

* **类型**：`string`
* **默认值**：`splunk.header.sourcetype`
* **重要级别**：中
* **有效值 / 注意事项**：仅在 `splunk.header.support=true` 时使用，Header 值会转换为字符串。

#### `splunk.header.host`

指定覆盖 Splunk host 的 Kafka Header 名称。

* **类型**：`string`
* **默认值**：`splunk.header.host`
* **重要级别**：中
* **有效值 / 注意事项**：仅在 `splunk.header.support=true` 时使用，Header 值会转换为字符串。

### 事件字段与时间

#### `splunk.hec.json.event.enrichment`

为 `/event` 记录添加固定字段。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：低
* **有效值 / 注意事项**：使用逗号分隔的 `key=value` 项；每项必须恰好形成非空键和值，重复键以后出现的值为准。不适用于 `/raw`。

#### `splunk.hec.track.data`

为 `/event` 添加 Kafka 位置和记录跟踪字段。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：低
* **有效值 / 注意事项**：可能包含 Topic、分区、Offset、时间戳、记录 key 和 Connect 主机信息；启用前评估敏感数据暴露。

#### `splunk.hec.use.record.timestamp`

使用 Kafka 记录时间戳作为普通 `/event` 事件时间。

* **类型**：`boolean`
* **默认值**：`true`
* **重要级别**：中
* **有效值 / 注意事项**：正则提取时间启用并成功时可覆盖该时间；不用于 `/raw` 或已成功解析的预格式化事件。

#### `splunk.hec.auto.extract.timestamp`

控制是否向 HEC 请求附加 `auto_extract_timestamp` 参数。

* **类型**：`boolean`
* **默认值**：`null`
* **重要级别**：低
* **有效值 / 注意事项**：`null` 表示不发送该参数；显式设置 `true` 或 `false` 会将对应值交给 HEC。它与 Connector 的正则时间提取相互独立。

#### `enable.timestamp.extraction`

启用 Connector 侧的事件时间正则提取。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：仅用于普通 `/event`；启用时必须设置包含命名组 `time` 的 `timestamp.regex`，并配置适用的时间格式。

#### `timestamp.regex`

从事件文本中提取时间值的 Java 正则表达式。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：启用提取时必须包含 `(?<time>...)` 命名组；表达式针对事件的字符串表示执行。

#### `timestamp.regex.timeout.ms`

单条记录执行时间正则表达式的超时。

* **类型**：`int`
* **默认值**：`500`
* **重要级别**：中
* **有效值 / 注意事项**：单位毫秒，最小值为 `1`；超时后保留此前已有的事件时间。

#### `timestamp.format`

解析正则提取值的时间格式。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：提取 Unix Epoch 时使用 `epoch`；其他值按 Java `SimpleDateFormat` 模式解析。启用提取时应显式设置。

#### `timestamp.timezone`

解析非 Epoch 时间时使用的时区。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：使用有效的 Java 时区 ID；仅在正则提取和非 Epoch 格式下生效。

### HEC 确认与重试

#### `splunk.hec.ack.enabled`

启用 Splunk HEC indexer acknowledgement 轮询。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：启用前必须为 HEC Token 开启 indexer acknowledgement。关闭时，成功的 HTTP 响应即用于判定批次完成，但不表示事件已经持久化并可检索；默认值以 ConfigDef 的 `false` 为准。

#### `splunk.hec.event.timeout`

等待 HEC 确认的超时时间。

* **类型**：`int`
* **默认值**：`300`
* **重要级别**：中
* **有效值 / 注意事项**：单位秒，仅在 `splunk.hec.ack.enabled=true` 时使用；应设置为适合 HEC 处理延迟的正值。

#### `splunk.hec.ack.poll.interval`

轮询 HEC 确认状态的间隔。

* **类型**：`int`
* **默认值**：`10`
* **重要级别**：中
* **有效值 / 注意事项**：单位秒，仅在 HEC 确认启用时使用；线程调度要求可用的正值。

#### `splunk.hec.ack.poll.threads`

轮询 HEC 确认状态的线程数。

* **类型**：`int`
* **默认值**：`2`
* **重要级别**：中
* **有效值 / 注意事项**：仅在 HEC 确认启用时使用，应配置正整数；默认值以 ConfigDef 的 `2` 为准。

#### `splunk.hec.max.outstanding.events`

限制尚未完成的在途事件数量。

* **类型**：`int`
* **默认值**：`1000000`
* **重要级别**：中
* **有效值 / 注意事项**：达到阈值会触发反压和可重试异常；结合单条记录大小、批量、确认延迟和 Worker 内存设置正值。

#### `splunk.hec.max.retries`

控制 Connector 对失败批次的内部重试次数。

* **类型**：`int`
* **默认值**：`5`
* **重要级别**：中
* **有效值 / 注意事项**：正值限制失败批次的重试计数；在此实现中，`0` 或负值不会进入次数上限条件，表现为不限次数。它不同于 Kafka Connect 框架的 `errors.retry.timeout`。

#### `splunk.hec.backoff.threshhold.seconds`

设置 HEC 通道失败后的反压时长。

* **类型**：`int`
* **默认值**：`60`
* **重要级别**：中
* **有效值 / 注意事项**：单位秒；配置名中的 `threshhold` 是公开键名的既有拼写，必须原样使用。

### 批量、并发与传输

#### `splunk.hec.max.batch.size`

设置单个 HEC 批次的最大记录数。

* **类型**：`int`
* **默认值**：`500`
* **重要级别**：中
* **有效值 / 注意事项**：按记录数而非字节数计算；ConfigDef 默认值为 `500`。应使用正值，并结合单条事件大小和 HEC 请求限制调整。

#### `splunk.flush.window`

设置批量发送的时间窗口。

* **类型**：`int`
* **默认值**：`30`
* **重要级别**：低
* **有效值 / 注意事项**：单位秒；达到批量记录数或在后续记录到达时观察到窗口经过会触发发送。仅正值会替换内部窗口。

#### `splunk.hec.threads`

设置每个 Task 内部发送 HEC 批次的线程数。

* **类型**：`int`
* **默认值**：`1`
* **重要级别**：低
* **有效值 / 注意事项**：大于 `1` 启用并发发送和有界队列；它不同于 `tasks.max`，提高该值可能改变批次完成顺序。

#### `splunk.hec.concurrent.queue.capacity`

设置并发 HEC 发送队列的批次数容量。

* **类型**：`int`
* **默认值**：`100`
* **重要级别**：低
* **有效值 / 注意事项**：必须大于 `0`；主要在 `splunk.hec.threads>1` 时承载待发送批次。

#### `splunk.hec.total.channels`

设置每个 Task 使用的 HEC 通道总量。

* **类型**：`int`
* **默认值**：`2`
* **重要级别**：高
* **有效值 / 注意事项**：应使用正值；与多个 URI 和多个 HEC 线程共同决定通道分配，不等同于 Task 数量。

#### `splunk.hec.max.http.connection.per.channel`

设置每个目标的 HTTP 连接池上限。

* **类型**：`int`
* **默认值**：`2`
* **重要级别**：中
* **有效值 / 注意事项**：应使用正值；总连接池还会受 HEC URI 数量影响。

#### `splunk.hec.http.keepalive`

控制 HEC HTTP 连接是否使用 Keep-Alive。

* **类型**：`boolean`
* **默认值**：`true`
* **重要级别**：中
* **有效值 / 注意事项**：`true` 或 `false`；通常保持启用以复用连接。

#### `splunk.hec.socket.timeout`

设置 HEC 客户端声明的 Socket 超时时间。

* **类型**：`int`
* **默认值**：`60`
* **重要级别**：低
* **有效值 / 注意事项**：单位秒；使用正值并结合网络和 HEC 响应时间评估。

#### `splunk.hec.lb.poll.interval`

设置 HEC URI 健康检查间隔。

* **类型**：`int`
* **默认值**：`120`
* **重要级别**：低
* **有效值 / 注意事项**：单位秒；小于或等于 `0` 会关闭带外健康检查。

#### `splunk.hec.enable.compression`

控制 HEC 请求实体是否使用 Gzip 压缩。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：同时适用于 `/event` 和 `/raw`；可减少网络传输量，但会增加 Worker 与 Splunk 的压缩处理开销。

### Kafka Connect 身份、订阅与转换

#### `connector.class`

指定 Connector 实现类。

* **类型**：`string`
* **默认值**：无，必填
* **重要级别**：高
* **有效值 / 注意事项**：使用 `com.splunk.kafka.connect.SplunkSinkConnector`。

#### `tasks.max`

设置 Connector 可创建的最大 Task 数量。

* **类型**：`int`
* **默认值**：`1`
* **重要级别**：高
* **有效值 / 注意事项**：最小值为 `1`；有效并行度还受输入 Topic 分区数限制。每个 Task 具有独立的 HEC 客户端和内部线程。

#### `tasks.max.enforce`

控制 Kafka Connect 是否强制 Connector 遵守 `tasks.max`。

* **类型**：`boolean`
* **默认值**：`true`
* **重要级别**：低
* **有效值 / 注意事项**：此项已弃用并计划在未来主版本移除；保持 `true` 并通过 `tasks.max` 管理任务数，没有同名替代属性。

#### `topics`

指定 Connector 消费的 Kafka Topic。

* **类型**：`list`
* **默认值**：空列表
* **重要级别**：高
* **有效值 / 注意事项**：使用逗号分隔，必须与 `topics.regex` 二选一。使用位置对应的 `splunk.indexes`、`splunk.sources` 或 `splunk.sourcetypes` 时必须选择本项。

#### `topics.regex`

使用正则表达式订阅 Kafka Topic。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：高
* **有效值 / 注意事项**：必须是有效 Java 正则表达式，并与 `topics` 二选一；不能使用位置对应的 Splunk 元数据列表，应改用 HEC 默认值或 Kafka Header。

#### `key.converter`

指定记录 key 的 Kafka Connect Converter。

* **类型**：`class`
* **默认值**：`null`
* **重要级别**：低
* **有效值 / 注意事项**：`null` 继承 Worker 配置；显式类必须是可实例化的 `Converter`。记录 key 默认不作为事件内容发送。

#### `value.converter`

指定记录 value 的 Kafka Connect Converter。

* **类型**：`class`
* **默认值**：`null`
* **重要级别**：低
* **有效值 / 注意事项**：`null` 继承 Worker 配置；转换结果会由 Connector 序列化为文本、JSON 或 HEC Event 内容。

#### `header.converter`

指定 Kafka Header 的 Converter。

* **类型**：`class`
* **默认值**：`null`
* **重要级别**：低
* **有效值 / 注意事项**：`null` 继承 Worker 配置；启用 `splunk.header.support` 时应确保 Header 转换结果符合预期。

#### `transforms`

指定在 SinkTask 处理前依次执行的单消息转换（SMT）别名。

* **类型**：`list`
* **默认值**：空列表
* **重要级别**：低
* **有效值 / 注意事项**：别名必须唯一；每个转换还需配置 `transforms.<alias>.type` 及其专属属性。

#### `config.action.reload`

控制 Config Provider 值变化或到期时的处理方式。

* **类型**：`string`
* **默认值**：`restart`
* **重要级别**：低
* **有效值 / 注意事项**：可选值为 `restart` 或 `none`；Config Provider 的注册属于 Worker 配置。

### Kafka Connect 错误处理

#### `errors.retry.timeout`

设置 Kafka Connect 框架阶段可重试错误的总重试时长。

* **类型**：`long`
* **默认值**：`0`
* **重要级别**：中
* **有效值 / 注意事项**：单位毫秒；`0` 不重试，`-1` 表示无限重试。它不替代 Connector 自己的 HEC 批次重试。

#### `errors.retry.delay.max.ms`

设置 Kafka Connect 框架重试之间的最大等待时间。

* **类型**：`long`
* **默认值**：`60000`
* **重要级别**：中
* **有效值 / 注意事项**：单位毫秒；与 `errors.retry.timeout` 配合使用，不影响 HEC 通道的反压时长。

#### `errors.tolerance`

控制 Kafka Connect 框架是否容忍可报告的记录处理错误。

* **类型**：`string`
* **默认值**：`none`
* **重要级别**：中
* **有效值 / 注意事项**：可选值为 `none` 或 `all`；主要适用于转换、SMT 等框架阶段，不保证覆盖 Connector 内部的异步 HEC 失败。

#### `errors.log.enable`

控制是否记录 Kafka Connect 框架处理错误。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：该日志与 Connector 自身日志独立；启用后结合日志访问控制和保留策略使用。

#### `errors.log.include.messages`

控制框架错误日志是否包含记录上下文。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：启用后可包含 Topic、分区、Offset 和时间戳等信息；评估日志中的数据暴露风险，并与 `errors.log.enable` 配合使用。

#### `errors.deadletterqueue.topic.name`

指定 Kafka Connect 框架死信 Topic。

* **类型**：`string`
* **默认值**：空字符串
* **重要级别**：中
* **有效值 / 注意事项**：空值关闭 DLQ；通常与 `errors.tolerance=all` 配合。DLQ Topic 不能被 `topics` 或 `topics.regex` 订阅，且该机制不覆盖所有 Connector 内部 HEC 失败。

#### `errors.deadletterqueue.topic.replication.factor`

设置 Kafka Connect 自动创建 DLQ Topic 时的复制因子。

* **类型**：`short`
* **默认值**：`3`
* **重要级别**：中
* **有效值 / 注意事项**：仅在 Connect 创建 DLQ Topic 时使用；值不得超过 Kafka 集群可用 Broker 数量。

#### `errors.deadletterqueue.context.headers.enable`

控制是否为 DLQ 记录添加 Kafka Connect 错误上下文 Header。

* **类型**：`boolean`
* **默认值**：`false`
* **重要级别**：中
* **有效值 / 注意事项**：启用后添加 `__connect.errors.*` Header；仅在配置了 DLQ 时有意义。

## 最佳实践

### 在生产接入时启用 HEC 确认

**适用业务场景**：快速开始已经完成基本写入，生产环境需要在 Splunk 返回 indexer acknowledgement 后再推进对应 Kafka Offset，并能接受故障恢复期间可能出现重复事件。

**配置示例**：沿用快速开始配置，并在 Splunk 中为同一 HEC Token 启用 indexer acknowledgement，再添加以下配置。

```properties theme={null}
splunk.hec.ack.enabled=true
splunk.hec.event.timeout=300
splunk.hec.ack.poll.interval=10
splunk.hec.ack.poll.threads=2
```

**关键说明**：在 HEC Token 已启用 indexer acknowledgement 且确认轮询正常工作的前提下，该模式提供至少一次交付，但不提供端到端事务或 exactly-once；HEC 已接收批次但确认响应丢失、超时、重启或再均衡都可能导致重放。根据实际索引延迟和并发量调整超时与轮询线程，并为需要严格去重的事件提供稳定事件标识或在 Splunk 侧实施去重。

### 扩展为多 Topic 的固定元数据路由

**适用业务场景**：初始单 Topic 接入已稳定，需要把应用日志和审计日志写入不同 index，并为每类数据设置明确的 source 与 sourcetype。

**配置示例**：在快速开始配置中替换 `topics`，并添加与 Topic 顺序一一对应的元数据列表。

```properties theme={null}
topics=<application-topic>,<audit-topic>
splunk.indexes=<application-index>,<audit-index>
splunk.sources=<application-source>,<audit-source>
splunk.sourcetypes=<application-sourcetype>,<audit-sourcetype>
```

**关键说明**：每个元数据列表可以只写一个共用值，也可以写与 `topics` 数量相同的值；使用多个值时，位置必须严格对应。该方式不适用于 `topics.regex`。需要动态路由时应启用 Kafka Header 映射，或使用 HEC Token 默认元数据，并验证生产者 Header 值域和访问权限。

### 随吞吐增长逐步提高发送并行度

**适用业务场景**：单 Task、单 HEC 发送线程已稳定运行，但 Kafka 积压持续增长，Splunk HEC 和网络仍有可用容量，需要通过更多 Task、连接和压缩提高吞吐。

**配置示例**：以具有至少四个输入分区、HEC 可承载相应并发为前提，在快速开始配置上添加以下起始值，再通过压测逐项调整。

```properties theme={null}
tasks.max=2
splunk.hec.threads=2
splunk.hec.total.channels=4
splunk.hec.max.http.connection.per.channel=2
splunk.hec.concurrent.queue.capacity=100
splunk.hec.enable.compression=true
```

**关键说明**：有效 Task 数受输入分区数限制，HEC 线程和通道则作用于每个 Task。增加并行度会提高 Worker 内存、连接和 Splunk 处理压力，也不保证跨分区、Task、通道或批次的全局顺序。每次只调整一组容量参数，观察 Kafka lag、HEC 响应、重试、Worker 堆内存与 CPU，再决定是否继续扩容。

## 监控

### 监控内容

关注 Kafka Connect 集群健康、Connector 和 Task 状态、消费与 HEC 写入吞吐、Kafka lag 和端到端延迟、Offset 提交进度、错误与重试，以及 Worker JVM 的堆内存、GC 和线程信号；同时关注 HEC 健康、确认超时、反压和重复事件。只有部署启用了相应框架错误处理时才关注 DLQ 活动，不能把 DLQ 视为所有 HEC 发送失败的兜底。

### 导入 Grafana 大盘

下载[AutoMQ Connect Cluster Grafana 大盘](https://automq-download-center.oss-cn-hangzhou.aliyuncs.com/connect-dashboard/automq-connect-cluster-dashboard.json)，准备可查询 Kafka Connect 指标的 Prometheus 兼容数据源，并确保采集标签与大盘筛选条件一致；在 Grafana 的导入页面上传 JSON，选择对应数据源后保存。

## 限制条件

* 启用 HEC 确认并满足确认条件时，交付语义为至少一次；重试、崩溃、再均衡或确认响应缺失仍可能产生重复事件。未启用确认时，Connector 在成功 HTTP 响应后完成批次，不提供 indexer acknowledgement 保障。两种模式都不提供 exactly-once 或目标端去重。
* Splunk 返回 `Invalid data format` 时，Connector 会把该响应视为已完成并允许 Kafka Offset 推进，即使对应事件被忽略。
* `topics.regex` 不能使用 `splunk.indexes`、`splunk.sources` 和 `splunk.sourcetypes` 的位置映射，需改用 Kafka Header 或 HEC Token 默认值。
* HTTPS 且启用证书校验时，必须配置 Worker 可读取的自定义信任库路径。
* `/raw` 模式的 Splunk 元数据作用于整个请求批次，自定义 Kafka Header 不会作为索引字段加入原始事件。

## 常见问题

### Connector 正常运行，但 Splunk 中查不到事件

检查 Task 日志和状态、HEC 健康、Token 是否启用及是否允许写入目标 index，并确认 URI、端点模式和 `/raw` 换行规则正确。若启用了 HEC 确认，核对 Splunk Token 的 indexer acknowledgement 设置；若 Splunk 返回 `Invalid data format`，Connector 可能已推进 Offset。修正 HEC、权限或事件格式后，用一条小型有效事件重新验证。

### 故障恢复或重启后出现重复事件

HEC 可能已经接收批次，但 Kafka Offset 尚未提交，或确认响应在超时、连接切换和再均衡期间丢失。检查 HEC 确认和重试日志、Task 重启记录及 Offset 进度。正确启用 indexer acknowledgement，并按实际延迟设置超时；对不能接受重复的数据，在事件中保留稳定标识并在查询或后续处理中去重。

### Kafka lag 持续增加或同一批记录反复重放

检查最早未完成批次的 HEC 响应、确认轮询、失败重试和在途事件数量，并确认至少一个 HEC 通道健康。先恢复 Token、index、网络或 HEC 容量，再评估并行度；不要在未确认数据边界前直接重置 Offset，因为这可能造成数据缺失或更多重复。

### HTTPS 校验或 Task 启动时报信任库错误

确认 `splunk.hec.ssl.trust.store.path` 在每个 Worker 上存在且可读，类型和密码正确，信任库包含 Splunk 证书的签发链，并核对 URI 主机名与证书匹配。修正信任库后重新启动 Task；不要把关闭证书校验作为长期解决方案。

### 事件写入了错误的 index、source 或 sourcetype

检查 `topics` 顺序与三类元数据列表的数量和顺序，以及 Kafka Header 映射是否覆盖了静态值。使用 `topics.regex` 时，位置映射不会生效，应改用 Header 或 HEC Token 默认值。`/raw` 还会按一组请求元数据发送批次，应确保同一批记录适合共享这些元数据。

### Splunk 中的事件时间不符合预期

依次检查 Kafka 记录时间戳、`splunk.hec.use.record.timestamp`、正则命名组、超时日志、`timestamp.format`、`timestamp.timezone` 和 HEC 自动时间提取设置。选择一种主要时间来源并用代表性事件验证，避免同时启用会相互覆盖的提取路径。
