Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›REST API ›API кластера

API управления задачами

API управления задачами — это новая функция, и её всё ещё следует рассматривать как бета-версию. API может измениться несовместимым образом. Состояние функции см. на странице #51628.

Справочник по новому API

Для получения самых последних данных об API обратитесь к API управления задачами.

Возвращает информацию о задачах, которые в данный момент выполняются в кластере.

Запрос

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:* 

Получает все задачи, выполняющиеся в данный момент на всех узлах кластера.

Получает все задачи, выполняющиеся на узлах nodeId1 и nodeId2. См. Спецификацию узлов для получения дополнительной информации о том, как выбрать отдельные узлы.

Получает все задачи, связанные с кластером, выполняющиеся на узлах nodeId1 и nodeId2.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API