Line 1: |
|
|
+ |
This report shows the user a list workflows (with their respective project), and the successes & failures on the workflows. It will also list durations of successes and failures. This report has to be used in conjunction with a report template such as the [[HTML Template]].
|
|
|
|
|
|
|
+ |
----
|
|
|
|
|
|
|
+ |
''Meta-Data Script:''
|
|
|
|
|
|
|
+ |
<pre>import com.urbancode.anthill3.domain.reporting.*;
|
|
|
+ |
import java.text.*;
|
|
|
+ |
import java.util.*;
|
|
|
|
|
|
|
+ |
ReportMetaData rmd = new ReportMetaData();
|
|
|
|
|
|
|
+ |
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
|
|
+ |
TextParamMetaData startDateParam = new TextParamMetaData();
|
|
|
|
|
|
|
+ |
startDateParam.setName("startDateStr");
|
|
|
+ |
startDateParam.setLabel("Start Date");
|
|
|
+ |
startDateParam.setDescription("The Interval Start Date yyyy-MM-dd");
|
|
|
+ |
startDateParam.setRequired(true);
|
|
|
|
|
|
|
+ |
Calendar cal = Calendar.getInstance();
|
|
|
+ |
cal.add(Calendar.MONTH, -1);
|
|
|
|
|
|
|
+ |
startDateParam.setDefaultValue(DATE_FORMAT.format(cal.getTime()));
|
|
|
|
|
|
|
+ |
rmd.addParameter(startDateParam);
|
|
|
|
|
|
|
+ |
TextParamMetaData endDateParam = new TextParamMetaData();
|
|
|
|
|
|
|
+ |
endDateParam.setName("endDateStr");
|
|
|
+ |
endDateParam.setLabel("End Date");
|
|
|
+ |
endDateParam.setDescription("The Interval End Date yyyy-MM-dd");
|
|
|
+ |
endDateParam.setRequired(true);
|
|
|
+ |
endDateParam.setDefaultValue(DATE_FORMAT.format(new Date()));
|
|
|
|
|
|
|
+ |
rmd.addParameter(endDateParam);
|
|
|
|
|
|
|
+ |
// Configure columns
|
|
|
+ |
rmd.addColumn("Project");
|
|
|
+ |
rmd.addColumn("Workflow");
|
|
|
+ |
rmd.addColumn("Successes");
|
|
|
+ |
rmd.addColumn("Failures");
|
|
|
+ |
rmd.addColumn("Duration (successes)");
|
|
|
+ |
rmd.addColumn("Duration (failures)");
|
|
|
|
|
|
|
+ |
// Lastly, return the meta data
|
|
|
+ |
return rmd;
|
|
|
+ |
</pre>
|
|
|
|
|
|
|
+ |
----
|
|
|
|
|
|
|
+ |
''Report Script:''
|
|
|
|
|
|
|
+ |
<pre>import com.urbancode.anthill3.dashboard.*;
|
|
|
+ |
import com.urbancode.anthill3.domain.reporting.*;
|
|
|
+ |
import com.urbancode.anthill3.domain.project.*;
|
|
|
+ |
import com.urbancode.anthill3.domain.workflow.WorkflowStatusEnum;
|
|
|
+ |
import java.util.*;
|
|
|
+ |
import java.text.*;
|
|
|
+ |
import com.urbancode.commons.util.Duration;
|
|
|
|
|
|
|
+ |
class WorkflowSummary {
|
|
|
+ |
Long id = null;
|
|
|
+ |
String name = null;
|
|
|
+ |
int successes = 0;
|
|
|
+ |
int failures = 0;
|
|
|
+ |
long successTime = 0;
|
|
|
+ |
long failTime = 0;
|
|
|
+ |
}
|
|
|
|
|
|
|
+ |
ReportOutput output = new ReportOutput(metaData);
|
|
|
|
|
|
|
+ |
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm");
|
|
|
|
|
|
|
+ |
Date startDate = DATE_FORMAT.parse(startDateStr + " 00:00");
|
|
|
+ |
Date endDate = DATE_FORMAT.parse(endDateStr + " 23:59");
|
|
|
+ |
Project[] projects = ProjectFactory.getInstance().restoreAllActive();
|
|
|
|
|
|
|
+ |
WorkflowSummary total = new WorkflowSummary();
|
|
|
+ |
total.name = " TOTAL";
|
|
|
|
|
|
|
|
|
|
|
+ |
for (int i = 0; i < projects.length; i++) {
|
|
|
+ |
Project project = projects[i];
|
|
|
+ |
Map workflowNameToSummary = new HashMap();
|
|
|
|
|
|
|
+ |
BuildLifeWorkflowCaseSummary[] summaries = DashboardFactory.getInstance().getBuildLifeWorkflowSummaries(project.getId(), startDate, endDate);
|
|
|
|
|
|
|
+ |
for (int j = 0; j < summaries.length; j++) {
|
|
|
+ |
BuildLifeWorkflowCaseSummary summary = summaries[j];
|
|
|
|
|
|
|
+ |
boolean failed = (summary.getStatus() == WorkflowStatusEnum.FAILED || summary.getStatus() == WorkflowStatusEnum.ERROR);
|
|
|
+ |
|
|
|
+ |
WorkflowSummary wfSummary = null;
|
|
|
+ |
if (workflowNameToSummary.containsKey(summary.getWorkflowName())) {
|
|
|
+ |
wfSummary = (WorkflowSummary) workflowNameToSummary.get(summary.getWorkflowName());
|
|
|
+ |
}
|
|
|
+ |
else {
|
|
|
+ |
wfSummary = new WorkflowSummary();
|
|
|
+ |
wfSummary.name = summary.getWorkflowName();
|
|
|
+ |
wfSummary.id = summary.getWorkflowId();
|
|
|
+ |
workflowNameToSummary.put(summary.getWorkflowName(), wfSummary);
|
|
|
+ |
}
|
|
|
|
|
|
|
+ |
if (failed) {
|
|
|
+ |
wfSummary.failures++;
|
|
|
+ |
total.failures++;
|
|
|
+ |
if (summary.getEndDate() != null && summary.getStartDate() != null) {
|
|
|
+ |
time = summary.getEndDate().getTime() - summary.getStartDate().getTime();
|
|
|
+ |
wfSummary.failTime += time;
|
|
|
+ |
total.failTime += time;
|
|
|
+ |
}
|
|
|
+ |
}
|
|
|
+ |
else {
|
|
|
+ |
wfSummary.successes++;
|
|
|
+ |
total.successes++;
|
|
|
+ |
if (summary.getEndDate() != null && summary.getStartDate() != null) {
|
|
|
+ |
time = summary.getEndDate().getTime() - summary.getStartDate().getTime();
|
|
|
+ |
wfSummary.successTime += time;
|
|
|
+ |
total.successTime += time;
|
|
|
+ |
}
|
|
|
+ |
}
|
|
|
+ |
}
|
|
|
|
|
|
|
+ |
Iterator itr = workflowNameToSummary.values().iterator();
|
|
|
+ |
while (itr.hasNext()) {
|
|
|
+ |
// Only include workflows with Activity
|
|
|
+ |
|
|
|
+ |
WorkflowSummary summary = (WorkflowSummary) itr.next();
|
|
|
+ |
if (summary.successes > 0 || summary.failures > 0) {
|
|
|
+ |
long numAvgSucDur = summary.successes == 0 ? 0 : summary.successTime / summary.successes;
|
|
|
+ |
long numAvgFailDur = summary.failures == 0 ? 0 : summary.failTime / summary.failures;
|
|
|
|
|
|
|
+ |
Duration successAvgDuration = new Duration(numAvgSucDur);
|
|
|
+ |
Duration failedAvgDuration = new Duration(numAvgFailDur);
|
|
|
|
|
|
|
+ |
ReportRow row = new ReportRow(output, project.getName() + "-" + summary.name);
|
|
|
+ |
row.setColumnValue("Project", project.getName());
|
|
|
+ |
row.setColumnValue("Workflow", summary.name);
|
|
|
+ |
row.setColumnValue("Successes", summary.successes + "");
|
|
|
+ |
row.setColumnValue("Failures", summary.failures + "");
|
|
|
+ |
row.setColumnValue("Duration (successes)", successAvgDuration.getLeastUnit(true,false));
|
|
|
+ |
row.setColumnValue("Duration (failures)", failedAvgDuration.getLeastUnit(true,false));
|
|
|
|
|
|
|
+ |
output.addRow(row);
|
|
|
+ |
}
|
|
|
+ |
}
|
|
|
+ |
}
|
|
|
+ |
|
|
|
+ |
// Set up a summary row
|
|
|
+ |
long numAvgSucDur = total.successes == 0 ? 0 : total.successTime / total.successes;
|
|
|
|
|
|
|
+ |
long numAvgFailDur = total.failures == 0 ? 0 : total.failTime / total.failures;
|
|
|
|
|
|
|
+ |
Duration successAvgDuration = new Duration(numAvgSucDur);
|
|
|
+ |
Duration failedAvgDuration = new Duration(numAvgFailDur);
|
|
|
|
|
|
|
+ |
ReportRow row = new ReportRow(output, "Total");
|
|
|
+ |
row.setColumnValue("Project", "<b>Total<b>");
|
|
|
+ |
row.setColumnValue("Workflow", " ");
|
|
|
+ |
row.setColumnValue("Successes", total.successes + "");
|
|
|
+ |
row.setColumnValue("Failures", total.failures + "");
|
|
|
+ |
row.setColumnValue("Duration (successes)", successAvgDuration.getLeastUnit(true,false));
|
|
|
+ |
row.setColumnValue("Duration (failures)", failedAvgDuration.getLeastUnit(true,false));
|
|
|
+ |
output.addRow(row);
|
|
|
|
|
|
|
+ |
return output;
|
|
|
+ |
</pre>
|
|
|
|
|
|
|
+ |
----
|
|
|
|
|
|
|
+ |
'''Related Content'''
|
|
|
|
|
|
|
+ |
[[AnthillPro Template Reports]]<br/>
|
|
|
+ |
[[Report Templates]]
|