2016-01-03

レポート通知のカスタムアクション試してみた

Spring ’15からレポート通知の機能が利用できるようになっています。 任意のレポートがある条件を満たした時に特定のアクションを実行させることができる機能で、ログインユーザレベルで設定できるものになります。具体的には「毎日午前10時に未解決のケースが100個以上溜まっている状態であれば、登録者に対してChatterやメール通知する」といったことが出来るようになります。

特定のアクションの実行では、Apexでアクションを記述することができます。つまり、任意のレコードを更新したり、コールアウトして外部システム連携するとか、特定のChatterグループにフィード投稿するとか、そういった処理を組み込むことができます。

カスタムアクションはこんな感じの実装をすればOKです。(デバッグとってるだけのサンプル)

public with sharing class ReportAlert implements Reports.NotificationAction {
    public void execute(Reports.NotificationActionContext context) {
    	System.debug(context.getThresholdInformation());
    	System.debug(context.getReportInstance());
        Reports.ReportResults results = context.getReportInstance().getReportResults();
        System.debug(results);
        System.debug(results.getGroupingsDown());
    }
}

Reports.NotificationActionをimplementsしてexecuteを実装するだけです。引数にはReports.NotificationActionContextが入ってくるので、ここから実行されたレポートの情報(集計結果)を取得することができます。またレポート通知の閾値、条件やレポートのメタデータ(所有者、レポートIDなど)の情報も含まれます。実際のレポートの値の取得に関しては基本的にはAnalytics REST APIの方と同じっぽいです。中身の集計結果をまともに取得しようとすると結構大変そうなイメージ。

作成したクラスは各レポートの登録画面の「カスタムアクションを実行」から設定します。

regist_reportaction2

「保存して今すぐ実行」をすれば即座にアクションを実行できるので、ここでポチポチボタンを押してテストしていく感じになります。Reports.NotificationActionContextから取得できるレポート情報をゴニョゴニョしたい場合は、apexからもレポートの情報取得ができるっぽいので、こちらで試してもOK。

通知手段がApexで組めるということなので、AWSのSNSでPublishするようなやつを作ってみました。→tzmfreedom/apex_sns

使い方こんな感じ↓

public with sharing class ReportAlert implements Reports.NotificationAction {
    public void execute(Reports.NotificationActionContext context) {
        SNSClient client = new SNSClient(
            '{access key id}',
            '{access key secret}',
            '{region}'
        );
        client.publish(new Map<String, String>{
            'Message' => '{message}',
            'TopicArn' => '{Topic ARN}'
        });
    }
}

こちらもAWS IoTのクライアントと同様に一旦仕組みを作れば、あとは管理者側の設定で色々な通知手段が組めるという利点があります。メールもモバイルPushもWebhookもSQSへのキューイングもいけます。

このエントリーをはてなブックマークに追加