カスタマーオンボーディングチームの塚原 一喜です。
本日は、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アカウントの該当チャネルにデータを送信していきます。メール、チャットワークなど、他のプラットフォームへの送信も可能です。
導入をご検討の際は、担当カスタマーサクセスまでお問い合わせください。
