API управления задачами
API управления задачами — это новая функция, и её всё ещё следует рассматривать как бета-версию. API может измениться несовместимым образом. Состояние функции см. на странице #51628.
Возвращает информацию о задачах, которые в данный момент выполняются в кластере.
Запрос
GET /_tasks/<task_id>
GET /_tasks
Предварительные условия
- Если в Elasticsearch включены функции безопасности, необходимо иметь право
monitorилиmanageразрешение на доступ к кластеру, чтобы использовать этот API.
Описание
API управления задачами возвращает информацию о задачах, которые в данный момент выполняются на одном или нескольких узлах кластера.
Параметры пути
-
<task_id> - (Необязательно, строка) Идентификатор задачи для возврата (
node_id:task_number).
Параметры запроса
-
actions -
(Необязательно, строка) Список, разделённый запятыми, или выражение с подстановкой значений для ограничений запроса.
Опустите этот параметр, чтобы вернуть все действия.
-
detailed - (Необязательно, логическое значение) Если
true, ответ включает подробную информацию о восстановлении фрагментов. По умолчаниюfalse. -
group_by -
(Необязательно, строка) Ключ для группировки задач в ответе.
Возможные значения:
-
nodes - (По умолчанию) ID узла
-
parents - ID родительской задачи
-
none - Не группировать задачи.
-
-
nodes - (Необязательно, строка) Список узлов или имён узлов, разделённых запятыми, для ограничения возвращаемой информации.
-
parent_task_id -
(Необязательно, строка) ID родительской задачи для ограничения возвращаемой информации.
Для возвращения всех задач опустите этот параметр или используйте значение
-1. -
timeout - (Необязательно, единицы измерения времени) Период ожидания ответа от каждого узла. Если узел не отвечает до истечения тайм-аута, его информация не включается в ответ. Тем не менее, узлы с истекшим временем ожидания включаются в свойство
node_failuresответа. По умолчанию30s. -
wait_for_completion - (Необязательно, логическое значение) Если
true, запрос блокируется до завершения всех найденных задач. По умолчаниюfalse.
Коды ответов
-
404(Нет ресурсов) - Если
<task_id>указан, но не найден, этот код указывает на отсутствие ресурсов, соответствующих запросу.
Примеры
resp = client.tasks.list()
print(resp)
resp1 = client.tasks.list(
nodes="nodeId1,nodeId2",
)
print(resp1)
resp2 = client.tasks.list(
nodes="nodeId1,nodeId2",
actions="cluster:*",
)
print(resp2) response = client.tasks.list puts response response = client.tasks.list( nodes: 'nodeId1,nodeId2' ) puts response response = client.tasks.list( nodes: 'nodeId1,nodeId2', actions: 'cluster:*' ) puts response
const response = await client.tasks.list();
console.log(response);
const response1 = await client.tasks.list({
nodes: "nodeId1,nodeId2",
});
console.log(response1);
const response2 = await client.tasks.list({
nodes: "nodeId1,nodeId2",
actions: "cluster:*",
});
console.log(response2); GET _tasks GET _tasks?nodes=nodeId1,nodeId2 GET _tasks?nodes=nodeId1,nodeId2&actions=cluster:*
| Получает все задачи, выполняющиеся в данный момент на всех узлах кластера. | |
| Получает все задачи, выполняющиеся на узлах | |
| Получает все задачи, связанные с кластером, выполняющиеся на узлах |
API возвращает следующий результат:
{
"nodes" : {
"oTUltX4IQMOUUVeiohTt8A" : {
"name" : "H5dfFeA",
"transport_address" : "127.0.0.1:9300",
"host" : "127.0.0.1",
"ip" : "127.0.0.1:9300",
"tasks" : {
"oTUltX4IQMOUUVeiohTt8A:124" : {
"node" : "oTUltX4IQMOUUVeiohTt8A",
"id" : 124,
"type" : "direct",
"action" : "cluster:monitor/tasks/lists[n]",
"start_time_in_millis" : 1458585884904,
"running_time_in_nanos" : 47402,
"cancellable" : false,
"parent_task_id" : "oTUltX4IQMOUUVeiohTt8A:123"
},
"oTUltX4IQMOUUVeiohTt8A:123" : {
"node" : "oTUltX4IQMOUUVeiohTt8A",
"id" : 123,
"type" : "transport",
"action" : "cluster:monitor/tasks/lists",
"start_time_in_millis" : 1458585884904,
"running_time_in_nanos" : 236042,
"cancellable" : false
}
}
}
}
} Получение информации о конкретной задаче
Также возможно получить информацию о конкретной задаче. Следующий пример получает информацию о задаче oTUltX4IQMOUUVeiohTt8A:124:
resp = client.tasks.get(
task_id="oTUltX4IQMOUUVeiohTt8A:124",
)
print(resp) response = client.tasks.get( task_id: 'oTUltX4IQMOUUVeiohTt8A:124' ) puts response
const response = await client.tasks.get({
task_id: "oTUltX4IQMOUUVeiohTt8A:124",
});
console.log(response); GET _tasks/oTUltX4IQMOUUVeiohTt8A:124
Если задача не найдена, API возвращает 404.
Для получения всех дочерних задач конкретной задачи:
resp = client.tasks.list(
parent_task_id="oTUltX4IQMOUUVeiohTt8A:123",
)
print(resp) response = client.tasks.list( parent_task_id: 'oTUltX4IQMOUUVeiohTt8A:123' ) puts response
const response = await client.tasks.list({
parent_task_id: "oTUltX4IQMOUUVeiohTt8A:123",
});
console.log(response); GET _tasks?parent_task_id=oTUltX4IQMOUUVeiohTt8A:123
Если родительская задача не найдена, API не возвращает 404.
Получение дополнительной информации о задачах
Вы также можете использовать параметр запроса detailed для получения дополнительной информации о выполняемых задачах. Это полезно для различения задач, но выполняется дороже. Например, получение всех поисков с использованием параметра запроса detailed:
resp = client.tasks.list(
actions="*search",
detailed=True,
)
print(resp) response = client.tasks.list( actions: '*search', detailed: true ) puts response
const response = await client.tasks.list({
actions: "*search",
detailed: "true",
});
console.log(response); GET _tasks?actions=*search&detailed
API возвращает следующий результат:
{
"nodes" : {
"oTUltX4IQMOUUVeiohTt8A" : {
"name" : "H5dfFeA",
"transport_address" : "127.0.0.1:9300",
"host" : "127.0.0.1",
"ip" : "127.0.0.1:9300",
"tasks" : {
"oTUltX4IQMOUUVeiohTt8A:464" : {
"node" : "oTUltX4IQMOUUVeiohTt8A",
"id" : 464,
"type" : "transport",
"action" : "indices:data/read/search",
"description" : "indices[test], types[test], search_type[QUERY_THEN_FETCH], source[{\"query\":...}]",
"start_time_in_millis" : 1483478610008,
"running_time_in_nanos" : 13991383,
"cancellable" : true,
"cancelled" : false
}
}
}
}
} Новое поле description содержит текст, понятный пользователю, который идентифицирует конкретный запрос, выполняемый задачей, например, идентификацию поискового запроса, выполняемого задачей поиска, как в примере выше. Другие типы задач имеют разные описания, например, _reindex, у которого есть источник и пункт назначения, или _bulk, у которого есть только количество запросов и индексы назначения. Многие запросы будут иметь только пустое описание, потому что более подробная информация о запросе не легкодоступна или не особенно полезна для идентификации запроса.
_tasks запросы с detailed также могут возвращать status. Это отчет об внутреннем состоянии задачи. Поэтому его формат варьируется в зависимости от задачи. Хотя мы стараемся поддерживать status для конкретной задачи согласованным от версии к версии, это не всегда возможно, поскольку мы иногда изменяем реализацию. В этом случае мы можем удалить поля из status для конкретного запроса, поэтому любая обработка вами статуса может сломаться в мелких выпусках.
Ожидание завершения
API задач также может использоваться для ожидания завершения конкретной задачи. Следующий вызов будет блокировать на 10 секунд или до тех пор, пока задача с идентификатором oTUltX4IQMOUUVeiohTt8A:12345 не завершится.
resp = client.tasks.get(
task_id="oTUltX4IQMOUUVeiohTt8A:12345",
wait_for_completion=True,
timeout="10s",
)
print(resp) response = client.tasks.get( task_id: 'oTUltX4IQMOUUVeiohTt8A:12345', wait_for_completion: true, timeout: '10s' ) puts response
const response = await client.tasks.get({
task_id: "oTUltX4IQMOUUVeiohTt8A:12345",
wait_for_completion: "true",
timeout: "10s",
});
console.log(response); GET _tasks/oTUltX4IQMOUUVeiohTt8A:12345?wait_for_completion=true&timeout=10s
Также можно ожидать завершения всех задач определенных типов. Эта команда будет ожидать завершения всех задач reindex:
resp = client.tasks.list(
actions="*reindex",
wait_for_completion=True,
timeout="10s",
)
print(resp) response = client.tasks.list( actions: '*reindex', wait_for_completion: true, timeout: '10s' ) puts response
const response = await client.tasks.list({
actions: "*reindex",
wait_for_completion: "true",
timeout: "10s",
});
console.log(response); GET _tasks?actions=*reindex&wait_for_completion=true&timeout=10s
Отмена задачи
Если долго выполняющаяся задача поддерживает отмену, ее можно отменить с помощью API отмены задач. Следующий пример отменяет задачу oTUltX4IQMOUUVeiohTt8A:12345:
resp = client.tasks.cancel(
task_id="oTUltX4IQMOUUVeiohTt8A:12345",
)
print(resp) response = client.tasks.cancel( task_id: 'oTUltX4IQMOUUVeiohTt8A:12345' ) puts response
const response = await client.tasks.cancel({
task_id: "oTUltX4IQMOUUVeiohTt8A:12345",
});
console.log(response); POST _tasks/oTUltX4IQMOUUVeiohTt8A:12345/_cancel
Команда отмены задачи поддерживает те же параметры выбора задач, что и команда списка задач, поэтому несколько задач можно отменить одновременно. Например, следующая команда отменит все задачи переиндексации, выполняющиеся на узлах nodeId1 и nodeId2.
resp = client.tasks.cancel(
nodes="nodeId1,nodeId2",
actions="*reindex",
)
print(resp) response = client.tasks.cancel( nodes: 'nodeId1,nodeId2', actions: '*reindex' ) puts response
const response = await client.tasks.cancel({
nodes: "nodeId1,nodeId2",
actions: "*reindex",
});
console.log(response); POST _tasks/_cancel?nodes=nodeId1,nodeId2&actions=*reindex
Задача может продолжать выполняться некоторое время после отмены, поскольку она может не иметь возможности безопасно остановить свою текущую активность сразу или потому, что Elasticsearch должен завершить свою работу над другими задачами, прежде чем обработать отмену. API списка задач будет продолжать перечислять эти отменённые задачи до их завершения. Флаг cancelled в ответе API списка задач указывает, что команда отмены была обработана и задача остановится как можно скорее. Чтобы устранить неполадки, почему отменённая задача не завершается быстро, используйте API списка задач с параметром ?detailed для определения других задач, которые система выполняет, а также используйте API горячих потоков узлов для получения подробной информации о работе, выполняемой системой, вместо завершения отменённой задачи.
Группировка задач
Списки задач, возвращаемые командами API задач, можно сгруппировать по узлам (по умолчанию) или по родительским задачам с помощью параметра group_by. Следующая команда изменит группировку на родительские задачи:
resp = client.tasks.list(
group_by="parents",
)
print(resp) response = client.tasks.list( group_by: 'parents' ) puts response
const response = await client.tasks.list({
group_by: "parents",
});
console.log(response); GET _tasks?group_by=parents
Группировку можно отключить, указав none как параметр group_by:
resp = client.tasks.list(
group_by="none",
)
print(resp) response = client.tasks.list( group_by: 'none' ) puts response
const response = await client.tasks.list({
group_by: "none",
});
console.log(response); GET _tasks?group_by=none
Идентификация выполняющихся задач
Заголовок X-Opaque-Id, когда он предоставляется в заголовке HTTP-запроса, будет возвращаться и в заголовке ответа, и в поле headers информации о задаче. Это позволяет отслеживать определенные вызовы или связывать определенные задачи с клиентом, который их инициировал:
curl -i -H "X-Opaque-Id: 123456" "http://localhost:9200/_tasks?group_by=parents"
API возвращает следующий результат:
HTTP/1.1 200 OK
X-Opaque-Id: 123456
content-type: application/json; charset=UTF-8
content-length: 831
{
"tasks" : {
"u5lcZHqcQhu-rUoFaqDphA:45" : {
"node" : "u5lcZHqcQhu-rUoFaqDphA",
"id" : 45,
"type" : "transport",
"action" : "cluster:monitor/tasks/lists",
"start_time_in_millis" : 1513823752749,
"running_time_in_nanos" : 293139,
"cancellable" : false,
"headers" : {
"X-Opaque-Id" : "123456"
},
"children" : [
{
"node" : "u5lcZHqcQhu-rUoFaqDphA",
"id" : 46,
"type" : "direct",
"action" : "cluster:monitor/tasks/lists[n]",
"start_time_in_millis" : 1513823752750,
"running_time_in_nanos" : 92133,
"cancellable" : false,
"parent_task_id" : "u5lcZHqcQhu-rUoFaqDphA:45",
"headers" : {
"X-Opaque-Id" : "123456"
}
}
]
}
}
} | id как часть заголовка ответа | |
| id для задач, инициированных REST-запросом | |
| дочерняя задача задачи, инициированной REST-запросом |
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/tasks.html