in perf-tools/framework/app_analyzer.go [76:105]
func (aa *AppAnalyzer) GetTasksDistribution(condType TaskConditionType) [][]*TaskStatus {
beginTime := aa.appInfo.AppStatus.CreateTime
endTime := aa.appInfo.AppStatus.RunningTime
maxSeconds := int(math.Floor(endTime.Sub(beginTime).Seconds()) + 1)
distribution := make([][]*TaskStatus, maxSeconds+1)
for _, status := range aa.appInfo.TasksStatus {
if condTransitionTime := status.GetTransitionTime(condType); condTransitionTime != nil {
seconds := int(math.Floor(condTransitionTime.Sub(beginTime).Seconds()) + 1)
if seconds < 0 {
utils.Logger.Warn("skip invalid task", zap.Any("beginTime", beginTime),
zap.Any("conditionType", condType), zap.Any("taskStatus", status))
continue
}
distribution[seconds] = append(distribution[seconds], status)
} else {
utils.Logger.Warn("skip invalid task", zap.Any("conditionType", condType),
zap.Any("taskStatus", status))
continue
}
}
// drop zero tail
lastNonZeroIndex := -1
for i := maxSeconds; i >= 0; i-- {
if len(distribution[i]) != 0 {
lastNonZeroIndex = i
break
}
}
return distribution[:lastNonZeroIndex+1]
}