[Data] 將報表截圖丟到 Slack 上(上篇)

Bryan Yang
A multi hyphen life
Oct 23, 2020

我承認一開始我覺得這是笨需求…

我相信做報表的同事一定都會聽過這樣的需求:

幫我把報表每天早上寄到信箱/ slack

我一開始真的覺得這有點無聊,既然都做 dashboard 了,幹嘛不自己每天重整頁面就好…截圖再傳超級麻煩的。但總之需求在那邊,也一直都有,所以還是得做。

第一代 selenium 截圖

selenium(https://www.selenium.dev/),應該沒啥好介紹的,就是一個 Webdriver,可以模仿使用者操作瀏覽器點擊按鍵,當然也包括截圖。所以概念上很簡單:

  • 用 selenium 啟動 webdriver
  • 使用 webdriver 連線到 superset(https://superset.apache.org/)
  • 截圖(使用 driver 的 screenshot)
  • 把圖片傳到 slack 上

坦白說每個步驟都很單純,最麻煩的就是連線到 superset 這段。由於我們是透過 google oauth 來管理 superset,webdriver 就必須模仿人類輸入帳號密碼。偏偏我們一開始用的公用帳號太多人在用,google 越來越常要求我們輸入認證碼、電話認證、最近甚至到了強置換密碼的程度,在 headless 的情況下又很難知道當下顯示的畫面,簡直不堪其擾。加上我們的爬蟲 server 有時候會換 IP,更加深 Google 認為我們是壞蛋的機率,後來就決定放棄這種方法。

第二代 BI 內建傳送機制

因為當時的 superset 沒有內建傳送圖表的功能,所以再 survey 下一代 BI 的時候都會先看有沒有這樣的功能。其中一個是 metabase:

Metabase

Metabase 在系統界面上就能設定 Slack 的整合,哪張報表要什麼時候發送也很好設定:

送到 Slack 上就會長這樣(p.s. 這是網路抓的圖,不是我們家的資料)

  • PROS
  1. 好設定
  2. 使用簡單
  • CONS
  1. 不能傳 Dashboard
  2. 不能設定 Threshold

Redash

Readsh 有官方的 slack 機器人可以設定: https://redash.io/slack/。他主要功能就是當把 redash 連結貼到 slack 上後可以 自動 render 圖片出來。

BUT,如過配合 slack 的 remind 做自動發送時,他就不會自動 render 了…orz。

補充:redash slack alert

設定上也很簡單,直接在管理介面就可以找到地方塞 webhook。不過 redash 上每個 destination 只能設定一個 slack 頻道,如果要多個頻道就是設定多個 destination。

之後就可以設定 Alert,當設定報表第一個 row 的數值超過 threshold 後就會自動發送通知。

  • PROS:
  1. 好設定
  2. 自動 render 圖片真的滿方便的
  3. 我們現在滿依賴 alert 功能來監控資料
  • CONS:
  1. 沒有內建自動排程
  2. 一樣不會 render dasboard

第三代 BI 內建 selenuim 爬蟲

可能全世界的老闆都會希望 BI 可以截圖寄到信箱,所以有人提出了這個 PR:https://github.com/apache/incubator-superset/pull/9810

這讓 superset 內建 selenium 爬蟲自己截圖寄到 slack … 細節待續

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect