Elasticsearch:使用 Elastic Workflows 构建自动化 - 9.3

20 阅读9分钟

作者:来自 Elastic Tinsae Erkailo Tal Borenstein 及 Shahar Glazner

Elastic 中工作流自动化的实用入门。了解工作流是什么样子、它们如何工作,以及如何构建一个。

Elastic Workflows 是内置于 Elasticsearch 平台中的自动化引擎。你使用 YAML 来定义工作流:包括是什么触发它们(启动)、它们执行哪些步骤、执行哪些动作,平台负责执行过程。一个工作流可以查询 Elasticsearch、转换数据、基于条件进行分支、调用外部 API,并通过你已经配置好的连接器与 Slack、Jira、PagerDuty 等服务集成。

在这篇博客中,我们将介绍 Workflows 的核心概念,并一起构建一个示例工作流。

Workflows 是声明式的,并使用 YAML 定义

Workflows 是可组合的。你只需要定义应该发生什么,平台会处理执行、错误恢复和日志记录。每个工作流都以 YAML 定义,并存在于 Kibana 中。

一个工作流由几个关键部分组成:触发器、输入和步骤。

触发器 决定工作流何时运行。告警触发器会在 Kibana 告警规则触发时运行,并可完全访问告警上下文。计划触发器按时间间隔或 cron 模式运行。手动触发器可以从 UI 或 API 按需运行。一个工作流可以有多个触发器。

输入 定义在运行时可以传递给工作流的参数。这让你可以创建可复用的工作流,根据不同的调用方式接受不同的值。

步骤 是工作流执行的具体动作。步骤按顺序执行,每个步骤都可以引用前一个步骤的输出。步骤类型包括:

  • 内部动作:在 Elasticsearch 和 Kibana 内执行的操作,例如查询索引、运行 Elasticsearch Query Language ( ES|QL )、创建 case 或更新告警。

  • 外部动作:在外部系统上执行的操作,例如发送 Slack 消息或创建 Jira 工单。你可以使用在 Elastic 中配置好的任何 connector,也可以通过 HTTP 步骤灵活调用任意 API 或内部服务。

  • 流程控制:使用条件、循环和并行执行来定义工作流逻辑。

  • AI:从向大语言模型 ( LLM ) 提示,到将 agent 作为工作流步骤启用,解锁 agentic 工作流用例。

实践一下:你的第一个工作流

让我们构建一个展示核心能力的工作流:操作 Elasticsearch 索引、使用条件逻辑,以及在步骤之间传递数据。我们将创建一个简单的演示,设置一个 National Parks 索引,加载示例数据,并对其进行搜索。

启用 Workflows

Workflows 在 Elastic 9.3 中可用( Technical Preview )。前往 Stack ManagementAdvanced Settings,然后启用 Elastic Workflows

创建一个工作流

在 Kibana 中导航到 Workflows。如果这是你第一次使用,你会看到 Get Started 界面:

点击 Create a new workflow 打开编辑器。你也可以探索 Example workflows 来查看 Elastic Workflow Library,这是一个为 search、observability 和 security 用例准备的即用型工作流集合。

工作流编辑器

编辑器提供带有自动补全和校验的 YAML 编辑功能。开始输入一个 step 类型,就会出现建议。使用快速操作菜单( Cmd+K / Ctrl+K )按类别浏览可用的 triggers、steps 和 actions:

构建工作流

这是我们的 National Parks 演示工作流:

`

1.  name: National Parks Demo
2.  description: Creates an Elasticsearch index, loads sample national park data, searches for parks, and displays the results.
3.  enabled: true
4.  consts:
5.    indexName: national-parks

7.  triggers:
8.    - type: manual

10.  steps:
11.    - name: get_index
12.      type: elasticsearch.indices.exists
13.      with:
14.        index: '{{ consts.indexName }}'

16.    - name: check_if_index_exists
17.      type: if
18.      condition: 'steps.get_index.output: true'
19.      steps:
20.        - name: index_already_exists
21.          type: console
22.          with:
23.            message: 'index: {{ consts.indexName }} already exists. Will proceed to delete it and re-create'
24.        - name: delete_index
25.          type: elasticsearch.indices.delete
26.          with:
27.            index: '{{ consts.indexName }}'
28.      else:
29.        - name: no_index_found
30.          type: console
31.          with:
32.            message: 'index: {{ consts.indexName }} not found. Will proceed to create'

34.    - name: create_parks_index
35.      type: elasticsearch.indices.create
36.      with:
37.        index: '{{ consts.indexName }}'
38.        mappings:
39.          properties:
40.            name:
41.              type: text
42.            category:
43.              type: keyword
44.            description:
45.              type: text

47.    - name: index_park_data
48.      type: elasticsearch.index
49.      with:
50.        index: '{{ consts.indexName }}'
51.        id: yellowstone
52.        document:
53.          name: Yellowstone National Park
54.          category: geothermal
55.          description: "America's first national park, established in 1872, famous for Old Faithful geyser and diverse wildlife including grizzly bears, wolves, and herds of bison and elk."
56.        refresh: wait_for

58.    - name: search_park_data
59.      type: elasticsearch.search
60.      with:
61.        index: '{{ consts.indexName }}'
62.        query:
63.          term:
64.            _id: yellowstone

66.    - name: log_results
67.      type: console
68.      with:
69.        message: 'Found {{ steps.search_park_data.output.hits.total.value }} park with doc id of yellowstone.'

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)收起代码块![](https://csdnimg.cn/release/blogv2/dist/pc/img/arrowup-line-top-White.png)

此工作流演示了若干功能:

  • 常量/Constants:定义可复用的值,如 indexName,可在整个工作流中引用。
  • Elasticsearch 操作:检查索引是否存在、删除索引、创建带映射的索引、索引文档和执行搜索。
  • 带分支的条件逻辑:如果索引存在,记录消息并删除它;如果不存在,记录未找到的消息。无论哪种情况,都继续创建索引。
  • 数据流:每个步骤使用 steps.<name>.output 引用前一步骤的输出。

注意整个工作流中使用的 {{ }} 语法。这是 Liquid 模板,用于在步骤之间传递数据。consts 包含工作流常量,steps.<name>.output 引用前一步骤的输出。

运行工作流

保存工作流后,点击 Save 按钮旁的 Play 按钮执行它。

工作流开始执行,你会在执行视图中看到每个步骤。每个步骤在侧边面板中显示运行状态和耗时:

点击任意步骤即可查看其输入和输出。侧边面板会显示工作流在每一步接收和生成的精确数据。这让调试变得非常直观:你可以看到输入是什么,输出是什么,如果某个步骤失败,问题出在哪里。

扩展工作流

让我们用 AI 和外部通知扩展此工作流。我们将在 log_results 之后添加一个步骤,使用 LLM 生成关于公园的诗歌,然后将其发送到 Slack。

log_results 之后添加这些步骤:

 `1.    - name: generate_poem
2.      type: ai.prompt
3.      with:
4.        prompt: >
5.          Write a short, fun poem about {{ steps.search_park_data.output.hits.hits[0]._source | json }}.
6.          Include something about its famous features. No other formatting.

8.    - name: share_poem
9.      type: slack
10.      connector-id: my-slack-connector
11.      with:
12.        message: |
13.          🏔️ *Poem of the Day about Yellowstone*

15.          {{ steps.generate_poem.output.content }}`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

现在工作流会创建索引、加载数据、搜索数据、使用 AI 生成诗歌,并将其分享至 Slack。相同的模式贯穿始终:添加步骤、引用其输出,让工作流处理执行。

这是一个简单示例,但相同方法可扩展到真实用例。将 national parks 替换为安全警报、可观测性指标,或 Elasticsearch 中的任何数据。将诗歌替换为 AI 总结或评估。将 Slack 替换为 Jira、PagerDuty 或任何你已配置的连接器。

工作流与 Elastic Agent Builder

National Parks 示例展示了 Workflows 的核心组件:触发器、步骤、条件逻辑、数据流、AI 提示和外部通知。这些组件可组合构建自动化流程,协调 Elasticsearch、Kibana、外部系统和 AI 中的操作结果。

上述流程适用于已知步骤的场景。但对于步骤未知、正确操作取决于发现内容,而发现内容又取决于查询位置的流程呢?

这正是 Agent Builder 扩展自动化能力的地方。一个基于你操作上下文的 agent 可以执行分析师或开发者通常手动完成的初步分析或调查。它可以探索、跨数据源推理并呈现发现,然后工作流继续执行后续结构化步骤。

Workflows 可与 Agent Builder 集成,且集成支持双向操作。

将 agent 用作工作流步骤

使用 ai.agent 可在工作流中调用 agent:

`

1.  - name: analyze
2.    type: ai.agent
3.    with:
4.      agent_id: my-analyst-agent
5.      message: 'Analyze this data and recommend next steps: {{ steps.search.output | json }}'

`AI写代码

agent 使用其配置的工具查询索引、关联数据,并对结果进行推理。工作流等待发现结果,然后继续执行下一步。

工作流作为 agent 工具

将工作流暴露给 Agent Builder,agent 就可以调用它来执行操作。

agent 可能会决定:“我需要创建一份报告并发送给团队。” 与其直接调用 API、承担不可预测性,不如调用一个可靠执行的工作流。

这种分离很重要。agent 擅长推理和探索,工作流擅长确定性执行。结合起来,你就拥有了既能推理又能可靠执行的 AI。

展望未来

此技术预览将 Workflows 确立为 Elasticsearch 平台的核心能力。基础已搭建完成:触发器、步骤、数据流、AI 集成以及与 Agent Builder 的双向连接。

接下来将基于此基础进行扩展。可期待更多步骤类型、扩展连接器支持以及改进的可视化创作工具。除此之外,Workflows 将整合到 Elastic 的特定解决方案体验中。

对于开发者而言,这意味着 AI 助手不再仅限于对话。agent 可以实际操作:查询系统、更新记录、触发流程并返回结果。推理由可靠执行支撑。

在可观测性领域,这意味着关联日志、指标和追踪信号,揭示可能的根因,协调修复步骤,实现从检测到解决的闭环,无需等待人工干预。

在安全领域,这意味着在警报触发的瞬间开始调查。利用内部和外部来源丰富发现结果。协调各工具的响应操作。更新案件并通知相关人员。过去需要人工完成的工作,现在可自动化处理。

你今天学到的模式可直接应用于这些场景。Workflows 是使这些自动化成为可能的核心层。

开始使用 Elastic Workflows

Elastic Workflows 现已作为技术预览提供。开始试用 Elastic Cloud 并查看文档