func collectPipelineResults()

in metrics/metrics/platform_significance.go [55:116]


func collectPipelineResults(buildResult data.DataSet) (map[string]*pipelineStats, error) {
	stats := make(map[string]*pipelineStats)
	for _, row := range buildResult.GetData().Data {
		values, err := toString(row)
		if err != nil {
			return nil, fmt.Errorf("Could not process build_success results: %v", err)
		}
		pipeline := values[0]
		if _, ok := stats[pipeline]; !ok {
			stats[pipeline] = &pipelineStats{}
		}

		passed := true
		canceled := false
		failures := make([]int, 0)
		missingData := 0
		for i := 1; i < len(values); i += 1 {
			if values[i] == "" {
				// Count the columns without data. If all columns have no data, this means that the setup step failed or was canceled.
				// Otherwise missing data means that the respective platform is not part of a given pipeline.
				missingData += 1
			} else if values[i] != passingState {
				passed = false
				if values[i] == canceledState {
					canceled = true
					break
				} else if values[i] == failedState {
					failures = append(failures, i)
				}
			}
		}

		stats[pipeline].totalBuilds += 1
		if missingData == len(values)-1 {
			stats[pipeline].setupFailed += 1
		} else if canceled {
			stats[pipeline].canceledBuilds += 1
		} else if passed {
			stats[pipeline].passingBuilds += 1
		} else if len(failures) > 1 {
			stats[pipeline].multiPlatformFailures += 1
		} else if len(failures) == 1 {
			// TODO(fweikert): improve data struct?
			id := fmt.Sprintf("%s/%s/%d", row[0], row[1], row[2])
			switch failures[0] {
			case 1:
				stats[pipeline].linuxFailures += 1
				log.Printf("Linux only: %s\n", id)
			case 2:
				stats[pipeline].macosFailures += 1
				log.Printf("MacOS only: %s\n", id)
			case 3:
				stats[pipeline].windowsFailures += 1
				log.Printf("Windows only: %s\n", id)
			case 4:
				stats[pipeline].rbeFailures += 1
				log.Printf("RBE only: %s\n", id)
			}
		}
	}
	return stats, nil
}