# 🌈 Splunk データフロー カラフル完全図解
---
## 🎨 1. データフローの全体像(カラフル版)
```
┌─────────────────────────────────────────────────────────────┐
│ 🎯 Splunk データの旅 - カラフルマップ │
└─────────────────────────────────────────────────────────────┘
🟦 ステップ1: データ保管
╔═══════════════════╗
║ 📦 インデックス ║ ← 青色 = データの源
║ (web_logs) ║ 冷蔵庫のイメージ
╚═══════════════════╝
│
│ SPL検索で取り出す
▼
🟩 ステップ2: 値の保管・受け渡し
╔═══════════════════╗
║ 💼 トークン ║ ← 緑色 = 値を運ぶ箱
║ $status$ = 200 ║ 配達ボックス
╚═══════════════════╝
│
│ 値を埋め込んで使用
▼
🟨 ステップ3: 表示
╔═══════════════════╗
║ 📊 チャート ║ ← 黄色 = ユーザーに見せる
║ グラフ・テーブル ║ お皿に盛り付け
╚═══════════════════╝
【色の意味】
🟦 青 = データソース(インデックス)
🟩 緑 = データ転送(トークン)
🟨 黄 = データ表示(チャート)
🟥 赤 = ユーザー操作(入力・クリック)
🟪 紫 = 条件分岐(制御)
```
---
## 🎨 2. 5大パターンのカラフル図解
### **パターン① 直接ルート(シンプル)**
```
┌─────────────────────────────────────────────┐
│ 🔵 パターンA: 直接ルート │
│ トークンを使わない最もシンプルな方法 │
└─────────────────────────────────────────────┘
🟦 データソース
┌──────────┐
│インデックス│
│ web_logs │
└─────┬────┘
│
│ 🔍 SPL検索
│ index=web_logs | stats count
│
▼
🟨 表示
┌──────────┐
│ チャート │
│ 📊 グラフ │
└──────────┘
【特徴】
✅ 最もシンプル
✅ 静的なダッシュボード向き
❌ ユーザー操作で変えられない
```
---
### **パターン② トークン経由(インタラクティブ)**
```
┌─────────────────────────────────────────────┐
│ 🟢 パターンB: トークン経由 │
│ ユーザー入力で動的に変わるダッシュボード │
└─────────────────────────────────────────────┘
🟥 ユーザー操作
┌──────────────┐
│ドロップダウン │ 「404」を選択
│ [200▼] │ ↓
└──────┬───────┘
│
│ 値を保存
▼
🟩 値の保管
┌──────────────┐
│ トークン │
│ $status$=404 │ ← 選んだ値を箱に入れる
└──────┬───────┘
│
│ 検索条件に使用
▼
🟦 データソース
┌──────────────┐
│インデックス │
│ web_logs │ status=404 で絞り込み
└──────┬───────┘
│
│ 検索結果
▼
🟨 表示
┌──────────────┐
│ チャート │
│ 📊 404のグラフ│
└──────────────┘
【特徴】
✅ インタラクティブ
✅ ユーザーが自由に操作
✅ 同じトークンを複数パネルで使える
```
---
### **パターン③ 検索結果をトークンに保存**
```
┌─────────────────────────────────────────────┐
│ 🟣 パターンC: 結果をトークンに保存 │
│ 1つの検索結果を複数チャートで使い回す │
└─────────────────────────────────────────────┘
🟦 データソース
┌──────────────┐
│インデックス │
│ web_logs │
└──────┬───────┘
│
│ 🔍 検索実行
│ | stats count
▼
📊 検索結果
┌──────────────┐
│ count = 1234 │
└──────┬───────┘
│
│ 結果を保存(<done>)
▼
🟩 値の保管
┌─────────────────┐
│ $total$ = 1234 │ ← 検索結果を箱に保存
└────┬────────────┘
│
├─────────┬─────────┬─────────┐
│ │ │ │
▼ ▼ ▼ ▼
🟨 表示1 🟨 表示2 🟨 表示3 🟨 表示4
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│HTMLカード│ │タイトル│ │KPI │ │グラフ │
│ 1234 │ │ 1234件│ │ 1234 │ │ 📊 │
└──────┘ └──────┘ └──────┘ └──────┘
【特徴】
✅ 1回の検索で複数箇所に表示
✅ 効率的(インデックスへのアクセスは1回)
✅ 値の一貫性が保証される
```
---
### **パターン④ ベースサーチ(超効率)**
```
┌─────────────────────────────────────────────┐
│ 🔷 パターンD: ベースサーチ │
│ 1回の検索結果を複数パネルで加工して使う │
└─────────────────────────────────────────────┘
🟦 データソース
┌──────────────┐
│インデックス │
│ web_logs │
└──────┬───────┘
│
│ 🔍 1回だけ検索実行
│ | stats count by status, host
▼
🟪 ベースサーチ結果(メモリに保持)
┌─────────────────────────────┐
│ status | host | count │
│ 200 | server01 | 100 │
│ 200 | server02 | 150 │
│ 404 | server01 | 20 │
│ 500 | server02 | 5 │
└────┬────────────────────────┘
│ 結果を共有
│
├────────┬────────┬────────┬────────┐
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
🟨 パネル1 🟨 パネル2 🟨 パネル3 🟨 パネル4 🟨 パネル5
┌──────┐┌──────┐┌──────┐┌──────┐┌──────┐
│円グラフ││棒グラフ││テーブル││地図 ││折れ線 │
│status││host ││全体 ││地域別 ││時系列 │
│別 ││別 ││ ││ ││ │
└──────┘└──────┘└──────┘└──────┘└──────┘
by status by host 全表示 by loc timechart
【特徴】
✅ 最も効率的(検索1回で5パネル)
✅ 高速(インデックスアクセス1回だけ)
✅ データの一貫性
✅ 複雑なダッシュボードに最適
```
---
### **パターン⑤ ドリルダウン(連携)**
```
┌─────────────────────────────────────────────┐
│ 🔴 パターンE: ドリルダウン │
│ クリックでパネル間を連携させる │
└─────────────────────────────────────────────┘
【ステップ1: 一覧表示】
🟦 データソース
┌──────────────┐
│インデックス │
│ web_logs │
└──────┬───────┘
│
│ 🔍 サマリー検索
│ | stats count by host
▼
🟨 パネル1(クリック元)
┌──────────────────┐
│ ホスト | 件数 │
├──────────────────┤
│server01 | 1000 ◄─┼─ 🖱️ ここをクリック!
│server02 | 800 │
│server03 | 600 │
└──────────────────┘
│
│ クリックイベント発火
▼
【ステップ2: トークンに保存】
🟩 値の保管
┌────────────────────┐
│ $host$ = server01 │ ← クリックした値を保存
│ $show$ = true │ ← 表示フラグON
└────────┬───────────┘
│
│ トークンが設定される
▼
【ステップ3: 詳細表示】
🟪 条件判定
┌─────────────────┐
│ depends="$show$" │ ← トークンが存在する?
│ → YES! │
└────────┬────────┘
│
│ 条件が真なので表示
▼
🟦 データソース(再検索)
┌──────────────────┐
│インデックス │
│ web_logs │ host=server01 で絞り込み
└──────┬───────────┘
│
│ 🔍 詳細検索
│ host="server01" | table ...
▼
🟨 パネル2(クリック先)
┌───────────────────────────┐
│ 📋 server01 の詳細ログ │
├───────────────────────────┤
│ 時刻 | URI | status │
│ 10:00:00 | /api | 200 │
│ 10:00:01 | /app | 200 │
│ 10:00:02 | /img | 404 │
└───────────────────────────┘
【特徴】
✅ パネル間の連携
✅ サマリー → 詳細のドリルダウン
✅ ユーザーが能動的に探索
✅ 大量データを段階的に表示
```
---
## 🎨 3. トークンの種類(カラフル分類)
```
┌─────────────────────────────────────────────┐
│ 🎯 トークンの種類と色分け │
└─────────────────────────────────────────────┘
🟥 【入力トークン】= ユーザーが値を入れる
┌──────────────────────────────────────┐
│ <input type="dropdown" token="status">│
│ <choice value="200">成功</choice> │
│ </input> │
└──────────────────────────────────────┘
↓
$status$ = "200" ← 赤い箱に保管
🟢 【時間トークン】= 時間範囲を保持
┌──────────────────────────────────────┐
│ <input type="time" token="time"> │
│ <default> │
│ <earliest>-24h</earliest> │
│ </default> │
│ </input> │
└──────────────────────────────────────┘
↓
$time.earliest$ = "-24h" ← 緑の箱(開始)
$time.latest$ = "now" ← 緑の箱(終了)
🟡 【結果トークン】= 検索結果を保存
┌──────────────────────────────────────┐
│ <search> │
│ <query>| stats count</query> │
│ <done> │
│ <set token="total"> │
│ $result.count$ │
│ </set> │
│ </done> │
│ </search> │
└──────────────────────────────────────┘
↓
$total$ = "1234" ← 黄色の箱に保管
🟣 【クリックトークン】= クリックで取得
┌──────────────────────────────────────┐
│ <drilldown> │
│ <set token="host"> │
│ $row.host$ │
│ </set> │
│ </drilldown> │
└──────────────────────────────────────┘
↓
$host$ = "server01" ← 紫の箱に保管
🔵 【制御トークン】= 表示/非表示の制御
┌──────────────────────────────────────┐
│ <set token="show">true</set> │
└──────────────────────────────────────┘
↓
$show$ = "true" ← 青の箱(フラグ)
↓
<panel depends="$show$"> ← これで表示制御
```
---
## 🎨 4. データの流れ(レストラン例 - 超カラフル版)
```
┌─────────────────────────────────────────────────────────┐
│ 🍜 うさうさラーメン店のデータフロー │
└─────────────────────────────────────────────────────────┘
🟦 【倉庫】= インデックス
┌─────────────────────┐
│ 🏪 食材倉庫 │
│ ┌──────┐ ┌──────┐ │
│ │ 野菜 │ │ 肉 │ │ index=web_logs
│ │ 棚 │ │ 棚 │ │ index=app_logs
│ └──────┘ └──────┘ │ index=security
│ ┌──────┐ ┌──────┐ │
│ │ 魚 │ │ 調味料│ │
│ │ 棚 │ │ 棚 │ │
│ └──────┘ └──────┘ │
└──────────┬──────────┘
│
│ 🔍 食材を取り出す(検索)
▼
🟥 【注文】= ユーザー入力
┌─────────────────────┐
│ 👨🍳 お客さんの注文 │
│ │
│ 「醤油ラーメン │
│ 大盛りで!」 │
│ │
│ メニュー: [醤油▼] │ ← dropdown
│ サイズ: [大盛▼] │ ← dropdown
└──────────┬──────────┘
│
│ 注文内容を記録
▼
🟩 【伝票】= トークン
┌─────────────────────┐
│ 📝 調理指示書 │
│ │
│ $menu$ = "醤油" │
│ $size$ = "大盛" │
│ $topping$ = "チャーシュー"│
└──────────┬──────────┘
│
│ 指示書を見ながら調理
▼
🟪 【調理】= SPL処理
┌─────────────────────┐
│ 🍳 調理場 │
│ │
│ 1. スープを作る │ | stats
│ 2. 麺を茹でる │ | timechart
│ 3. トッピングを乗せる │ | eval
└──────────┬──────────┘
│
│ 完成!
▼
🟨 【提供】= チャート表示
┌─────────────────────┐
│ 🍜 完成したラーメン │
│ │
│ [醤油ラーメン] │ ← グラフ
│ 大盛り │ ← テーブル
│ チャーシュー付き │ ← KPI
└─────────────────────┘
【データの対応関係】
🟦 倉庫(インデックス)
↓
食材 = ログデータ
棚 = インデックス名(web_logs, app_logs)
🟥 注文(ユーザー入力)
↓
メニュー選択 = dropdown, radio
カスタマイズ = テキスト入力
🟩 伝票(トークン)
↓
注文内容 = $token_name$
控え = 複数パネルで共有
🟪 調理(SPL処理)
↓
レシピ = SPLクエリ
調理手順 = | stats, | eval, | timechart
🟨 提供(チャート)
↓
盛り付け = グラフ、テーブル
お皿 = パネル
```
---
## 🎨 5. 実装コード(カラーコメント付き)
```xml
<form>
<label>🌈 カラフルダッシュボード</label>
<!-- ========================================== -->
<!-- 🟥 ユーザー入力エリア -->
<!-- ========================================== -->
<fieldset submitButton="false">
<!-- 🟥 入力1: ステータス選択 -->
<input type="dropdown" <!-- 🟥 ドロップダウン -->
token="my_status"> <!-- 🟩 トークン名を定義 -->
<label>🎯 ステータスコード</label>
<choice value="200">✅ 成功(200)</choice>
<choice value="404">⚠️ Not Found(404)</choice>
<choice value="500">❌ Server Error(500)</choice>
<default>200</default> <!-- 🟡 デフォルト値 -->
</input>
<!-- 🟥 入力2: 時間範囲選択 -->
<input type="time" <!-- 🟥 時間ピッカー -->
token="my_time"> <!-- 🟩 時間トークン -->
<label>📅 期間選択</label>
<default>
<earliest>-24h</earliest> <!-- 🟢 開始時刻 -->
<latest>now</latest> <!-- 🟢 終了時刻 -->
</default>
</input>
</fieldset>
<!-- ========================================== -->
<!-- 🟦 データ検索エリア -->
<!-- ========================================== -->
<search id="base_search"> <!-- 🔵 ベースサーチ定義 -->
<query>
index=web_logs <!-- 🟦 インデックス指定 -->
<!-- ここがデータソース -->
earliest=$my_time.earliest$ <!-- 🟢 時間トークン使用 -->
latest=$my_time.latest$ <!-- 🟢 時間トークン使用 -->
status=$my_status$ <!-- 🟩 入力トークン使用 -->
<!-- ユーザーが選んだ値 -->
| stats <!-- 🟪 データ集計 */
count as 件数,
avg(response_time) as 平均レスポンス
by host
</query>
<!-- 🟡 検索結果をトークンに保存 -->
<done> <!-- 検索完了時 -->
<set token="total_count"> <!-- 🟡 結果トークン -->
$result.件数$ <!-- 検索結果を取得 -->
</set>
</done>
</search>
<!-- ========================================== -->
<!-- 🟨 表示エリア -->
<!-- ========================================== -->
<row>
<!-- 🟨 パネル1: KPI表示 -->
<panel>
<title>📊 総件数</title>
<html>
<style>
.kpi-card {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 15px;
padding: 30px;
color: white;
text-align: center;
font-size: 48px;
font-weight: bold;
box-shadow: 0 8px 16px rgba(0,0,0,0.2);
}
</style>
<div class="kpi-card">
$total_count$ <!-- 🟡 結果トークン表示 -->
</div>
</html>
</panel>
<!-- 🟨 パネル2: 円グラフ -->
<panel>
<title>📈 ホスト別分布</title>
<chart>
<search base="base_search"> <!-- 🔵 ベースサーチ参照 -->
<query>
| stats sum(件数) by host <!-- 🟪 再集計 */
</query>
</search>
<option name="charting.chart">pie</option>
<option name="charting.chart.showPercent">true</option>
</chart>
</panel>
<!-- 🟨 パネル3: テーブル -->
<panel>
<title>📋 詳細データ</title>
<table>
<search base="base_search"> <!-- 🔵 ベースサーチ参照 -->
<query>
| sort -件数 <!-- 🟪 ソート */
</query>
</search>
<!-- 🟣 クリックでトークン設定 -->
<drilldown> <!-- クリックイベント -->
<set token="clicked_host"> <!-- 🟣 クリックトークン -->
$row.host$ <!-- クリックした行の値 -->
</set>
<set token="show_detail">true</set> <!-- 🔵 表示フラグ -->
</drilldown>
</table>
</panel>
</row>
<!-- ========================================== -->
<!-- 🟪 条件付き表示エリア -->
<!-- ========================================== -->
<row>
<panel depends="$show_detail$"> <!-- 🔵 条件付き表示 -->
<!-- トークンが存在する時だけ表示 -->
<title>🔍 詳細: $clicked_host$</title> <!-- 🟣 クリックトークン -->
<chart>
<search>
<query>
index=web_logs <!-- 🟦 インデックス -->
host="$clicked_host$" <!-- 🟣 クリックした値で絞り込み -->
| timechart count <!-- 🟪 時系列集計 */
</query>
</search>
<option name="charting.chart">area</option>
</chart>
<!-- 閉じるボタン -->
<html>
<button style="
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
color: white;
padding: 12px 24px;
border: none;
border-radius: 8px;
cursor: pointer;
font-size: 16px;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
" id="close_btn">
✕ 閉じる
</button>
<script>
require(["jquery", "splunkjs/mvc"], function($, mvc) {
var tokens = mvc.Components.getInstance("submitted");
$("#close_btn").click(function() {
tokens.unset("show_detail"); <!-- 🔵 フラグ削除 -->
tokens.unset("clicked_host"); <!-- 🟣 値削除 -->
});
});
</script>
</html>
</panel>
</row>
</form>
【色の凡例】
🟥 赤 = ユーザー入力(dropdown, text, time)
🟩 緑 = 入力トークン($my_status$, $my_time$)
🟦 青 = データソース(インデックス)
🟪 紫 = データ処理(SPLクエリ)
🟡 黄 = 結果トークン($total_count$)
🟨 橙 = 表示(チャート、テーブル)
🟣 赤紫 = クリックトークン($clicked_host$)
🔵 水色 = 制御(depends, ベースサーチ)
```
---
## 🎨 6. トークンの受け渡しフロー(超詳細カラー版)
```
┌────────────────────────────────────────────────────────────┐
│ 🎯 トークンの受け渡し完全フロー図 │
└────────────────────────────────────────────────────────────┘
【シーン1: ユーザーが選択】
🟥 ステップ1: ユーザー操作
┌─────────────────┐
│ Dropdown Menu │
│ ┌───────────┐ │
│ │ 200 ▼ │ │ ← ユーザーが「404」をクリック
│ ├───────────┤ │
│ │ 200 │ │
│ │ 404 ◄──┼──────🖱️ ここ!
│ │ 500 │ │
│ └───────────┘ │
└─────────────────┘
│
│ onChange イベント発火
▼
🟩 ステップ2: トークンに保存
┌──────────────────┐
│ Token Storage │
│ ┌──────────────┐ │
│ │ $my_status$ │ │
│ │ = "404" │ │ ← 値が箱に入る
│ └──────────────┘ │
└────────┬─────────┘
│
│ 検索を再実行
▼
【シーン2: 検索実行】
🟦 ステップ3: インデックス検索
┌──────────────────────┐
│ Index: web_logs │
│ ┌────────────────┐ │
│ │ 📄 Log Entry 1 │ │
│ │ status=200 │ │ ← これはスキップ
│ ├────────────────┤ │
│ │ 📄 Log Entry 2 │ │
│ │ status=404 ◄──┼─────✅ マッチ!
│ ├────────────────┤ │
│ │ 📄 Log Entry 3 │ │
│ │ status=500 │ │ ← これもスキップ
│ └────────────────┘ │
└────────┬─────────────┘
│
│ 404のログだけ抽出
▼
🟪 ステップ4: データ処理
┌──────────────────────┐
│ SPL Processing │
│ ┌────────────────┐ │
│ │ | stats count │ │ ← 集計処理
│ │ | timechart │ │ ← 時系列化
│ │ | eval ... │ │ ← 計算処理
│ └────────────────┘ │
└────────┬─────────────┘
│
│ 結果データセット生成
▼
【シーン3: 結果表示】
🟨 ステップ5: チャート描画
┌──────────────────────────┐
│ Chart Panel │
│ ┌────────────────────┐ │
│ │ 📊 │ │
│ │ ▂▄▆█ │ │ ← グラフ描画
│ │ 404エラー推移 │ │
│ └────────────────────┘ │
└──────────────────────────┘
【全体フロー図】
🟥 ユーザー → 🟩 トークン → 🟦 インデックス → 🟪 処理 → 🟨 表示
選択 保存 検索 集計 描画
↓ ↓ ↓ ↓ ↓
[404▼] $status$=404 status=404 | stats 📊グラフ
```
---
## 🎨 7. チャートタイプ別カラー図解
```
┌────────────────────────────────────────────────────────────┐
│ 📊 チャートタイプ カラーカタログ │
└────────────────────────────────────────────────────────────┘
🔵 【1】シングル値 (KPI)
┌──────────────┐
│ │
│ 1,234 │ ← 大きな数字1つ
│ │
│ 総リクエスト数 │
└──────────────┘
用途: KPI、重要指標
色: 青系(安定感)
🟢 【2】折れ線グラフ (Line Chart)
╱╲
╱ ╲ ╱╲
╱ ╲╱ ╲___
時系列の推移を表示
用途: トレンド分析
色: 緑系(成長イメージ)
🟡 【3】棒グラフ (Column Chart)
█
█ █
█ █ █
█ █ █ █
───────────
比較・ランキング表示
用途: 項目別比較
色: 黄系(活発)
🟠 【4】円グラフ (Pie Chart)
╱──╲
│▓▓│▒│
│▓▓│░│
╲──╱
割合・構成比を表示
用途: 全体に対する割合
色: 橙系(温かみ)
🔴 【5】面グラフ (Area Chart)
╱▓▓╲
╱▓▓▓▓╲╱╲
╱▓▓▓▓▓▓▓▓╲___
時系列の量を強調
用途: 累積表示
色: 赤系(重要性)
🟣 【6】テーブル (Table)
┌──────┬──────┬──────┐
│ホスト │件数 │平均 │
├──────┼──────┼──────┤
│srv01 │ 100 │ 0.5 │
│srv02 │ 80 │ 0.3 │
└──────┴──────┴──────┘
詳細データを一覧表示
用途: 詳細確認
色: 紫系(高級感)
🟤 【7】ゲージ (Gauge)
╱──╲
│ ↗ │
╲__╱
75%
パフォーマンス指標
用途: 進捗・達成率
色: 茶系(地に足)
⚫ 【8】散布図 (Scatter)
●
● ● ●
● ● ●
● ●
相関関係を表示
用途: 関係性分析
色: 黒系(シック)
```
---
## 🎨 8. 実装パターン色分けチートシート
```
┌────────────────────────────────────────────────────────────┐
│ 🎨 実装パターン カラーチートシート │
└────────────────────────────────────────────────────────────┘
【🟥 ユーザー入力を受け取る】
<input type="dropdown" token="名前">
<choice value="値">表示名</choice>
<default>初期値</default>
</input>
【🟩 トークンに値を保存する】
<set token="名前">$値$</set>
<set token="名前">$result.フィールド$</set>
<set token="名前">$row.フィールド$</set>
【🟦 インデックスから検索する】
<query>
index=インデックス名
earliest=$time.earliest$
latest=$time.latest$
フィールド=$token$
| stats count
</query>
【🟪 データを処理する】
| stats count by フィールド ← 集計
| timechart span=1h count ← 時系列
| eval 新項目=計算式 ← 計算
| where 条件 ← 絞り込み
| sort -フィールド ← ソート
【🟡 検索結果をトークンに保存】
<done>
<set token="名前">$result.フィールド$</set>
</done>
【🟨 チャートで表示する】
<chart>
<search>...</search>
<option name="charting.chart">種類</option>
</chart>
【🟣 クリックでトークン設定】
<drilldown>
<set token="名前">$row.フィールド$</set>
</drilldown>
【🔵 条件付き表示】
<panel depends="$token$">
...
</panel>
【⚪ トークンを削除】
<unset token="名前"></unset>
tokens.unset("名前");
```
---
カラフルな図解で完全にまとめました!
**色の意味をもう一度:**
- 🟥 赤 = ユーザー操作(入力)
- 🟩 緑 = トークン(値の保管)
- 🟦 青 = データソース(インデックス)
- 🟪 紫 = データ処理(SPL)
- 🟡 黄 = 結果の保存
- 🟨 橙 = 表示(チャート)
- 🟣 赤紫 = クリック操作
- 🔵 水色 = 制御(条件分岐)
この色分けを覚えておけば、コードを見た時に「今どの部分を書いているか」が一目で分かりますね!
どの部分をもっと詳しく知りたいですか?