グラフ・ネットワークを Splunkで作る! 


## 概要

ネットワーク通信の可視化がしたい！　こんな要望から色々と調べているうちに Splunkに Network Diagram Viz というアプリがあることがわかり触っているうちにこれが意外に面白い！

当初の目的のネットワーク通信の可視化から少し脱線して、こちらの Network Diagram Vizを深堀してみました。
もちろん Network可視化にも利用できます。

**Update**
[こちらの続編(NetworkXを使った分析・可視化)もご覧ください](https://qiita.com/maroon/items/025e415b9bd53197d8b0)


## グラフ理論

この Network Diagram Viz のコンセプトは、おそらくですがグラフ理論に基づいて作られていると思います。

ノード（節点・頂点）の集合とエッジ（枝・辺）の集合で構成されるグラフに関する数学の理論である。(by wikipedia) 
https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95%E7%90%86%E8%AB%96

例えばSNSの世界だと、人が（ノード）となり、フォローが（エッジ）と考えた場合、グラフ理論を使って可視化すると、それぞれの繋がりを確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/1126581f-c292-ea4c-712c-12f06607caf9.png)


これ以外にも、例えばこんなケースにも利用できます。
・　物流の流れ
・　お金の流れ
・　Webサイトとリンク先の関係
・　ネットワークのフロー
・　文献の引用先

基本的には from と to がわかれば、このグラフネットワークが利用出来るのです！　

それでは、前置きはこのくらいにして早速触ってみましょう。

## Splunk Network Diagram Viz のインストール

Splunk Network Diagram Viz のダウンロード
https://splunkbase.splunk.com/app/4438/

こちらのアプリをダウンロードして、Splunkにインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/32091dac-db5f-5979-999f-503a69ebeb76.png)

Splunkの再起動をする。

## 使い方

アプリを開くと最初のページに使い方ガイドがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/85267abd-6e19-fd48-71c3-e68e0999dbb6.png)


注意するのは、フィールド名が予め決まっている点です。そのため可視化したいログのフィールド名を renameする必要があります。
可視化に必須なのは fromだけですが、toがないと線が引けないので、最低でも from / to は作ってください。

```:利用できるフィールド名
from (required): ソースノード名
to (optional): ターゲットノード名
value (optional): tool tipとして利用される名前。token名としても利用される
type (optional): Iconの種類 ( server-definition-lookup.csv に定義されている）
color (optional): カラー。 Iconとテキストに使われる
linktext (optional): リンク（エッジ）に表示されるテキスト名
linkcolor (optional): リンクのカラー - HTML colours または "red" / "yellow" / "green" / "blue". など
linkwidth (optional): リンクの太さ. The optimal size range is between 0 and 15.
x (optional): アプリの 'Create Layouts' で利用される、場所を固定するためのオプション (x軸)
y (optional): アプリの 'Create Layouts' で利用される、場所を固定するためのオプション (y軸)
```


## 早速使ってみよう

これだけわかれば利用できてしまいます。早速使ってみましょう！

### ビットコイン取引の図

MLTKを入れていると、bitcoin_transaction.csv というサンプルデータセットがありましたので、そちらをまずは可視化してみます。
こんな感じで、取引の日時と、トランザクション番号、from / to そして、value(取引量) があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/780479ed-00e5-3238-9e0b-727562a6f08e.png)

以下のように、対象のものに絞って、フィールド名を変更します。
今回はわかりやすいように、10件に絞ってみてみます。また取引サイズにしたがって線の色を変更してみます。

```
| inputlookup bitcoin_transactions.csv 
| head 10 
| eval linkcolor = case('value' < 10, "blue", value>=10 AND value<50,"green", value>=50, "red") 
| rename user_id_from as from user_id_to as to value as linktext 
| eval value = from
| table from value to linktext linkcolor
```

検索結果はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/6cfc3239-823e-0100-d567-b8d3b44c75e0.png)


可視化のグラフに、Network Diagram Viz が登場します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/563e7c68-739c-ce95-6e9b-c0ac64baa249.png)

こんな感じで表示できます。表で確認するよりも、どこからどこにお金が流れているのか、またその量なども一目でわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/7382d479-cf76-6a88-df73-f07653729bf2.png)

今回 Hierarchy を Top-Downにしているので、From から To にかけて上から下に流れて行きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/6053d13d-bd0f-31ae-e533-7bda19c8f100.png)

Icon も自由に変えられます。 (いくつかエラーになる Iconもありましたが。。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/8f2093b8-05ba-7588-fc52-95226b4f6e53.png)


ちょっと残念なのが、ノード名表示が from にしか対応していない点です。（おそらく仕様の問題）
そのため、ちょっと工夫をして toも表示できるようにしました。

```
| inputlookup bitcoin_transactions.csv 
| head 10 
| eval linkcolor = case('value' < 10, "blue", value>=10 AND value<50,"green", value>=50, "red") 
| rename user_id_from as from user_id_to as to value as linktext 
| eval value = from
| append 
    [| inputlookup bitcoin_transactions.csv 
    | head 10 
    | rename user_id_to as to
    | dedup to 
    | eval value =  to
    | table to value
    | rename to as from] 
| table from value to linktext linkcolor
```

これで to まで表示できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/e5316415-d7cb-8dd6-fc1e-fc99855ffab7.png)

残念ながら矢印（有向グラフ）は作成できませんでした。

### ダッシュボード作成

ここまでくると、対象のノードやエッジをクリックしたら、詳細が表示できたりしたくなりますよね。

この Network Diagram Viz Appのいいところは、そこまで考えて設計されている点です。

「視覚エフェクト」の「フォーマット」を開くと、Tokens というタブがあります。すでに Node や Link　を対象としてtokenが割り当てられておりますので、ダッシュボードを作成した際にこの Tokenを使ってドリルダウンできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/e3b56592-e528-0f60-ab9e-88f85451cd7e.png)


それでは、先ほどのグラフと詳細がわかる表を追加してダッシュボードを作成します。
作成したダッシュボードはこちらです。（小さいですが、下に表があります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/6bea2618-4b93-e928-e870-12a2e2edf7fa.png)


### ドリルダウン設定 

ダッシュボードを編集モードにして、グラフの右上から「ドリルダウンを編集」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/8e9c1b0a-91f8-d7e7-6111-ece91f746e06.png)

次に「このダッシュボード上のトークンの管理」に進みます。

今回は from のノード名を引数として渡したいと思います。
そのため、nd_node_tokens = \$nd_node_token\$　として入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/90f13df5-900a-e2d3-0b8d-fc63c038cbfc.png)


次に対象のグラフのサーチを編集します。
先ほどの node_from を対象の検索value の箇所に$マークを前後につけておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/0530e2f6-e547-9d1e-aade-105fdeaf8be4.png)

完成です。


グラフの対象のノードをクリックすると、下の表に対象ノードの取引履歴が表示されました。


## 注意点

この Network Diagram Viz Appは大量のデータを可視化しようとするとスペック不足のせいかハングしました。
ノードが増えると計算する対象も累乗に増えてしまうので相当のリソースが必要になると思いますし、そもそも大量のデータを可視化しても見た目が細かくてみづらくなってしまいました。（ズームはできますが）

そのため、可視化する対象を最初にフィルターしてから表示するのがおすすめです。（上位50個とか）