Skip to main content
Arc 提供三套可观测性子系统:Prometheus 指标、NDJSON 结构化访问日志、W3C 分布式追踪。

指标(Metrics)

配置

端点

访问控制规则:如果未配置 auth_token,只允许回环地址(127.x::1)访问;如果配置了 auth_token,任意来源 IP 都必须带 Authorization: Bearer <token>

Prometheus 指标参考

连接类指标: 请求/响应指标: 流量字节指标: 阶段耗时指标cli_readup_connup_writeup_readcli_write): io_uring 健康指标:
arc_ring_sq_dropped_totalarc_ring_cq_overflow_total 非 0,通常表示 ring 过小。请提高 io_uring.uring_entries
上游连接池指标: 镜像流量指标: 日志子系统指标: 限流指标: 配置与路由指标: TLS 与插件指标: XDP 指标:

设计说明

worker 线程通过 AtomicU64::fetch_addOrdering::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 时触发轮转,流程如下:
  1. 当前文件重命名为带时间戳的归档文件(元数据操作,几乎瞬时)
  2. 立即重开原路径继续写入,避免中断
  3. compress: true,后台线程异步 gzip 压缩归档
  4. 仅保留 max_files 数量的归档,其余删除

设计说明:不反压 worker

worker 把日志事件写入有界 SPSC ring。队列满时直接丢弃并增计数,不会阻塞业务线程。writer 线程负责汇聚 ring、手工编码 NDJSON(写时不走 serde),再通过 io_uring Write 批量刷盘。

分布式追踪(Tracing)

Arc 实现了 W3C Trace Context。每个请求都会拥有 trace_idspan_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 导出

故障排查

确认 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。文件未达到阈值时不会轮转。可查看 /metricsarc_log_written_total。如果开启压缩且 arc_log_compress_dropped_total 增长,说明压缩队列已满,需要降写入速率或提高 ARC_LOG_COMPRESS_QUEUE_CAPACITY
确认 observability.tracing.endpoint 从 Arc 到 collector 可达。如果 collector 没有 TLS,请设置 insecure: true。即便 OTLP 出口异常,也可以先看访问日志里的 trace_id 判断 Arc 本地 trace 是否正常生成。
阶段耗时指标只有在请求完整经过对应处理阶段后才会出现。先确认 Arc 确实在处理代理流量。若在首批请求后才出现,通常属于预期行为。