| 11 | } |
| 12 | |
| 13 | func BuildBenchmarkReport(ctx context.Context, plugins []BenchmarkPlugin, options BuildReportOptions) (BenchmarkReport, error) { |
| 14 | core := BenchmarkCore{} |
| 15 | activeVariant := withTiers(variantOrDefault(options.Variant, VariantOverride{Name: "candidate", Description: "benchmark run"}), options.Tiers) |
| 16 | pluginResults := map[string]PluginRunResult{} |
| 17 | pluginRules := map[string][]PluginSLA{} |
| 18 | pluginOrder := make([]string, 0, len(plugins)) |
| 19 | for _, plugin := range plugins { |
| 20 | result, err := core.RunSuite(ctx, plugin, &activeVariant) |
| 21 | if err != nil { |
| 22 | return BenchmarkReport{}, err |
| 23 | } |
| 24 | name := plugin.Name() |
| 25 | pluginResults[name] = result |
| 26 | pluginRules[name] = plugin.BuildSLARules() |
| 27 | pluginOrder = append(pluginOrder, name) |
| 28 | } |
| 29 | run := core.BuildRunWithOrder(activeVariant, pluginResults, pluginOrder) |
| 30 | verdict, err := core.Evaluate(run, pluginRules) |
| 31 | if err != nil { |
| 32 | return BenchmarkReport{}, err |
| 33 | } |
| 34 | |
| 35 | var comparison *BenchmarkComparison |
| 36 | if options.BaselinePlugins != nil { |
| 37 | var baselineVariant VariantOverride |
| 38 | if options.BaselineProfile != nil { |
| 39 | profile, err := GetProfile(*options.BaselineProfile) |
| 40 | if err != nil { |
| 41 | return BenchmarkReport{}, err |
| 42 | } |
| 43 | baselineVariant = profile |
| 44 | } else { |
| 45 | baselineVariant = variantOrDefault(options.BaselineVariant, VariantOverride{Name: "baseline", Description: "benchmark baseline"}) |
| 46 | } |
| 47 | activeBaselineVariant := withTiers(baselineVariant, options.Tiers) |
| 48 | baselineResults := map[string]PluginRunResult{} |
| 49 | baselineOrder := make([]string, 0, len(options.BaselinePlugins)) |
| 50 | for _, plugin := range options.BaselinePlugins { |
| 51 | result, err := core.RunSuite(ctx, plugin, &activeBaselineVariant) |
| 52 | if err != nil { |
| 53 | return BenchmarkReport{}, err |
| 54 | } |
| 55 | name := plugin.Name() |
| 56 | baselineResults[name] = result |
| 57 | baselineOrder = append(baselineOrder, name) |
| 58 | } |
| 59 | baselineRun := core.BuildRunWithOrder(activeBaselineVariant, baselineResults, baselineOrder) |
| 60 | comparison = new(core.ComputeDeltas(baselineRun, run)) |
| 61 | } |
| 62 | |
| 63 | return core.BuildBenchmarkReport(comparison, verdict, run, pluginRules), nil |
| 64 | } |
| 65 | |
| 66 | func variantOrDefault(variant *VariantOverride, fallback VariantOverride) VariantOverride { |
| 67 | if variant == nil { |