feat(syslog): 优化大日志通道并增加异常连续消费兜底

- 128 KiB 及以上日志默认进入大日志 Topic
- InfluxDB 原文及达梦大字段超过 256 KiB 时截断保存
- 截断内容追加 HB_XDR_TRUNCATED 标记
- InfluxDB 写入失败时继续执行规则解析和达梦写入
- 未知或系统性异常优先写入普通/大日志 DLT
- DLT 写入失败时记录特殊告警并提交 offset,避免阻塞后续消息
- DLT 失败等待时间默认限制为 1 秒
- 增加连续性放行、DLT 成功及失败监控指标
- 更新 Docker Compose、v3 升级文档及相关测试
This commit is contained in:
王绍宏
2026-09-12 19:24:58 +08:00
parent 0e9e6656db
commit c868e3befd
16 changed files with 342 additions and 43 deletions
+11 -2
View File
@@ -16,10 +16,12 @@ v3 同时增加大日志独立处理链路:
- `syslog-serve` 在进入 WAL 前执行单条硬上限检查;超过上限明确拒绝,不把原文写入应用日志;
- 接纳后的消息仍先进入 `syslog-serve` 本地 WAL,WAL 入队和 Kafka 投递同时受条数、字节数约束;
- 超过分流阈值的消息进入独立 `.large` Topic,其 Retry、DLT、Replay 也使用独立 Topic;
- 达到分流阈值的消息进入独立 `.large` Topic,其 Retry、DLT、Replay 也使用独立 Topic;
- `syslog-consumer-rule` 使用独立的大日志 listener、消费组、ConsumerFactory、poll 批量和规则计算线程池;
- 规则解析使用完整内容,写 InfluxDB 和达梦前才按 UTF-8 字节数截断,结尾带
`HB_XDR_TRUNCATED` 标记;InfluxDB 另存原长度、保存长度和原文 SHA-256。
- 消费端默认采用连续性优先策略:无法理解或系统性异常先尝试写入 DLT;即使 DLT 失败,也记录
`[SYSLOG_CONTINUITY_LOSS]` 后推进 offset,避免单条异常永久阻塞整个分区。
## 文件与执行顺序
@@ -173,9 +175,16 @@ ORDER BY status;
`dispatch_inflight_bytes`、`kafka_large_dispatched`;
- `GET /xdrrule/api/syslog/raw-storage/metrics`:检查 `raw_message_truncated_total` 及截断前后字节累计值;
- `GET /xdrrule/api/syslog/storage-limits/metrics`:检查达梦正常/非标字段截断计数;
- 发送一条略大于 256 KiB、但小于 6 MiB 的测试消息,确认 `.large` Topic 有数据且普通 Topic 无该事件;
- 发送一条不小于 128 KiB、但小于 6 MiB 的测试消息,确认 `.large` Topic 有数据且普通 Topic 无该事件;
- 查询 InfluxDB/达梦,确认被截断值以 `...[HB_XDR_TRUNCATED original_utf8_bytes=...]` 结尾。
连续性指标也位于 `GET /xdrrule/api/syslog/raw-storage/metrics`:
- `raw_write_bypassed_messages_total`:InfluxDB 原文写失败后仍继续标准化的消息数;
- `continuity_dlt_published_total`:特殊异常成功写入 DLT 的消息数;
- `continuity_dlt_publish_failed_total`:DLT 写失败但仍放行的消息数。该值增加时应立即检查 Kafka/DLT,
对应消息可能无法自动重放。
## 回滚
回滚最后一台新版本前,先确认 Outbox 没有未应用事件:
@@ -18,10 +18,10 @@ syslog-serve/docker-compose/docker-compose-serve-prod.yaml
- SYSLOG_SERVER_ENABLED=true
- SYSLOG_CHARSET=UTF-8
# 单条最多接收 6 MiB,超过 256 KiB 时发送到大日志 Topic。
# 单条最多接收 6 MiB,达到 128 KiB 时发送到大日志 Topic。
- SYSLOG_MAX_FRAME_LENGTH=6291456
- SYSLOG_MESSAGE_MAX_BYTES=6291456
- SYSLOG_LARGE_MESSAGE_THRESHOLD_BYTES=262144
- SYSLOG_LARGE_MESSAGE_THRESHOLD_BYTES=131072
# WAL 和 Kafka 投递最多各占用 256 MiB 在途内存。
- SYSLOG_WAL_MAX_PENDING_BYTES=268435456
@@ -36,7 +36,7 @@ syslog-serve/docker-compose/docker-compose-serve-prod.yaml
- `SYSLOG_MAX_FRAME_LENGTH`:TCP 单帧最大长度;
- `SYSLOG_MESSAGE_MAX_BYTES`:所有来源的单条日志硬上限,超过后拒绝;
- `SYSLOG_LARGE_MESSAGE_THRESHOLD_BYTES`:超过该值后走大日志 Topic;
- `SYSLOG_LARGE_MESSAGE_THRESHOLD_BYTES`:达到该值后走大日志 Topic;
- `SYSLOG_WAL_MAX_PENDING_BYTES`、`SYSLOG_DISPATCH_MAX_INFLIGHT_BYTES`:限制 JVM 在途数据量。
`SYSLOG_MAX_FRAME_LENGTH` 必须大于或等于 `SYSLOG_MESSAGE_MAX_BYTES`。如果设备发送 GBK,应将
@@ -70,12 +70,16 @@ syslog-consumer-rule/docker-compose/docker-compose-consumer-rule-prod.yaml
# Retry、DLT、Replay 也允许传输大日志。
- KAFKA_RELIABILITY_MAX_REQUEST_SIZE=33554432
# InfluxDB 原文最多保存 1 MiB,单批写入最多 8 MiB。
- INFLUXDB_RAW_MESSAGE_MAX_UTF8_BYTES=1048576
# 连续性优先:特殊异常即使无法写入 DLT,也记录告警并继续消费。
- SYSLOG_FAILURE_CONTINUITY_ENABLED=true
- SYSLOG_FAILURE_CONTINUITY_DLT_PUBLISH_TIMEOUT_MS=1000
# InfluxDB 原文最多保存 256 KiB,单批写入最多 8 MiB。
- INFLUXDB_RAW_MESSAGE_MAX_UTF8_BYTES=262144
- INFLUXDB_RAW_WRITE_BATCH_MAX_BYTES=8388608
# 达梦正常日志大字段最多保存 64 KiB,非标日志原文最多保存 256 KiB。
- DM_NORMAL_LARGE_FIELD_MAX_UTF8_BYTES=65536
# 达梦正常日志大字段和非标日志原文最多保存 256 KiB。
- DM_NORMAL_LARGE_FIELD_MAX_UTF8_BYTES=262144
- DM_NON_NORMAL_LARGE_FIELD_MAX_UTF8_BYTES=262144
```
@@ -95,6 +99,18 @@ DM_NON_NORMAL_LARGE_FIELD_MAX_UTF8_BYTES
规则解析始终使用完整原文,只在写入 InfluxDB 或达梦时截断。
`SYSLOG_FAILURE_CONTINUITY_ENABLED=true` 时:
- InfluxDB 原文写入失败,会先尝试把原消息写入普通/大日志 DLT,再继续规则解析和达梦写入;
- 其他无法完成的特殊异常,会先尝试写 DLT,然后提交原 Kafka offset,避免阻塞整个分区;
- 如果 DLT 也不可用,仍会输出 `[SYSLOG_CONTINUITY_LOSS]` 日志并提交 offset。此时消息可能无法重放,
但不会阻塞后续新消息。
DLT 首次写入失败最多等待 `SYSLOG_FAILURE_CONTINUITY_DLT_PUBLISH_TIMEOUT_MS` 毫秒;随后不再逐条等待,
整批记录一次后立即放行。
设置为 `false` 可恢复原来的失败保留 offset 行为。
## 3. 日统计投影
日统计投影默认开启,一般不需要新增配置。只需确认现场没有配置: