目录结构


概述(Overview)

01-overview.md


数据类型与指标

2. 可观测性数据类型总览(Telemetry Overview)

02-telemetry-overview.md


eBPF 技术与应用

03-bpf-overview.md


应用系统故障排查

4.1 故障排查整体流程

4.1.1 从客户端到服务端的请求路径

4.1.2 分层排查思路


4.2 应用请求关联指标的排查

4.2.1 响应时间

4.2.2 错误率

4.2.3 系统资源使用率

4.2.4 用户留存率

4.2.5 吞吐量


4.3 网络关键指标的排查

4.3.1 带宽利用率

4.3.2 延迟

4.3.3 丢包率

4.3.4 网络抖动

4.3.5 网络可用性

4.3.6 重传率

4.3.7 TCP 连接时间

4.3.8 DNS 查询时间

4.3.9 HTTP 请求成功率


4.4 日志分析与故障定位

4.4.1 网络日志分析

4.4.2 服务日志分析

4.4.3 应用日志分析


4.5 典型故障场景与案例分析

4.5.1 服务端异常

4.5.2 客户端异常

4.5.3 综合案例


附录

5.1 术语表

5.2 参考资料

5.3 工具与资源

5.4 生产级监控配置方案(Linux 裸机)

05-production-monitoring-linux-bare-metal.md

5.6 PostgreSQL + ClickHouse 分层写入架构

05-postgres-clickhouse-layered-architecture.md


架构设计与容灾

6.1 技术选型对比(Technology Selection Comparison)

06-technical-selection-comparison.md

6.2 总体架构设计

07-overall-architecture-design.md

6.3 多区域架构与区域内拓扑

08-multi-region-architecture-topology.md

6.4 端到端可靠传输设计(At-least-once 语义)

09-end-to-end-reliable-transmission-design.md

6.5 PostgreSQL 二级分析域

10-postgresql-secondary-analysis-domain.md

6.6 多区域与容灾(Disaster Recovery, DR)

11-multi-region-disaster-recovery.md

监控简史(Monitoring History)

7.1 漫谈监控简史到全栈可观测数据选型

12-1-monitoring-history-to-full-stack-observable-data-selection.md

7.2 典型运维工作场景

12-2-typical-operations-scenarios.md

可观测系统设计篇(Observability System Design)

8.1 边缘采集与网关的抉择

13-1-edge-collection-vs-gateway.md

8.2 OTel Gateway 的设计与思考

13-2-otel-gateway-design-considerations.md

8.3 数据采集多级持久化与可重放

13-3-data-ingestion-multi-level-persistence-and-replay.md

8.4 全栈可观测数据库设计

13-4-full-stack-observability-database-design.md

8.5 全栈可观测数据库 ETL 设计

13-5-full-stack-observability-database-etl-design.md

8.6 监控系统的多区域与容灾

13-6-monitoring-system-multi-region-and-dr.md

LLM OPS Agent 设计篇(LLM OPS Agent Design)

9.1 从 SSH/SCP 到 AI 驱动的 OPS Agent:落地前的思考

14-1-from-ssh-scp-to-ai-ops-agent-pre-deployment-considerations.md

9.2 从 SSH/SCP 到 AI 驱动的 OPS Agent:能力清单

14-2-from-ssh-scp-to-ai-ops-agent-capability-checklist.md

9.3 PostgreSQL 扩展驱动的复杂分析(向量 / 图 / 趋势)

14-3-postgresql-extension-driven-complex-analysis-vector-graph-trend.md

9.4 AI-OPS Agent MVP 架构方案

14-4-ai-ops-agent-mvp-architecture.md

Observability: An Overview

“Observability”(可观测性)是系统工程中的一个核心概念,尤其在分布式系统、云原生架构和微服务环境中至关重要。Observability 指的是通过系统外部可见的数据(如指标、日志、追踪信息等),推断系统内部状态并理解其运行行为的能力。它能够帮助工程师快速定位问题,优化性能,确保系统的可靠性和稳定性。


核心组成:从三大支柱到五大关键数据类型

传统上,Observability 的三大支柱是 Metrics(指标)、Logs(日志)和 Traces(分布式追踪)。在现代 Observability 中,这一体系已扩展为五大数据类型,涵盖 Events(事件)和 Profiles(性能剖析)。

1. Metrics(指标)

2. Logs(日志)

3. Traces(分布式追踪)

4. Events(事件)

5. Profiles(性能剖析)


CBPF/eBPF 与零代码开源 Agent 技术

现代 Observability 的实现得益于 CBPF/eBPF 技术,它们支持高性能、零代码的数据采集,并已催生出多种开源 Agent 工具。

CBPF 与 eBPF 技术概述

零代码开源 Agent

利用 eBPF 的强大能力,社区开发了多种开源工具,能够实现零代码的深度数据采集。

1. DeepFlow-Agent

2. Pixie

3. Cilium

4. Parca

5. Sysdig


关键术语

术语 定义
Monitoring 实时监控系统的健康状况和性能,用于快速检测异常。
Tracing 追踪请求在分布式系统中的传播路径,用于依赖关系和性能分析。
Logging 捕获系统运行时的信息,记录详细的事件历史。
Instrumentation 在代码中嵌入可观测性相关逻辑以生成数据,便于调试和监控。
CBPF 经典 BPF,主要用于简单的网络数据包过滤操作。
eBPF 扩展 BPF,可挂载到内核多个钩子点,支持复杂的监控和分析任务。
XDP 高性能网络数据包处理框架,运行在网络驱动层。

总结

Observability 是现代分布式系统中不可或缺的能力。通过 Metrics、Logs、Traces、Events 和 Profiles 的结合,以及 CBPF/eBPF、XDP 等强大的内核技术支持,我们能够全面了解系统的行为和状态,并快速诊断问题。结合 DeepFlow-Agent、Pixie、Cilium 等开源工具,可以轻松实现零代码、低开销的高效数据采集,保障系统的稳定性和性能。

概述

APM / NPM 一览

请在此添加图片描述

象限定位(X=APM 强度,Y=NPM 强度)

产品/厂商 类型定位 APM 能力(应用) NPM 能力(网络) 亮点 / 差异
乘云数字 DataBuff 综合型 有(链路追踪、AI 辅助) 有(依赖/拓扑) 国产化与行业落地(成本/合规友好)
DeepFlow NPM 起家 有一定(eBPF 侧采集) 强(eBPF+流量/拓扑/pcap) 零侵入、流量级全栈关联
科莱 Colasoft NPM 为主 强(抓包、协议解析、取证) 传统网络与取证场景
Dynatrace APM 为主 强(OneAgent、因果分析、数据湖仓) 中(网络依赖/集成) 自动化一体化强,企业级
Datadog 综合型 强(APM/Trace/RUM/Profiler) 中–强(USM/eBPF) 模块丰富、生态广
New Relic APM 为主 强(全栈 APM) 免费层友好、易上手
Apache SkyWalking APM 为主 强(Trace/Metrics/Logs) 中(Rover eBPF Profiling) 开源可控,国产替代佳
OpenTelemetry(OTel) 采集标准 N/A(SDK/Collector) N/A 统一三信号采集;需搭配后端
Grafana Labs(LGTM+Pyroscope) 平台拼装 Tempo=Trace(Grafana UI) Loki/Mimir 为主(可联动 Cilium/Hubble) 自建成本友好、组件化灵活
Rancher(Monitoring 组合) 多集群集成 接 OTel/Tempo/Prometheus 接 Prom/Loki(非专职 NPM) 多集群可观测与运维整合
SigNoz(开源) APM 为主 强(OTel 原生) 中(应用侧为主) “开源 Datadog 替代”路线
Cilium + Hubble(开源) NPM 为主 强(L3–L7 拓扑/依赖) K8s eBPF 网络观测标配
Pixie(开源) NPM/运行时 中(运行时剖析) 强(eBPF 自动采集) 零代码采集,研发/调试友好

国内(代表性做法)

公司 APM(应用观测) NPM/网络侧 主要栈/产品 公开亮点(摘)
字节跳动 自研/对外产品 APMPlus(火山引擎),内外统一用 OTel 采集;内部有 BytedTrace(统一 Tracing/Logging/Metrics 的平台化方案) (公开资料以应用侧为主,网络侧细节披露较少) APMPlus + OTel Collector(自动注入/接入)、CloudWeGo 生态 APMPlus 是字节内部大规模实践沉淀,对外提供全链路 APM;APMPlus×CloudWeGo 打造“一站式开发与观测”;OTel Collector 组件化部署。volcengine.com+2火山引擎开发者社区+2 另有 BytedTrace 作为内部一体化可观测方案报道。
京东 / 京东物流 自研 APM(京东云 APM 产品线、金融/物流落地),分布式链路追踪在金融/物流场景大规模推行 (公开材料更多聚焦业务/链路,不特指 eBPF 网络侧) 京东云 APM、金融场景分布式追踪实践(SGM 等)、大规模实时监控+AIOps 金融场景“分批接入、快速见效”,APM 与告警/认证/CMDB 体系打通;物流线 AIOps + APM 保障大促稳定。
美团 CAT(自研开源 APM,日处理百 TB 级数据)+ 终端日志平台 Logan;还有“可视化全链路日志追踪”的体系文章 (公开文更多在应用/日志/终端侧) CAT、Logan、可视化链路日志方案(与 ELK 辅助) CAT 深耕多年、规模化 APM 的代表;终端实时日志 Logan 提升客户端问题定位;对“日志→链路”可视化方法有系统沉淀。
滴滴 早期自研 DD-Falcon/夜莺(Nightingale) 体系覆盖监控与告警,含分布式调用链、异常检测、压测平台等整体可观测构件 有提到“网络/数据通道/日志平台”配合,但细节披露以平台化监控为主 DD-Falcon/夜莺(Nightingale)+ ES/实时数据通道 + 可观测架构多阶段演进 公开演讲/文稿显示:从监控系统到异常检测、压测平台的全链路能力;夜莺作为分布式高可用监控系统在混合云/K8s 场景落地。pic.huodongjia.com+2知乎专栏+2

说明:NPM(网络观测)层的公开披露在国内通常更少,不少公司把网络侧能力融合在平台里(如流量证据、依赖拓扑、网格可视化等),但未必单独称“NPM”。如果要专看“网络/eBPF/流量侧”的公开国产案例,DeepFlow 在运营商/银行/云厂商的实践文章较多

国外(代表性做法)

国外互联网大厂可观测实践:APM / NPM & 技术栈对比

