Google Formsのアンケート結果をSplunkに自動収集して分析してみた。


# はじめに

今回は Google Formのアンケート結果を自動的に Splunkに取り込んで、分析できるようにしてみました。


### なにがうれしいいか？
・　柔軟な分析ができる。（Google Formにデフォルトでついている結果グラフなどは有用だが、それ以上の分析ができない）
・　過去のアンケート結果を含めて総合的な表示や、特定の項目に絞った分析ができる。
・　上記の事をリアルタイムに表示できる。（アンケート期間が長くてもリアルタイムに最新情報が確認できる）
・　自動化しているので、手動で Excelや Spreadsheetを毎回編集しなくてもいい。（これが一番かも）


##アーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/04b4844e-8355-da4f-2cd8-dd6ae15abb7f.png)

Google Formには、回答結果を Google Sheetに自動で保存する機能がついてます。今回はさらにその Google SheetをSplunkに自動で取り込むように設定しました。これでいつでもリアルタイムに Splunkで分析したり、ダッシュボードで可視化したり、アラートをあげたりすることができます。また同じ Google Sheetに保存するように設定すれば、アンケートが何回行われても一箇所に保存されるため、過去データも含めた分析ができるようになります。


##設定手順
1. Google appを作成し、APIのTokenを取得する
2. Google Form を作成し、Google Sheetに回答が保存されるようにし、1で作成したアカウントに共有する
3. Splunkにアプリを追加する (Google Import/Export)
4. SplunkにLookupを作成し、Google sheetのデータを同期する

ポイントはGoogle Sheetのデータを外部から参照できるように APIのTokenを取得する点と、Splunkにアプリを追加しLookupファイルにデータを同期する点です。



###手順1：Google appを作成し、APIのTokenを取得する

参考サイト
https://lukemurphey.net/projects/splunk-google-docs/wiki/How_to_setup_app
https://qiita.com/odorusatoshi/items/2d00edbd074c9b267195

詳細は上記のサイトに記載があるので、ここではさくっと流します。

1. プロジェクトの新規作成 https://console.developers.google.com/cloud-resource-manager


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/8f999641-199a-bda1-85a5-3733a70c7416.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/cf73f97b-fa38-1ad5-3831-271e299da0aa.png)


完了すると、jsonファイルが自動的にダウンロードされます。（後ほど使うので保存する）

###手順2: Google Form を作成し、Google Sheetに回答が保存されるようにし、手順1で作成したアカウントに共有する

ここでは、Google Formの使い方については解説しませんが、Google Sheetに自動保存される設定方法のみ解説します。Formの管理者画面で、回答(Response)タブを開き、設定画面を開くと下図のような項目が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/47196432-9521-761d-f559-f76c28bbeda3.png)

作成された Spread Sheetを、手順１で作成したサービスアカウントに共有します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/535132d7-6092-4d4f-1ed5-3db86416209f.png)


###手順３：Splunkにアプリを追加する (Google Import/Export)

Google Import/Export Appを Splunkにインストールする
https://splunkbase.splunk.com/app/2630/

Installが完了すると、Google Drive というアプリ(名前に違和感があるが）がインストールされているので、設定画面にいくと以下のような画面になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/cd050886-3058-b4a1-87bc-e29d0b4865c1.png)

###手順４：SplunkにLookupを作成し、Google sheetのデータを同期する

このアプリのポイントは、データを Splunkの Indexに取り込むのではなく、ローカルファイルに同期されLookupで参照するという点です。
なので、最初に空のファイルを作成し、Splunkにアップロードしルックアップファイルを作成します。

### lookupファイルの作成と定義
lookupファイルの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/29ceacc9-0fb1-9fd5-ee78-975d70063ddf.png)

lookupの定義をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/09d09e03-be29-68fe-0d9b-6b9fc1d10462.png)

最後に定義した lookupファイルを共有する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/02dda8f1-e212-4a0f-8622-ba5f1e5d518c.png)

これで、lookupファイルを呼び出せるようになりました。
ちなみに、作成したルックアップファイルは共有されているので、 ({SPLUNK_HOME}/etc/apps/search/lookups に保存されてます。



### 入力データの登録
「設定」--> 「データ入力」 --> 「Google Spreadsheet」新規作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/88a7d316-b0a3-cdf6-00c5-3717ed9d611c.png)



## データ分析開始

しばらくすると、データが同期されます。


```:作成したlookupの呼び出し方
|inputlookup gform 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/a4e7322b-71b4-5bb1-b25e-e4a72109808d.png)
(*)日本語ももちろんOKです。
質問文は長いので分析するには不便ですので、サーチマクロとかで rename文を書いておくと後が楽になります。

こんな形でダッシュボード作っておけば、過去のアンケートや講師別の結果などいつでも簡単に見返せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/ede0c56f-c58e-36b4-9f9f-71c3c9406c93.png)


## おまけ

lookup File Editor という神アプリがあります。Lookupファイルを Splunk GUI上から直接編集することができるので非常に便利です。

Lookup File Editor
https://splunkbase.splunk.com/app/1724/

これで、実際にファイルの中身を確認したり、編集することが可能です。今回はSpreadsheetと同期しているので、元を編集しないと意味はないんですが。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/ce1ef166-8980-cfa7-fd60-2c39d723715d.png)