blob: 4739e086796429afc4d7bee8bbcdda08c6a86cb0 [file] [log] [blame]
package metrics
import (
"fmt"
"strings"
"github.com/bazelbuild/continuous-integration/metrics/clients"
"github.com/bazelbuild/continuous-integration/metrics/data"
)
const macPlatform = "macos"
type MacPerformance struct {
perfMetric *PipelinePerformance
columns []Column
}
func (mp *MacPerformance) Name() string {
return "mac_performance"
}
func (mp *MacPerformance) Columns() []Column {
return mp.columns
}
func (mp *MacPerformance) Collect() (data.DataSet, error) {
legacyPerfData, err := mp.perfMetric.Collect()
if err != nil {
return nil, fmt.Errorf("Cannot calculate macOS metrics: %v", err)
}
perfData, ok := legacyPerfData.(*pipelinePerformanceSet)
if !ok {
return nil, fmt.Errorf("Invalid type %T of performance data", legacyPerfData)
}
result := data.CreateDataSet(GetColumnNames(mp.columns))
skippedBuilds := make(map[int]struct{})
for _, row := range perfData.rows {
if _, ok := skippedBuilds[row.build]; ok {
continue
}
err = nil
if getPlatformFromJobName(&row.job) == macPlatform {
err = result.AddRow(row.org, row.pipeline, row.build, getShardFromJobName(row.job), row.waitTimeSeconds, row.runTimeSeconds, false)
} else if strings.Contains(row.skippedTasks, macPlatform) {
err = result.AddRow(row.org, row.pipeline, row.build, nil, nil, nil, true)
skippedBuilds[row.build] = struct{}{}
}
if err != nil {
return nil, fmt.Errorf("Pipeline %s/%s: Failed to add result for job %s of build %d: %v", row.org, row.pipeline, row.job, row.build, err)
}
}
return result, nil
}
// CREATE TABLE mac_performance (org VARCHAR(255), pipeline VARCHAR(255), build INT, shard INT, wait_time_seconds FLOAT, run_time_seconds FLOAT, skipped BOOL, PRIMARY KEY(org, pipeline, build, shard));
func CreateMacPerformance(client clients.BuildkiteClient, lastNBuilds int, pipelines ...*data.PipelineID) *MacPerformance {
columns := []Column{Column{"org", true}, Column{"pipeline", true}, Column{"build", true}, Column{"shard", true}, Column{"wait_time_seconds", false}, Column{"run_time_seconds", false}, Column{"skipped", false}}
perfMetric := CreatePipelinePerformance(client, lastNBuilds, pipelines...)
return &MacPerformance{perfMetric: perfMetric, columns: columns}
}