@Override public Number calculate(Iterable<IScheduledTask> tasks, Range<Long> timeFrame) { Iterable<IScheduledTask> activeTasks = FluentIterable.from(tasks) .filter(Predicates.compose(Predicates.in(Tasks.ACTIVE_STATES), Tasks.GET_STATUS)); List<Long> waitTimes = Lists.newLinkedList(); for (IScheduledTask task : activeTasks) { long pendingTs = 0; for (ITaskEvent event : task.getTaskEvents()) { if (event.getStatus() == PENDING) { pendingTs = event.getTimestamp(); } else if (event.getStatus() == status && timeFrame.contains(event.getTimestamp())) { if (pendingTs == 0) { throw new IllegalArgumentException( "SLA: missing PENDING status for:" + task.getAssignedTask().getTaskId()); } waitTimes.add(event.getTimestamp() - pendingTs); break; } } } return SlaUtil.percentile(waitTimes, 50.0); }
@Override public Number calculate(Iterable<IScheduledTask> tasks, final Range<Long> timeFrame) { List<Long> uptimes = FluentIterable.from(tasks) .filter(IS_RUNNING) .transform( Functions.compose( new Function<ITaskEvent, Long>() { @Override public Long apply(ITaskEvent event) { return timeFrame.upperEndpoint() - event.getTimestamp(); } }, TASK_TO_EVENT)) .toList(); return (int) Math.floor((double) SlaUtil.percentile(uptimes, percentile) / 1000); }