feat(metrics): 优化延迟分布数据处理逻辑

- 增加对延迟分布数据的类型兼容性处理
- 新增直接使用 map[string]int64 类型的处理分支
- 优化日志输出,提供更详细的类型转换信息
- 在处理结束后打印最终的延迟分布数据
- 改进错误处理和类型转换的健壮性
This commit is contained in:
wood chen 2025-03-09 11:49:37 +08:00
parent f2e1b8cbf5
commit d2e5020d22

View File

@ -170,9 +170,14 @@ func (h *ProxyHandler) MetricsHandler(w http.ResponseWriter, r *http.Request) {
distribution, ok := latencyStatsMap["distribution"]
if ok && distribution != nil {
log.Printf("[MetricsHandler] distribution=%v", distribution)
distributionMap, ok := distribution.(map[string]interface{})
if ok {
log.Printf("[MetricsHandler] distributionMap=%v", distributionMap)
// 尝试直接使用 map[string]int64 类型
if distributionMap, ok := distribution.(map[string]int64); ok {
log.Printf("[MetricsHandler] 直接使用 map[string]int64: %v", distributionMap)
metrics.LatencyStats.Distribution = distributionMap
} else if distributionMap, ok := distribution.(map[string]interface{}); ok {
// 如果不是 map[string]int64尝试转换 map[string]interface{}
log.Printf("[MetricsHandler] 转换 map[string]interface{}: %v", distributionMap)
metrics.LatencyStats.Distribution = make(map[string]int64)
for k, v := range distributionMap {
log.Printf("[MetricsHandler] 处理延迟分布项: %s=%v (type=%T)", k, v, v)
@ -182,12 +187,10 @@ func (h *ProxyHandler) MetricsHandler(w http.ResponseWriter, r *http.Request) {
} else if intValue, ok := v.(int64); ok {
metrics.LatencyStats.Distribution[k] = intValue
log.Printf("[MetricsHandler] 已经是int64: %s=%d", k, intValue)
} else {
log.Printf("[MetricsHandler] 无法转换: %s=%v (type=%T)", k, v, v)
}
}
} else {
log.Printf("[MetricsHandler] distribution不是map: %v (type=%T)", distribution, distribution)
log.Printf("[MetricsHandler] distribution类型未知: %v (type=%T)", distribution, distribution)
}
} else {
log.Printf("[MetricsHandler] 没有distribution字段或为nil: ok=%v, distribution=%v", ok, distribution)
@ -216,6 +219,9 @@ func (h *ProxyHandler) MetricsHandler(w http.ResponseWriter, r *http.Request) {
metrics.ErrorStats.ServerErrors = serverErrors
metrics.ErrorStats.Types = errorTypes
// 打印最终的延迟分布数据
log.Printf("[MetricsHandler] 最终的延迟分布数据: %v", metrics.LatencyStats.Distribution)
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(metrics); err != nil {
log.Printf("Error encoding metrics: %v", err)