From d2e5020d22d88744ccebdac7df4eda2c0a6743a0 Mon Sep 17 00:00:00 2001 From: wood chen Date: Sun, 9 Mar 2025 11:49:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(metrics):=20=E4=BC=98=E5=8C=96=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E5=88=86=E5=B8=83=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加对延迟分布数据的类型兼容性处理 - 新增直接使用 map[string]int64 类型的处理分支 - 优化日志输出,提供更详细的类型转换信息 - 在处理结束后打印最终的延迟分布数据 - 改进错误处理和类型转换的健壮性 --- internal/handler/metrics.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/internal/handler/metrics.go b/internal/handler/metrics.go index ff21821..06ffd5c 100644 --- a/internal/handler/metrics.go +++ b/internal/handler/metrics.go @@ -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)