はじめに
Elastic v9.3に新しくElastic WorkflowsがTech Previewとして登場しました!
v9.2にGAしたElastic Agent Builderとともに、今後のElasticの使い方を革新する大きな機能です。
このブログではその使い方のほんの一例として、日常的なシステムの監視業務で行うデータ監視、インシデントレポーティング、類似インシデントの検索の3つを自動化する簡易的なフレームワークを、Elasticに付属するサンプルフライトデータを使って作っていきます。
最初から完成形のフレームワークを作ろうとすると、手順がわかりにくくなるので、後続記事でブラッシュアップしながら完成形を目指していきます。
本ブログはElastic Cloudでv9.3のElasticデプロイメントを使用しています。本ブログの内容を行うにはEnterpriseサブスクリプションである必要があります。フリートライアルでも試すことが可能です。
シリーズの他の記事はこちらから参照ください
第1回
第2回
第3回
第4回
第5回
第6回
事前設定:Elastic Workflowsの有効化
Elastic Workflowsはv9.3.0においてはまだTechPreviewのため、利用するには有効化の設定が必要です。
以下のステップで有効化してください。
KibanaのAdvanced Settingsを開きます。Kibanaの中の画面トップの検索バーを使うと楽です。

workflowで設定箇所を検索し、トグルで有効化して、最後に保存ボタンを教えて下さい。

Webページをリロードして、メニューにWorkflowsが表示されればOKです!
事前設定(オプショナル):Elastic Agent Builderをメニュー表示
v9.3.0のObservabilityソリューションを利用している場合、何も設定しなくてもトップの検索バーからAgent Builder機能にアクセスできます。ただし、左のナビゲーションメニューには最初は表示されていません。

もしメニュー表示したい場合、GenAI Settingsを開き...

以下のようにAI Agent (Beta)を設定すると、メニューに表示されます。ただし、従来のAI Assistantは使えなくなるので、注意です。

使用するデータ: Kibana Sample Data Flights
Elasticに付属するKibana Sample Data Flightsの架空の飛行機の離発着履歴データを使います。下のようなデータです。

こちらのデータは以下のIntegrationsのSample Dataからセットアップしてください。

このブログで作成する部品
チケット(= ElasticのCases)に対して、2月3日のTokyo空港で起きた問題についての情報を追加していき、それを元に原因調査をAIエージェントに行ってもらい、その結果のレポートもチケットに追加することを自動化します。
-
ワークフロー
esql_to_case_v2
ES|QLクエリーでデータの調査の実行し、クエリー結果に対してAIエージェントtransform_output_by_aiによって解説の生成を行い、チケットにその情報を自動登録
(2月3日のTokyo離発着 の遅延・キャンセルがあったフライトデータの検索) -
AIエージェント
rca_flight_case_agent
CaseのIDを伝えるとCaseの情報を読み込み、原因分析のRCAレポートをチャットに出力 -
ワークフロー
call_rca_agent_and_write_to_case
Case IDを渡して実行すると、上記のrca_flight_case_agentを呼び出し、さらにその分析結果のレポートをCaseに自動登録する
※ ここで言うAIエージェントはElastic Agent Builderのエージェントを指します。
事前準備 - フライト遅延データを検索するES|QLクエリーの用意
ステップ1で使う検索クエリーを用意します。今回は2月3日のTokyo離発着便で、キャンセルされた OR 大幅な遅延があるデータを検索しています。(後続のブログで柔軟にAI Agentがクエリーの変数を書き換えるようにしていく予定です。)

FROM kibana_sample_data_flights
| WHERE timestamp >= "2026-02-03T00:00:00" AND timestamp < "2026-02-04T00:00:00"
| WHERE OriginCityName == "Tokyo" OR DestCityName == "Tokyo"
| WHERE Cancelled == true OR (FlightDelay == true AND FlightDelayMin >= 60)
| KEEP timestamp, Cancelled, FlightDelay, OriginCityName, DestCityName, Carrier, FlightDelayType, FlightDelayMin, OriginWeather, DestWeather
AIエージェントにクエリーを考えてもらう手もあるかと思いますが、今回はクエリーを自分で用意しました。
事前準備 - チケットの用意
今回はチケット(Case)を事前に用意しておきます。(後続記事にて、AI Agentが自動で作ってくれるようにする予定です。)
Elastic ObservabilityのCasesを使い、このように作ります。

Case IDはわかりづらいですが、この右上の...のボタンから取得できます。

または、URLのこの部分も同じIDなのでここからも取得できます。

ES|QL検索結果をCasesにコメント追記するワークフローesql_to_case_v1を作成
Elastic Workflowsのページから新しいワークフローを下記のように作ります。

name: esql_to_case_v1
enabled: true
description: Write ES|QL result to a case comment
tags:
- draft
triggers:
- type: manual
settings:
timeout: 1m
inputs:
- name: case_id
type: string
steps:
- name: execute_esql
type: elasticsearch.esql.query
with:
query: >
FROM kibana_sample_data_flights
| WHERE timestamp >= "2026-02-03T00:00:00" AND timestamp < "2026-02-04T00:00:00"
| WHERE OriginCityName == "Tokyo" OR DestCityName == "Tokyo"
| WHERE Cancelled == true OR (FlightDelay == true AND FlightDelayMin >= 60)
| KEEP timestamp, Cancelled, FlightDelay, OriginCityName, DestCityName, Carrier, FlightDelayType, FlightDelayMin, OriginWeather, DestWeather
format: csv
- name: add_response_to_existing_case
type: kibana.addCaseComment
with:
type: user
owner: observability
caseId: "{{inputs.case_id}}"
comment: '{{ steps.execute_esql.output }}'
右上の再生ボタンでワークフローを実行します。今回のCase Idをパラメータとして渡します。

ワークフローのステータスが実行中のまま終わらない場合があります。(クルクルアイコンが回ったまま変換しない)
そんなときは上のタブのWorkflow|Executionsで表示を切り替えると、ステータスが反映された表示になるので、いつまでも終わらないと思ったときはこれを行ってみてください。
このようにES|QLクエリーの結果が指定したCSVアップロードフォーマットで記載されました。

ES|QL検索結果を自然文に変換するワークフローに調整(esql_to_case_v2)
自動的にクエリー結果をコメント追記できたのはすばらしいのですが、今のままだとコメントが機械的すぎて自然ではありませんよね。
ここでElastic Agent Builderをワークフローに組み込みます。
さきほどのを更新しても良いですが、Cloneできるので、v2として新しいのを作ります。
name: esql_to_case_v2
enabled: true
description: Write ES|QL result to a case comment
tags:
- draft
triggers:
- type: manual
settings:
timeout: 1m
inputs:
- name: case_id
type: string
steps:
- name: execute_esql
type: elasticsearch.esql.query
with:
query: >
FROM kibana_sample_data_flights
| WHERE timestamp >= "2026-02-03T00:00:00" AND timestamp < "2026-02-04T00:00:00"
| WHERE OriginCityName == "Tokyo" OR DestCityName == "Tokyo"
| WHERE Cancelled == true OR (FlightDelay == true AND FlightDelayMin >= 60)
| KEEP timestamp, Cancelled, FlightDelay, OriginCityName, DestCityName, Carrier, FlightDelayType, FlightDelayMin, OriginWeather, DestWeather
format: csv
### start: updated from v1 ###
- name: transform_output_by_ai
type: ai.agent
with:
agent_id: "flight_analyzer_agent"
message: "次のデータをCaseに追記するコメントに変換してください: {{steps.execute_esql.output}}"
- name: add_response_to_existing_case
type: kibana.request
with:
method: POST
path: /api/cases/{{ inputs.case_id }}/comments
body:
type: user
owner: observability
comment: '{{ steps.transform_output_by_ai.output }}'
### end: updated from v1 ###
クエリー結果を自然文に変換するためのAIエージェント flight_analyzer_agentを作成
次に、上記で記述したflight_analyzer_agentのエージェントをAgent Builderで作成します。
以下のような簡単な定義のエージェントです。このエージェントのToolsはデフォルトにしました。今回はToolsの機能は使わずに済み、このエージェントに繋がっているLLMがサマライズしてくれるだけです。

エージェントを作成したら先程のワークフローに戻って、再生ボタンで実行します。Agentの呼び出しステップをクリックすると、LLMが作ってくれたレスポンスがOutputから確認できます。

原因調査のエージェント rca_flight_case_agentを作成
以下のように原因調査のRCA (Root Cause Analysis)を行うエージェントを新規に作成します。

このエージェントへのプロンプトのCustom Instructionsは以下のとおりです。
あなたは入力されたCase内の情報を元に原因分析し、指定された報告書フォーマットに変換するアシスタントです。
* 与えられたCase Idを元にCaseの内容を参照してください。
* Caseが扱っている対象の空港(一つ)を識別してください。
* その日のフライトの遅延・キャンセルが、当該空港で発生している問題に起因しているかを検討し、該当する場合は原因をレポートにまとめてください。
* 原因のカテゴリは次のものから一つだけ選んでください:天候、システムトラブル、機材トラブル、その他
### 役割
- 文章から事実情報を抽出し、決められたフィールドに整理してください。
- 推測や創作は行わず、コメントに含まれる情報のみを使用してください。
- 情報が不足している項目は「不明」と記載してください。
- 表現は簡潔で公的な報告書調にしてください。
### 出力形式
必ず以下にあるヘッダ名を出力してください。
必ず以下の「フィールド名: 値」の形式で出力してください。
---
# RCAレポート
対象空港:
対象日:
概要:
影響を受けた便名:
原因のカテゴリ:
---
このエージェントにはToolsとして、Casesを参照するplatform.core.casesを設定します。

チャットでこのエージェントのテストをします。このようにCase IDを渡して、指定した通りのレポートを返してくれました。

原因分析を実行し、結果をコメントに追記するワークフロー call_rca_agent_and_write_to_caseの作成
では、このエージェントを実行して、結果をコメントとして追加するワークフローを作成します。
name: call_rca_agent_and_write_to_case
enabled: true
description: Research airport problem resulting in flight cancels and delays
tags:
- draft
triggers:
- type: manual
settings:
timeout: 1m
inputs:
- name: case_id
type: string
steps:
- name: rca_flight_case_agent
type: ai.agent
with:
agent_id: "rca_flight_case_agent"
message: "Case Id: `{{inputs.case_id}}` を確認し、原因を報告してください"
- name: add_response_to_existing_case
type: kibana.addCaseComment
with:
caseId: "{{inputs.case_id}}"
comment: "{{ steps.rca_flight_case_agent.output }}"
type: user
owner: observability
このワークフローを実行したらケースにこのように追加されました。

おわり
今回はElastic WorkflowsやAgent Builderを使い、データ分析とその結果をCasesにまとめることを実践しました。
まだ理想的な使用感にはなっていませんが、その辺りは今後の続編でやっていきたいと思います。


