Add start time and duration to tasks
Tasks now contain timestamps indicating when the tasks were created and current run time
This commit is contained in:
parent
e1b5ebb46c
commit
863fab4007
|
@ -29,6 +29,7 @@ import org.elasticsearch.tasks.Task;
|
|||
import org.elasticsearch.tasks.TaskId;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Information about a currently running task.
|
||||
|
@ -50,17 +51,24 @@ public class TaskInfo implements Writeable<TaskInfo>, ToXContent {
|
|||
|
||||
private final String description;
|
||||
|
||||
private final long startTime;
|
||||
|
||||
private final long runningTimeNanos;
|
||||
|
||||
private final Task.Status status;
|
||||
|
||||
private final TaskId parentTaskId;
|
||||
|
||||
public TaskInfo(DiscoveryNode node, long id, String type, String action, String description, Task.Status status, TaskId parentTaskId) {
|
||||
public TaskInfo(DiscoveryNode node, long id, String type, String action, String description, Task.Status status, long startTime,
|
||||
long runningTimeNanos, TaskId parentTaskId) {
|
||||
this.node = node;
|
||||
this.taskId = new TaskId(node.getId(), id);
|
||||
this.type = type;
|
||||
this.action = action;
|
||||
this.description = description;
|
||||
this.status = status;
|
||||
this.startTime = startTime;
|
||||
this.runningTimeNanos = runningTimeNanos;
|
||||
this.parentTaskId = parentTaskId;
|
||||
}
|
||||
|
||||
|
@ -75,6 +83,8 @@ public class TaskInfo implements Writeable<TaskInfo>, ToXContent {
|
|||
} else {
|
||||
status = null;
|
||||
}
|
||||
startTime = in.readLong();
|
||||
runningTimeNanos = in.readLong();
|
||||
parentTaskId = new TaskId(in);
|
||||
}
|
||||
|
||||
|
@ -110,6 +120,23 @@ public class TaskInfo implements Writeable<TaskInfo>, ToXContent {
|
|||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the task start time
|
||||
*/
|
||||
public long getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the task running time
|
||||
*/
|
||||
public long getRunningTimeNanos() {
|
||||
return runningTimeNanos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the parent task id
|
||||
*/
|
||||
public TaskId getParentTaskId() {
|
||||
return parentTaskId;
|
||||
}
|
||||
|
@ -132,6 +159,8 @@ public class TaskInfo implements Writeable<TaskInfo>, ToXContent {
|
|||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
out.writeLong(startTime);
|
||||
out.writeLong(runningTimeNanos);
|
||||
parentTaskId.writeTo(out);
|
||||
}
|
||||
|
||||
|
@ -147,6 +176,8 @@ public class TaskInfo implements Writeable<TaskInfo>, ToXContent {
|
|||
if (description != null) {
|
||||
builder.field("description", description);
|
||||
}
|
||||
builder.dateValueField("start_time_in_millis", "start_time", startTime);
|
||||
builder.timeValueField("running_time_in_nanos", "running_time", runningTimeNanos, TimeUnit.NANOSECONDS);
|
||||
if (parentTaskId.isSet() == false) {
|
||||
builder.field("parent_task_id", parentTaskId.toString());
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ import java.util.Date;
|
|||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -961,6 +961,23 @@ public final class XContentBuilder implements BytesStream, Releasable {
|
|||
return this;
|
||||
}
|
||||
|
||||
public XContentBuilder timeValueField(String rawFieldName, String readableFieldName, long rawTime, TimeUnit timeUnit) throws
|
||||
IOException {
|
||||
if (humanReadable) {
|
||||
field(readableFieldName, new TimeValue(rawTime, timeUnit).toString());
|
||||
}
|
||||
field(rawFieldName, rawTime);
|
||||
return this;
|
||||
}
|
||||
|
||||
public XContentBuilder dateValueField(String rawFieldName, String readableFieldName, long rawTimestamp) throws IOException {
|
||||
if (humanReadable) {
|
||||
field(readableFieldName, defaultDatePrinter.print(rawTimestamp));
|
||||
}
|
||||
field(rawFieldName, rawTimestamp);
|
||||
return this;
|
||||
}
|
||||
|
||||
public XContentBuilder byteSizeField(XContentBuilderString rawFieldName, XContentBuilderString readableFieldName, ByteSizeValue byteSizeValue) throws IOException {
|
||||
if (humanReadable) {
|
||||
field(readableFieldName, byteSizeValue.toString());
|
||||
|
|
|
@ -40,16 +40,26 @@ public class Task {
|
|||
|
||||
private final TaskId parentTask;
|
||||
|
||||
private final long startTime;
|
||||
|
||||
private final long startTimeNanos;
|
||||
|
||||
public Task(long id, String type, String action, String description) {
|
||||
this(id, type, action, description, TaskId.EMPTY_TASK_ID);
|
||||
}
|
||||
|
||||
public Task(long id, String type, String action, String description, TaskId parentTask) {
|
||||
this(id, type, action, description, parentTask, System.currentTimeMillis(), System.nanoTime());
|
||||
}
|
||||
|
||||
public Task(long id, String type, String action, String description, TaskId parentTask, long startTime, long startTimeNanos) {
|
||||
this.id = id;
|
||||
this.type = type;
|
||||
this.action = action;
|
||||
this.description = description;
|
||||
this.parentTask = parentTask;
|
||||
this.startTime = startTime;
|
||||
this.startTimeNanos = startTimeNanos;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -69,7 +79,8 @@ public class Task {
|
|||
description = getDescription();
|
||||
status = getStatus();
|
||||
}
|
||||
return new TaskInfo(node, getId(), getType(), getAction(), description, status, parentTask);
|
||||
return new TaskInfo(node, getId(), getType(), getAction(), description, status, startTime, System.nanoTime() - startTimeNanos,
|
||||
parentTask);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -100,6 +111,13 @@ public class Task {
|
|||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the task start time
|
||||
*/
|
||||
public long getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns id of the parent task or NO_PARENT_ID if the task doesn't have any parent tasks
|
||||
*/
|
||||
|
|
|
@ -63,6 +63,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
|||
import static org.elasticsearch.action.support.PlainActionFuture.newFuture;
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.endsWith;
|
||||
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
||||
import static org.hamcrest.Matchers.not;
|
||||
|
||||
public class TransportTasksActionTests extends TaskManagerTestCase {
|
||||
|
@ -461,10 +462,12 @@ public class TransportTasksActionTests extends TaskManagerTestCase {
|
|||
}
|
||||
|
||||
public void testTasksDescriptions() throws Exception {
|
||||
long minimalStartTime = System.currentTimeMillis();
|
||||
setupTestNodes(Settings.EMPTY);
|
||||
connectNodes(testNodes);
|
||||
CountDownLatch checkLatch = new CountDownLatch(1);
|
||||
ActionFuture<NodesResponse> future = startBlockingTestNodesAction(checkLatch);
|
||||
long maximumStartTimeNanos = System.nanoTime();
|
||||
|
||||
// Check task counts using transport with filtering
|
||||
TestNode testNode = testNodes[randomIntBetween(0, testNodes.length - 1)];
|
||||
|
@ -478,12 +481,15 @@ public class TransportTasksActionTests extends TaskManagerTestCase {
|
|||
}
|
||||
|
||||
// Check task counts using transport with detailed description
|
||||
long minimalDurationNanos = System.nanoTime() - maximumStartTimeNanos;
|
||||
listTasksRequest.detailed(true); // same request only with detailed description
|
||||
response = testNode.transportListTasksAction.execute(listTasksRequest).get();
|
||||
assertEquals(testNodes.length, response.getPerNodeTasks().size());
|
||||
for (Map.Entry<DiscoveryNode, List<TaskInfo>> entry : response.getPerNodeTasks().entrySet()) {
|
||||
assertEquals(1, entry.getValue().size());
|
||||
assertEquals("CancellableNodeRequest[Test Request, true]", entry.getValue().get(0).getDescription());
|
||||
assertThat(entry.getValue().get(0).getStartTime(), greaterThanOrEqualTo(minimalStartTime));
|
||||
assertThat(entry.getValue().get(0).getRunningTimeNanos(), greaterThanOrEqualTo(minimalDurationNanos));
|
||||
}
|
||||
|
||||
// Release all tasks and wait for response
|
||||
|
|
Loading…
Reference in New Issue