blob: 8cfa50a5b0d057048b9008245a714564b4804b76 [file] [log] [blame]
package metrics
import (
"fmt"
"github.com/bazelbuild/continuous-integration/metrics/clients"
"github.com/bazelbuild/continuous-integration/metrics/data"
)
type AggregatedPipelinePerformance struct {
client clients.BuildkiteClient
pipelines []*data.PipelineID
columns []Column
lastNBuilds int
}
func (app *AggregatedPipelinePerformance) Name() string {
return "aggregated_pipeline_performance"
}
func (app *AggregatedPipelinePerformance) Columns() []Column {
return app.columns
}
func (*AggregatedPipelinePerformance) Type() MetricType {
return BuildBasedMetric
}
func (*AggregatedPipelinePerformance) RelevantDelta() int {
return 100 // builds
}
func (app *AggregatedPipelinePerformance) Collect() (data.DataSet, error) {
result := data.CreateDataSet(GetColumnNames(app.columns))
for _, pipeline := range app.pipelines {
builds, err := app.client.GetMostRecentBuilds(pipeline, app.lastNBuilds)
if err != nil {
return nil, fmt.Errorf("Cannot collect aggregated performance statistics for pipeline %s: %v", pipeline, err)
}
for _, build := range builds {
if build.FinishedAt == nil {
continue
}
skippedTasks := getSkippedTasks(build)
err := result.AddRow(pipeline.Org, pipeline.Slug, *build.Number, build.ScheduledAt.Time, getDifferenceSeconds(build.ScheduledAt, build.FinishedAt), skippedTasks, *build.State)
if err != nil {
return nil, fmt.Errorf("Failed to add result for build %d in %s: %v", *build.Number, pipeline.Slug, err)
}
}
}
return result, nil
}
// CREATE TABLE aggregated_pipeline_performance (org VARCHAR(255), pipeline VARCHAR(255), build INT, scheduled DATETIME, total_time_seconds FLOAT, skipped_tasks VARCHAR(255), result VARCHAR(16), PRIMARY KEY(org, pipeline, build));
func CreateAggregatedPipelinePerformance(client clients.BuildkiteClient, lastNBuilds int, pipelines ...*data.PipelineID) *AggregatedPipelinePerformance {
columns := []Column{Column{"org", true}, Column{"pipeline", true}, Column{"build", true}, Column{"scheduled", false}, Column{"total_time_seconds", false}, Column{"skipped_tasks", false}, Column{"result", false}}
return &AggregatedPipelinePerformance{client: client, pipelines: pipelines, columns: columns, lastNBuilds: lastNBuilds}
}