internal/benchrunner/reporters/outputs/file.go (69 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 outputs
import (
"errors"
"fmt"
"os"
"path/filepath"
"github.com/elastic/elastic-package/internal/benchrunner/reporters"
"github.com/elastic/elastic-package/internal/builder"
"github.com/elastic/elastic-package/internal/multierror"
)
func init() {
reporters.RegisterOutput(ReportOutputFile, reportToFile)
}
const (
// ReportOutputFile reports benchmark results to files in a folder
ReportOutputFile reporters.Output = "file"
)
func reportToFile(report reporters.Reportable) error {
multiReport, ok := report.(reporters.MultiReportable)
if !ok {
return reportSingle(report)
}
var merr multierror.Error
for _, r := range multiReport.Split() {
reportableFile, ok := r.(reporters.ReportableFile)
if !ok {
continue
}
if err := reportSingle(reportableFile); err != nil {
merr = append(merr, err)
}
}
if len(merr) > 0 {
return merr
}
return nil
}
func reportSingle(report reporters.Reportable) error {
reportableFile, ok := report.(reporters.ReportableFile)
if !ok {
return errors.New("this output requires a reportable file")
}
dest, err := reportsDir()
if err != nil {
return fmt.Errorf("could not determine benchmark reports folder: %w", err)
}
// If filename contains folders, be sure we create them properly
dir := filepath.Dir(reportableFile.Filename())
if dir != reportableFile.Filename() {
dest = filepath.Join(dest, dir)
}
// Create benchmark reports folder if it doesn't exist
_, err = os.Stat(dest)
if err != nil && errors.Is(err, os.ErrNotExist) {
if err := os.MkdirAll(dest, 0755); err != nil {
return fmt.Errorf("could not create benchmark reports folder: %w", err)
}
}
filePath := filepath.Join(dest, filepath.Base(reportableFile.Filename()))
if err := os.WriteFile(filePath, append(reportableFile.Report(), byte('\n')), 0644); err != nil {
return fmt.Errorf("could not write benchmark report file: %w", err)
}
return nil
}
// reportsDir returns the location of the directory to store reports.
func reportsDir() (string, error) {
buildDir, err := builder.BuildDirectory()
if err != nil {
return "", fmt.Errorf("locating build directory failed: %w", err)
}
const folder = "benchmark-results"
return filepath.Join(buildDir, folder), nil
}