公司 APM(应用观测) NPM / 网络侧 主体技术栈 / 组件 亮点与取舍
Uber Jaeger(自研并捐赠 CNCF;大规模分布式追踪) jaegertracing.io+1 Mesh/边车与网络指标结合(公开资料以应用侧为主) M3(超大规模指标平台)+ Jaeger + 自研采样与告警链路(uMonitor/Neris) Uber+3Uber+3M3+3 “自研核心 + 开源输出”路线:百万级指标与大规模追踪并行,重采样与告警可扩展性。
Netflix 以 Atlas 为主的运行时遥测,APM 由多组件协同(Tracing 常接 OTel/Jaeger/Tempo) netflix.github.io+2netflix.github.io+2 Envoy/Istio 等网格遥测配合(公开资料多在指标/平台侧) Atlas(维度时序、近实时运维洞察)+ Mesh 遥测接 OTel 后端 netflix.github.io+1 “指标为王”的实时运营视角:极强的在线查询与维度切片能力,Tracing 后端可插拔。
Google 以 OTel 标准为采集统一面(Cloud Operations/Stackdriver 体系) Istio/Envoy 遥测 + 云探针(ThousandEyes 等为行业常见补充) Monarch 星球级 TSDB(论文)+ OTel 采集 + Mesh 遥测 VLDB+1 “标准化采集 + 超大规模时序库”:统一三信号语义,后端服务化运营。
Meta(Facebook) 内部一体化观测(公开论文偏指标) 网络侧细节对外较少 Gorilla 内存 TSDB(论文)作为核心指标基座 VLDB+1 “指标压缩与近线价值”理念:高压缩、低延迟,强调近期数据的重要性。
Lyft 基于 OTel/Jaeger 等开源链路 Envoy(自研,后捐开源) 提供 L7 遥测/依赖拓扑 Envoy + OTel/Jaeger(或 Tempo)链路后端 envoyproxy.io+1 “以网格为基础设施”的观测:网络/应用边界自然打通。
Airbnb 大量采用 Datadog(APM/告警/仪表) Datadog+1 Datadog NPM/合规探针配合(公开分享以 APM/告警为主) Datadog SaaS 平台(监控即代码、统一告警) Datadog “SaaS 化省心”路线:工程团队聚焦业务,代价是规模化成本需精算。
SaaS 用户如 Slack/Shopify 常见于 Datadog / New Relic / Dynatrace 组合(厂商公开案例) NPM / Synthetics 结合 APM 使用 商用一体化平台 + OTel 接入 快速落地与运营省心,对数据量/留存的成本治理要求高。
Grafana 社区路线(Spotify 等) OTel + Tempo(Trace) Loki/Mimir + Cilium-Hubble(网络可视) “开源拼装”:OTel → Tempo/Jaeger;Logs→Loki;Metrics→Mimir/Cortex;NPM→Hubble “开源优先 + 成本可控”:需要更强的自运维与采样/留存策略。

快速对照(APM / NPM 归类视角)

区域 APM 主线(应用可观测) NPM 主线(网络/流量可观测) 一体化趋势
国内 阿里云 ARMS、自研 + OTel/SkyWalking;部分采用商用平台 DeepFlow、Cilium/Hubble 在云原生里普及;运营商/金融偏爱流量侧证据链 更强调无侵入 eBPF + 统一数据面,兼顾合规与私有化落地。
国外 自研(Netflix Atlas、Uber M3)+ 开源(Jaeger/OTel)+ 商用(Datadog/Dynatrace/New Relic) Envoy / Service Mesh + 流量遥测;NPM 与 APM 共同驱动 SLO OTel 标准化采集成共识,后端/可视化自由拼装。

共同趋势

  1. eBPF 上位、数据面“内核化”: 以零侵入内核态采集作为地基,贯通网络 ↔︎ 应用的断点,兼顾性能与覆盖。(国内:DeepFlow;海外:Pixie / 各厂 eBPF 模块) 采集标准化(OpenTelemetry),后端多样化
  2. 统一(Metrics/Logs/Traces)与语义,解耦采集与存储/分析,降低厂商锁定。后端按成本与能力自由组合(Tempo/Jaeger/Mimir/Loki、或商用;也有 Uptrace 这类一体化选择)。
  3. 成本治理成为刚需
  1. Trace 作为“上下文总线”:
  1. 平台一体化 + AIOps:

概述

可观测性领域的主要数据类型包括指标、日志、追踪、事件、性能剖析以及网络元组,这些数据为 SLA、SLO 和 SLI 提供量化基础。它们共同构成对系统健康状况的多维度观察。

对比

类型 目的 优势 常用工具
指标 持续监控系统资源与性能 结构化、易聚合、查询高效 Prometheus, CloudWatch
日志 记录详细事件与错误 上下文丰富、可追溯 ELK Stack, Loki
追踪 展现请求的端到端路径 还原调用链路、分析延迟 Jaeger, Zipkin
事件 捕获状态变更 触发实时告警 Kubernetes Events, PagerDuty
性能剖析 分析代码级资源消耗 定位热点与瓶颈 pprof, eBPF
网络元组 识别网络会话与协议 精确流量分类 NetFlow, DeepFlow
SLA/SLO/SLI 度量服务质量 统一服务级别标准 各类 SLO 平台

使用场景

eBPF 技术综述

概述

对比

CBPF 与 eBPF

特性 CBPF eBPF
用途 数据包过滤 网络过滤、性能分析、安全监控等
指令集 简单,功能有限 功能强大,支持复杂逻辑
运行环境 网络数据包 多种挂载点(网络、系统调用等)
验证器 严格的安全验证器
扩展性 强,支持用户态交互和多种映射类型
性能 接近 CBPF,有优化机制

传统模式与基于 Agent 的采集模式

维度 传统模式 基于 Agent 的采集模式
流量采集方式 流量镜像或旁路设备 eBPF/XDP 内核级采集
部署复杂度 需要交换机配置或旁路设备 只需在主机安装 Agent
协议解析能力 通常仅支持 L3/L4 支持全面的 L7 协议解析
数据粒度 粗粒度流量统计 细粒度流日志与性能指标
元数据关联 需手动关联容器、进程信息 自动关联主机、容器与 Kubernetes 元数据
性能开销 镜像可能带来带宽占用 内核级采集开销极低
动态环境支持 对 Kubernetes 等动态环境支持较弱 原生适配动态环境,扩展性强
安全性 镜像存在数据泄露风险 数据在内核空间处理,安全性更高

场景

4.1 故障排查整体流程

4.1.1 从客户端到服务端的请求路径

  1. DNS 解析
  2. TCP 连接建立
  3. TLS 握手(如适用)
  4. 请求发送与响应接收

4.1.2 分层排查思路


排查应用系统故障的详细步骤

应用系统故障排查需要从应用层到网络层系统性地进行分析。以下是结合应用指标、网络指标和日志分类的详细排查流程:

1. 明确故障现象和范围

1.1 收集用户反馈

1.2 划定故障范围

2. 从应用层开始排查

2.1 查看应用日志

目标:确定是否有内部错误(服务端异常)或客户端发送无效请求。

步骤

2.2 分析应用指标

排查要点

2.3 验证依赖服务

3. 从服务层排查

3.1 调用日志分析

目标:检查服务间调用是否正常,定位异常的服务节点。

步骤

3.2 服务依赖健康检查

目标:确认服务的健康状况。

步骤

4. 从网络层排查

4.1 查看流日志

目标:排查网络连接问题,确认流量是否正常到达。

步骤

4.2 分析网络指标

4.3 网络层问题验证

目标:判断是否为网络问题导致的故障。

步骤

5. 综合分析日志和指标

5.1 应用日志

ERROR: User authentication failed due to missing token.

markdown 复制代码

5.2 服务日志

Service A -> Service B [Timeout]

5.3 网络日志

TCP Retransmissions detected: 10% packets lost.

6. 常见故障场景及排查思路

故障现象 可能原因 排查方法
页面加载缓慢 服务响应时间长、数据库查询慢、网络延迟高 检查响应时间指标,分析慢查询日志,验证网络延迟和丢包。
HTTP 500 错误 服务端代码错误、资源耗尽、依赖服务不可用 查看应用日志中的异常堆栈,检查系统资源使用率,验证外部依赖服务状态。
HTTP 503 错误 服务过载或正在维护 检查系统资源使用情况,查看调用日志是否有过载信息,确认流量是否超出服务能力。
HTTP 404 错误 请求资源不存在 查看客户端请求路径是否正确,分析应用日志是否有未处理的资源。
无法连接服务 网络中断、DNS 解析失败、服务未启动 检查网络流日志,测试目标服务连接状态,验证 DNS 解析。
请求被中断或取消 客户端刷新、网络不稳定 查看客户端错误日志,分析网络连接稳定性。

7. 整体流程总结

  1. 确认现象:收集用户反馈,划定问题范围。
  2. 应用层分析:查看应用日志,确认是否存在服务端或客户端错误。
  3. 服务层分析:检查服务调用链,验证依赖服务健康状态。
  4. 网络层分析:通过流日志和网络指标,排查连接和链路问题。
  5. 综合定位:结合日志、指标和用户反馈,确认根因并制定修复方案。

通过系统性的排查方法,可以快速定位故障的来源并采取对应的解决措施。

4.2 应用请求关联指标的排查

应用请求关联指标可以帮助我们深入了解系统性能、稳定性和用户体验。通过对这些指标的分析,可以快速定位问题并采取相应的改进措施。以下是针对关键指标的详细排查方法。

4.2.1 响应时间

慢请求分析

目标:识别导致应用响应时间过长的原因,优化用户体验。

步骤

  1. 数据收集
  2. 确定慢请求阈值
  3. 筛选慢请求
  4. 分析慢请求原因

解决方案

依赖服务性能

目标:确保应用所依赖的外部服务(如数据库、缓存、第三方 API)运行正常。

步骤

  1. 监控依赖服务的性能指标
  2. 分析性能瓶颈
  3. 排查服务异常

解决方案

4.2.2 错误率

服务端异常 vs 客户端异常

目标:区分错误来源,以便采取针对性的解决措施。

服务端异常(5xx)

客户端异常(4xx)

排查方法

  1. 收集和分类错误日志
  2. 分析错误模式
  3. 复现问题场景

解决方案

HTTP 状态码分析

目标:通过分析 HTTP 状态码,了解系统运行状况和潜在问题。

常见状态码

分析步骤

  1. 统计各状态码的出现频率和比例
  2. 识别异常高的状态码
  3. 深入分析具体错误

解决方案

4.2.3 系统资源使用率

CPU 和内存监控

目标:确保系统有足够的计算和存储资源,防止性能下降或服务中断。

监控内容

排查步骤

  1. 设置资源使用的警戒线
  2. 实时监控和报警
  3. 分析资源消耗来源

解决方案

资源泄漏检测

目标:发现并修复程序中未正确释放的资源,防止长期运行导致的资源耗尽。

常见的资源泄漏类型

检测方法

  1. 监控资源使用的增长趋势
  2. 使用分析工具
  3. 代码审查

解决方案

4.2.4 用户留存率

用户行为分析

目标:通过分析用户的使用习惯和行为,提升用户满意度和产品竞争力。

关键指标

分析步骤

  1. 收集用户行为数据
  2. 构建用户行为模型
  3. 识别影响留存率的因素

解决方案

功能可用性检查

目标:确保应用的核心功能在任何时候都可用,提升用户满意度。

检查内容

排查步骤

  1. 建立功能测试用例
  2. 定期执行自动化测试
  3. 收集用户反馈

解决方案

4.2.5 吞吐量

负载测试

目标:评估系统在高并发访问下的性能,找出潜在的瓶颈。

测试流程

  1. 制定测试计划
  2. 设计测试场景
  3. 选择测试工具
  4. 执行测试
  5. 分析测试结果

解决方案

扩展能力评估

目标:确保系统能够随着业务增长而平滑扩展,满足未来需求。

评估内容

评估步骤

  1. 分析当前架构
  2. 设计扩展方案
  3. 验证扩展能力

解决方案


通过对上述指标的分析和排查,可以全面了解应用的运行状况,及时发现和解决问题,保障系统的稳定性和用户满意度。定期监控和优化这些关键指标,对于持续提升应用性能和竞争力至关重要。

4.3 网络关键指标的排查

在网络性能和可靠性方面,关键指标的监控和分析至关重要。通过对这些指标的深入了解和排查,可以有效提升网络服务质量,确保应用系统的稳定运行。以下是优先级最高的网络指标,这些指标直接影响应用的可用性、性能和用户体验,适合在网络性能优化中重点关注:

