如何將炫酷的報表直接截圖發送郵件——在Superset 0.37使用Schedule Email功能

Superset的圖表是非常炫酷的,但是原來的版本只能在web端查看,而最新的0.37版本,可以將圖表截圖直接發送成郵件,非常的方便。

本文將詳細介紹Superset 0.37 定時郵件功能。安裝過程遇到的任何問題請關注 「實時流式計算」 隨時與我聯繫。所有的離線安裝包已經整理好,請後台回復 「superset0928」 下載。

開啟郵件功能

superset 0.37的電子郵件功能 默認是關閉的

電子郵件功能允許用戶對以下兩種電子郵件進行報告:

  • 圖表和儀錶板(附件或嵌在郵件之中)

  • 圖表數據(CSV附件)

vi config.py

開啟郵件功能

ENABLE_SCHEDULED_EMAIL_REPORTS = True

要發送電子郵件 還需要配置一下SMTP

EMAIL_NOTIFICATIONS = True

SMTP_HOST = "email-smtp.eu-west-1.amazonaws.com"
SMTP_STARTTLS = True
SMTP_SSL = False
SMTP_USER = "smtp_username"
SMTP_PORT = 25
SMTP_PASSWORD = os.environ.get("SMTP_PASSWORD")
SMTP_MAIL_FROM = "[email protected]"

啟動前記得執行 superset init 否則可能看不到菜單

這時候再登錄superset,我們可以看到在Manage下有兩個新的菜單了

Dashboard Emails 和 Chart Email Schedules

配置Celery

郵件功能需要使用Celery進行定時調度,為了開啟Celery,需要在config.py中進行配置。

class CeleryConfig(object):
    BROKER_URL = 'redis://localhost:6379/0'
    CELERY_IMPORTS = (
        'superset.sql_lab',
        'superset.tasks',
    )
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
    CELERYD_LOG_LEVEL = 'DEBUG'
    CELERYD_PREFETCH_MULTIPLIER = 10
    CELERY_ACKS_LATE = True
    CELERY_ANNOTATIONS = {
        'sql_lab.get_sql_results': {
            'rate_limit': '100/s',
        },
        '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='*'),
        },
    }

CELERY_CONFIG = CeleryConfig

隨後啟動celery worker和celery beat

celery worker --app=superset.tasks.celery_app:app --pool=prefork -O fair -c 4
celery beat --app=superset.tasks.celery_app:app

為了更好地監控Celery,建議大家安裝flower,這是一個celery的監控,可以清楚的看到celery任務的執行情況。

pip install flower
celery flower --app=superset.tasks.celery_app:app

flower頁面:

安裝瀏覽器驅動

為了可以渲染看板,需要在superset所在環境下本地安裝瀏覽器驅動。

驅動的類型在config.py中配置

EMAIL_REPORT_WEBDRIVER = "chrome"

這裡安裝chrome

從google官方網站下載google chrome安裝包

//www.google.cn/chrome/browser/desktop/index.html

選擇linux系統,並下載google-chrome-stable_current_x86_64.rpm

安裝:rpm -ivh google-chrome-stable_current_x86_64.rpm

再安裝chromedriver

//chromedriver.chromium.org/

unzip chromedriver_linux64.zip

mv chromedriver /usr/bin/

清注意兩者版本一定要保證一致

安裝成功輸入 chrome 和 chromedriver驗證一下

發送郵件

準備工作做好以後,就可以新建一個郵件發送任務了。

發送看板:

可以選擇發送的看板,crontab表達式,郵箱,是否發送測試郵件,內聯還是附件。。

也可以選擇發送圖表:

可以選擇發送原始數據。

最後,在郵件中接收到看板和圖表了~

郵件看板:

郵件圖表:

原始數據:

常見錯誤

接收不到郵件,也沒有看到錯誤提示

請仔細查看celery worker的log日誌,如果發送失敗會有錯誤提示。

可能是SMTP或者其他的配置問題。

如果log正常,請注意設置 SCHEDULED_EMAIL_DEBUG_MODE 是不是設置成了True,如果是True將進行調試模式不會真正的發送郵件,要改成False。

Error: Failed dependencies:

Error: Failed dependencies:
	libappindicator3.so.1()(64bit) is needed by google-chrome-stable-85.0.4183.121-1.x86_64
	liberation-fonts is needed by google-chrome-stable-85.0.4183.121-1.x86_64
	libvulkan.so.1()(64bit) is needed by google-chrome-stable-85.0.4183.121-1.x86_64

安裝chrome依賴失敗,有網的情況下 yum install libappindicator3 等等 依次安裝,沒網的話只能自行下載

IndexError: pop from empty list

redis.exceptions.AuthenticationError: Authentication required.

redis認證失敗,redis設置了密碼,但是訪問的URL沒有設置密碼,設置好密碼: 「redis://xxx:[email protected]:6379/0」

想去掉郵件中的Explore in Superset

需要修改源碼,位於

anaconda3/lib/python3.7/site-packages/apache_superset-0.37.0-py3.7.egg/superset/tasks/schedules.py

裏面有report charts的郵件模板,修改為自己想要的即可。