Day 6: データの可視化
今日学ぶこと
- 可視化の種類(チャートタイプ)
- ダッシュボードの作成
- パネルの追加と設定
- ドリルダウン
- Simple XMLの基本
可視化の種類
Splunkは検索結果をさまざまなチャートで可視化できます。
flowchart TB
subgraph Charts["チャートタイプ"]
Line["折れ線グラフ<br>時系列の推移"]
Bar["棒グラフ<br>カテゴリ比較"]
Pie["円グラフ<br>割合"]
Area["エリアチャート<br>累積推移"]
Column["カラムチャート<br>縦棒グラフ"]
Single["シングルバリュー<br>KPI表示"]
end
style Line fill:#3b82f6,color:#fff
style Bar fill:#22c55e,color:#fff
style Pie fill:#f59e0b,color:#fff
style Area fill:#8b5cf6,color:#fff
style Column fill:#ef4444,color:#fff
style Single fill:#3b82f6,color:#fff
| チャートタイプ | 用途 | 適したSPLコマンド |
|---|---|---|
| 折れ線グラフ | 時系列推移 | timechart |
| 棒グラフ | カテゴリ比較 | stats ... by |
| 円グラフ | 構成比 | stats count by, top |
| エリアチャート | 累積推移 | timechart |
| テーブル | 詳細一覧 | table |
| シングルバリュー | KPI | stats count |
| ゲージ | 閾値表示 | stats + 単一値 |
| マップ | 地理情報 | iplocation + geostats |
チャートの選び方
# 折れ線グラフ → 時間推移
index=main | timechart span=1h count
# 棒グラフ → カテゴリ比較
index=main | stats count by host | sort -count
# 円グラフ → 割合
index=main | top limit=5 sourcetype
# シングルバリュー → KPI
index=main | stats count AS total_events
ダッシュボードの作成
Web UIから作成
- Dashboards > Create New Dashboard
- ダッシュボード名を入力
- Dashboard Studio または Classic Dashboards を選択
- パネルを追加
サーチからダッシュボードへ
- サーチを実行
- Save As > Dashboard Panel
- 新規ダッシュボードまたは既存ダッシュボードを選択
- パネルタイトルを入力
Simple XML
Classic DashboardsはSimple XMLで記述されます。
基本構造
<dashboard>
<label>Web Server Monitor</label>
<description>Webサーバーの監視ダッシュボード</description>
<row>
<panel>
<title>Total Requests</title>
<single>
<search>
<query>index=main sourcetype=access_combined | stats count</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
</single>
</panel>
<panel>
<title>Error Rate</title>
<single>
<search>
<query>
index=main sourcetype=access_combined
| stats count(eval(status>=400)) AS errors, count AS total
| eval error_rate = round(errors/total*100, 2) . "%"
| fields error_rate
</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
</single>
</panel>
</row>
<row>
<panel>
<title>Requests Over Time</title>
<chart>
<search>
<query>
index=main sourcetype=access_combined
| timechart span=1h count by status
</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
<option name="charting.chart">line</option>
</chart>
</panel>
</row>
</dashboard>
パネルタイプ
| タグ | 説明 |
|---|---|
<single> |
シングルバリュー |
<chart> |
チャート(折れ線、棒、円等) |
<table> |
テーブル |
<map> |
マップ |
<event> |
イベントリスト |
<html> |
カスタムHTML |
チャートオプション
<chart>
<search>
<query>...</query>
</search>
<!-- チャートタイプ -->
<option name="charting.chart">line</option>
<!-- 凡例の位置 -->
<option name="charting.legend.placement">bottom</option>
<!-- Y軸のラベル -->
<option name="charting.axisTitleY.text">Requests</option>
<!-- スタック表示 -->
<option name="charting.chart.stackMode">stacked</option>
</chart>
| オプション | 値 | 説明 |
|---|---|---|
charting.chart |
line, bar, column, pie, area |
チャートタイプ |
charting.chart.stackMode |
default, stacked, stacked100 |
スタックモード |
charting.legend.placement |
right, bottom, top, none |
凡例位置 |
入力(Inputs)
ダッシュボードにフィルタ用の入力コントロールを追加できます。
<dashboard>
<label>Filtered Dashboard</label>
<fieldset submitButton="true">
<!-- テキスト入力 -->
<input type="text" token="keyword">
<label>Keyword</label>
<default>*</default>
</input>
<!-- ドロップダウン -->
<input type="dropdown" token="selected_host">
<label>Host</label>
<choice value="*">All</choice>
<search>
<query>index=main | stats count by host | fields host</query>
</search>
<fieldForLabel>host</fieldForLabel>
<fieldForValue>host</fieldForValue>
<default>*</default>
</input>
<!-- 時間範囲ピッカー -->
<input type="time" token="time_range">
<label>Time Range</label>
<default>
<earliest>-24h@h</earliest>
<latest>now</latest>
</default>
</input>
</fieldset>
<row>
<panel>
<chart>
<search>
<query>
index=main host=$selected_host$ $keyword$
| timechart span=1h count
</query>
<earliest>$time_range.earliest$</earliest>
<latest>$time_range.latest$</latest>
</search>
</chart>
</panel>
</row>
</dashboard>
トークン
| トークン | 説明 |
|---|---|
$token_name$ |
入力の値を参照 |
$time_range.earliest$ |
時間入力の開始 |
$time_range.latest$ |
時間入力の終了 |
ドリルダウン
パネルをクリックした時のアクションを定義します。
<chart>
<search>
<query>index=main | stats count by host</query>
</search>
<drilldown>
<!-- 新しいサーチを開く -->
<link target="_blank">
/app/search/search?q=index%3Dmain%20host%3D$click.value$
</link>
</drilldown>
</chart>
<!-- 別のダッシュボードへ遷移 -->
<chart>
<drilldown>
<link>/app/search/host_detail?host=$click.value$</link>
</drilldown>
</chart>
| ドリルダウン変数 | 説明 |
|---|---|
$click.value$ |
クリックした値 |
$click.name$ |
クリックしたフィールド名 |
$row.field_name$ |
クリックした行のフィールド値 |
ダッシュボード設計のベストプラクティス
flowchart TB
subgraph Layout["ダッシュボードレイアウト"]
KPI["最上段: KPIパネル<br>シングルバリュー"]
Trend["中段: トレンドグラフ<br>折れ線・エリア"]
Detail["下段: 詳細テーブル<br>テーブル・イベント"]
end
KPI --> Trend --> Detail
style KPI fill:#3b82f6,color:#fff
style Trend fill:#22c55e,color:#fff
style Detail fill:#f59e0b,color:#fff
| ガイドライン | 説明 |
|---|---|
| KPIを上に | 重要な数値は最上段に |
| 4パネル/行以下 | 読みやすさを維持 |
| 時間フィルタを共有 | グローバルタイムピッカーを使用 |
| ドリルダウンを設定 | クリックで詳細へ遷移 |
| 色を統一 | 一貫した色使い |
実践: Webサーバー監視ダッシュボード
<dashboard>
<label>Web Server Monitor</label>
<fieldset submitButton="false">
<input type="time" token="time">
<default>
<earliest>-24h@h</earliest>
<latest>now</latest>
</default>
</input>
</fieldset>
<!-- KPI行 -->
<row>
<panel><title>Total Requests</title>
<single>
<search>
<query>index=main sourcetype=access_combined | stats count</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
</single>
</panel>
<panel><title>Unique Visitors</title>
<single>
<search>
<query>index=main sourcetype=access_combined | stats dc(clientip)</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
</single>
</panel>
<panel><title>Error Count</title>
<single>
<search>
<query>index=main sourcetype=access_combined status>=400 | stats count</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
</single>
</panel>
</row>
<!-- トレンド行 -->
<row>
<panel><title>Requests Over Time</title>
<chart>
<search>
<query>index=main sourcetype=access_combined | timechart span=1h count by status</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
<option name="charting.chart">area</option>
<option name="charting.chart.stackMode">stacked</option>
</chart>
</panel>
</row>
<!-- 詳細行 -->
<row>
<panel><title>Top URIs</title>
<table>
<search>
<query>index=main sourcetype=access_combined | top limit=10 uri</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
</table>
</panel>
<panel><title>Top Client IPs</title>
<table>
<search>
<query>index=main sourcetype=access_combined | top limit=10 clientip</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
</table>
</panel>
</row>
</dashboard>
まとめ
| 概念 | 説明 |
|---|---|
| チャートタイプ | 折れ線、棒、円、エリア、テーブル、シングルバリュー |
| ダッシュボード | パネルを配置した画面 |
| Simple XML | ダッシュボードの記述言語 |
| トークン | 入力とパネルを連携させる変数 |
| ドリルダウン | クリック時のアクション |
重要ポイント
- KPI→トレンド→詳細の順にパネルを配置
- 時間フィルタはグローバルに共有する
- ドリルダウンで詳細への導線を作る
- Simple XMLを理解するとカスタマイズの幅が広がる
練習問題
問題1: 基本
3つのKPIパネル(総イベント数、ユニークホスト数、エラー数)を持つダッシュボードを作成してください。
問題2: 応用
ドロップダウンでホストを選択でき、選択したホストのイベント推移と上位URIを表示するダッシュボードを作成してください。
チャレンジ問題
ドリルダウンを設定し、チャートのバーをクリックすると、そのホストの詳細ログが新しいタブで開くダッシュボードを作成してください。
参考リンク
次回予告: Day 7では「サーチの応用」について学びます。サブサーチ、ルックアップ、トランザクションなどの高度なSPLテクニックをマスターしましょう。