简介
Redash 是团队查询,可视化和协作的一款开源 BI 工具,提供了基于 web 的数据库查询和数据可视化功能。
Redash 基于 Python 和 AngularJS 编写,使用 Flask web 框架,可快速轻便的访问大量数据。支持多种数据来源,包括:Redshift, Google BigQuery, PostgreSQL, MySQL, Graphite, Presto, Google Spreadsheets, Cloudera Impala, Hive等等。
在数据运维人员的日常工作中,常会遇到需要将数据库中的数据查询并展示出来的问题,可能总是需要让前端开发人员来做 web 页面帮助完成这些需求。Redash 提供了这么一种简单便捷的方式将这些工作标准化:在 web 页面上输入 sql 语句,使用查询返回的结果构造数据可视化图表,用户可以将这些图表结果拖动构造成自己需要的数据面板,在很大程度上可以缓解数据运维人员对前端开发人员的需求。
- Redash 由两部分组成:
- 查询编辑器:用于保存和在组织内分享查询语句;
- 控制面板/可视化工具: 提供了多种图表可视化和组织方式来构造自己的控制面板。
升级 Redash 分享 Dashboard 的机制
- 现在 Redash 的分享机制:
- 为每个对象生成一个 ApiKey,分享该对象时由它的 ApiKey 构成一个 public url,被分享的用户通过该链接查看。
- 升级后的分享机制:
- 管理员和 Dashboard 的创建者可以管理分享的用户,定向的分享而不是分享给所有用户(包括未登录用户)。
- 被分享的用户登录后可以在 Dashboard List 以及主页看到分享的 Dashboard。
- 根据不同用户的权限的不同,可以对 Dashboard 做不同的操作。
- 没有数据库权限的用户也可以对 Dashboard 中的 Query Result 做刷新、下载操作。
安装
- Install Docker, Docker Compose and Node.js
- 下载源码
在 Docker 上启 redash 后端服务
在 redash 目录里运行 :
-
产品版
$ docker-compose -f docker-compose.production.yml run --rm server create_db # create tables $ docker-compose -f docker-compose.production.yml up
访问 ip:80
-
开发版
$ docker-compose run --rm server create_db # create tables $ docker-compose up
访问网址 ip:5000
启 redash 前端服务:
$ npm install
$ npm run build
$ npm run start
如果要启开发版:
将 package.json 中的 build 那行改为:
"build": "rm -rf ./client/dist/ && NODE_ENV=development node node_modules/.bin/webpack"
如果报错:
-
问题可能出在 estraverse 的版本上:Module build failed: TypeError: Cannot read property 'length' of undefined at Traverser.traverse (/Users/lingling/repos/redash/node_modules/estraverse/estraverse.js:411:37) ...
$ npm install --upgrade estraverse
-
可以通过在 package.json 中加以下语句来解决:Module build failed: TypeError: loaderUtils.getOptions is not a function
"loader-utils": "^1.0.2"
Models
梳理了一下 redash 的表结构(线条太杂就失去了梳理的初衷,所以省略了一些箭头)。

Redash 源码中数据库工具使用 SQLAlchemy,数据库使用 PostgreSQL。
后端实现
- models
- 为每个对象的每个分享用户生成一个 ApiKey:在 ApiKey 中加上 ForeignKey owner_id,代表该 ApiKey 的 owner user
- permission
- 在每次判权时加入被分享的人也可见的条件:通过 ApiKey 确定是否被分享
- 增加 api
- 通过 Dashboard name 查找该 Dashboard 的分享成员列表的 api
- 通过 Query id,Dashboard id 下载 Query result 文件的 api
- 通过 Query result id,Dashboard id 查找 Query result 的 api
- 通过 Dashboard id 重跑 Query 得到 Query result 的 api
- 通过 Dashboard id,User id 获取 Dashboard 的 api
- 通过 Dashboard id,User id 将 Dashboard 分享给 User 的 api
前端实现
- 增加 service
- dashboard-query-result.js(仿照原有的 query-result.js 写,增加 dashboard_id 参数)
- dashboard-share.js(调用通过 Dashboard name 查找该 Dashboard 的分享成员列表的 api)
- 在 query.js 中仿照 Query.prototype.getQueryResult 增加 Query.prototype.getDashboardQueryResult(增加 dashboard_id 参数)
- 修改 page
- 修改 share-dashboard 的 dialog 页面
- 在 ShareDashboardComponent 增加 share-dashboard 的 dialog 页面所需函数
- 将 Dashboard 的所有页面中调用 query-result.js 中的 service,改为调用 dashboard-query-result.js 中的 service
先挖坑,以后再慢慢补充
参考资料:
网友评论