SplunkでD3.jsを動かす


SplunkでD3.jsを動作させる例として、Appの「Splunk Web Framework Toolkit」を使ってバブルチャートを表示させる手順を紹介します。

ちなみに、D3をご存じない方には以下のチュートリアルが参考になると思います。

D3 入門|スコット・マレイ
http://ja.d3js.info/alignedleft/tutorials/d3/

ダッシュボードにバブルチャートを表示させる

「Splunk Web Framework Toolkit」のインストール

以下からダウンロードして、Splunkにインストールしてください。
https://splunkbase.splunk.com/app/1613/#/overview

Appの作成

App作成画面から「Try_D3」を作成します(フォルダ名は「try_d3」とします)。

Dashboardの作成

作成したApp「Try_D3」のDashboardで「Bubblechart」の名前で作成します。

サーチ文の作成

「Bubglechart」のDashboardで「Add Panel」から「Statistics Table」を選択し、以下のサーチ文を入力します。

index=_internal | stats count by sourcetype

すると以下のような画面になります。

HTMLへ変換

Dashboardsの画面に戻り、「Edit」から「Conver to HTML」を選択します。

D3.jsライブラリの配置

try_d3配下に"appserver/static"ディレクトリを作成し、その配下に"splunk_wftoolkit/appserver/static/components"をコピーします。

$ mkdir -p /Applications/Splunk/etc/apps/try_d3/appserver/static
$ cp -r /Applications/Splunk/etc/apps/splunk_wftoolkit/appserver/static/components /Applications/Splunk/etc/apps/try_d3/appserver/static/

ライブラリへのパスを通す

以下の記述を見つけ、

// <![CDATA[

その下に以下を追記します。

require.config({
    baseUrl: "{{SPLUNKWEB_URL_PREFIX}}/static/js",
    waitSeconds: 0,
    paths:
    {
        "app": "../app"
    }
});

requireの最下に以下を追加します。

"app/try_d3/components/bubblechart/bubblechart"

functionの最下に以下を追加します。

BubbleChartView

バブルチャートのviewを定義

以下の記述を見つけ

// VIEWS: VISUALIZATION ELEMENTS

その下に以下を追記します。

var bubblechart = new BubbleChartView({
    id: "bubblechart",
    managerid: "search1",
    labelField:"sourcetype",
    valueField: "count",
    categoryField: "sourcetype",
    el: $("#bubblechart")
}).render();

ここで、各属性は以下の通りです。

  • id,el : DOMエレメントとして、ダッシュボードに表示させる際に使用
  • managerid : サーチ文との紐付け."SEARCH MANAGERS"のidを使用
  • labelField : 各々のバブルに表示させるラベル
  • valueField : 各々のバブルの大きさの指標
  • categoryField : 色をつけるためのグルーピング

ダッシュボードへの表示

以下の記述を見つけ

<div id="element1" class="dashboard-element table" style="width: 100%">

以下に書き換えます(ここで上記elを使用します)。

<div id="bubblechart" class="dashboard-element table" style="width: 100%">

描画してみます。

これでは小さすぎるので、サイズを調整します。

<div id="bubblechart" class="dashboard-element table" style="width:400px;height:300px">

いい感じになりました。

インタラクティブ(ドリルダウン)動作を定義する

バブルチャートを表示させただけではちょっとつまらないので、バブルをクリックした際の動作(ドリルダウン)を定義します。バブルをクリックすると該当のデータの詳細を統計テーブルに表示させるという動きにします。

表示領域の作成

まず以下をバブルチャートの下に追記して、表示領域を作成します。

<div id="row2" class="dashboard-row dashboard-row2">
    <div id="panel2" class="dashboard-cell" style="width: 100%;">
        <div class="dashboard-panel clearfix">

            <div class="panel-element-row">
                <div id="statisticstable" class="dashboard-element table" style="width: 100%">
                    <div class="panel-body"></div>
                </div>
            </div>
        </div>
    </div>
</div>

// VIEWS: VISUALIZATION ELEMENTSに以下を追記します。

        var statisticstable = new TableElement({
            "id": "statisticstable",
            "drilldown": "none",
            "managerid": "search2",
            "el": $('#statisticstable')
        }, {tokens: true, tokenNamespace: "submitted"}).render();

サーチ文の定義

以下の記述を見つけ、

// SEARCH MANAGERS

以下を追記します。

var search2 = new SearchManager({
            "id": "search2",
            "cancelOnUnload": true,
            "search": "index=_internal sourcetype=$select_sourcetype$ | table _time source",
            "latest_time": "now",
            "status_buckets": 0,
            "earliest_time": "-24h@h",
            "sample_ratio": null,
            "app": utils.getCurrentApp(),
            "auto_cancel": 90,
            "preview": true,
            "tokenDependencies": {
            },
            "runWhenTimeIsUndefined": false
        }, {tokens: true, tokenNamespace: "submitted"});

イベントハンドラの定義

バブルクリック時の動作を記述します。
上記で作成した、

var bubblechart = new BubbleChartView({
    id: "bubblechart",
    managerid: "search1",
    labelField:"sourcetype",
    valueField: "count",
    categoryField: "sourcetype",
    el: $("#bubblechart")
}).render();

の下に以下を追記します。

bubblechart.on("click", function(e) {
   if (e !== undefined) {
        setToken("select_sourcetype", e.name);
   }
});

ここで、バブルチャートの場合、eは以下のような構成になっています(上記ではname属性を利用しました)。

{
  name: labelFieldの値,
  category: categoryFieldの値,
  value: valueFieldの値
}

以上で完成です。下図のようにバブルをクリックすると、下の統計テーブルに詳細が表示されます。

なお、完成形の構成をgithubに置いておきましたので、ご興味がある方はご覧ください。
https://github.com/myogada/Splunk_Try_D3