From f6a686967c26780105e3dbfa0baf0b68b56590be Mon Sep 17 00:00:00 2001 From: yoyo Date: Fri, 21 Nov 2025 18:41:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=81=E7=BB=AD1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/continuous/ping.go | 21 ++++++++--- internal/handler/continuous.go | 69 +++++++++++++++++----------------- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/internal/continuous/ping.go b/internal/continuous/ping.go index f3208b1..03e8641 100644 --- a/internal/continuous/ping.go +++ b/internal/continuous/ping.go @@ -104,33 +104,42 @@ func (t *PingTask) executePing() map[string]interface{} { func parsePingOutput(output string) map[string]interface{} { result := map[string]interface{}{ - "latency": 0.0, + "latency": float64(0), "success": true, "packet_loss": false, } lines := strings.Split(output, "\n") for _, line := range lines { + line = strings.TrimSpace(line) + + // 解析丢包率:4 packets transmitted, 4 received, 0% packet loss if strings.Contains(line, "packets transmitted") { - // 解析丢包率 parts := strings.Fields(line) for i, part := range parts { if part == "packet" && i+2 < len(parts) { - if loss, err := strconv.ParseFloat(strings.Trim(parts[i+1], "%"), 64); err == nil { + // 查找百分比 + lossStr := strings.Trim(parts[i+1], "%") + if loss, err := strconv.ParseFloat(lossStr, 64); err == nil { result["packet_loss"] = loss > 0 + if loss > 0 { + result["success"] = false + } } } } } - if strings.Contains(line, "min/avg/max") { - // 解析平均延迟 + + // 解析延迟:rtt min/avg/max/mdev = 10.123/12.456/15.789/2.345 ms + if strings.Contains(line, "min/avg/max") || strings.Contains(line, "rtt") { parts := strings.Fields(line) for _, part := range parts { - if strings.Contains(part, "/") { + if strings.Contains(part, "/") && !strings.Contains(part, "=") { times := strings.Split(part, "/") if len(times) >= 2 { if avg, err := strconv.ParseFloat(times[1], 64); err == nil { result["latency"] = avg + break } } } diff --git a/internal/handler/continuous.go b/internal/handler/continuous.go index 1095fae..a6fb8ba 100644 --- a/internal/handler/continuous.go +++ b/internal/handler/continuous.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "fmt" + "io" "net" "net/http" "sync" @@ -186,69 +187,67 @@ func HandleContinuousStatus(c *gin.Context) { } func pushResultToBackend(taskID string, result map[string]interface{}) { + // 确保result包含必要的字段 + if result["timestamp"] == nil { + result["timestamp"] = time.Now().Unix() + } + if result["latency"] == nil { + result["latency"] = 0.0 + } + if result["success"] == nil { + result["success"] = true + } + if result["packet_loss"] == nil { + result["packet_loss"] = false + } + // 推送结果到后端 url := fmt.Sprintf("%s/api/public/node/continuous/result", backendURL) - // 获取本机IP - nodeIP := getLocalIP() - + // 不发送node_ip,让后端从请求中获取客户端IP(外网IP) data := map[string]interface{}{ "task_id": taskID, - "node_ip": nodeIP, "result": result, } jsonData, err := json.Marshal(data) if err != nil { - logger.Error("序列化结果失败", zap.Error(err)) + logger.Error("序列化结果失败", zap.Error(err), zap.String("task_id", taskID)) return } req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { - logger.Error("创建请求失败", zap.Error(err)) + logger.Error("创建请求失败", zap.Error(err), zap.String("task_id", taskID)) return } req.Header.Set("Content-Type", "application/json") - client := &http.Client{Timeout: 5 * time.Second} + client := &http.Client{Timeout: 10 * time.Second} resp, err := client.Do(req) if err != nil { - logger.Warn("推送结果失败", zap.Error(err)) - // 如果推送失败,停止任务 - taskMutex.Lock() - if task, exists := continuousTasks[taskID]; exists { - task.IsRunning = false - if task.pingTask != nil { - task.pingTask.Stop() - } - if task.tcpingTask != nil { - task.tcpingTask.Stop() - } - delete(continuousTasks, taskID) - } - taskMutex.Unlock() + logger.Warn("推送结果失败,继续运行", + zap.Error(err), + zap.String("task_id", taskID), + zap.String("url", url)) + // 推送失败不停止任务,继续运行 return } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - logger.Warn("推送结果失败", zap.Int("status", resp.StatusCode)) - // 如果推送失败,停止任务 - taskMutex.Lock() - if task, exists := continuousTasks[taskID]; exists { - task.IsRunning = false - if task.pingTask != nil { - task.pingTask.Stop() - } - if task.tcpingTask != nil { - task.tcpingTask.Stop() - } - delete(continuousTasks, taskID) - } - taskMutex.Unlock() + body, _ := io.ReadAll(resp.Body) + logger.Warn("推送结果失败,继续运行", + zap.Int("status", resp.StatusCode), + zap.String("task_id", taskID), + zap.String("url", url), + zap.String("response", string(body))) + // 推送失败不停止任务,继续运行 + return } + + logger.Debug("推送结果成功", zap.String("task_id", taskID)) } func getLocalIP() string {