package report import ( "encoding/json" "fmt" "html/template" "log" "os" "time" "github.com/go-echarts/go-echarts/v2/charts" "github.com/go-echarts/go-echarts/v2/opts" "github.com/go-echarts/go-echarts/v2/render" "llm-api-benchmark-tool/pkg/stats" ) // ReportData holds the data passed to the HTML template. type ReportData struct { Stats stats.FinalStats LatencyChart template.HTML // Already safe HTML TTFTChart template.HTML // Already safe HTML // Add other charts here (QPSChart, etc.) } // Basic HTML template string - No |safeHTML filter needed const htmlTemplate = `
| Metric | Value |
|---|---|
| Total Duration: | {{ .Stats.TotalDuration }} |
| Total Requests: | {{ .Stats.TotalRequests }} |
| Successful Requests: | {{ .Stats.SuccessfulRequests }} |
| Failed Requests: | {{ .Stats.FailedRequests }} |
| Avg QPS: | {{ printf "%.2f" .Stats.AvgQPS }} |
| Avg Latency: | {{ .Stats.AvgLatency }} |
| Min Latency: | {{ .Stats.MinLatency }} |
| Max Latency: | {{ .Stats.MaxLatency }} |
| P90 Latency: | {{ .Stats.P90Latency }} |
| P95 Latency: | {{ .Stats.P95Latency }} |
| P99 Latency: | {{ .Stats.P99Latency }} |
| Avg TTFT: | {{ .Stats.AvgTimeToFirstToken }} |
| Min TTFT: | {{ .Stats.MinTimeToFirstToken }} |
| Max TTFT: | {{ .Stats.MaxTimeToFirstToken }} |
| P90 TTFT: | {{ .Stats.P90TimeToFirstToken }} |
| P95 TTFT: | {{ .Stats.P95TimeToFirstToken }} |
| P99 TTFT: | {{ .Stats.P99TimeToFirstToken }} |
| Avg Tokens/Second: | {{ printf "%.2f" .Stats.AvgTokensPerSecond }} |