错误追踪、业务信号与可观测成本:怎样诊断而不过载
信号价值取决于能否缩短决策,而不是采集总量。
OpenTelemetry 的 Metrics 概念 说明高基数聚合状态的内存成本;Micrometer Observation 用统一生命周期驱动指标、链路和日志处理器。
故障现场:同一依赖超时生成十万条异常,错误平台按堆栈行号拆成数百问题;团队追逐事件数,却没有受影响请求、支付金额、租户范围和恢复水位。
同一依赖超时生成十万条异常,错误平台按堆栈行号拆成数百问题;团队追逐事件数,却没有受影响请求、支付金额、租户范围和恢复水位。 先画出事件从业务动作到查询结果的完整路径,逐段记录输入、输出、队列水位、丢弃策略和关联键。最危险的不是显式报错,而是应用成功、遥测静默缺失;缺失必须变成可告警状态,不能用“平台偶尔延迟”长期解释。
权威状态与观测结论必须分开
指纹由稳定异常类型、错误码、归一化栈顶和依赖组成,不含订单号等实例值;业务指标表达影响面,Trace 解释路径,日志补充局部细节,三者用关联键互证。 对每个结论列出反证:字段缺失时还能否区分业务拒绝与系统异常,关联断开时能否从消息或 operationId 恢复,采样后统计是否仍代表总体。信号只能证明其观测窗口内发生了记录,不能证明未记录的事件不存在。
建模主链与边界条件
User impact
在 User impact 阶段固定 owner、输入、输出、失败原因和容量上限。正向用例证明正常状态产生唯一且稳定的证据;反向用例分别删除上下文、制造未知字段、填满队列或扩大标签空间,断言缺口被计数且不会污染业务线程。字段名和结果枚举一旦进入告警与查询就是契约,修改必须兼容迁移。
Signal contract
在 Signal contract 阶段固定 owner、输入、输出、失败原因和容量上限。正向用例证明正常状态产生唯一且稳定的证据;反向用例分别删除上下文、制造未知字段、填满队列或扩大标签空间,断言缺口被计数且不会污染业务线程。字段名和结果枚举一旦进入告警与查询就是契约,修改必须兼容迁移。
Correlate
在 Correlate 阶段固定 owner、输入、输出、失败原因和容量上限。正向用例证明正常状态产生唯一且稳定的证据;反向用例分别删除上下文、制造未知字段、填满队列或扩大标签空间,断言缺口被计数且不会污染业务线程。字段名和结果枚举一旦进入告警与查询就是契约,修改必须兼容迁移。
Triage
在 Triage 阶段固定 owner、输入、输出、失败原因和容量上限。正向用例证明正常状态产生唯一且稳定的证据;反向用例分别删除上下文、制造未知字段、填满队列或扩大标签空间,断言缺口被计数且不会污染业务线程。字段名和结果枚举一旦进入告警与查询就是契约,修改必须兼容迁移。
Cost gate
在 Cost gate 阶段固定 owner、输入、输出、失败原因和容量上限。正向用例证明正常状态产生唯一且稳定的证据;反向用例分别删除上下文、制造未知字段、填满队列或扩大标签空间,断言缺口被计数且不会污染业务线程。字段名和结果枚举一旦进入告警与查询就是契约,修改必须兼容迁移。
Repair feedback
在 Repair feedback 阶段固定 owner、输入、输出、失败原因和容量上限。正向用例证明正常状态产生唯一且稳定的证据;反向用例分别删除上下文、制造未知字段、填满队列或扩大标签空间,断言缺口被计数且不会污染业务线程。字段名和结果枚举一旦进入告警与查询就是契约,修改必须兼容迁移。
从用户问题反推信号,而不是从采集能力出发
一条信号必须拥有完整生命周期
基数、体积和保留期是运行时资源
敏感数据和攻击面进入信号设计
用故障注入验证信号而不是看一次漂亮页面
查询、告警与恢复必须共享同一语义
两个 Java 17 模型固定可重复见证
模型不依赖日志平台、指标后端或 Collector,只压缩该主题最关键的状态转换和量化判据。真实工程用 SLF4J、Logback、Micrometer 或 OpenTelemetry 驱动同一不变量。
javac --release 17 -Xlint:all -Werror examples/backend-development/observability/observability-errors-cost/ErrorFingerprintDemo.java examples/backend-development/observability/observability-errors-cost/TelemetryBudgetDemo.java
java -cp examples/backend-development/observability/observability-errors-cost ErrorFingerprintDemo
java -cp examples/backend-development/observability/observability-errors-cost TelemetryBudgetDemoevents=6 fingerprints=2 duplicateEvents=4 top=PAYMENT_TIMEOUT grouped=true piiPresent=false
logMB=420 metricSeries=18000 spans=240000 dailyCostUnits=678 budget=700 allowed=true headroom=22输出变化必须能归因于信号契约、容量策略或业务规格,不能通过删除字段、扩大采样或无限重试吸收差异。
容量、发布与恢复门禁
成本模型同时计算日志字节、指标序列、Span 数、保留期、索引和网络;按信号价值执行采样、聚合、字段裁剪和冷热分层,错误与审计不能被统一比例随机丢弃。 发布前用峰值输入和故障放大系数计算容量,在预发布环境制造后端慢、连接中断和停机,验证业务延迟、遥测缺口和恢复时间。每次删减前回放真实故障问题:能否发现、定位和确认恢复。信号契约像 API 一样版本化,Dashboard、Alert、Runbook 和 owner 随字段变更一同迁移。
门禁同时检查信号存在、语义正确、关联完整、基数受控、敏感字段缺失和故障时可恢复。围绕“每项信号都对应用户影响、诊断假设和处置动作,其质量、成本与缺口能够持续计量”记录 owner、预算、保留期、告警消费者和最近一次真实发现;没有消费者且不能回答诊断问题的信号应删除,而不是永久堆积。
