fix(telemetry): 指标写入对空接收者安全,修 nil 解引用 panic
metrics 包的全局指标(UpstreamTotal 等)默认是 nil,只有 main 调过 metrics.Init() 之后才有值。任何不经过 main 的调用路径都会在 controller/tts.go -> adapter/volcano/synthesis.go -> metrics.AdapterRecorder 处 nil 解引用,整个进程崩掉。 生产路径本来没问题(二进制一定先 Init),但这类崩溃只在运行时暴露,且漏掉指标初始化属于很容易踩的装配错误,不该以 panic 收场。 改动: Counter.Add / Gauge.Set / Gauge.Add / Histogram.Observe 增加空接收者判断,nil 时静默忽略(与 noop 语义一致);在包注释里写成显式设计约定,避免以后被当成冗余代码删掉。
This commit is contained in:
+6
-1
@@ -5,7 +5,12 @@
|
||||
// - 零外部依赖,只使用标准库;
|
||||
// - label key 在指标注册时锁定,运行期不可新增(避免 cardinality 爆炸);
|
||||
// - 所有并发安全由实现保证,调用方无需加锁;
|
||||
// - Meter 是高层入口,NoopMeter 用于测试。
|
||||
// - Meter 是高层入口,NoopMeter 用于测试;
|
||||
// - **空接收者安全**: 未初始化的 *Counter / *Gauge / *Histogram(即 nil 指针)
|
||||
// 上的 Inc/Add/Set/Observe 一律静默忽略,不 panic。
|
||||
// 这条约定是为 metrics 包的全局指标变量服务的 —— 它们默认为 nil,只有 main
|
||||
// 调用过 metrics.Init() 之后才有值;直接复用 handler 的场景(集成测试、
|
||||
// 未来做成库)不应该因为漏掉指标初始化而崩掉整个请求处理。
|
||||
package telemetry
|
||||
|
||||
import (
|
||||
|
||||
Reference in New Issue
Block a user