package stress import ( "encoding/json" "fmt" "os" "strings" ) // chartData 给 JS 用的数据 type chartData struct { Labels []string `json:"labels"` CPU []float64 `json:"cpu"` Temp []float64 `json:"temp"` Title string `json:"title"` } // WriteChartHTML 根据采样数据生成折线图 HTML 文件,返回文件路径 func WriteChartHTML(ip string, result Result, reportDir string) (string, error) { if len(result.Samples) == 0 { return "", nil } cd := chartData{ Title: fmt.Sprintf("%s - %s 压测曲线 (%s)", ip, result.Type, result.Duration), } for _, s := range result.Samples { cd.Labels = append(cd.Labels, s.Time) cd.CPU = append(cd.CPU, s.CPU) cd.Temp = append(cd.Temp, s.Temp) } dataJSON, err := json.Marshal(cd) if err != nil { return "", err } html := strings.Replace(chartHTMLTemplate, "__DATA__", string(dataJSON), 1) os.MkdirAll(reportDir, 0755) filename := fmt.Sprintf("%s/chart-%s-%s.html", reportDir, result.Type, SanitizeFilename(ip)) if err := os.WriteFile(filename, []byte(html), 0644); err != nil { return "", err } return filename, nil } // SanitizeFilename 清理 IP 中的特殊字符,用于文件名 func SanitizeFilename(ip string) string { return strings.ReplaceAll(ip, ":", "_") } const chartHTMLTemplate = ` 压测曲线

CPU 使用率 (%) 温度 (°C)
`