Splunk
概述
GreptimeDB 实现了 Splunk HTTP Event Collector (HEC) 协议的一个子集。已经在用 HEC 的采集器——比如 Vector 和 OpenTelemetry Collector——只需要改一下地址和 token 就能写入 GreptimeDB。
提供两个写入端点:
/services/collector/event接收结构化的 JSON 事件。/services/collector/raw接收纯文本,原样存储。
Splunk 的 index 对应 GreptimeDB 的表。host、source、sourcetype 以及 fields 下的各个 key 会成为 Tag 列,GreptimeDB 会把它们加进表的主键。
不支持 indexer acknowledgment(/services/collector/ack)。channel 参数会被接收但忽略。
Fluent Bit 自带的 splunk output 用不了这个端点。它把请求路径写死成 /services/collector/event,也没有提供配置路径的选项,所以在没有反向代理的情况下访问不到 GreptimeDB 的 /v1/splunk。要从 Fluent Bit 写入,请改用它的 HTTP output。
HTTP API
基础路径是 /v1/splunk,采集路径由客户端自己拼接。把采集器指向 http://${db_host}:${db_http_port}/v1/splunk 即可,例如 http://localhost:4000/v1/splunk。
| 端点 | 方法 | 用途 |
|---|---|---|
/v1/splunk/services/collector/event | POST | 写入 JSON 事件。别名:/services/collector、/services/collector/event/1.0 |
/v1/splunk/services/collector/raw | POST | 写入纯文本。别名:/services/collector/raw/1.0 |
/v1/splunk/services/collector/health | GET | 健康检查。别名:/services/collector/health/1.0 |
请求体支持 gzip 压缩(Content-Encoding: gzip)。
鉴权
只有在服务端配置了 user provider 时才会校验鉴权。没有配置时请求直接放行。
HEC 客户端发送的是 Authorization: Splunk <token>,GreptimeDB 把这个 token 按 username:password 解析:
Authorization: Splunk greptime_user:greptime_pwd
Authorization: Basic <base64> 同样接受。
大多数 Splunk 客户端默认用一个不含冒号的 opaque token,这种 token 会被 GreptimeDB 拒绝并返回 HEC code 4。请把客户端的 token 配置成 <username>:<password> 的形式。
健康检查端点是公开的,任何情况下都不需要 token。
写入 JSON 事件
POST /v1/splunk/services/collector/event
请求体是一个或多个 HEC 事件对象。它们可以直接拼接、用换行或空格这类 JSON 空白字符分隔,也可以放在一个顶层 JSON 数组里。其他分隔符(比如逗号、分号)会导致解析失败,请求返回 HEC code 6。
字段映射
| HEC 字段 | 对应到 |
|---|---|
time | greptime_timestamp 时间索引 |
index | 表名 |
host、source、sourcetype | Tag 列 |
fields 下的各个 key | Tag 列,每个 key 一列 |
event 及其余 key | 数据列 |
time 是 epoch 秒,可以带小数。大于等于 1e12 的值按毫秒解析。time 缺失或为 null 时使用服务端的写入时间。
time 存在但解析不了不会回退,而是直接报错,请求返回 HEC code 6。raw 端点的 ?time= 同理。
表名路由
表名按以下顺序确定:
- 事件里的
index,会被规整成合法表名。[A-Za-z0-9_:\-.@#]之外的字符替换成_,首字符不合法时在前面补一个下划线。例如my index/2026会变成my_index_2026。 tablequery 参数。- 默认表
splunk_logs。
Query 参数
| 参数 | 说明 |
|---|---|
db | 目标数据库,默认 public。 |
table | 事件里没有 index 时使用的兜底表名。 |
pipeline_name | 使用的 Pipeline,默认是内置的 greptime_identity。 |
version | Pipeline 版本,默认使用最新版本。 |
这个端点只认上面这几个参数。其他日志写入参数如 msg_field、custom_time_index、ignore_errors 在这里不生效。
示例
curl -X POST "http://localhost:4000/v1/splunk/services/collector/event" \
-H "Authorization: Splunk greptime_user:greptime_pwd" \
-H "Content-Type: application/json" \
-d '{"time":1785312000,"host":"web-01","source":"/var/log/nginx/access.log","sourcetype":"nginx:access","index":"splunk_events","fields":{"env":"prod","region":"us-west"},"event":{"status":200,"path":"/api/v1/health","latency_ms":12}}
{"time":1785312001,"host":"web-02","source":"/var/log/nginx/access.log","sourcetype":"nginx:access","index":"splunk_events","fields":{"env":"prod","region":"eu-central"},"event":{"status":503,"path":"/api/v1/orders","latency_ms":841}}'
写入成功返回:
{"code":0,"text":"Success"}
第一次写入时会自动建表 splunk_events:
DESC TABLE splunk_events;
+--------------------+---------------------+------+------+---------+---------------+
| Column | Type | Key | Null | Default | Semantic Type |
+--------------------+---------------------+------+------+---------+---------------+
| greptime_timestamp | TimestampNanosecond | PRI | NO | | TIMESTAMP |
| env | String | PRI | YES | | TAG |
| event.latency_ms | Int64 | | YES | | FIELD |
| event.path | String | | YES | | FIELD |
| event.status | Int64 | | YES | | FIELD |
| host | String | PRI | YES | | TAG |
| region | String | PRI | YES | | TAG |
| source | String | PRI | YES | | TAG |
| sourcetype | String | PRI | YES | | TAG |
+--------------------+---------------------+------+------+---------+---------------+
默认 Pipeline 会把嵌套的 event 对象打平,所以数据列的名字是 event.status、event.path、event.latency_ms。
SELECT * FROM splunk_events ORDER BY greptime_timestamp;
+---------------------+------+------------------+----------------+--------------+--------+------------+---------------------------+--------------+
| greptime_timestamp | env | event.latency_ms | event.path | event.status | host | region | source | sourcetype |
+---------------------+------+------------------+----------------+--------------+--------+------------+---------------------------+--------------+
| 2026-07-29 08:00:00 | prod | 12 | /api/v1/health | 200 | web-01 | us-west | /var/log/nginx/access.log | nginx:access |
| 2026-07-29 08:00:01 | prod | 841 | /api/v1/orders | 503 | web-02 | eu-central | /var/log/nginx/access.log | nginx:access |
+---------------------+------+------------------+----------------+--------------+--------+------------+---------------------------+--------------+
后续写入里 fields 新出现的 key 会自动加成 Tag 列并加入主键。