指标 定义 重要性 优先级
延迟 数据包从源到目的地传输所需的时间。 高延迟会影响实时应用(如视频会议、在线游戏)以及 API 的响应速度。
丢包率 传输中丢失数据包的比例。 高丢包率会导致重传或数据丢失,影响应用性能和用户体验。
带宽利用率 网络已使用带宽占总带宽的百分比。 带宽不足可能导致网络拥塞,带宽利用率低可能是资源浪费的信号。 中等
网络抖动 连续数据包之间延迟的变化幅度。 高抖动会对实时服务(如 VoIP 和视频流)造成明显影响,可能导致卡顿或失真。 中等
网络可用性 网络在特定时间内可正常运行的比例。 网络中断会导致服务不可用,对高可靠性应用影响严重。
重传率 因丢包或错误而需要重传的数据包比例。 重传增加了网络负载,降低了传输效率,可能进一步加剧延迟和拥塞。 中等
TCP 连接时间 建立 TCP 连接所需的时间。 长连接时间会影响首次请求的响应速度,特别是需要频繁建立连接的应用。 中等
DNS 查询时间 域名解析到 IP 地址所需的时间。 慢速的 DNS 查询会延长应用的请求启动时间,影响整体性能。 中等
HTTP 请求成功率 成功的 HTTP 请求占总请求的比例。 HTTP 请求失败会直接导致功能不可用或用户体验下降。

以下是对这些关键网络指标的详细分析和排查方法。

4.3.1 带宽利用率

流量监控

目标:实时监控网络带宽的使用情况,确保网络资源被合理利用,避免带宽瓶颈。

步骤

  1. 收集流量数据
  2. 分析带宽使用趋势
  3. 识别主要流量来源

解决方案

异常流量检测

目标:及时发现和处理异常流量,防止网络拥塞和安全问题。

步骤

  1. 设定基线
  2. 实时监控
  3. 识别异常行为

解决方案

4.3.2 延迟

网络路径优化

目标:降低网络延迟,提高数据传输效率,提升用户体验。

步骤

  1. 测量延迟
  2. 分析路径
  3. 优化路径

解决方案

地理位置影响

目标:理解地理位置对网络延迟的影响,针对性地优化跨地域通信。

分析

解决方案

4.3.3 丢包率

链路质量

目标:确保网络链路的可靠性,降低数据包丢失率。

步骤

  1. 监测丢包率
  2. 分析链路状态

解决方案

设备故障排查

目标:检查网络设备的健康状况,排除因设备故障导致的丢包。

步骤

  1. 设备日志检查
  2. 接口状态检查
  3. 固件和配置

解决方案

4.3.4 网络抖动

实时应用影响

目标:降低网络抖动对实时应用(如 VoIP、视频会议)的影响,保证服务质量。

分析

检测方法

解决方案

网络稳定性提升

目标:通过网络优化,提高整体网络的稳定性,减少抖动。

措施

4.3.5 网络可用性

冗余设计

目标:通过冗余设计,提升网络的可靠性,防止单点故障。

策略

实现方法

故障切换机制

目标:确保在故障发生时,系统能够自动切换到备用路径或设备,最小化服务中断。

步骤

  1. 配置故障检测
  2. 设定切换条件
  3. 测试切换流程

解决方案

4.3.6 重传率

拥塞控制

目标:通过拥塞控制,降低数据包重传率,提升网络效率。

分析

措施

传输优化

目标:优化传输协议和参数,减少重传,提升传输性能。

策略

解决方案

4.3.7 TCP 连接时间

握手延迟分析

目标:降低 TCP 连接建立的时间,提升用户访问速度。

分析

检测方法

解决方案

服务器性能

目标:提升服务器处理连接的能力,避免成为瓶颈。

措施

4.3.8 DNS 查询时间

DNS 服务优化

目标:降低 DNS 查询时间,加快域名解析速度。

措施

  1. 本地部署 DNS 服务器
  2. 优化 DNS 配置
  3. 提高 DNS 服务器性能

缓存策略

目标:通过缓存机制,加快 DNS 解析,提高查询效率。

策略

注意事项

4.3.9 HTTP 请求成功率

服务器健康检查

目标:确保服务器运行正常,提升 HTTP 请求的成功率。

措施

  1. 定期检测
  2. 健康检查接口
  3. 日志分析

解决方案

网络异常处理

目标:处理网络异常情况,确保 HTTP 请求的可靠传输。

措施

解决方案

TCP 传输超时机制整理

300ms 内没有收到 ACK 的场景

在 TCP 协议中,300ms内没有收到 ACK 这种情况通常发生在以下两个阶段之一:连接建立阶段数据传输阶段


1. 连接建立阶段 (Connection Establishment Phase)

描述

这是 TCP 的三次握手过程,用于建立可靠的连接。

ACK 的作用

示例流程

  1. SYN:发送方发送 SYN 请求建立连接。
  2. SYN+ACK:接收方返回 SYN+ACK
  3. ACK:发送方确认 ACK,连接建立完成。

300ms 超时的情况


2. 数据传输阶段 (Data Transmission Phase)

描述

在连接建立后,双方通过 TCP 数据包进行数据传输,每个数据段都需要 ACK 确认。

ACK 的作用

示例流程

  1. 发送数据:发送端发送一个 TCP 数据包。
  2. 返回 ACK:接收端成功接收数据后,返回 ACK 确认。
  3. 下一数据段:发送端收到 ACK 后,发送下一个数据段。

300ms 超时的情况


3. 阶段区别总结

阶段 ACK 的作用 300ms 超时的可能性
连接建立阶段 确保三次握手成功建立连接 网络延迟、丢包、目标主机不可达。
数据传输阶段 确认接收数据包,并告知发送端继续发送下一数据段 数据包或 ACK 丢失、接收端延迟、网络抖动。

如何应对 300ms 未收到 ACK 的情况?

1. 动态调整 RTO(重传超时时间)

2. TCP 快速重传 (Fast Retransmit)

3. 网络优化


通过对网络关键指标的深入分析和有效排查,可以显著提升网络的性能和可靠性。定期监控这些指标,及时发现并解决问题,对于保障应用系统的正常运行和用户满意度至关重要。

TCP 时延相关指标表

指标 定义 阶段 影响因素 区别
TCP 连接时延 三次握手所需时间 连接建立阶段 网络延迟、服务器响应速度 测量连接建立效率,不涉及后续数据传输。
RTT 数据包从源到目的地再返回的总时间 全过程 网络物理距离、拥塞 网络底层延迟的综合反映,是其他时延的基础。
初始时延 从请求到收到首字节的时间(TTFB) 连接建立 + 数据开始 TCP 握手时延、服务器响应 包括了 TCP 握手和服务器处理时间,反映用户可感知的响应延迟。
数据传输时延 从开始发送到完全接收数据的时间 数据传输阶段 带宽、窗口大小、丢包重传 强调传输阶段性能,与握手阶段无关。
抖动 数据包到达时间的波动性(Jitter) 全过程 网络稳定性 关注时间一致性,而非单次时延,主要影响实时性要求较高的应用。
重传时延 因丢包重传导致的额外延迟 数据传输阶段 丢包率、网络质量 表示丢包的代价,直接影响传输性能。
慢启动时延 TCP 连接初期,数据传输受限所需的时间 数据传输阶段 窗口大小、网络拥塞 仅影响传输初期,与稳定阶段性能无关,适用于大文件传输分析。

TCP 建连异常相关指标表

指标 定义 异常阶段 常见原因 区别
TCP 连接失败率 未完成三次握手的连接比例 全过程 网络丢包、服务器未监听、超时 反映总体连接失败的宏观指标,是性能排查的起点。
TCP 超时率 建连超时的比例 全过程 高延迟、丢包重传、服务器过载 专注超时问题,通常与网络延迟或服务器负载有关。
TCP 重试次数 建连中因丢包需要重传的次数 全过程 丢包率高、拥塞、路由问题 表示网络传输可靠性,过高可能导致建连失败或性能下降。
SYN 丢包率 客户端发送的 SYN 包未收到响应的比例 第一步 链路丢包、防火墙拦截 专注建连的第一步,反映初始连接的成功率。
SYN-ACK 失败率 服务端返回的 SYN-ACK 包未到达客户端的比例 第二步 服务端丢包、防火墙或 NAT 问题 分析服务端到客户端方向的网络问题。
RST 包率 建连过程中收到 RST 包的比例 全过程 服务端拒绝连接、防火墙或策略问题 表明服务端主动中断连接,可能涉及配置错误或策略限制。
建连延迟 完成三次握手的时间 全过程 高 RTT、丢包重传 偏向时延分析,高延迟可能导致连接超时或多次重传。
拒绝连接率 被服务器拒绝的连接比例 全过程 服务器端口未监听、超出连接限制 表明服务器端主动拒绝连接的情况。
防火墙拦截率 数据包被防火墙拦截的比例 全过程 防火墙规则错误或策略限制 特指中间设备干预导致的连接失败。
NAT 超时率 因 NAT 转换失败导致建连异常的比例 全过程 NAT 表溢出、超时配置不当 特指 NAT 相关问题,区别于常规的丢包或超时原因。

TCP 超时类型

超时类型 (中文) 状态 (英文) 默认值(Linux) 默认值(Windows) 默认值(macOS)
初始 RTO Initial RTO (Retransmission Timeout) 200ms - 1秒 300ms 1秒
最大重传超时 Maximum Retransmission Timeout 13-30分钟 240秒 9分钟
Keepalive 超时 Keepalive Timeout 7200秒(2小时) 7200秒(2小时) 7200秒(2小时)
连接建立超时 Connection Establishment Timeout 63秒 21秒 75秒
连接重置超时 Connection Reset Timeout 0秒 0秒 0秒

4.4 日志分析与故障定位

4.4.1 网络日志分析

流日志

流日志记录网络层的元数据,如源 IP、目标 IP、端口、协议和流量大小,用于分析网络流量和连接问题。

数据包日志

数据包日志捕获网络中的详细数据包信息,包括 MAC 地址、IP 地址、端口和负载内容,用于深入分析网络问题。


4.4.2 服务日志分析

调用链追踪

记录服务间调用或客户端与服务间的调用详情,包括请求时间、路径、参数和响应时间。

接口性能监控

通过调用日志中的响应时间和错误率,监控接口性能,定位瓶颈。


4.4.3 应用日志分析

错误堆栈

记录应用运行中的详细错误信息,包括异常堆栈和出错时的上下文。

业务逻辑验证

记录应用内部的关键业务事件(如订单状态、用户登录)和逻辑流程。


4.4.4 排查思路:从客户端到服务端

日志分析的排查思路可以按照以下顺序进行:应用日志 -> 接口调用日志 -> 流日志,逐步深入定位问题。

1. 应用日志


2. 接口调用日志


3. 流日志


排查流程示例

示例 1:客户端报错“服务不可用”

  1. 应用日志
  2. 接口调用日志
  3. 流日志

示例 2:客户端显示“网络请求失败”

  1. 应用日志
  2. 接口调用日志
  3. 流日志

4.4.5 日志类型分类表

