基础指标采集不能只靠 shell 脚本,因 /proc 快照式采样易漏瞬时尖峰,而 eBPF 可纳秒级低开销观测内核路径;需聚焦 RED+USE 四大黄金信号,结构化日志关联 trace_id,并透传 W3C traceparent 实现全链路追踪。

从 /proc 到 eBPF:为什么基础指标采集不能只靠 shell 脚本
很多运维一上来就写 top -b -n1 | awk 或轮询 /proc/meminfo,结果在高负载 VPS 上监控进程自己吃掉 15% CPU,还漏掉关键信号——比如 cgroup 的 CPU throttling 比例、软中断分布倾斜、页回收延迟漂移。这些不是“有没有”的问题,而是“偏不偏”的问题。
-
/proc是快照式伪文件,采样间隔内可能错过瞬时尖峰;eBPF(如bpftrace或libbpf程序)可 hook 内核 tracepoints,实现纳秒级低开销观测 - 内存回收耗时、TCP 重传率、调度延迟等路径必须建 7 天滚动基线,用标准差(
σ)定义“异常”,而非硬设cpu_usage > 90% - 美国 VPS 共享宿主资源,
node_exporter默认指标不够细;建议加装systemd-exporter和cgroup-exporter,暴露systemd_unit_cpu_throttled_seconds_total这类真实约束信号
Metrics 不是越多越好:聚焦 RED + USE 四大黄金信号
别被 Prometheus 的 200+ node_exporter 指标吓住。真正影响业务的只有四类:Request Rate(流量)、Error Rate(错误)、Duration(延迟)、Saturation(饱和度)。中间件如 Nginx、PostgreSQL 必须暴露业务层指标,而非只看 CPU。
- Nginx 需启用
nginx-module-vts或nginx-prometheus-exporter,抓取nginx_http_requests_total{status=~"5.."}和nginx_http_request_duration_seconds_bucket - PostgreSQL 用
postgres_exporter,重点关注pg_locks、pg_stat_database_xact_rollback、pg_stat_bgwriter_buffers_checkpoint - 避免在 Grafana 中堆砌“CPU 使用率”曲线——改用
node_load1 / count by(instance)(node_cpu_seconds_total{mode="idle"})计算实际可扩展性余量
日志不是用来 tail -f 的:结构化 + trace_id 关联才是关键
原始文本日志在故障定位时等于没有日志。一次跨服务请求散落在 5 台 VPS 的不同日志文件里,没 trace_id 就是盲人摸象。
ShopWind网店系统是国内最专业的网店程序之一,采用ASP语言设计开发,速度快、性能好、安全性高。ShopWind网店购物系统提供性化的后台管理界面,标准的网上商店管理模式和强大的网店软件后台管理功能。ShopWind网店系统提供了灵活强大的模板机制,内置多套免费精美模板,同时可在后台任意更换,让您即刻快速建立不同的网店外观。同时您可以对网模板自定义设计,建立个性化网店形象。ShopWind网
- 应用日志强制 JSON 格式,字段至少含
timestamp、service、level、trace_id、span_id;Go 用logrus.JSONFormatter,Python 用python-json-logger - 用
fluent-bit(非 heavy 的 Fluentd)收集,配置filter_kubernetes自动注入host和namespace标签,转发到 Loki(比 ELK 更轻,适合 VPS 资源限制) - Grafana 中用
{job="loki",trace_id="xxx"}一键聚合所有相关日志行,再点开同trace_id的 Prometheus 指标和 Jaeger 链路——这才是闭环
链路追踪别断在 Nginx:透传 traceparent 是底线
很多团队上了 Jaeger 却发现链路只有一跳,原因全在入口网关没做透传。W3C Trace Context(traceparent header)是唯一能跨语言、跨中间件对齐的标准,别再用自定义 X-Trace-ID。
- Nginx 配置必须加
proxy_set_header traceparent $http_traceparent;,且开启underscores_in_headers on;(否则忽略带下划线 header) - OpenTelemetry SDK 默认支持
traceparent解析;若用旧版 Zipkin,需在 client 端手动注入span.context().traceId()到下游 HTTP header - Redis/MySQL 客户端必须启用 OTel 自动插桩(如
redis-opentelemetry),否则 DB 调用在链路中直接消失——这点最容易被忽略
真正卡住可观测性的,从来不是工具链没配齐,而是 trace_id 在第二跳就断了、duration 指标没按业务语义埋点、基线用的是静态阈值而非动态漂移检测。这些细节不补上,告警再多也只是噪音。









