カスタマーオンボーディングチームの塚原 一喜です。
本日は、td-js-sdkでのデータ収集状況モニタリングの重要性について説明します。
td-js-sdkで送信していたはずのデータが送信されていない
そんな経験をお持ちのTreasure Data CDPご担当者様もいらっしゃるのではないでしょうか。
- サイトリニューアルでうまくタグが動かなくなった
- タグマネーシャーの管理を複数人で行っていて、誤って停止してしまった
- 他のタグと干渉してうまく送信ができなくなってしまった
など、さまざまな理由で送信していたはずのデータが送信されなくなってしまうという状況は、発生する可能性があります。Javascriptのブラウザエラーなどを毎日モニタリングする体制が整っていれば、突発的なエラーに気づく社内体制も構築できると思いますが、できれば機械的にモニタリングしたいと思います。
そこで、日次実行のWorkflowで、3ヶ月の日次PV平均から閾値を設定し、アラート対象以下になったらメールやSlackで通知をする、などの仕組みを構築しておくことで、「データ送信に何か不具合が発生したかもしれない」、ということにタイムリーに気が付く体制を構築することができます。
機械学習のロジックにWebログが使われている、定期アクセスに対してロイヤリティプログラムを組んでいる、などの分析実行をしている場合、データ送信ができていない状況に1ヶ月気がつかなかった場合などは、施策にも影響が出ると思いますので、準備をしておくことは重要だと思っております。
Workflowサンプル
ベーシックな記述になりますので、お客様ごとにカスタマイズは必要になると思いますが、サンプルを公開します。(本サンプルは「前日のPVが、過去3ヶ月平均PVの1/3以下だった場合通知する」Workflowサンプルです)
https://github.com/tsukaharakazuki/td/tree/master/monitoring_collect_weblog
WITH avg AS ( SELECT AVG(pv) AS pv_avg , --平均PVの1/3 AVG(pv) / 3 AS avg_onetherd , --平均PVの1/3 'a' AS dum FROM ( SELECT TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'JST') AS day , COUNT(*) AS pv FROM ${brand.log_db}.${brand.log_tbl} WHERE TD_INTERVAL(time, '-3M/now', 'JST') GROUP BY 1 ) ) , yesterday AS ( SELECT TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'JST') AS check_date , COUNT(*) AS pv_yesterday , 'a' AS dum FROM ${brand.log_db}.${brand.log_tbl} WHERE TD_INTERVAL(time, '-1d', 'JST') GROUP BY 1 ) SELECT b.check_date , a.pv_avg , a.avg_onetherd , b.pv_yesterday , CASE WHEN a.avg_onetherd > b.pv_yesterday THEN 'true' WHEN a.avg_onetherd <= b.pv_yesterday THEN 'false' END flag , '${brand.brand_name}' AS brand_name FROM avg a INNER JOIN yesterday b ON a.dum = b.dum
上記のSQLで、前日のPV数と平均を比較して、アラート対象の場合だけ通知をする制御を実行しています。
config/params.yml
で、モニタリングする対象のDatabase名/Table名を指定すると、複数サイトのモニタリングが一括処理で実行されます。
--- brand: - brand_name: branda log_db: branda_db log_tbl: pageviews - brand_name: brandab log_db: brandab_db log_tbl: pageviews
サンプルWorkflowでは、Slackに送信設定を行っています。
+for_each_slack: td_for_each>: queries/p1000_log_store.sql _do: +send_slack: if>: ${td.each.flag} _do: http>: https://hooks.slack.com/services/xxxxx/yyyyy/zzzzzzzzzzzzzz method: POST content: username: "Log alert bot" icon_emoji: ':fireball:' channel: "#general" fields: - title: ブランド名 value: "${td.each.brand_name}" short: false - title: 計測日 value: "${td.each.check_date}" short: false - title: PV value: "${td.each.pv_yesterday}" short: true - title: 3ヶ月平均PV value: "${td.each.pv_avg}" short: true - title: session_time value: "${session_time}" short: false content_format: json
Webhook URL、チャネル名を変更いただくと、送信したいSlackアカウントの該当チャネルにデータを送信していきます。メール、チャットワークなど、他のプラットフォームへの送信も可能です。
導入をご検討の際は、担当カスタマーサクセスまでお問い合わせください。