Files
王绍宏 8f1a8b6283 feat(syslog): 增加 WAL 与分 IP 接入诊断
- 每分钟保存 WAL 全局状态和分 IP 接收统计,历史保留 7 天
- 记录接收、WAL 落盘、Kafka ACK、过滤、背压及丢弃数量
- 增加 wal_max_pending_bytes 和 wal_admission_unavailable 指标
- 增加 TCP pending 当前值及进程内峰值统计
- 网络异常后同一 IP 恢复接收时打印恢复日志
- 提供当前状态及按日期查询诊断历史的接口
- 连接关闭时清理 TCP pending 计数并停止无效重试
- 增加相关单元测试和现场排查文档
2026-09-16 17:32:08 +08:00

146 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# v5 现场设备原始日志采样
天眼/微步 JSON 异常的代码入口和现场开发排查顺序见
[`02-json-format-error-debug-guide.md`](./02-json-format-error-debug-guide.md)。
Syslog 接收、WAL、Kafka ACK、设备过滤和 TCP 异常的全局/分 IP 七天诊断历史见
[`03-syslog-wal-diagnostics.md`](./03-syslog-wal-diagnostics.md)。
## 功能说明
v5 为 `syslog-consumer-rule` 增加按设备短时采集原始日志的诊断接口,并提供自动落盘脚本。
- 单次采集最长 600 秒;
- 单次最多返回 50 条;
- 先保留采集窗口内最早的 N 条日志;
- 后续出现非标、规则执行异常、InfluxDB 写入异常、达梦写入异常或 Retry/DLT 时,用异常日志逐条替换最早的正常样本;
- 返回内容来自规则解析和非标字段截断之前,不受 `HB_XDR_TRUNCATED` 影响;
- 三个 `syslog-consumer-rule` 实例通过相同 Redis 汇聚有界候选集;
- 不新增数据库表,也不需要执行达梦 SQL。
## 升级与配置
滚动升级全部 `syslog-consumer-rule` 实例,并确保各实例连接同一个 Redis。原始日志采集和多实例汇聚默认
均已启用;建议在所有实例显式保留以下配置,便于现场识别和后续调整:
```yaml
- SYSLOG_RAW_CAPTURE_ENABLED=true
- SYSLOG_RAW_CAPTURE_CLUSTER_ENABLED=true
```
推荐保留默认配置:
```yaml
- SYSLOG_RAW_CAPTURE_MAX_ACTIVE_SESSIONS=20
- SYSLOG_RAW_CAPTURE_MAX_RETAINED_SESSIONS=100
- SYSLOG_RAW_CAPTURE_CLUSTER_ACTIVATION_DELAY_MS=1000
- SYSLOG_RAW_CAPTURE_CLUSTER_SYNC_INTERVAL_MS=200
- SYSLOG_RAW_CAPTURE_SETTLE_SECONDS=30
- SYSLOG_RAW_CAPTURE_RESULT_RETENTION_MINUTES=30
```
如果多个 Java 进程运行在同一主机且没有不同的容器 `HOSTNAME`,应为每个实例配置不同标识:
```yaml
- SYSLOG_RAW_CAPTURE_NODE_ID=consumer-rule-01
```
接口会返回完整原文,应只允许受信任的运维网络或现有管理网关访问。
## 一键采集
脚本依赖 `bash`、`curl` 和 `python3`。先增加执行权限:
```bash
chmod 700 /升级资料路径/v5/capture-device-raw-logs.sh
```
基本用法:
```bash
/升级资料路径/v5/capture-device-raw-logs.sh \
38 \
60 \
10 \
http://127.0.0.1:8289/xdrrule \
/data/haobang/raw-log-captures
```
参数依次是:
1. 设备 ID;
2. 采集秒数,默认 60,最大 600;
3. 样本数,默认 10,最大 50;
4. `syslog-consumer-rule` 基础地址,默认 `http://127.0.0.1:8289/xdrrule`;
5. 本地输出目录,默认当前目录下的 `raw-log-captures`。
如果接口经过鉴权网关,可通过环境变量传入请求头:
```bash
RAW_CAPTURE_AUTH_HEADER='Authorization: Bearer 替换为现场令牌' \
./capture-device-raw-logs.sh 38 120 20 https://管理地址/xdrrule /data/raw-samples
```
## 输出文件
每次运行生成独立目录:
```text
device-38_20260914-190000_会话ID/
├── start.json
├── latest.json
├── result.json
├── samples.jsonl
├── session-id.txt
├── summary.txt
└── raw/
├── 001_normal_事件ID.log
└── 002_anomaly_事件ID.log
```
- `result.json`:最终完整 API 响应,是最完整的交付文件;
- `samples.jsonl`:每行一条样本及其处理状态、异常原因和原文;
- `raw/*.log`:每条原始报文单独保存,内容不添加分隔符,也不主动截断;
- `summary.txt`:会话时间、收到的消息数、异常数和替换数;
- `latest.json`:脚本被中断或等待超时时保留的最后一次有效快照。
脚本设置 `umask 077`,新生成文件默认只允许执行脚本的账号访问。
## 生命周期
状态依次为:
```text
SCHEDULED -> RUNNING -> DRAINING -> COMPLETED
```
采集时间到达后不再接收新日志,随后默认等待 30 秒,让窗口内日志的异步处理异常完成替换。进入
`COMPLETED` 后结果默认继续保留 30 分钟,之后 Redis TTL 自动删除。
脚本会一直轮询到 `COMPLETED` 并自动导出,不需要人工再次查询。关闭终端或脚本等待超时不会使服务端会话
永久运行,会话仍按上述时间自动结束。
## 常见问题
### 返回 503:现场原始日志采样功能未启用
确认实例没有通过环境变量设置 `SYSLOG_RAW_CAPTURE_ENABLED=false`,并确认实例已经升级到 v5 JAR。
### 返回 503:跨实例原始日志采样暂不可用
检查所有 `syslog-consumer-rule` 实例到 Redis 的网络、密码、数据库编号是否一致。Redis 故障只影响诊断
采集,不会中断主 Kafka 消费。
### 返回 429
活动采集会话达到上限。等待已有会话进入 `COMPLETED`,或核对是否有人重复创建采集任务。
### 脚本退出码为 2
表示客户端等待超时,但已经把最后一次有效快照写入输出目录。服务端会话仍会自动结束,可在结果保留期内
使用 `session-id.txt` 中的 ID 再查询:
```bash
curl 'http://127.0.0.1:8289/xdrrule/api/syslog/raw-captures/会话ID'
```