/*
* Copyright 2012 LinkedIn Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package azkaban.webapp;
import java.io.File;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import azkaban.executor.ExecutableFlow;
import azkaban.executor.ExecutorManagerAdapter;
import azkaban.executor.ExecutorManagerException;
import azkaban.executor.Status;
import azkaban.scheduler.Schedule;
import azkaban.scheduler.ScheduleManager;
import azkaban.scheduler.ScheduleStatisticManager;
import azkaban.scheduler.ScheduleManagerException;
public class SchedulerStatistics {
public static Map<String, Object> getStatistics(
int scheduleId, AzkabanWebServer server)
throws ScheduleManagerException {
if (ScheduleStatisticManager.getCacheDirectory() == null) {
ScheduleStatisticManager.setCacheFolder(
new File(server.getServerProps().getString("cache.directory", "cache")));
}
Map<String, Object> data = ScheduleStatisticManager.loadCache(scheduleId);
if (data != null) {
return data;
}
// Calculate data and cache it
data = calculateStats(scheduleId, server);
ScheduleStatisticManager.saveCache(scheduleId, data);
return data;
}
private static Map<String, Object> calculateStats(
int scheduleId, AzkabanWebServer server)
throws ScheduleManagerException {
Map<String, Object> data = new HashMap<String, Object>();
ExecutorManagerAdapter executorManager = server.getExecutorManager();
ScheduleManager scheduleManager = server.getScheduleManager();
Schedule schedule = scheduleManager.getSchedule(scheduleId);
try {
List<ExecutableFlow> executables = executorManager.getExecutableFlows(
schedule.getProjectId(), schedule.getFlowName(), 0,
ScheduleStatisticManager.STAT_NUMBERS, Status.SUCCEEDED);
long average = 0;
long min = Integer.MAX_VALUE;
long max = 0;
if (executables.isEmpty()) {
average = 0;
min = 0;
max = 0;
} else {
for (ExecutableFlow flow : executables) {
long time = flow.getEndTime() - flow.getStartTime();
average += time;
if (time < min) {
min = time;
}
if (time > max) {
max = time;
}
}
average /= executables.size();
}
data.put("average", average);
data.put("min", min);
data.put("max", max);
} catch (ExecutorManagerException e) {
e.printStackTrace();
}
return data;
}
}