大分类 日志类型 对应层面 主要内容 用途 典型工具或技术
应用日志 应用日志 应用层(业务逻辑) - 应用程序内部运行时的详细信息(如业务处理流程、变量状态、异常堆栈)。 - 排查应用内部逻辑错误。
- 记录业务事件(如订单处理、用户登录)。
- 调试和优化代码。
Log4j、SLF4J、ELK Stack、Fluentd
应用日志 HTTP 访问日志 应用层(HTTP 协议) - HTTP 请求和响应:方法(GET/POST)、路径、状态码、响应时间、用户代理。 - 分析网站流量。
- 监控接口性能和错误率。
Apache Logs、Nginx Access Logs
应用日志 DNS 查询日志 应用层(DNS 协议) - DNS 请求记录:查询域名、查询类型、响应时间。
- 是否缓存命中、查询结果(成功或失败)。
- 分析域名解析性能。
- 检测恶意域名访问或 DNS 放大攻击。
BIND DNS Logs、DNSCrypt Proxy Logs
应用日志 TLS 握手日志 会话层(TLS 协议) - TLS 握手的详细信息:握手阶段、加密算法、证书验证结果。 - 检测加密通信的失败原因(如证书过期、算法不匹配)。
- 分析加密通道的安全性。
OpenSSL Logs、Wireshark、SSL Labs Reports
服务日志 调用日志 服务层(接口层) - 服务间或客户端与服务间的调用详情(如请求时间、参数、状态码、响应时间)。 - 排查接口错误或调用失败。
- 分析接口性能(如响应时间和错误率)。
- 监控服务健康状况。
API Gateway Logs、Nginx Access Logs、Application APM Tools
网络日志 流日志 网络层/传输层 - 网络流量的元数据(如 IP 地址、端口、协议、流量大小)。
- 不包含具体的传输内容(仅元信息)。
- 分析网络流量。
- 排查网络连接问题(如丢包、延迟)。
- 安全事件监控(如检测异常访问)。
AWS VPC Flow Logs、Azure NSG Flow Logs、NetFlow、sFlow
网络日志 数据包日志 链路层/网络层 - 数据包的详细信息:MAC 地址、IP 地址、端口、协议标识。
- 数据包的头部和负载内容。
- 深入分析网络问题(如 MTU 不匹配、路由环路)。
- 网络入侵检测。
Wireshark、Tcpdump
网络日志 TCP 连接日志 传输层 - TCP 连接的状态:SYN、ACK、FIN、RST。
- 重传次数、握手失败。
- 分析连接状态(如建立失败)。
- 排查丢包或重传问题。
Wireshark、Nmap
应用日志 SMTP 日志 应用层(SMTP 协议) - 邮件发送和接收的状态:邮件来源、目标、传输状态、延迟、错误代码。 - 分析邮件服务器性能。
- 检测垃圾邮件或邮件服务异常。
Postfix Logs、Exim Logs
应用日志 VPN 日志 会话层/网络层 - VPN 连接的状态:握手时间、加密方式、连接 IP、断开原因。

4.5 典型故障场景与案例分析

4.5.1 服务端异常


4.5.2 客户端异常


4.5.3 综合案例

案例 1:应用-DNS 故障快速排查

场景:用户反馈应用无法访问,测试发现域名解析失败。 解决步骤: 1. 使用 nslookupdig 检查 DNS 配置和解析结果。 2. 排查 DNS 服务器状态,确认是否可用。 3. 更新 DNS 缓存,或临时切换到其他 DNS 服务(如 8.8.8.8)。 4. 检查网络路径中是否存在拦截(如防火墙或 NAT 问题)。


案例 2:应用-IO 性能问题定位分析

场景:批量处理任务时,应用性能急剧下降,分析发现磁盘 IO 过高。 解决步骤: 1. 使用 iostatiotop 工具查看磁盘 IO 状态,确认读写是否过于频繁。 2. 检查文件系统是否存在碎片,或日志文件是否持续增长。 3. 对 IO 密集型任务进行限速或分批处理,减轻瞬时压力。 4. 升级磁盘性能(如 SSD)或优化数据访问逻辑(如缓存)。


案例 3:应用-DB 性能问题定位分析

场景:数据库查询速度变慢,影响整体服务响应。 解决步骤: 1. 使用数据库自带的查询分析工具(如 EXPLAIN)定位慢查询。 2. 检查索引是否存在或合理,避免全表扫描。 3. 查看数据库服务器的资源使用情况,是否达到瓶颈。 4. 使用分库分表或读写分离的方式优化查询效率。


案例 4:应用-中间件性能问题定位分析

场景:消息队列积压严重,消费者处理速度明显下降。 解决步骤: 1. 检查消息队列的队列长度和吞吐量,确认瓶颈点。 2. 查看消费者的消费速率和日志,是否存在逻辑错误或阻塞。 3. 增加消费者实例或优化消费逻辑,提升处理能力。 4. 对非关键消息启用丢弃或延迟消费策略,避免影响核心业务。


案例 5:定位网络时延类故障

场景:用户反馈访问服务延迟明显增加,分析发现网络延迟异常。 解决步骤: 1. 使用 pingtraceroute 工具确认延迟节点或链路。 2. 检查网络路由是否发生变更,或是否存在拥塞点。 3. 使用 SD-WAN 或 MPLS 等技术优化网络路径。 4. 针对跨区域访问,启用 CDN 加速或服务节点本地化。


案例 6:洞察、定位云网络丢包类故障

场景:云环境中的服务稳定性下降,监控显示存在高丢包率。 解决步骤: 1. 使用云平台提供的网络监控工具查看丢包位置(如 VPC 内或跨区域)。 2. 排查相关网络设备(如网关、负载均衡器)的日志和健康状态。 3. 检查服务端和客户端的 MTU 设置,避免分片问题。 4. 增加链路冗余,或切换到不同区域的节点降低丢包影响。


通过对这些典型案例的分析和总结,可以为实际问题排查提供清晰的流程和有效的解决方案,同时为提升系统可靠性积累宝贵经验。

概述

结合原有的故障排查章节,本节总结了从客户端请求到服务端响应的完整排查思路,并梳理了应用指标、网络指标和日志分析的要点:

对比

维度 关注重点 常用工具 典型问题示例
应用指标 响应时间、错误率、资源使用、吞吐量 APM、监控面板、性能测试工具 慢查询、依赖服务超时
网络指标 延迟、丢包率、带宽利用率、重传率 NetFlow、ping、traceroute 链路拥塞、跨区域访问延迟
日志分析 应用日志、调用日志、网络流/数据包日志 ELK、Jaeger、Tcpdump 错误堆栈、HTTP 4xx/5xx 等

场景

PostgreSQL + ClickHouse 高性能分层写入架构

1. 架构目标

2. 架构总览

graph TD
    subgraph Client
        A[Vector Agent]
    end

    subgraph Transport
        A --> B[Unified API (REST/gRPC/OTel)]
    end

    subgraph Storage
        B --> C1[PostgreSQL (TimescaleDB + JSONB)]
        B --> C2[ClickHouse (OLAP 聚合)]
    end

    subgraph Query
        C1 --> D[Grafana / SQL API]
        C2 --> D
    end

3. 核心组件

3.1 API 层

使用 Go / Rust 编写 Ingest 网关: - /write/metrics → TimescaleDB - /write/logs → ClickHouse - /schema/register → 写入 table_registry 元数据表

3.2 PostgreSQL 写入端(实时指标)

CREATE TABLE metrics_events (
  time        TIMESTAMPTZ NOT NULL,
  app         TEXT,
  host        TEXT,
  labels      JSONB,
  value       DOUBLE PRECISION,
  trace_id    TEXT,
  level       TEXT
);
SELECT create_hypertable('metrics_events', 'time');

3.3 ClickHouse 写入端(归档聚合)

CREATE TABLE logs_events (
  timestamp DateTime,
  app       String,
  host      String,
  trace_id  String,
  message   String,
  labels    Nested(k String, v String)
) ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY (timestamp, app);

3.4 Schema 管理

CREATE TABLE table_registry (
  table_name TEXT PRIMARY KEY,
  schema     JSONB,
  created_at TIMESTAMPTZ DEFAULT now()
);

注册示例:

{
  "columns": [
    {"name": "time",   "type": "timestamp"},
    {"name": "value",  "type": "double"},
    {"name": "labels", "type": "jsonb"}
  ]
}

4. 参考配置

4.1 Vector 采集配置

[sources.prom]
type = "prometheus_scrape"
endpoints = ["http://localhost:9100/metrics"]

[sources.logs]
type = "journald"

[transforms.jsonify_logs]
type = "remap"
inputs = ["logs"]
source = '''
.structured = parse_json!(string!(.message))
'''

[sinks.pg]
type = "postgresql"
inputs = ["prom", "jsonify_logs"]
database = "metrics"
endpoint = "postgresql://user:pass@pg:5432/metrics"
table = "observability_events"
mode = "insert"
compression = "zstd"

[sinks.ch]
type = "clickhouse"
inputs = ["jsonify_logs"]
endpoint = "http://clickhouse:8123"
database = "default"
table = "logs"
compression = "gzip"

4.2 Grafana 查询示例

SELECT time_bucket('1 minute', event_time) AS ts, COUNT(*)
FROM observability_events
WHERE node = $__variable_node
  AND raw->>'source' = $__variable_source_type
  AND $__timeFilter(event_time)
GROUP BY ts
ORDER BY ts;
SELECT node, count() AS total
FROM logs
WHERE timestamp >= $__from AND timestamp <= $__to
GROUP BY node
ORDER BY total DESC
LIMIT 5;

5. 部署演进路径

阶段 特性 说明
单节点一体化 所有组件运行在一台主机 适合 PoC / 开发环境
多副本集群 API、PG、CH 分别部署为独立节点,可接入负载均衡 支持横向扩展与高可用
存算分离 引入 Kafka 等缓冲层,PG/CH 采用分布式与 Replication 写入与查询解耦,适合大规模场景

6. 测试验证方案

6.1 测试目标

目标类别 说明
💾 吞吐能力 是否能支撑 50K+ IOPS 持续写入并在高峰期达到 100K/s
🧠 查询能力 事件查询/统计分析响应稳定在 100~500ms
🔁 分层写入正确性 标签/类型是否正确路由至 PostgreSQL 与 ClickHouse
🔐 数据一致性 PostgreSQL 中 Trace、事件无漏写
📈 可观测性 Vector/PG/CH 与系统资源均可监控

6.2 基础环境准备

数据源模拟

工具 用途
vector generator / log-generator 模拟高负载日志流
OpenTelemetry demo 生成 Trace 数据
prometheus-testgen 生成 Metrics 样本

写入目标部署

系统 推荐配置
PostgreSQL 16+ + TimescaleDB + pg_partman
ClickHouse 24.4+ + ReplicatedMergeTree
Vector 支持 transforms 路由、sink 至 PG/CH
监控组件 node_exporter、pg_exporter、vector internal、CH monitor

6.3 测试维度与方法

6.3.1 吞吐验证

项目 方法 期望
最大持续写入 持续向 Vector 发送 JSON logs @ 50K/s,观察是否丢包 ACK latency < 500ms
高峰瞬时写入 峰值 100K/s 持续 1 min,观察 PG/CH 报错情况 无错误、吞吐稳定
网络抖动模拟 通过 tc 注入延迟/丢包,观察重试 数据无丢失

6.3.2 数据分层准确性

验证点 检查项
Trace 事件 → PostgreSQL 是否按时间/traceID 正确分区落表
普通日志 → ClickHouse 是否按标签写入 MergeTree 表
异常标签 是否触发 fallback/dead-letter

6.3.3 查询验证

类型 查询目标 预期性能
PostgreSQL 精确事件 → TraceID 查询 <200ms
ClickHouse 日志聚合 → app error rate <1s
联合 Trace + 日志聚合视图 <1.5s

6.3.4 资源使用验证

组件 监控项 期望值
Vector CPU < 300m、Mem < 300MB
PostgreSQL IOPS < 40K / WAL flush latency
ClickHouse Merge 负载、后台线程瓶颈

6.3.5 自动化脚本示例

for i := 0; i < 100000; i++ {
  body := map[string]interface{}{
    "app": "auth", "trace_id": fmt.Sprintf("t-%d", i), "message": "log",
    "ts": time.Now().UnixNano() / 1e6,
  }
  jsonBody, _ := json.Marshal(body)
  http.Post("http://localhost:9000/my-pg-sink", "application/json", bytes.NewBuffer(jsonBody))
}

6.4 异常与恢复测试

验证目标 方案 期望指标
Vector 重启/崩溃 高负载写入时重启 Vector,观察数据补写 无重复或漏写
PG/CH 停机 短暂下线数据库,观察 Vector 缓冲 自动重试,恢复后数据一致
网络断连恢复 使用 netem 模拟断网,检查重连 不丢失、不时序异常

6.5 可观测性与告警

验证目标 方案 期望指标
指标完备性 检查 Vector、PG、CH、OS 指标 覆盖率 > 95%
告警规则有效性 模拟 CPU/延迟异常触发告警 告警及时
日志追踪 通过集中日志跟踪关键事件 故障可快速定位

6.6 验证成功标准

维度 成功判定
写入链路 ≥ 95% 写入无丢失,ACK latency 稳定
数据正确性 PG 与 CH 数据能联查对齐,时间戳正确
系统资源 单节点 PG/CH/Vector CPU < 50%,无 OOM
查询性能 常用 Trace 查询 <500ms
异常处理 标签异常可自动 fallback 或告警记录

6.7 可选增强场景

7. 结语

通过 PostgreSQL + ClickHouse 的分层写入方案,可以在保证实时查询能力的同时实现高吞吐归档和聚合分析,为可观测性平台提供灵活、可扩展的存储基础。

生产级监控配置方案(Linux 裸机)

1. 目标

2. 目录 & 用户规划

# 安装目录
/opt/metrics-agent/
  ├─ node_exporter
  ├─ process_exporter
  └─ process_exporter.yml

# 日志目录
/var/log/atop/
/var/log/sysstat/

# 专用用户
useradd --system --no-create-home --shell /usr/sbin/nologin metrics

3. Node Exporter(系统级)

安装

cd /opt/metrics-agent
curl -L https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz \
  | tar xz --strip-components=1 -C /opt/metrics-agent --wildcards '*/node_exporter'

systemd 单元 /etc/systemd/system/node-exporter.service

