將截圖丟到 Slack 原來是普世的需求

前情提要:

第三代 BI 內建 selenuim 爬蟲

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

大意就是說讓 Superset 內建截圖機制,讓使用者可以將單一個 chart 和 dashboard 丟到 email/ slack 上。一開始我還想說他們不知道用什麼方式自己 render 圖片,一翻程式碼發現,這不就是我們熟悉的 selenium 嗎

https://github.com/apache/incubator-superset/blob/master/superset/utils/webdriver.py

總之原理就是 superset 透過 webdriver 從自己的 worker 連線到 webui 抓圖,在我們的配置下剛好可以避掉 google 檢查那段。因為這是完成的功能,我們的 superset 從去年開始就沒有更新了,以下會紀錄完整更新以及安裝的過程。

一、備份現有 DB

這個沒啥好說的,因為這次的大升級會動到 DB ,先備份一下是必要的

二、包 Dockerfile

雖然 superset 現在已經提供了 dockerfile 可以使用,但還是要多裝一些東西才能正常使用 Webdirver,這些東西包括了(以 Firefox 為例):

所以要安裝以下這些東西:

RUN wget -O ~/FirefoxSetup.tar.bz2 "https://download.mozilla.org/?product=firefox-latest&os=linux64" \
&& tar xjf ~/FirefoxSetup.tar.bz2 -C /opt/ \
&& ln -s /opt/firefox/firefox /usr/local/bin/firefox \
&& apt update && apt install -y libwxgtk3.0-dev libdbus-glib-1-2 xorg openbox fonts-wqy-zenhei
COPY driver /app/driver ## 我是先把 driver 下載放在另外的資料夾

三、設定 Celery Worker 和 Task

Superset 官方文件裡面其實有提到,Celery 分成兩段,

  • To start a Celery worker to leverage the configuration run:
celery worker — app=superset.tasks.celery_app:app — pool=prefork -O fair -c4
  • To start a job which schedules periodic background jobs, run
celery beat — app=superset.tasks.celery_app:app

worker 是拿來跑 SQL job 的,beat 是用來跑定期背景程式的。然後這邊很雷的是按照官方 Dockerfile 的設計,celery beat 沒辦法直接執行。因為 celery beat 執行時會需要讀寫 local file,預設的路徑是沒有權限使用的 -.-,所以實際執行上要另外指定暫存檔的路徑。

四、config 檔

superset 真的是這幾個 open source BI 工具裡最難 config 的…跟截圖相關的 Config 包括:

  • 這邊影響了 email report 的發送和scheduler sync 的時間。
class CeleryConfig(object):
BROKER_URL = 'redis://helix.vlbe5v.0001.use1.cache.amazonaws.com:6379/0'
CELERY_IMPORTS = (
'superset.sql_lab',
'superset.tasks',
)
CELERY_RESULT_BACKEND = 'redis://helix.vlbe5v.0001.use1.cache.amazonaws.com:6379/0'
CELERY_ANNOTATIONS = {
"email_reports.send": {
"rate_limit": "1/s",
"time_limit": 120,
"soft_time_limit": 150,
"ignore_result": True,
},
}
CELERYBEAT_SCHEDULE = {
"email_reports.schedule_hourly": {
"task": "email_reports.schedule_hourly",
"schedule": crontab(minute=1, hour="*"),
}
}
  • Slack bot 的 Token
SLACK_API_TOKEN=fasfasf
  • 功能相關設定
ENABLE_SCHEDULED_EMAIL_REPORTS = True   # 開啟功能SCREENSHOT_LOCATE_WAIT = 30             # 爬蟲在鎖定元件要等多久
SCREENSHOT_LOAD_WAIT = 60 # 忘了,需要爬一下 source code
EMAIL_PAGE_RENDER_WAIT = 60 # 等 render 要等多久
EMAIL_REPORTS_USER = "superset" # superset 用哪個帳號去拿資料
EMAIL_REPORTS_SUBJECT_PREFIX = "[Report] " # prefix
  • Web Driver 相關設定
WEBDRIVER_TYPE = "firefox"    # 指定 webdriver 類型,目前只有 firefox 和 chrome 可以選# Window size 
WEBDRIVER_WINDOW = {"dashboard": (1600, 2000), "slice": (3000, 1200)}
# 跟認證相關的,目前是沒有用到
WEBDRIVER_AUTH_FUNC = None
# web driver 的路徑,log 的位置要留意權限
WEBDRIVER_CONFIGURATION = {
"executable_path": "/app/driver/geckodriver",
"service_log_path": "/tmp/geckodriver.log"
}
# Additional args to be passed as arguments to the config object
# Note: these options are Chrome-specific. For FF, these should
# only include the "--headless" arg
WEBDRIVER_OPTION_ARGS = [
"--headless",
]
# Webdriver 的路徑,因為我是從 k8s 內部爬,所以就輸入 service 的路徑
WEBDRIVER_BASEURL = "http://superset:8088/"

大概就是這樣子,其實上面很多地方 superset 的文件都有,但很多寫不清楚或是沒有太多細節,實際上走一遍還是跌的滿頭包。

五、Deploy

Deploy 分成兩段

  • Deploy superset image

這段就是把剛剛該安裝的安裝好,包起來丟上去就沒事。

  • Deploy k8s deployment

這段就是看個人設定檔的寫法了,像我們的設定檔沒有直接包在 dockerfile 裡面,是全部都定義在 helm 裡面,執行時才會在 runtime 帶進去。

六、upgrade db

前面提到因為我們線上的版本落後滿多的,superset 的 db 已經跟當時不太一樣,所以一但上線後就要手動進去 upgrade db 才有辦法正常使用。

superset db upgrade

七、權限設定

剛安裝好的時候發現有些功能不能用,也是因為版本的關係,多了一些新的權限,這時候需要先把所有 permission 產生出來加到 admin 身上,才能享受完整的功能。

superset fab create-permissions

八、Slack 設定

Slack 這邊首先要去申請一個 slack bot 取得 token,這個 bot 要能在頻道發文和上傳附件的權限。接著最重要的就是如果要丟到 private 群組的話,記得要手動把機器人加到群組裡,不然 superset 丟資料時會爆錯。

Final

最後再 Superset 右上角的 navigator 中可以找到 dashboard scheduler,點進去後就能還算直覺的操作。

圖片可以選擇使用 inline 的方式發送,送到 Slack 上的效果也不錯。

大概就是這樣,如果有漏掉什麼歡迎隨時補充。

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect