「インシデント・リレー」の面白さは、複数のツールに散らばるカオスなコミュニケーションログを、次の担当者が即座に行動できる「引き継ぎ票」という一点に集約する点にあります。単なる要約ツールとは異なり、Slackの会話やJiraの更新履歴から時系列と未解決の論点を抽出し、「次に何をすべきか」という具体的なチェックリストまで生成するのが新しい。この「行動への変換」こそが、現場の負担を劇的に減らす差別化要因です。この体験は、最新のLLMが持つ文脈理解と構造化能力を最大限に活かすことで実現しており、単なる情報整理から一歩進んだ、運用現場のパートナーとしてのAIの可能性を示しています。
インシデント・リレー
カオスなインシデントログを行動できる引き継ぎ票へ変換
Slackスレッド、監視ログ、チケットなどのインシデント情報をシステムに渡します。これにより、次の担当者向けの状況タイムラインと、確認すべき具体的な手順をまとめた引き継ぎ票が作成されます。
今後は、現在は単一のテキスト入力を想定していますが、将来的にはSlack URLやJiraチケットIDを直接入力するだけで、複数の情報源を自動で横断的に分析できるようにしたいです。そこまで進化させて、多忙な運用チームの標準ツールになることを目指しています。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
インシデント関連情報を入力
Slackの会話、監視ツールのアラート、チケットのコメントなど、時系列のテキスト情報をシステムに渡します。例えば、「2024-07-07T15:05:00Z - Prometheus: DB応答時間閾値超過 (web-db-01)」のような生データが入力されます。
入力された情報をAIが分析
AIは「優秀なIT運用チームのSRE」として、入力された生ログや会話からインシデントの状況を解析する設計です。時系列イベント、未解決の論点、次に行うべきアクションを抽出します。このステップでは、例えば「DB応答時間閾値超過 (web-db-01)」といったイベントが抽出されます。
構造化された引き継ぎ票を出力
AIが合成した情報に基づき、最終的な引き継ぎ票が整形されて表示されます。この引き継ぎ票には、インシデントID、要約、ステータス、時系列、未解決の論点、次のアクションが含まれます。例えば、「DBのSlow Queryログを確認する」という具体的なアクションが提示されます。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
一般的な要約ツールがログから状況を整理するに留まるのに対し、これはインシデント対応において「次に何をするか」という具体的な手順まで提示する。情報集約だけでなく行動への変換を促す点で、現場の意思決定支援に明確な差分がある。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
コードプレビュー
'use client';
import { useState } from 'react';
import { pipelineSteps, finalOutput } from '../data/sample-trace';
// NOTE: To keep this demo self-contained and offline, types are re-declared here.
// They are not imported from source/core/types.ts.
type TimelineEntry = {
timestamp: string;
eventType: string;
description: string;
source: string;
};
type UnresolvedIssue = {
issueId: string;
description: string;
status: string;
};
type ActionItem = {
actionId: string;
description: string;
priority: string;
};
type IncidentReport = {
incidentId: string;
title: string;
summary: string;
status: string;
timeline: TimelineEntry[];
unresolvedIssues: UnresolvedIssue[];
nextActions: ActionItem[];
};
export default function IncidentRelayPage() {
const [currentStep, setCurrentStep] = useState(-1);
const handleReplay = () => {
setCurrentStep(0);
let step = 0;
const interval = setInterval(() => {
step++;
if (step < pipelineSteps.length) {
setCurrentStep(step);
} else {
clearInterval(interval);
}
}, 500);
};
const isFinished = currentStep === pipelineSteps.length - 1;
return (
<div style={{ fontFamily: 'sans-serif', padding: '2rem', maxWidth: '800px', margin: 'auto' }}>
<header style={{ borderBottom: '1px solid #eee', paddingBottom: '1rem', marginBottom: '2rem' }}>
<h1>インシデント・リレー</h1>
<p>Slackスレッド・監視ログ・チケットを渡し、次の担当者向けの状況タイムラインと確認すべき次の手順を1枚の引き継ぎ票にまとめます。</p>
</header>
<main>
<div style={{ display: 'flex', gap: '2rem' }}>
<div s
...