任务管理 API

编辑

任务管理 API 是新的,仍应视为 beta 功能。API 可能会以不向后兼容的方式更改。有关功能状态,请参阅 #51628

返回有关集群中当前正在执行的任务的信息。

请求

编辑

GET /_tasks/<task_id>

GET /_tasks

先决条件

编辑
  • 如果启用了 Elasticsearch 安全功能,您必须具有 monitormanage 集群权限才能使用此 API。

描述

编辑

任务管理 API 返回有关当前在集群中一个或多个节点上执行的任务的信息。

路径参数

编辑
<task_id>
(可选,字符串)要返回的任务的 ID (node_id:task_number)。

查询参数

编辑
actions

(可选,字符串)用于限制请求的操作的逗号分隔列表或通配符表达式。

省略此参数以返回所有操作。

detailed
(可选,布尔值)如果为 true,则响应包括有关分片恢复的详细信息。默认为 false
group_by

(可选,字符串)用于对响应中的任务进行分组的键。

可能的值是

nodes
(默认)节点 ID
parents
父任务 ID
none
不对任务进行分组。
nodes
(可选,字符串)用于限制返回信息的节点 ID 或名称的逗号分隔列表。
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:* 

检索当前在集群中所有节点上运行的所有任务。

检索在节点 nodeId1nodeId2 上运行的所有任务。有关如何选择单个节点的更多信息,请参阅 节点规范

检索在节点 nodeId1nodeId2 上运行的所有与集群相关的任务。

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,它仅具有请求数和目标索引。许多请求将只有空描述,因为有关请求的更详细信息不容易获得,或者对于识别请求没有特别帮助。

带有 detailed_tasks 请求也可能返回 status。这是任务内部状态的报告。因此,其格式因任务而异。尽管我们试图保持特定任务的 status 在各个版本中保持一致,但这并非总是可能的,因为我们有时会更改实现。在这种情况下,我们可能会从特定请求的 status 中删除字段,因此您对状态进行的任何解析都可能在次要版本中中断。

等待完成

编辑

任务 API 也可用于等待特定任务的完成。以下调用将阻塞 10 秒或直到 ID 为 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

任务取消命令支持与列出任务命令相同的任务选择参数,因此可以同时取消多个任务。例如,以下命令将取消在节点 nodeId1nodeId2 上运行的所有 reindex 任务。

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 将继续列出这些已取消的任务,直到它们完成。列出任务 API 响应中的 cancelled 标志指示已处理取消命令,并且任务将尽快停止。要解决为什么已取消的任务没有及时完成的问题,请使用带有 ?detailed 参数的列出任务 API 来识别系统正在运行的其他任务,并使用 节点热线程 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

识别正在运行的任务

编辑

当在 HTTP 请求标头上提供 X-Opaque-Id 标头时,它将在响应中以及任务信息中的 headers 字段中作为标头返回。这允许跟踪某些调用,或将某些任务与启动它们的客户端关联起来

curl -i -H "X-Opaque-Id: 123456" "https://127.0.0.1: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

REST 请求启动的任务的 ID

由 REST 请求启动的任务的子任务