病みつきエンジニアブログ

機械学習、Python、Scala、JavaScript、などなど

OSS 版 Redash ボットを Slack Bolt で作り直した

Redash のオンプレの bot を、Slack の Bolt というフレームワークを使って作り直しました。

github.com

Redash とは

Redash は様々なデータソースと接続して SQL/可視化に使える OSS/SaaS です。最近、Databricks に買収されたことで話題にもなりました。

redash.io

Redash 本体は OSS で公開されていますが、Slack ボットに関しては OSS ではありません(OSS でないものが公式提供されてる)。そのため、Redash 本体はオンプレ(クラウド)にデプロイできるにも関わらず、ボットがオンプレに置けないという課題がありました。このあたりの課題感は、ボットのフォーク元である、hakoberaさんのQiitaをご覧ください。

また、OSS 版 Redash を運用する工夫はこちらに記載しています。今回のリリースに伴い、JX通信社の Slack にもインストールしています。

tech.jxpress.net

Slack の Bolt とは

Slack の Bolt はボットのためのフレームワークで、とても生産性高く書けます。また、Python 版も最近 α 版がリリースされました。

slack.dev

さて、Slack の bot は、もともと RTM (Real Time Messaging)と呼ばれる、Websocket ベースのアーキテクチャでした。しかし新しい Slack のアプリでは、Events API という Webhook(HTTP) ベースの新しい bot を作る必要があります。これはアーキテクチャ的に後述する安定性などのメリットがあります。

使い方

詳しくは README を読んでください。Docker を使う場合は docker run yamitzky/redashbot:2.0.0 で使えます

書き直した理由

コードを書き直したことにより、次のメリットが生まれました。

  • RTM API から Events API へ移行したことで、安定性が増加した
    • HTTP でロードバランサーにぶら下げればいいので負荷分散しやすい
    • Websocket に比べ、ヘルスチェックがしやすい
  • TypeScript へ移行
  • ソースコードを分割しやすくなった

特に、僕のフォークしたバージョンではダッシュボードが見れるなどの追加機能があったため、ソースコードが地獄でした(ソース)。

また、地味に次のような変更をしています

  • デフォルトブランチを master ではなく main に
  • Chromium 以外に、FirefoxWebkit のサポート (playwright を利用。テストできてない)
  • Serverless 環境へのデプロイ (途中...誰かテストして...)

playwright は Microsoft から出ている Puppeteer の後継パッケージみたいな感じで、マルチブラウザでの Puppeteer 相当のことができます。また、公式で Docker イメージが提供されているので、Docker 化も簡単でした。(文字化け対策で fonts-noto だけインストールした)

できること

公式のボットを使ってないのでわからないですが、

  • グラフのキャプチャ (これは当たり前ですね!)
  • ダッシュボードのキャプチャ
  • 表データを、キャプチャではなく、フォーマットした表テキストとして投稿する

などができます。また Bolt で作られている OSS なので、機能追加も簡単かと思います。せっかくなので、対話機能とかも使いこなしたいかもしれない。

@bot <URL> といった形式で使うので、もちろん Slack のリマインダーと組み合わせて使うこともできます。例: /remind #hoge @redash https://your-redash-url/dashboards/fuga *1

*1:リマインダーの対応については、公式の directMention だと先頭一致となっているため、現在は独自実装しています。こちらのスレッドで話しています