blob: fe46da924342247b4132b272d2985440dc675d26 [file] [log] [blame]
package metrics
import (
"fmt"
"github.com/bazelbuild/continuous-integration/metrics/clients"
"github.com/bazelbuild/continuous-integration/metrics/data"
)
type PlatformUsage struct {
client clients.BuildkiteClient
orgs []string
columns []Column
builds int
}
func (pu *PlatformUsage) Name() string {
return "platform_usage"
}
func (pu *PlatformUsage) Columns() []Column {
return pu.columns
}
func (*PlatformUsage) Type() MetricType {
return BuildBasedMetric
}
func (*PlatformUsage) RelevantDelta() int {
return 200 // builds
}
func (pu *PlatformUsage) Collect() (data.DataSet, error) {
result := data.CreateDataSet(GetColumnNames(pu.columns))
for _, org := range pu.orgs {
pid := &data.PipelineID{Org: org, Slug: "all"}
builds, err := pu.client.GetMostRecentBuilds(pid, pu.builds)
if err != nil {
return nil, fmt.Errorf("Cannot collect platform usage: %v", err)
}
for _, build := range builds {
pipeline := *build.Pipeline.Slug
for _, job := range build.Jobs {
platform := getPlatform(job)
if platform == "" {
continue
}
diff := getDifferenceSeconds(job.StartedAt, job.FinishedAt)
if diff < 0 {
continue
}
err := result.AddRow(org, pipeline, *build.Number, platform, diff)
if err != nil {
return nil, fmt.Errorf("Failed to add result for build %d in pipeline %s on platform %s: %v", *build.Number, pipeline, platform, err)
}
}
}
}
return result, nil
}
// CREATE TABLE platform_usage (org VARCHAR(255), pipeline VARCHAR(255), build INT, platform VARCHAR(255), usage_seconds FLOAT, PRIMARY KEY(org, pipeline, build, platform));
func CreatePlatformUsage(client clients.BuildkiteClient, builds int, orgs ...string) *PlatformUsage {
columns := []Column{Column{"org", true}, Column{"pipeline", true}, Column{"build", true}, Column{"platform", true}, Column{"usage_seconds", false}}
return &PlatformUsage{client: client, orgs: orgs, columns: columns, builds: builds}
}