use of com.hubspot.singularity.SingularityTaskReconciliationStatistics in project Singularity by HubSpot.
the class SingularityClient method getTaskReconciliationStatistics.
public Optional<SingularityTaskReconciliationStatistics> getTaskReconciliationStatistics() {
final Function<String, String> uri = (host) -> String.format(TASK_RECONCILIATION_FORMAT, getApiBase(host));
LOG.info("Fetch task reconciliation statistics from {}", uri);
final long start = System.currentTimeMillis();
HttpResponse response = executeRequest(uri, Method.GET, Optional.absent(), Collections.emptyMap());
if (response.getStatusCode() == 404) {
return Optional.absent();
}
checkResponse("task reconciliation statistics", response);
LOG.info("Got task reconciliation statistics in {}ms", System.currentTimeMillis() - start);
return Optional.of(response.getAs(SingularityTaskReconciliationStatistics.class));
}
use of com.hubspot.singularity.SingularityTaskReconciliationStatistics in project Singularity by HubSpot.
the class SingularityTaskReconciliation method checkReconciliation.
private void checkReconciliation(final long reconciliationStart, final Collection<SingularityTaskId> remainingTaskIds, final int numTimes, final Histogram histogram) {
final List<SingularityTaskStatusHolder> taskStatusHolders = taskManager.getLastActiveTaskStatusesFor(remainingTaskIds);
final List<MesosTaskStatusObject> taskStatuses = Lists.newArrayListWithCapacity(taskStatusHolders.size());
for (SingularityTaskStatusHolder taskStatusHolder : taskStatusHolders) {
if (taskStatusHolder.getServerId().equals(serverId) && taskStatusHolder.getServerTimestamp() > reconciliationStart) {
histogram.update(taskStatusHolder.getServerTimestamp() - reconciliationStart);
continue;
}
if (taskStatusHolder.getTaskStatus().isPresent()) {
LOG.debug("Re-requesting task status for {}", taskStatusHolder.getTaskId());
taskStatuses.add(taskStatusHolder.getTaskStatus().get());
} else {
TaskStatus.Builder fakeTaskStatusBuilder = TaskStatus.newBuilder().setTaskId(TaskID.newBuilder().setValue(taskStatusHolder.getTaskId().getId())).setState(TaskState.TASK_STARTING);
if (taskStatusHolder.getSlaveId().isPresent()) {
fakeTaskStatusBuilder.setAgentId(AgentID.newBuilder().setValue(taskStatusHolder.getSlaveId().get()));
}
LOG.info("Task {} didn't have a TaskStatus yet, submitting fake status", taskStatusHolder.getTaskId());
taskStatuses.add(mesosProtosUtils.taskStatusFromProtos(fakeTaskStatusBuilder.build()));
}
}
if (taskStatuses.isEmpty()) {
LOG.info("Task reconciliation ended after {} checks and {}", numTimes, JavaUtils.duration(reconciliationStart));
final Snapshot snapshot = histogram.getSnapshot();
stateManager.saveTaskReconciliationStatistics(new SingularityTaskReconciliationStatistics(reconciliationStart, System.currentTimeMillis() - reconciliationStart, numTimes, histogram.getCount(), snapshot.getMax(), snapshot.getMean(), snapshot.getMin(), snapshot.getMedian(), snapshot.get75thPercentile(), snapshot.get95thPercentile(), snapshot.get98thPercentile(), snapshot.get99thPercentile(), snapshot.get999thPercentile(), snapshot.getStdDev()));
isRunningReconciliation.set(false);
return;
}
LOG.info("Requesting reconciliation of {} taskStatuses, task reconciliation has been running for {}", taskStatuses.size(), JavaUtils.duration(reconciliationStart));
schedulerClient.reconcile(taskStatuses.stream().map((t) -> Task.newBuilder().setTaskId(MesosProtosUtils.toTaskId(t.getTaskId())).setAgentId(MesosProtosUtils.toAgentId(t.getAgentId())).build()).collect(Collectors.toList()));
scheduleReconciliationCheck(reconciliationStart, remainingTaskIds, numTimes, histogram);
}
Aggregations