指标(Metrics)
配置
端点
访问控制规则:如果未配置
auth_token,只允许回环地址(127.x、::1)访问;如果配置了 auth_token,任意来源 IP 都必须带 Authorization: Bearer <token>。
Prometheus 指标参考
连接类指标:
请求/响应指标:
流量字节指标:
阶段耗时指标(
cli_read、up_conn、up_write、up_read、cli_write):
io_uring 健康指标:
上游连接池指标:arc_ring_sq_dropped_total或arc_ring_cq_overflow_total非 0,通常表示 ring 过小。请提高io_uring.uring_entries。
镜像流量指标:
日志子系统指标:
限流指标:
配置与路由指标:
TLS 与插件指标:
XDP 指标:
设计说明
worker 线程通过AtomicU64::fetch_add(Ordering::Relaxed)写指标,单指令、无锁。WorkerMetrics 使用 #[repr(C, align(64))],保证每个 worker 指标结构体占独立缓存行。管理端线程每 250ms 刷新一次指标快照。
访问日志(Access Logs)
Arc 输出结构化 NDJSON 访问日志,不提供纯文本格式。配置
日志字段
每条访问日志是一行 JSON 对象:
示例:
脱敏
Arc 在写日志前会做敏感信息脱敏:- Header:大小写不敏感匹配,值替换为
[REDACTED] - Query 参数:大小写不敏感匹配,值替换为
[REDACTED] - Body 字段:JSONPath 风格(
$.field.subfield),值替换为"[REDACTED]"
文件轮转
当当前日志文件超过max_size 时触发轮转,流程如下:
- 当前文件重命名为带时间戳的归档文件(元数据操作,几乎瞬时)
- 立即重开原路径继续写入,避免中断
- 如
compress: true,后台线程异步 gzip 压缩归档 - 仅保留
max_files数量的归档,其余删除
设计说明:不反压 worker
worker 把日志事件写入有界 SPSC ring。队列满时直接丢弃并增计数,不会阻塞业务线程。writer 线程负责汇聚 ring、手工编码 NDJSON(写时不走 serde),再通过 io_uringWrite 批量刷盘。
分布式追踪(Tracing)
Arc 实现了 W3C Trace Context。每个请求都会拥有trace_id 和 span_id,并写入访问日志,同时向上游透传。
Trace 上下文解析规则
traceparent 格式
- 2 位版本号(
00) - 32 位 trace ID(不能全 0)
- 16 位 span ID(不能全 0)
- 2 位 flags(
01表示 sampled)
上游透传
Arc 转发到上游时,会携带同一个trace_id,但生成新的 span_id,形成父子关系:
按 trace ID 查日志
OTLP 导出
故障排查
/metrics 返回 404 或连接被拒绝
/metrics 返回 404 或连接被拒绝
确认
observability.metrics_bind 已配置且 Arc 正在运行。默认是 127.0.0.1:9090,从其他主机访问会被拒绝。可先本机验证:curl http://127.0.0.1:9090/metrics。访问日志没有输出
访问日志没有输出
确认
observability.access_log.enabled: true,并且 logging.output.file 指向可写路径,同时 sample 不为 0.0。日志是异步写入,writer 忙时会出现短暂延迟。日志文件没有轮转
日志文件没有轮转
轮转条件是
FileState.offset >= RotationConfig.max_size_bytes。文件未达到阈值时不会轮转。可查看 /metrics 中 arc_log_written_total。如果开启压缩且 arc_log_compress_dropped_total 增长,说明压缩队列已满,需要降写入速率或提高 ARC_LOG_COMPRESS_QUEUE_CAPACITY。OTLP 后端看不到 Trace
OTLP 后端看不到 Trace
确认
observability.tracing.endpoint 从 Arc 到 collector 可达。如果 collector 没有 TLS,请设置 insecure: true。即便 OTLP 出口异常,也可以先看访问日志里的 trace_id 判断 Arc 本地 trace 是否正常生成。arc_worker_phase_*_seconds 相关直方图没数据
arc_worker_phase_*_seconds 相关直方图没数据
阶段耗时指标只有在请求完整经过对应处理阶段后才会出现。先确认 Arc 确实在处理代理流量。若在首批请求后才出现,通常属于预期行为。

