internal/reportgenerator/generators/pipelinebench/report.go (89 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
package benchmark
import (
"bytes"
"fmt"
"html/template"
"github.com/elastic/elastic-package/internal/reportgenerator"
)
var resultExts = map[string]bool{".json": true, ".xml": true}
const (
resultNoChange = ":+1:"
resultImprovement = ":green_heart:"
resultWorse = ":broken_heart:"
tpl = `### :rocket: Benchmarks report
{{range $package, $reports := .}}
{{if hasPrintableReports $reports}}
#### Package ` + "`" + `{{$package}}` + "`" + ` {{getReportsSummary $reports}}
<details>
<summary>Expand to view</summary>
Data stream | Previous EPS | New EPS | Diff (%) | Result
----------- | ------------ | ------- | -------- | ------
{{range $reports}}{{$result := getResult .Old .Percentage}}{{if isPrintable $result}}` +
"`" + `{{.DataStream}}` + "`" +
` | {{.Old}} | {{.New}} | {{.Diff}} ({{if gt .Old 0.0}}{{.Percentage}}{{else}} - {{end}}%) | {{$result}}
{{end}}{{end}}</details>{{end}}
{{end}}
`
)
func (g *generator) markdownFormat(reports Reports) ([]byte, error) {
tpl, err := getReportTpl(g.options)
if err != nil {
return nil, err
}
var buf bytes.Buffer
if err := tpl.Execute(&buf, reports); err != nil {
return nil, err
}
if !g.options.Full {
buf.WriteString(`To see the full report comment with ` + "`/test benchmark fullreport`\n")
}
return buf.Bytes(), nil
}
func getReportTpl(opts reportgenerator.ReportOptions) (*template.Template, error) {
return template.New("result").Funcs(map[string]interface{}{
"getResult": func(oldValue, p float64) string {
return getResult(opts.Threshold, oldValue, p)
},
"isPrintable": func(result string) bool {
return isPrintable(opts.Full, result)
},
"getReportsSummary": func(reports []Report) string {
sum := map[string]int{}
for _, r := range reports {
sum[getResult(opts.Threshold, r.Old, r.Percentage)] += 1
}
return fmt.Sprintf(
"%s(%d) %s(%d) %s(%d)",
resultNoChange, sum[resultNoChange],
resultImprovement, sum[resultImprovement],
resultWorse, sum[resultWorse],
)
},
"hasPrintableReports": func(reports []Report) bool {
for _, r := range reports {
if isPrintable(opts.Full, getResult(opts.Threshold, r.Old, r.Percentage)) {
return true
}
}
return false
},
}).Parse(tpl)
}
func getResult(threshold, oldValue, p float64) string {
switch {
default:
fallthrough
case oldValue == 0:
return resultNoChange
case p > threshold:
return resultImprovement
case p < 0 && p < (threshold*-1):
return resultWorse
}
}
func isPrintable(fullReport bool, result string) bool {
if fullReport {
return true
}
return result == resultWorse
}