Salesforce初心者の私がイベントモニタリングでログを確認するためにやったこと

こんにちは！
[エイチームフィナジー](https://finergy.a-tm.co.jp/)の[アドベントカレンダー](https://qiita.com/advent-calendar/2020/ateam-finergy)9日目は、[hondam](https://qiita.com/hondam)が担当します！

# はじめに

いきなりですが、Salesforceって導入するだけではログは**「ログイン履歴くらいしか見れない」**って知ってますか？

私は知りませんでした汗

Slackを買収して今を時めく世界シェアNo.1のCRM/SFAなSalesforceが、まさかログイン履歴くらい(実際は他にもログはありますが)しかデフォルトで見れないと思いませんよね。

こういう所が**商売上手**なんだろうなと思いつつ、ぐぬぬしながら詳細なログを取得する方法を探りました。

Salesforceで詳細なログを取得するには**「Salesforce Shield」**、もしくはそのサブシステムである**「イベントモニタリング」**を**別途契約して**導入する必要があります。

本稿では**「イベントモニタリング」**について紹介したいと思います。

# イベントモニタリングとは
イベントモニタリングはWinter'15にてSalesforceの機能としてリリースされました。

イベントモニタリングを有効にすると、Salesforce上での様々なアクティビティを追跡することが可能となります。ログイン・ログアウト履歴だけでなく、レポートを表示・エクスポートしたか、APIの呼び出し状況、Lightningのパフォーマンスなど様々な情報が**イベントログファイル**として残ります(**ただし30日間しか保持されません。**)

# 権限の確認
さて、イベントモニタリングを契約により有効にしたからといって、何もしなければイベントログは確認することが出来ません。

イベントログを確認するにはプロファイルにて、

* 「イベントログファイルを参照」を有効

にする必要があります。またAPI経由にてイベントログを取得するため、

* 「API の有効化」を有効

にする必要があります。

イベントログを参照するユーザには当該権限が有効になっているかご確認ください。

# ワークベンチを使ってイベントログを取得する
特定プロファイルが有効化できれば、イベントログは取得する事は簡単にできます。

ワークベンチは、管理者および開発者がSalesforceのAPIを介して、Salesforce上の様々なデータにアクセスするための強力なWebベースのツールです。

ワークベンチは以下のURLから利用できます。これはSalesforceの開発者向けサイト上に構築されたワークベンチです。利用に際しては注意が必要で、このサイトは**「Salesforceの公式なプロダクトではない」**という点と**「Salesforce自体はワークベンチに対するサポートはしない」**点です。
利用規約もありますので同意可能な方のみご利用ください。
(とはいえSalesforceのTrailheadという学習サイトで案内してたりもするんですけどね...)

https://workbench.developerforce.com

<img width="500" alt="ワークベンチスクリーンショット1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/dc71c7a9-c124-aec2-3e50-5b024f80572c.png" />

以下はワークベンチからSOQL(Salesforce Object Query Language)というSalesforce専用のSQLに似たクエリを発行して、データを取得した例です。

<img width="500" alt="ワークベンチスクリーンショット2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/9f388266-cc9a-dccb-0c92-dda16ada8007.png" />

ワークベンチではSOQLを通じてのデータ検索以外にオブジェクト(データベースでいうテーブルみたいなもの)の操作(追加・変更・削除)や、REST APIをコールしての操作が可能と非常に強力なツールとなっています。

SalesforceのUIからのオブジェクト操作ではなく、もう少し効率的にオブジェクトを操作したい場合はワークベンチは有用と思われます。

# CLIからイベントログを取得する
では次にCLIからイベントログを取得する方法を紹介します。
Force.com CLIはGo言語で記述されたSalesforceを操作するクライアントです。
以下のサイトからバイナリをダウンロードする事が可能です。

http://force-cli.herokuapp.com/

ソースを確認したい場合は以下のサイトを参照してください。

https://github.com/ForceCLI/force

実行権限などは適宜付与してください。以下のように表示されるとOKです。

```
$ force version
v0.28.1
```

forceコマンドが使えるだけでもSalesforceは操作可能なのですが、ここではさらに以下のシェルスクリプトを使用して、イベントログファイルをダウンロードしてみようと思います。

https://github.com/atorman/elfBash/blob/master/elfCLI_mac.sh

このシェルスクリプトはforceコマンドとjqコマンド、curlコマンドを使用して、Salesforce上から特定日付のイベントログファイルを取得するスクリプトです。
紹介しておいてなんですが、当該スクリプトが古く、forceコマンドで受けるレスポンスが若干変わっているようで、jqで参照する項目を以下のように変更する必要があります。

```
-access_token=`more ~/.force/accounts/${username} | jq -r '.AccessToken'`
+access_token=`more ~/.force/accounts/${username} | jq -r '.access_token'`
 
-instance_url=`more ~/.force/accounts/${username} | jq -r '.InstanceUrl'`
+instance_url=`more ~/.force/accounts/${username} | jq -r '.instance_url'`
```

修正できましたら、以下実行してください。

```
$ ./elfCLI_mac.sh
```

すると、Salesforceでログインが求められます。

<img width="500" alt="CLIスクリーンショット1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/12e3c284-fff0-cbb8-6d30-7a1c75676864.png" />

<img width="500" alt="CLIスクリーンショット2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/a051f9e2-df2a-c2b0-ad4b-c4cf7f9e4ead.png" />

OAuthのコールバックが完了すると、コマンドラインで入力を求めれます。

```
Please enter logdate (e.g. Yesterday, Last_Week, Last_n_Days:5) (and press ENTER): Last_n_Days:5
```

スクリプトの実態としては、curlを使ってSalesforceに対してクエリを発行し、特定期間のイベントログのIDを取得、それを元にイベントログファイルをCSVでダウンロードする挙動となります。

上手く取得できると、以下の添付画像のようになります。

<img width="500" alt="CLIスクリーンショット3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/fffd6ff1-b9bf-6365-c157-377cfdf53d45.png" />


# イベントログファイルブラウザを使ってイベントログを取得する

というか、もっと簡単にイベントログ取得できないの？と思いますよね。

出来ます。

https://salesforce-elf.herokuapp.com/

こちらはHeroku上で稼働する、Salesforceのイベントログファイルブラウザです。

<img width="500" alt="イベントログファイルブラウザ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/9b7823f7-1f94-1e26-b7a5-fcfab6e59a01.png" />

本番もしくはサンドボックス環境を指定し、OAuthログインすると、指定環境のイベントログがリストで表示され、指定のイベントログファイルをダウンロードする事が可能になります。

ただしこちらもSalesforce公式のアプリケーションではないので利用する場合は注意してください。
プルリクエストのマージやHerokuへのデプロイはSalesforceの従業員だけと記載されてはいますが...。
コードや詳しい実装内容など知りたい方は以下のURLからご参照ください。

https://github.com/abisek/salesforce-elf-browser

# Einstein Analytics アプリケーションでイベントログを視覚化する

さて、ここまでイベントログファイルをあの手この手で取得してきましたが、いずれも生データであることや、場合によってイベントログデータ量が膨大にあるため、取り扱いが難しく、せっかくのイベントログを活用できません。

SalesforceにはEinstein Analytics(旧称はWaveで、新称はTableau CRMになる予定)というBIツールが存在します。詳細は割愛しますが、標準のレポートやダッシュボードと違い、視覚化のリアルタイム性はありませんが、AIによる要因分析が可能となります。

イベントログを視覚化するには以下の割り当て・有効化が必要となります。

* 権限セットから「Event Monitoring Analytics 管理者」を割り当てる
* 権限セットから「Event Monitoring Analytics ユーザ」を割り当てる
* 設定から「Einstein Analytics」の有効化する
* 設定から「Analytics アプリケーションでイベントログデータを表示」の有効化する

上記が無事完了すると、アプリケーションランチャーに「Analytics Studio」が表示されていると思いますのでこちらをクリックしてください。

<img width="500" alt="Analytics Studio1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/c8c92243-6842-aef0-4566-3e369ac17a9d.png" />

クリックすると次のようにAnalytics Studioのホーム画面が表示されるはずです。

<img width="500" alt="Analytics Studio2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/055fe788-fa43-1981-c6e0-1a9e5df3a8c5.png" />


ホーム画面が表示されましたが、右にある「作成」ボタンをクリックし、「アプリケーション」を選択してください。

<img width="200" alt="Analytics Studio3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/4519dd59-c048-0fa3-f344-4c7cb66d3669.png" />

新規アプリケーションを作成するモーダルウィンドウで表示されると思います。
表示されたら、Event Monitoring Analytics Appのテンプレートを選択し、「次へ」ボタンをクリックして進めてください。

<img width="500" alt="Analytics Studio4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/d0efc13f-4dd9-2105-b375-0beb20086917.png" />

進めると以下のように各種データの保持期間を確認されます。デフォルトは7日間です。

<img width="500" alt="Analytics Studio5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/60d014b3-6de1-e4c3-b0f0-8bf38ffc2273.png" />

最後にアプリケーション名を入力し完了させると、ホーム画面には作成に時間がかかると表示されます。作成が完了すると作成者に対してメールで通知が来るのですが、およそ30分ほどで作成されるようです。

<img width="500" alt="Analytics Studio6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/15ca48db-575f-2b63-157d-28ed8384b369.png" />

さて、アプリケーションの作成が完了したら、再度Analytics Studioのホーム画面へ遷移し、左サイドメニューの**「自分が作成」**を表示すると、以下のように付属のダッシュボードがいつくか表示されます。

<img width="500" alt="Analytics Studio7" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/57519e92-a169-a7e4-7572-aeb7a8b98c1b.png" />

ここで、**「Logins」**というダッシュボードを選択すれば、ログイン状況が視覚化されるのですが、これだけでは不十分で、最新のデータをAnalyticsにインポートするデータフローが必要です。実行は**「データマネージャ」**から実施します。
「データマネージャ」はAnalytics Studioホーム画面の左サイドメニュー下部にあります。

<img width="500" alt="Analytics Studio8" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/3f7fa986-a6d3-8b9b-d4a6-2b118e312924.png" />

データマネージャ画面を表示したら、左サイドメニューにある**「接続」**を選択してください。ここで未スケジュールと表示されている横の下三角形をクリックするとさらにメニューが表示されます。ここでデータインポートのスケジュールを作成してください。すぐにインポートしたい場合は**「今すぐ実行」**を選択してください。

さて、インポート後に改めて**「Logins」**というダッシュボードを表示してみると...
無事イベントログが視覚化されました！やったぜ！

<img width="500" alt="Analytics Studio7" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4305/4cd3b04c-e937-b765-9557-48c02401ca88.png" />


# まとめ
さて、ここまで様々な方法でSalesforceのイベントログを取得してきましたが、まとめると、

* Salesforceはデフォルトでは詳細なイベントログは取得できない
* Salesforce Shieldやイベントモニタリングを契約すると詳細なログを取得する事が可能になる
* 可能になるだけで、自らワークベンチやCLI、アプリケーションを操作しないとイベントログは取得できない
* Einstein Analyticsの設定でSalesforce上で視覚化可能となる

となります。

イベントログは30日間しかSalesforceに保存されないので、別途ログファイルをダウンロードしてデータストレージに保存する仕組みや、イベントログを監視してアラートを飛ばす仕組みなど、運用面は触れておりません。このあたりは別の機会にでも記事にしたいと思います。

# 明日は

エイチームフィナジーが誇る、スーパールーキー [tommy1038](https://qiita.com/tommy1038) さんが担当します。
楽しみですね！！

# 参考文献
* [イベントモニタリング \| Salesforce Trailhead](https://trailhead.salesforce.com/ja/content/learn/modules/event_monitoring)
* [Einstein Analytics の基本 \| Salesforce Trailhead](https://trailhead.salesforce.com/ja/content/learn/modules/wave_analytics_basics)
* [Event Monitoring Analytics アプリケーション](https://help.salesforce.com/articleView?id=bi_app_admin_wave.htm&type=5)