[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
User=metrics
Group=metrics
ExecStart=/opt/metrics-agent/node_exporter \
  --web.listen-address=127.0.0.1:9100 \
  --collector.processes \
  --collector.filesystem.ignored-mount-points="^/(sys|proc|dev|run|var/lib/docker/.+)($|/)"
Restart=always

[Install]
WantedBy=multi-user.target

绑定 127.0.0.1,避免直接暴露公网,建议 Prometheus 通过内网采集或加反代。

4. Process Exporter(进程级)

安装

cd /opt/metrics-agent
curl -L https://github.com/ncabatoff/process-exporter/releases/download/v0.7.10/process-exporter-0.7.10.linux-amd64.tar.gz \
  | tar xz --strip-components=1 -C /opt/metrics-agent --wildcards '*/process-exporter'

配置文件 /opt/metrics-agent/process_exporter.yml

process_names:
  - name: "nginx"
    exe: ["^/usr/local/openresty/nginx/sbin/nginx$"]
    comm: ["^nginx$"]
    cmdline: ["nginx"]

  - name: "redis"
    exe: [".*/redis-server$"]
    comm: ["^redis-server$"]
    cmdline: ["redis-server"]

  - name: "postgres"
    exe: [".*/postgres$", ".*/postmaster$"]
    comm: ["^postgres$", "^postmaster$"]
    cmdline: ["postgres", "postmaster"]

  - name: "xcontrol-server"
    exe: ["^/usr/bin/xcontrol-server$"]
    comm: ["^xcontrol-server$"]
    cmdline: ["xcontrol-server"]

  - name: "other"
    cmdline: [".+"]

systemd 单元 /etc/systemd/system/process-exporter.service

[Unit]
Description=Prometheus Process Exporter
After=network.target

[Service]
User=metrics
Group=metrics
ExecStart=/opt/metrics-agent/process-exporter \
  --config.path=/opt/metrics-agent/process_exporter.yml \
  --web.listen-address=127.0.0.1:9256
Restart=always

[Install]
WantedBy=multi-user.target

5. 本地保底(atop + sysstat)

apt-get update
apt-get install -y atop sysstat

# sysstat: 每分钟采样,保留30天
sed -ri 's/^ENABLED=.*/ENABLED="true"/' /etc/default/sysstat
sed -ri 's/^HISTORY=.*/HISTORY=30/' /etc/default/sysstat
echo '* * * * * root sa1 60 1' > /etc/cron.d/sysstat
systemctl enable --now sysstat

# atop: 每分钟采样,保留30天
sed -ri 's/^LOGINTERVAL=.*/LOGINTERVAL=60/' /etc/default/atop || true
sed -ri 's/^LOGGENERATIONS=.*/LOGGENERATIONS=30/' /etc/default/atop || true
systemctl enable --now atop

回放命令

atop -r /var/log/atop/atop_$(date +%Y%m%d)
sar -u -f /var/log/sysstat/sa16   # 16日的CPU历史

6. Prometheus 抓取配置

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['<vm-ip>:9100']

  - job_name: 'process'
    static_configs:
      - targets: ['<vm-ip>:9256']

7. Grafana 面板

8. 加固要点

✅ 最终效果: - 在线:Prometheus + Grafana → 时序趋势 & 告警 - 离线/断联:atop/sysstat → 回放事后诊断 - 可扩展:如需应用级指标,可加 redis_exporter、postgres_exporter、nginx-lua-prometheus

Vector 统一采集架构与 DeepFlow Agent 对比

1. 架构概览

Vector 可以作为统一的采集出口,将系统、进程、网络和日志数据汇聚后再转发到不同的可观测性后端。

示例链路:

node_exporter ─┐
process_exporter ─┤
DeepFlow Agent ──▶ Vector Agent ──▶ Loki
journald/syslog ─┘                ├─▶ Prometheus Remote Write
                                  └─▶ Tempo

核心设计

2. 配置拆分与样例

Vector 支持将配置拆分为多个文件,主配置通过 includes 统一加载:

/etc/vector/
├── vector.yaml
├── sources/
│   ├── node_exporter.yaml
│   ├── process_exporter.yaml
│   └── journald.yaml
├── sinks/
│   ├── prometheus.yaml
│   └── loki.yaml
└── transforms/
    └── tags.yaml

主配置 vector.yaml

data_dir: /var/lib/vector
includes:
  - /etc/vector/sources/*.yaml
  - /etc/vector/sinks/*.yaml
  - /etc/vector/transforms/*.yaml

示例 source/sink 片段

# sources/node_exporter.yaml
sources:
  node_exporter:
    type: prometheus_scrape
    endpoints: ["http://localhost:9100/metrics"]
    scrape_interval_secs: 15

# sinks/prometheus.yaml
sinks:
  prometheus_out:
    type: prometheus_remote_write
    inputs: ["add_tags"]
    endpoint: "http://vm.example.com/api/v1/write"

拆分后可独立修改某个采集器配置,便于模块化维护和热更新。

3. 高负载下的可靠性机制

Vector 在高负载场景中通过多层保护减少数据丢失:

机制 说明
背压控制 当下游拥塞时暂停上游读取,防止爆仓
缓冲策略 支持内存或磁盘缓冲,when_full = "block" 默认阻塞而非丢弃
重试与限流 对 Loki、Prometheus 等 sink 内置重试与 backoff,支持 rate_limit
降级策略 drop_on_full = false,尽量保留数据
自监控指标 /metrics 暴露 events_dropped_totalbuffer_overflows_total 等指标供告警

4. 采集器能力对比

特性/组件 node_exporter process-exporter DeepFlow Agent Vector Agent
安装体积 <20MB <20MB ≈70–100MB ≈70MB
资源占用 极低 中等(依赖 eBPF) 低~中,可限内存
采集维度 主机资源 进程资源 网络四/七层 指标、日志、链路
输出能力 Prometheus Prometheus DeepFlow Collector Prometheus、Loki、Tempo 等
可靠性 无背压 无背压 重试有限 背压 + 缓冲 + 重试

Vector 在可靠性、可扩展性与自观测能力上相较 DeepFlow Agent 更为成熟,后者适合作为网络事件探针。

5. 渐进式部署路线

  1. 平台自身稳定性:部署 node_exporter、process-exporter 与 Vector,先掌握主机与关键进程状态。
  2. 网络可观测:引入 DeepFlow Agent,分析 L4/L7 流量,后端可用 ClickHouse + Grafana 展示。
  3. 日志聚合:Vector 同步写入 Loki 或其他日志系统,辅助故障排查与审计。
  4. 链路追踪:启用 Vector → Tempo 或 OTLP,将 DeepFlow 产出的 trace 信息整合展示。
  5. 示例 process-exporter 配置yaml process_names: - name: "deepflow-agent" cmdline: ["deepflow-agent"] - name: "clickhouse" cmdline: ["clickhouse-server"]

6. Server 端存储选型

为了在后端构建统一、弹性、低成本的可观测平台,可按数据类型选用以下组件:

Metrics:VictoriaMetrics

Logs:Loki

Traces:Tempo

结构化数据:PostgreSQL(可选)

推荐部署组合

数据类型 后端存储 采集/转发组件 说明
Metrics VictoriaMetrics vmagent / Vector 远程写入并归档到对象存储
Logs Loki Vector 按小时本地留存,按日归档到 S3
Traces Tempo otel-collector / Vector 可按需采样与压缩
结构化数据 PostgreSQL (+Timescale) 应用或 ETL 用于业务事件与分析

组合优势

7. 总结

通过 Vector 构建统一采集出口,可在保证稳定性的同时整合指标、日志、链路与结构化数据。DeepFlow Agent 专注网络可观测,结合推荐的后端存储组件,可形成覆盖系统到业务的完整可观测体系。

技术选型对比

边缘采集对比

网关对比

存储对比

分析层对比

总体架构设计

边缘采集与缓冲

区域网关与扇出

存储与分析层

双链路(近线检索 + Kafka 回放)

多区域架构与区域内拓扑

区域内拓扑(单区示例)

多区域部署模式(主区 + 从区)

联邦查询与统一入口

端到端可靠传输设计(At-least-once 语义)

多级持久化链(Vector → OTel → Kafka → OpenObserve)

扇出与去重策略(event_id + UPSERT)

SRE 可观测与演练方法

PostgreSQL 二级分析域

IT咖啡馆|全栈可观测数据库设计

线 I/O 面交给 OpenObserve(OO),治理/知识面沉到 PostgreSQL 栈(Timescale + AGE + pgvector)。保留明细在 OO,只把聚合、摘要、索引与证据链写回 PG:既省钱、又好查、也好演进。


摘要

本文落地一套「全栈可观测」数据库设计:明细进 OO,PG 仅存 12 张核心表(维度、定位符、指标 1m、服务调用 5m、日志指纹/计数、拓扑时态、知识库、事件/证据),并用 AGE 维护“当前服务级调用图”。给出可直接执行的 DDL、保留与压缩策略、典型查询与接入流程。


设计目标

分层原则


数据模型总览(12 表 + AGE)

维度(2)dim_tenantdim_resource

定位符(1)oo_locator(对象存路径 + 时间窗 + 查询 hint)

聚合(3)metric_1mservice_call_5mlog_pattern_5m

指纹(1)log_pattern

拓扑(1)topo_edge_time(边 + 有效期)

知识(2)kb_dockb_chunk(HNSW 向量索引)

事件(2)event_envelopeevidence_link

图(AGE):仅维护“服务级调用图”的活跃子图(10 分钟窗口)。

注:日志明细、trace span、指标原始点位 不入 PG,统一留在 OO。


表设计与策略(逐表解读)

1)维度

策略


2)OO 定位符

策略


3)指标聚合(1 分钟)

策略


4)服务级调用聚合(5 分钟)

用途

策略:留存 365 天,适配容量评估与 SLO 分析。


5)日志指纹/计数(5 分钟)

策略


6)拓扑时态

策略


7)知识库 / 向量

策略


8)事件与证据链

关键修正


图:只维护“当前 10 分钟活跃调用图”


最小化接入流程

写入

  1. 明细 → OO(logs/traces/metrics);
  2. 近线作业在 OO 内计算聚合:写入 metric_1mservice_call_5mlog_pattern_5m
  3. 同步 oo_locator(对象路径 + 时间窗 + hint);
  4. 用聚合结果刷新 AGE 活跃调用图。

读取

默认留存


典型查询

1)过去 30 分钟某服务下游 Top‑5 慢/错依赖

SELECT d.urn AS dst, avg(p95_ms) AS p95, avg(err_rate) AS err
FROM service_call_5m c
JOIN dim_resource s ON s.resource_id = c.src_resource_id
JOIN dim_resource d ON d.resource_id = c.dst_resource_id
WHERE s.urn = $service_urn
  AND c.bucket >= now() - interval '30 minutes'
GROUP BY d.urn
ORDER BY p95 DESC, err DESC
LIMIT 5;

2)按事件拉取证据(含 OO 回查线索)

SELECT e.event_id, e.title, e.detected_at, r.urn,
       ev.dim, ev.ref_pg, ol.bucket, ol.object_key, ol.query_hint
FROM event_envelope e
JOIN dim_resource r ON r.resource_id = e.resource_id
LEFT JOIN evidence_link ev ON ev.event_id = e.event_id
LEFT JOIN oo_locator   ol ON ol.id = ev.ref_oo
WHERE e.event_id = $1;

3)恢复“某一时刻”的服务级拓扑

SELECT s.urn AS src, d.urn AS dst, t.relation
FROM topo_edge_time t
JOIN dim_resource s ON s.resource_id = t.src_resource_id
JOIN dim_resource d ON d.resource_id = t.dst_resource_id
WHERE t.tenant_id = $tenant
  AND t.valid @> $timestamp::timestamptz;

与「全塞 PG」的对比


运维与演进建议


附录 A:可直接执行的 DDL(含扩展/索引/策略)

-- 0) 扩展(一次性)
CREATE EXTENSION IF NOT EXISTS timescaledb;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS pgcrypto;  -- gen_random_uuid
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS age;       -- 图扩展(服务级调用图)
LOAD 'age';
CREATE EXTENSION IF NOT EXISTS btree_gist; -- 用于时态拓扑范围索引

-- 1) 维度(2)
CREATE TABLE dim_tenant (
  tenant_id   BIGSERIAL PRIMARY KEY,
  code        TEXT UNIQUE NOT NULL,
  name        TEXT NOT NULL,
  labels      JSONB DEFAULT '{}'::jsonb,
  created_at  TIMESTAMPTZ DEFAULT now()
);

CREATE TABLE dim_resource (
  resource_id BIGSERIAL PRIMARY KEY,
  tenant_id   BIGINT REFERENCES dim_tenant(tenant_id),
  urn         TEXT UNIQUE NOT NULL,
  type        TEXT NOT NULL,
  name        TEXT NOT NULL,
  env         TEXT,
  region      TEXT,
  zone        TEXT,
  labels      JSONB DEFAULT '{}'::jsonb,
  created_at  TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_res_type ON dim_resource(type);
CREATE INDEX idx_res_labels_gin ON dim_resource USING GIN(labels);

-- 2) OO 定位符(1)
CREATE TABLE oo_locator (
  id          BIGSERIAL PRIMARY KEY,
  tenant_id   BIGINT REFERENCES dim_tenant(tenant_id),
  dataset     TEXT NOT NULL,             -- logs / traces / metrics
  bucket      TEXT NOT NULL,
  object_key  TEXT NOT NULL,
  t_from      TIMESTAMPTZ NOT NULL,
  t_to        TIMESTAMPTZ NOT NULL,
  query_hint  TEXT,
  attributes  JSONB DEFAULT '{}'::jsonb
);
CREATE INDEX idx_oo_time ON oo_locator(dataset, t_from, t_to);

-- 3) 指标聚合(1m,Hypertable)
CREATE TABLE metric_1m (
  bucket       TIMESTAMPTZ NOT NULL,
  tenant_id    BIGINT REFERENCES dim_tenant(tenant_id),
  resource_id  BIGINT REFERENCES dim_resource(resource_id),
  metric       TEXT NOT NULL,
  avg_val      DOUBLE PRECISION,
  max_val      DOUBLE PRECISION,
  p95_val      DOUBLE PRECISION,
  labels       JSONB DEFAULT '{}'::jsonb
);
SELECT create_hypertable('metric_1m','bucket',chunk_time_interval => interval '7 days');
CREATE INDEX idx_metric_key ON metric_1m(resource_id, metric, bucket DESC);
CREATE INDEX idx_metric_labels ON metric_1m USING GIN(labels);
ALTER TABLE metric_1m SET (
  timescaledb.compress,
  timescaledb.compress_segmentby = 'resource_id, metric',
  timescaledb.compress_orderby   = 'bucket'
);
SELECT add_compression_policy('metric_1m', INTERVAL '7 days');
SELECT add_retention_policy   ('metric_1m', INTERVAL '180 days');

-- 4) 服务级调用聚合(5m,Hypertable)
CREATE TABLE service_call_5m (
  bucket          TIMESTAMPTZ NOT NULL,
  tenant_id       BIGINT REFERENCES dim_tenant(tenant_id),
  src_resource_id BIGINT REFERENCES dim_resource(resource_id),
  dst_resource_id BIGINT REFERENCES dim_resource(resource_id),
  rps             DOUBLE PRECISION,
  err_rate        DOUBLE PRECISION,
  p50_ms          DOUBLE PRECISION,
  p95_ms          DOUBLE PRECISION,
  sample_ref      BIGINT REFERENCES oo_locator(id),
  PRIMARY KEY(bucket, tenant_id, src_resource_id, dst_resource_id)
);
SELECT create_hypertable('service_call_5m','bucket',chunk_time_interval => interval '30 days');
CREATE INDEX idx_call_src_dst ON service_call_5m(src_resource_id, dst_resource_id, bucket DESC);
SELECT add_retention_policy('service_call_5m', INTERVAL '365 days');

-- 5) 日志指纹(去重)+ 5m 计数(2)
CREATE TABLE log_pattern (
  fingerprint_id  BIGSERIAL PRIMARY KEY,
  tenant_id       BIGINT REFERENCES dim_tenant(tenant_id),
  pattern         TEXT NOT NULL,
  sample_message  TEXT,
  severity        TEXT,
  attrs_schema    JSONB DEFAULT '{}'::jsonb,
  first_seen      TIMESTAMPTZ,
  last_seen       TIMESTAMPTZ
);
CREATE INDEX idx_logpat_tenant ON log_pattern(tenant_id);
CREATE INDEX idx_logpat_pattern_trgm ON log_pattern USING GIN (pattern gin_trgm_ops);

CREATE TABLE log_pattern_5m (
  bucket         TIMESTAMPTZ NOT NULL,
  tenant_id      BIGINT REFERENCES dim_tenant(tenant_id),
  resource_id    BIGINT REFERENCES dim_resource(resource_id),
  fingerprint_id BIGINT REFERENCES log_pattern(fingerprint_id),
  count_total    BIGINT NOT NULL,
  count_error    BIGINT NOT NULL DEFAULT 0,
  sample_ref     BIGINT REFERENCES oo_locator(id),
  PRIMARY KEY(bucket, tenant_id, resource_id, fingerprint_id)
);
SELECT create_hypertable('log_pattern_5m','bucket',chunk_time_interval => interval '30 days');
CREATE INDEX idx_logpat5m_res ON log_pattern_5m(resource_id, bucket DESC);
SELECT add_retention_policy('log_pattern_5m', INTERVAL '180 days');

-- 6) 拓扑时态(1)
CREATE TABLE topo_edge_time (
  tenant_id       BIGINT REFERENCES dim_tenant(tenant_id),
  src_resource_id BIGINT REFERENCES dim_resource(resource_id),
  dst_resource_id BIGINT REFERENCES dim_resource(resource_id),
  relation        TEXT NOT NULL,
  valid           tstzrange NOT NULL,  -- [from, to)
  props           JSONB DEFAULT '{}'::jsonb,
  PRIMARY KEY(tenant_id, src_resource_id, dst_resource_id, relation, valid)
);
CREATE INDEX idx_topo_valid ON topo_edge_time USING GIST (tenant_id, src_resource_id, dst_resource_id, valid);

-- 7) 知识库 / 向量(2)
CREATE TABLE kb_doc (
  doc_id     BIGSERIAL PRIMARY KEY,
  tenant_id  BIGINT REFERENCES dim_tenant(tenant_id),
  source     TEXT,
  title      TEXT,
  url        TEXT,
  metadata   JSONB DEFAULT '{}'::jsonb,
  created_at TIMESTAMPTZ DEFAULT now()
);

CREATE TABLE kb_chunk (
  chunk_id   BIGSERIAL PRIMARY KEY,
  doc_id     BIGINT REFERENCES kb_doc(doc_id) ON DELETE CASCADE,
  chunk_idx  INT NOT NULL,
  content    TEXT NOT NULL,
  embedding  vector(1536) NOT NULL,
  metadata   JSONB DEFAULT '{}'::jsonb
);
CREATE INDEX idx_kb_chunk_doc ON kb_chunk(doc_id, chunk_idx);
CREATE INDEX idx_kb_chunk_meta ON kb_chunk USING GIN(metadata);
CREATE INDEX idx_kb_vec_hnsw ON kb_chunk USING hnsw (embedding vector_l2_ops);

-- 8) 事件 & 证据链(2)
DO $$ BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'severity') THEN
    CREATE TYPE severity AS ENUM ('TRACE','DEBUG','INFO','WARN','ERROR','FATAL');
  END IF;
END $$;

CREATE TABLE event_envelope (
  event_id     UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  detected_at  TIMESTAMPTZ NOT NULL DEFAULT now(),
  tenant_id    BIGINT REFERENCES dim_tenant(tenant_id),
  resource_id  BIGINT REFERENCES dim_resource(resource_id),
  severity     severity NOT NULL,
  kind         TEXT NOT NULL,     -- anomaly/slo_violation/deploy/incident/...
  title        TEXT,
  summary      TEXT,
  labels       JSONB DEFAULT '{}'::jsonb,
  fingerprints JSONB DEFAULT '{}'::jsonb
);
CREATE INDEX idx_event_time ON event_envelope(tenant_id, detected_at DESC);

-- 注意:主键不能用表达式,改为自增 + 唯一索引(ref_pg 哈希 + ref_oo)
CREATE TABLE evidence_link (
  evidence_id BIGSERIAL PRIMARY KEY,
  event_id    UUID NOT NULL REFERENCES event_envelope(event_id) ON DELETE CASCADE,
  dim         TEXT NOT NULL,  -- metric/log/trace/topo/kb
  ref_pg      JSONB,          -- {"table":"...","keys":{...}}
  ref_oo      BIGINT REFERENCES oo_locator(id),
  note        TEXT,
  ref_pg_hash TEXT GENERATED ALWAYS AS (md5(coalesce(ref_pg::text, ''))) STORED
);
CREATE UNIQUE INDEX ux_evidence_unique
  ON evidence_link(event_id, dim, ref_pg_hash, coalesce(ref_oo, 0));
CREATE INDEX idx_evidence_event ON evidence_link(event_id);

-- AGE 图:初始化(一次)
SELECT * FROM create_graph('ops');
SELECT * FROM create_vlabel('ops', 'Resource');
SELECT * FROM create_elabel('ops', 'CALLS');

附录 B:AGE 活跃调用图刷新(示例)

WITH active AS (
  SELECT tenant_id, src_resource_id, dst_resource_id,
         max(bucket) AS last_seen,
         avg(rps) AS rps, avg(err_rate) AS err_rate, avg(p95_ms) AS p95_ms
  FROM service_call_5m
  WHERE bucket >= now() - interval '10 minutes'
  GROUP BY 1,2,3
)
SELECT * FROM cypher('ops', $$
  UNWIND $rows AS row
  MERGE (s:Resource {tenant_id: row.tenant_id, resource_id: row.src})
  MERGE (d:Resource {tenant_id: row.tenant_id, resource_id: row.dst})
  MERGE (s)-[e:CALLS]->(d)
  ON CREATE SET e.first_seen = row.last_seen
  SET e.last_seen = row.last_seen, e.rps = row.rps, e.err_rate = row.err_rate, e.p95 = row.p95
  RETURN 1
$$) AS (ok int)
PARAMS (rows := (
  SELECT json_agg(json_build_object(
    'tenant_id', tenant_id, 'src', src_resource_id, 'dst', dst_resource_id,
    'last_seen', last_seen, 'rps', rps, 'err_rate', err_rate, 'p95', p95_ms))
  FROM active));

收尾

这套「OO 扛明细 + PG 扛治理」的极简方案能把近线排障、影响面分析与知识复用串成闭环:

多区域与容灾(Disaster Recovery, DR)

接入与路由(Anycast/GeoDNS)

跨区复制与镜像(Kafka MirrorMaker2)

阈值控制与降级策略

历史回放与灰度演练

From Monitoring History to Full-Stack Observable Data Selection

An overview of how monitoring evolved into modern full-stack observability and the key considerations when choosing diverse data sources.

1. 概述(ETL-OO2PG & AGE 活跃调用图 & 拓扑/IaC/Ansible)

[exporter]                     [Vector]         [OTel GW]        [OpenObserve]
NE ─┐                      ┌─────────┐      ┌──────────┐     ┌─────────────┐
PE ─┼── metrics/logs ────> │ Vector  │ ───> │ OTel GW  │ ──> │      OO      │
DF ─┤                      └─────────┘      └──────────┘     └─────────────┘
LG ─┘

                       (近线窗口 ETL: 对齐=1m · 延迟=2m)
                                        │
                                        ▼
                         ┌──────────────────────────────────────┐
 IaC/Cloud  ────────────>│                                      │
                         │   ObserveBridge (ETL 任务)           │
 Ansible     ───────────>│   • ETL 窗口聚合 / oo_locator        │
                         │   • 拓扑 (IaC/Ansible)               │
 OO 明细(OO→OB)  ───────>│   • AGE 10 分钟活跃调用图刷新        │
                         └──────────────────────────────────────┘

┌─────────────────────────────── Postgres 套件 ───────────────────────────────┐
│   PG_JSONB            │   PG Aggregates (Timescale)   │  PG Vector  │  AGE   │
│ (oo_locator/events)   │ (metric_1m / call_5m / log_5m)│ (pgvector)  │ Graph  │
└───────────────┬────────┴───────────────┬──────────────┴─────────────┬────────┘
                │                        │                             │
                │                        │                             │
                ▼                        ▼                             ▼
                         [ llm-ops-agent / 应用消费(查询/检索/推理) ]

目标:在单二进制 Go 编排器内,完成三条主干 ETL 闭环:

调度特性:窗口对齐 + 延迟容忍 + DAG 依赖 + 幂等 Upsert + 分片多租户

可靠性:PG 唯一索引保证一次性;指数退避重试;失败熔断;事件补数回放。


2. 项目目录(合并版)

etl/
├─ cmd/etl/                   # 二进制入口/CLI
│  └─ main.go
├─ pkg/
│  ├─ scheduler/              # 调度器(窗口计算/派发)
│  ├─ runner/                 # Worker+ 执行/重试/回调
│  ├─ registry/               # Job 接口 + 注册中心 + DAG
│  ├─ store/                  # 状态/一次性保证/简易队列(PG)
│  ├─ window/                 # 时间对齐/窗口工具
│  ├─ events/                 # 事件入口(HTTP/CloudEvents风格)
│  ├─ oo/                     # OO 读取(S3 客户端 + 查询 API 适配)
│  ├─ agg/                    # 聚合器(指标1m / 调用5m / 指纹5m)
│  ├─ patterns/               # 日志指纹挖掘(Drain / RE2)
│  ├─ iac/                    # IaC/Cloud 归一(TF/Pulumi/aws/aliyun…)
│  ├─ ansible/                # Playbook/Inventory 解析与依赖抽取
│  └─ pgw/                    # PG 写入器(COPY 批量 + 幂等 upsert)
├─ jobs/
│  ├─ ooagg.go                # OO → metric_1m / call_5m / log_5m / locator
│  ├─ age_refresh.go          # 近10分钟活跃调用图刷新(依赖 ooagg)
│  ├─ topo_iac.go             # IaC/Cloud → topo_edge_time(时态差分)
│  └─ topo_ansible.go         # Ansible → topo_edge_time(时态差分)
├─ sql/
│  └─ age_refresh.sql         # AGE 刷新 SQL
└─ configs/
   └─ etl.yaml                # 调度/并发/延迟 配置

3. 表/模块总览(合并表)

下面是模块—接口—数据源/目标—窗口/键—幂等的一览表(开发/联调用)。

模块 API/入口 SRC(输入) DEST(输出) 窗口/键 幂等/唯一约束 备注
pkg/oo Stream(ctx, tenant, w, fn) OO(S3 分区或查询 API)logs/metrics/traces 回调 oo.Record w=[From,To) 统一时间/URN;并发读取
pkg/agg Feed(rec) / Drain() oo.Record Metrics1m / Calls5m / LogPatterns5m / PatternsUpsert / Locators 1m/5m 内存桶聚合、指纹抽取
pkg/pgw Flush(ctx, tenant, w, out) 聚合结果 out metric_1m、service_call_5m、log_pattern_5m、log_pattern、oo_locator、dim_resource 1m/5m 主键 ON CONFLICT DO UPDATE;oo_locator 唯一 PG 批量 COPY + Upsert
jobs/ooagg Run(ctx, tenant, w) pkg/oo → pkg/agg pkg/pgw.Flush Align=1m;Delay=2m 由目标表主键保证 成功后触发 age-refresh
sql/age_refresh.sql cypher(‘ops’, …) service_call_5m 近10分钟 AGE 图 CALLS 边 10 分钟 MERGE 唯一匹配 e.last_seen/rps/err/p95
jobs/age_refresh Run(ctx, tenant, w) service_call_5m 执行 SQL Align=5m After()=“oo-agg”
pkg/iac Discover(ctx, tenant) TF/Pulumi/Cloud API 边集合 []Edge 构造 URN、relation
pkg/ansible ExtractDeps(ctx, tenant) inventory/group_vars/roles 边集合 []Edge 解析 upstream/连接串
pkg/pgw UpsertTopoEdges(ctx, tenant, edges) iac/ansible 边 topo_edge_time(时态) valid tstzrange PK(tenant,src,dst,rel,valid) 差分开/关区间
jobs/topo_iac Run(ctx, tenant, w) pkg/iac.Discover topo_edge_time Align=15m 结构拓扑
jobs/topo_ansible Run(ctx, tenant, w) pkg/ansible.ExtractDeps topo_edge_time Align=1h 应用依赖拓扑
pkg/events /events/enqueue CloudEvents/HTTP etl_job_run 状态置 queued 任意窗口 ux_job_once 手动补数/回放
pkg/store EnqueueOnce/Mark* etl_job_run job/tenant/window ux_job_once 一次性保证/队列
pkg/scheduler Tick() dim_tenant & etl_job_run 入队窗口 Align/Delay/Lookback 动态加载配置

相关 PG 表(12 + ETL 元数据)


4. 设计要点与边界


5. Codex Tasks(落地清单)

每个任务包含:name / 描述 / 测试-验证。可直接拆成 Codex 指令执行(create-or-update-files / patch),或作为 PR checklist。

T1 — 完成 pkg/pgw.Flush(COPY + Upsert 批量写)

T2 — 实现 sql/age_refresh.sql 的程序化执行

T3 — pkg/oo.Stream 的 MOCK 与真实 S3/API 适配

-  MOCK:生成固定分布的 logs/metrics/traces;支持 `--mock` 开关。
-  S3:按 `dataset/yyyy=.../hh=.../mm=...` 列表对象;API:按时间窗查询。
-  `--mock` 模式 1m 生成 5k 日志、500 指标点、1k span,端到端落库 < 3s/窗口 
-  切换到 S3,验证窗口边界与对象命名正确。

T4 — pkg/agg 聚合正确性

T5 — pkg/patterns 指纹抽取(Drain/RE2)

T6 — pkg/iac.Discover + pkg/ansible.ExtractDeps

T7 — pkg/pgw.UpsertTopoEdges 时态差分

T8 — pkg/events 事件补数接口

T9 — 配置加载与初始回看

T10 — 观测指标与窗口滞后


附:典型验证 SQL

SELECT metric, count(*), min(bucket), max(bucket)
FROM metric_1m
GROUP BY metric ORDER BY count(*) DESC LIMIT 10;
WITH active AS (
  SELECT src_resource_id, dst_resource_id
  FROM service_call_5m
  WHERE bucket >= now() - interval '10 minutes'
  GROUP BY 1,2
)
SELECT count(*) AS edges_in_source FROM active;
-- 再在 AGE 里查同样规模(CALLS 边数量),两者应近似一致(考虑租户过滤)
-- 当前有效边
SELECT count(*) FROM topo_edge_time WHERE upper_inf(valid);
-- 历史边(已关闭)
SELECT count(*) FROM topo_edge_time WHERE NOT upper_inf(valid);

Typical Operations Scenarios

Illustrates common operational situations that highlight the need for effective monitoring across systems and services.

1) 发布与环境

2) 可靠性与故障处置

3) 性能与容量优化

4) 数据与存储运维

5) 安全与合规

6) 网络与边缘

7) 集群与平台生命周期(K8s/容器/GPU)

8) AI/ML 与数据应用运维

9) 可观测性与告警工程

10) 灾备与演练

11) FinOps(成本与资源)

12) 自助与治理

Edge Collection vs Gateway

Discusses trade-offs between collecting observability data at the edge and routing through centralized gateways.

OTel Gateway Design and Considerations

Explores architectural patterns and design thoughts for building an OpenTelemetry-based gateway.

Data Ingestion with Multi-Level Persistence and Replay

Details strategies for persisting collected data at multiple stages and replaying it for analysis or recovery.

Full-Stack Observability Database Design

Outlines principles for structuring databases that support metric, log, trace, event, and profile storage in one system.

Full-Stack Observability Database ETL Design

Describes extract-transform-load workflows for moving observability data between hot and cold storage layers.

Monitoring System Multi-Region and Disaster Recovery

Covers approaches to deploying observability stacks across regions with failover and disaster recovery in mind.

From SSH/SCP to AI-Driven OPS Agent: Pre-Deployment Considerations

Reviews the challenges of traditional remote management and outlines factors to evaluate before adopting AI-powered operations agents.

From SSH/SCP to AI-Driven OPS Agent: Capability Checklist

Enumerates the functional requirements and competencies expected from an AI-assisted operations agent.

PostgreSQL Extension-Driven Complex Analysis (Vector, Graph, Trend)

Highlights how PostgreSQL extensions enable advanced analysis such as vector similarity search, graph traversal, and trend detection for operations data.

AI-OPS Agent MVP Architecture

Proposes a minimal viable architecture for an AI-powered operations agent integrating data collection, analysis, and automated actions.

如何设计 AI 驱动的 OPS Agent:漫谈状态机

关键词:Walking Skeleton/状态机(FSM)/Outbox/Idempotency/事件驱动/LLM 契约化

本文落地一条“最短闭环”(人工触发 → 计划 → 审批 → 执行 → 验证 → 归档),强调:确定性的状态机做“合法性与原子落库”,不确定性的 LLM 做“生成、检索、归纳”,两者以“可验证的契约”交汇。


0. 结论先行(TL;DR)


1. 为什么状态机是 AI OPS 的地基

LLM 擅长“生成与归纳”,但不提供事务性与幂等保证。生产级 OPS 需要: 1) 可证明的合法迁移(纯函数 FSM) 2) 原子副作用(状态 + 时间线 + 出盒) 3) 至少一次投递 + 消费幂等(Outbox/Inbox Pattern)

原则:确定性包围不确定性。所有非确定性的 AI 产物都转为结构化契约(JSON/YAML + Schema 校验)后,才允许进入状态机的下一跳。


2. Walking Skeleton(从零到可跑)

目标:先打通一条最短闭环,可演示、可观测、可回滚。

实现顺序: 1. Orchestrator(必须先做):纯函数 FSM + 原子事务(状态/时间线/出盒)+ 幂等/OCC。 2. Planner(最小可用):模板计划生成,产出 plan_proposedevt.plan.proposed.v1。 3. Gatekeeper(自动审批):本地策略阈值,产出 plan_approvedevt.plan.approved.v1。 4. Executor(Step Runner):先做 echo/scriptk8s rollout 两个适配器。 5. Verifier(SLO 校验):基于 metric_1m 的阈值判定。 6~8. Analyst / Sensor / Librarian:把入口从“人工”扩展到“信号驱动”,把 Planner 从模板升级为基于证据的拟合。


3. 体系结构与事件流

flowchart LR
  subgraph UI/API
    H[Human/UI]
  end

  subgraph Core[Core Services]
    O[Orchestrator\nFSM+Outbox+Timeline]
    P[Planner\n(LLM/模板→ plan_proposed)]
    G[Gatekeeper\n(策略/OA判定)]
    E[Executor\n(Adapters: script/k8s/...)]
    V[Verifier\n(SLO阈值)]
    A[Analyst\n(规则/统计→ findings)]
    S[Sensor\n(oo_locator / ingest)]
    L[Librian\n(pgvector RAG)]
  end

  EV[(Event Bus\nNATS/Redpanda)]
  DB[(PostgreSQL/Timescale)]
  OO[(OpenObserve/Logs)]

  H -- REST --> O
  O -- outbox/cmd.* --> EV
  EV -- evt.* --> O
  P & G & E & V & A & S & L -- evt./cmd. <--> EV
  O -- R/W --> DB
  E -- logs/refs --> OO

接口与事件最小集 - REST: - POST /case/createGET /case/{id}GET /case/{id}/timeline - PATCH /case/{id}/transition唯一改状态入口;需 Idempotency-Key + 建议 If-Match) - POST /plan/generatePOST /gate/evalPOST /adapter/execPOST /verify/run - 事件: - evt.case.transition.v1(任何迁移事实) - evt.plan.proposed.v1evt.plan.approved.v1 - evt.exec.step_result.v1evt.exec.done|failed.v1 - evt.verify.pass|failed.v1evt.analysis.findings.v1 - cmd.plan.generate / cmd.gate.eval / cmd.exec.run / cmd.verify.run


4. 状态机(FSM)与守卫

stateDiagram-v2
  [*] --> NEW
  NEW --> ANALYZING: start_analysis
  ANALYZING --> PLANNING: analysis_done
  PLANNING --> WAIT_GATE: plan_ready (guard: complete plan)
  WAIT_GATE --> EXECUTING: gate_approved
  WAIT_GATE --> PARKED: gate_rejected
  EXECUTING --> VERIFYING: exec_done
  EXECUTING --> PARKED: exec_failed
  VERIFYING --> CLOSED: verify_pass
  VERIFYING --> PARKED: verify_failed
  PARKED --> PLANNING: resume / fix

守卫示例(plan 完整性) - steps 至少 1 个;每个 step 定义 actiontimeoutretry; - rollbackverify 字段必须存在; - 计划大小、危险操作需标识并由 Gatekeeper 评分/审批。

任何守卫失败都不改变状态,仅记录时间线并返回 409/422。


5. Orchestrator 的“原子三件套”

单事务保证: 1) 更新 ops_case.version, status 2) 追加 case_timeline 3) 写入 outbox(cmd.* 或 evt.* 载荷)

幂等与并发: - Idempotency-Key:命中即返回首次结果,不重复写时间线/出盒。 - If-Match/expected_version:不匹配 → 409/412

伪代码(Go/Pseudocode)

func Transition(ctx, caseID, event, meta) (Case, error) {
  return WithTx(ctx, func(tx Tx) (Case, error) {
    c := repo.GetForUpdate(tx, caseID)
    allowed, next := workflow.Decide(c.Status, event)
    if !allowed { return error(409) }

    // guards (schema/plan completeness/risk window etc.)
    if err := Guards.Pass(tx, c, event, meta); err != nil { return error(422) }

    c.Status, c.Version = next, c.Version+1
    repo.Update(tx, c)

    timeline.Append(tx, c.ID, event, meta)

    outbox.Append(tx, BuildMessages(c, event, meta))

    return c, nil
  })
}

6. LLM “做擅长的事”:契约与位置

口号:LLM 只输出“结构化、可验证、可回放”的产物;状态改变永远经 Orchestrator。

6.1 Planner × LLM(计划生成)

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "ChangePlan",
  "type": "object",
  "required": ["title","steps","rollback","verify"],
  "properties": {
    "title": {"type":"string"},
    "risk_score": {"type":"number","minimum":0,"maximum":1},
    "steps": {
      "type":"array","minItems":1,
      "items": {"type":"object","required":["action","timeout_s","retry"],
        "properties": {
          "action": {"enum":["k8s.rollout","script.exec","gateway.flip","noop"]},
          "params": {"type":"object"},
          "timeout_s": {"type":"integer","minimum":10},
          "retry": {"type":"integer","minimum":0,"maximum":3}
        }
      }
    },
    "rollback": {"type":"object"},
    "verify": {"type":"object"}
  }
}

Prompt 片段(示意)

System: 你是资深 SRE。产出必须是符合 JSON Schema 的 ChangePlan。不要输出自然语言解释。
User: {问题摘要/证据/限制}
Assistant: {ChangePlan JSON}

6.2 Analyst × LLM(证据摘要)

6.3 Librarian × LLM(RAG)

6.4 Gatekeeper/Verifier 的 AI 用法(限定)


7. 数据模型(关键表,最小集)

-- 1) 事实源
CREATE TABLE ops_case (
  id UUID PRIMARY KEY,
  tenant TEXT, title TEXT,
  status TEXT NOT NULL,
  version INT NOT NULL,
  created_at TIMESTAMPTZ DEFAULT now(),
  updated_at TIMESTAMPTZ DEFAULT now()
);

CREATE TABLE case_timeline (
  id BIGSERIAL PRIMARY KEY,
  case_id UUID REFERENCES ops_case(id),
  event TEXT, actor TEXT, reason TEXT,
  correlation_id TEXT, meta JSONB,
  created_at TIMESTAMPTZ DEFAULT now()
);

CREATE TABLE outbox (
  id BIGSERIAL PRIMARY KEY,
  topic TEXT, key TEXT, payload JSONB,
  created_at TIMESTAMPTZ DEFAULT now(),
  published_at TIMESTAMPTZ
);

CREATE TABLE idempotency (
  key TEXT PRIMARY KEY,
  response JSONB,
  created_at TIMESTAMPTZ DEFAULT now()
);

-- 2) Planner/Exec/Verify(示意)
CREATE TABLE plan_proposed (
  id UUID PRIMARY KEY,
  case_id UUID REFERENCES ops_case(id),
  plan JSONB NOT NULL,
  created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE plan_approved (
  id UUID PRIMARY KEY,
  case_id UUID REFERENCES ops_case(id),
  decision JSONB,
  created_at TIMESTAMPTZ DEFAULT now()
);

8. 可观测性(先打指标,再写业务)


9. 第一条端到端演示(cURL)

# 1) 创建 Case
CASE=$(curl -sX POST /case/create -d '{"title":"p95 spike","tenant":"t-001"}'|jq -r .data.case_id)

# 2) 开始分析
curl -X PATCH /case/$CASE/transition \
  -H 'Idempotency-Key:a1' \
  -d '{"event":"start_analysis","actor":"analyst@svc"}'

# 3) 生成计划(模板/LLM)
curl -X POST /plan/generate -d '{"case_id":"'$CASE'","template":"k8s.rollout.canary"}'
# Planner 发 evt.plan.proposed.v1 → Orchestrator 判定 plan_ready → WAIT_GATE

# 4) 自动审批
curl -X POST /gate/eval -d '{"case_id":"'$CASE'"}'
# Gatekeeper 发 evt.plan.approved.v1 → EXECUTING

# 5) 执行适配器(示例:script)
curl -X POST /adapter/exec -d '{"case_id":"'$CASE'","adapter":"script","script":"echo ok"}'
# Executor 发 evt.exec.done.v1 → VERIFYING

# 6) 验证通过 → CLOSED
curl -X POST /verify/run -d '{"case_id":"'$CASE'"}'

10. 目录结构建议

.
├─ api/                # Gin/Fiber + OpenAPI + 中间件
├─ workflow/           # 纯函数 FSM
├─ plans/              # 纯函数计划生成(模板 + LLM 契约)
├─ gatekeeper/         # 策略引擎(本地规则/OPA/Cedar)
├─ executor/
│  ├─ adapters/        # k8s/script/gateway...
│  └─ runner/          # step 执行/超时/重试
├─ verifier/
├─ analyst/
├─ sensor/
├─ librarian/
├─ internal/pubsub/    # NATS/Redpanda(至少一次 + 去重)
├─ ports/              # Repo/Outbox/Timeline/Idempotency 接口
├─ services/           # Orchestrator 等聚合服务
└─ migrations/         # DDL

11. DoD 清单(可直接转 Issue)


12. 风险与避坑

  1. 事务一致性:禁止在 FSM 回调内做外部 IO;先落地再发事件
  2. 幂等:所有写接口都要 Idempotency-Key;消费者对 message_id 去重。
  3. 并发:SELECT ... FOR UPDATE + 版本控制;冲突返回 409/412。
  4. 守卫松紧:先宽后紧,避免卡死;策略统一在 Gatekeeper。
  5. 可观测:先打指标,再写业务;没有指标就无法排障。

13. 路线图(建议)


一句话

Orchestrator 只做两件事:判定合法迁移(纯函数)+一次事务内记录(状态/时间线/出盒)。其余模块要么被它的命令驱动,要么把“事实事件”交还它,由它来改变世界。LLM 负责提出“更好的方案”,而不是亲自“按下回车”。