Apache Superset 1.0 版本深度解读:用户体验、异步查询、ECharts 与功能开关全面解析
【免费下载链接】supersetApache Superset is a Data Visualization and Data Exploration Platform项目地址: https://gitcode.com/gh_mirrors/supers/superset
Apache Superset 1.0 是该开源数据可视化与探索平台(仓库根目录 README.md 描述为Data Visualization and Data Exploration Platform)的里程碑式大版本,围绕用户体验、开发者体验、性能、新特性、功能开关与稳定性六大主题发布。本文以仓库中 Superset 1.0 发布说明 为骨架,结合 配置文件、异步事件模块(api.py、async_query_manager.py)、告警报表模型 等源码实现,为你系统梳理 1.0 的核心能力、开关配置与背后的实现原理,助你完成升级评估、功能开启与二次开发。
为什么说 1.0 是一个里程碑
Superset 1.0 在发布说明中被定位为 "huge milestone",它确立了比以往任何版本都更高的质量标准,并为后续版本设定了标杆。这次发布在**可用性(Usability)**上大幅提升,同时带来了用户期待已久的五大主题功能:
- 用户体验(User Experience):更简单、更直观的 UI
- 开发者体验(Developer Experience):更易构建、部署与维护
- 性能(Performance):图表与 SQL Lab 的异步数据加载
- 新特性(New Features):新可视化插件架构、Apache ECharts 集成、告警报表重构等
- 功能开关(Feature Flags):默认关闭的新功能及对应开关
- 稳定性与 Bug 修复(Stability and Bugfixes):数百项修复
下面逐一展开。
用户体验:从卡片视图到 SQL Lab ↔ Explore 的双向流转
缩略图卡片视图
图表(Charts)与仪表盘(Dashboards)的列表新增了**缩略图网格(thumbnail grid)**展示模式,让用户在实例中存在大量图表/仪表盘时可以更快地发现与定位目标。当前前端代码中ListView组件(ListView.tsx)内置了卡片视图(CardView)图标切换入口,而LISTVIEWS_DEFAULT_CARD_VIEW开关(见 config.py)可控制列表视图默认是否以卡片形式呈现。
Explore 控件现代化重构
可视化控件(Visualization controls)经过全面重构,内容/标签/排序、样式以及交互与布局均被统一与简化,为后续版本拖拽式控件与动态填充控件输入打好了基础。
SQL Lab ↔ Explore 双向联动
用户现在可以从SQL Lab创建并命名一个新数据集(dataset),或在进入Explore时更新已有数据集;返回 SQL Lab 时,数据集底层的查询会重新展示出来,方便随时修改并同步更新数据集。这一流程在 1.0 中由SaveDatasetModal组件(对应 PR #11861)支撑,体现了"SQL 查询结果直接沉淀为可视化数据集"的顺畅体验。
开发者体验:现代化组件库、Storybook 与 REST API 增强
1.0 在"现代化、整合、简化"前端界面元素上迈出一大步:高频使用的组件获得视觉更新,被重构进现代组件库,并集成React Storybook以获得立即可见的组件展示,同时合并了测试与样式。这让开发者构建、部署和维护 Superset 功能更加容易,也带来更一致、更现代的用户观感。
与此同时REST API持续演进,新增了一批端点并改进了既有端点。仓库中大量模块(如 charts/api.py、dashboards/api.py、databases/api.py)都基于 Flask-AppBuilder 的BaseSupersetModelRestApi提供标准的 CRUD 端点。1.0 文档已启用Swagger UI来探索与在线调试这些接口,相关页面位于文档站点(docs/api.mdx)。
性能:图表与 SQL Lab 的异步数据加载
1.0 是当时"最具性能表现"的版本,在大量细节调优之外,Charts 与 SQL Lab 双双支持异步数据加载(asynchronous data loading)。当仪表盘内图表很多或查询长时间运行时,加载查询结果的主观体验显著提升。
从当前仓库源码结构看,这背后是SIP-39(Global Async Query Support,PR #11499)的实现体系:
- 前端通过轮询或 WebSocket 从后端拉取事件;
- 后端以 AsyncEventsRestApi(
resource_name = "async_event",端点GET /api/v1/async_event/)作为入口,从 Redis 事件流中读取事件; - AsyncQueryManager 负责核心逻辑:它根据
GLOBAL_ASYNC_QUERIES_REDIS_STREAM_PREFIX构造流名(第 110 行),用redis.xadd写入scoped_stream_name(按用户 channel 隔离)与full_stream_name(firehose 全量流),并用redis.xrange按last_event_id增量读取(第 230–256 行)。
Redis Streams(要求 Redis 5.0+)作为事件总线,是这套异步架构的关键基础设施。相关配置项见下文"功能开关"一节。
新特性:ECharts、注解、新首页、过滤器状态与告警报表
新可视化插件架构 + 动态插件加载 + Apache ECharts
1.0 引入的新可视化插件架构让构建、测试、样式化与配置自定义可视化变得更简单;**动态可视化插件导入(Dynamic viz plugin import)**允许 Superset 按需从 Web 任意位置加载数据可视化插件,方便开发者使用或分享自定义插件。同时 Superset 采纳Apache ECharts作为新可视化插件的核心图表库。
仓库中的开关DYNAMIC_PLUGINS(见 config.py)控制动态插件导入,后端提供 DynamicPluginsView(route_base = "/dynamic-plugins")用于管理插件元数据(key、url等字段),并有 DynamicPlugin 模型 持久化;plugin-chart-echarts 则是当前仓库中 ECharts 系插件的实现(含 BoxPlot、时间序列等多种图表)。1.0 中一个直观示例是使用 ECharts 绘制的 Prophet 时间序列预测图:
注解(Annotations)能力增强
配合 ECharts 集成,1.0 引入了一套更强的注解功能:
- Formula annotation(公式注解):在图表上绘制任意数学函数;
- Interval and Event annotations(区间与事件注解):为时间序列趋势添加上下文;
- Line annotation(线条注解):以预定义图表作为注解来源。
对应 PR #11665(为 chart data endpoint 增加 event/interval 注解支持)。这些注解类型在仓库的时间序列相关图表控件与数据请求层均有对应字段支撑。
全新首页与内容发现
重构后的首页为登录用户提供个性化落地页(personalized landing page):展示与用户相关的内容(图表、仪表盘、保存的查询等),并作为发现内容、快速访问近期项目的枢纽。对应 PR #11206(home screen MVP)及后续一系列样式与加载状态优化(#11557、#11650 等)。前端实现位于 src/pages/Home 与 src/features/home。
仪表盘过滤器状态可视化
仪表盘上的图表现在会清晰显示过滤器(filters)的生效范围、是否已应用、是否出错。选中过滤器时高亮受影响的图表,并提升不兼容过滤器图表的可见性,为过滤器变更提供更多上下文。
告警与报表(Alerts & Reporting)重构
Alerts 和 Reporting获得了稳健的后端与 UI 重构。当前仓库的 reports/models.py 中可见其领域模型已相当完备:
ReportScheduleType:ALERT与REPORT两种类型(第 50–52 行);ReportRecipientType:Email、Slack、SlackV2三种通知渠道(第 62–65 行);ReportState:Success、Working、Error、Not triggered、On Grace(第 68–73 行);ReportDataFormat:PDF、PNG、CSV、TEXT(第 76–80 行)。
后端 REST 端点为 ReportScheduleRestApi,任务调度由 tasks/scheduler.py 配合 Celery 与 celery beat 执行。
功能开关:默认关闭的新特性及其依赖
1.0 的部分新特性默认关闭,每个特性在config.py中都有一个 feature flag,部分特性还需要额外后端依赖(Celery、SMTP、Redis 等)。下表是发布说明给出的开关清单,并结合当前仓库 config.py 中的DEFAULT_FEATURE_FLAGS做了补充说明:
| 特性 | 功能开关 | 依赖 | 说明(结合源码) |
|---|---|---|---|
| Global Async Queries | GLOBAL_ASYNC_QUERIES: True | Redis 5.0+、已配置并运行的 celery workers | 底层依赖 AsyncQueryManager 读写 Redis Streams;相关配置见下方GLOBAL_ASYNC_QUERIES_*系列 |
| Dashboard Native Filters | DASHBOARD_NATIVE_FILTERS: True | 无 | 仪表盘原生过滤器(filter box 的现代化替代) |
| Alerts & Reporting | ALERT_REPORTS: True | Celery workers 及 celery beat 进程 | 领域模型见 reports/models.py,后端 API 见 reports/api.py;告警/报表执行超时、执行人等行为由ALERT_REPORTS_*系列配置控制 |
| Homescreen Thumbnails | THUMBNAILS: True,THUMBNAIL_CACHE_CONFIG(如{"CACHE_TYPE": "null", "CACHE_NO_NULL_WARNING": True}) | selenium、pillow 7、celery | 缩略图由 tasks/thumbnails.py 配合浏览器截图生成;当前默认关闭(config.py) |
| Dynamic Viz Plugin Import | DYNAMIC_PLUGINS: True | 无 | 后端管理视图见 views/dynamic_plugins.py,数据模型见 models/dynamic_plugins.py |
说明:
DASHBOARD_NATIVE_FILTERS在发布说明中列出,当前版本仓库中过滤器相关能力已演进(见 filters 目录),此处以 1.0 发布说明为准。
开关配置方式
功能开关统一在config.py的DEFAULT_FEATURE_FLAGS中定义默认值,用户可通过superset_config.py中的FEATURE_FLAGS字典覆盖合并(见 config.py 的注释说明)。例如启用全局异步查询与告警报表:
# superset_config.py FEATURE_FLAGS = { "GLOBAL_ASYNC_QUERIES": True, "ALERT_REPORTS": True, "THUMBNAILS": True, }全局异步查询的配套配置
开启GLOBAL_ASYNC_QUERIES后,config.py 中还有一整套配套参数值得关注:
GLOBAL_ASYNC_QUERIES_REDIS_CONFIG:Redis 连接配置(需 Redis 5.0+);GLOBAL_ASYNC_QUERIES_REDIS_STREAM_PREFIX:事件流前缀,默认async-events-;GLOBAL_ASYNC_QUERIES_REDIS_STREAM_LIMIT/..._FIREHOSE:每用户流与全量流(firehose)的最大长度,默认 1000 / 1000000;GLOBAL_ASYNC_QUERIES_JWT_COOKIE_NAME与GLOBAL_ASYNC_QUERIES_JWT_SECRET:用于在轮询/WS 请求中携带并校验用户身份的 JWT 配置;GLOBAL_ASYNC_QUERIES_TRANSPORT:传输方式,"polling"(轮询)或"ws"(WebSocket);GLOBAL_ASYNC_QUERIES_WEBSOCKET_URL:WebSocket 服务地址(默认ws://127.0.0.1:8080/),对应仓库中的 superset-websocket 独立服务。
告警报表的常用配套配置
开启ALERT_REPORTS后,config.py 提供了一组行为控制参数,例如:
ALERT_REPORTS_DEFAULT_WORKING_TIMEOUT:默认工作超时(3600 秒);ALERT_REPORTS_WORKING_TIME_OUT_KILL:超时是否强制结束任务;ALERT_REPORTS_DEFAULT_CRON_VALUE:默认 cron 表达式(0 0 * * *,每天);ALERT_REPORTS_DEFAULT_RETENTION:执行日志保留天数(90 天);ALERT_REPORTS_NOTIFICATION_DRY_RUN:是否以 dry-run 模式运行通知;ALERT_REPORTS_QUERY_EXECUTION_MAX_TRIES:查询执行最大重试次数。
稳定性与 Bug 修复
1.0 包含数百项bug 修复与稳定性增强,发布说明强调后续大版本会继续把"稳定、无 bug 的体验"作为重点。升级前请留意向后不兼容变更,见仓库根目录 UPDATING.md。
1.0 PR 亮点速览
发布说明按主题罗列了本次更新的代表性 PR(完整列表见 CHANGELOG.md):
用户体验(User Experience)
- 样式与细节:恢复菜单高亮(#12024)、eslint curly 规则(#11913)、移除 react bootstrap fade 组件(#11843)、暗色过滤器弹层背景(#11611)
- Explore 控件:全局导航菜单 hover 展开(#12025)、数据集健康检查 hook(#11970)、仪表盘/图表/数据集/数据库导入弹窗(#11924/#11956/#11910/#11884)、Explore 结果表(#11854)、告警/报表 CRUD 列表(#11802)、CRUD 列表"筛选我的"(#11683)、Explore 新数据源页签(#12008)、时间选择器增强(#11418)、指标与过滤器控件重设计(#12095)、保存按钮文案调整(#11281)、数据源下拉排序(#11424)
- SQL Lab:自定义错误消息(#12080)、缺失参数提示(#12049)、SQL Lab 到 Explore 体验改进(#11755)、Postgres SQL 校验器(#11538)、BigQuery 单语句执行(#11904)、SaveDatasetModal 组件(#11861)、查询历史列表筛选(#11702)、SQL 预览弹窗(#11634)、Query History CRUD 列表(#11574)、saved_query 增加 UUID 列(#11397)、保存查询携带执行信息(#11391)、保存查询预览弹窗(#11135)、保存查询权限简化(#11764)
- 文档:安全角色页恢复(#11978)、Docker 配置路径修复(#11703)、PR 标题语义化前缀(#11398)、Swagger UI API 文档页(#11154)、Apache 毕业相关发布流程更新(#12117)
开发者体验(Developer Experience)
- 新格式导出保存查询端点(#11447)
- 组件库:cypress 5.5.0(#11603)、less/@emotion/core/core-js/lodash 等依赖升级、nvd3 插件版本升级(#11947)、pypi cryptography 升级(#11511)
性能(Performance)
- 缓存仪表盘 bootstrap 数据(#11234)、UUID 列生成加速(#11209)、API info 性能优化(#11346)
- Global Async Query Support(SIP-39):图表异步查询支持(#11499)
新特性(New Features)
- 数据可视化改进:event/interval 注解支持(#11665)、ECharts BoxPlot 图表(#11199)、sankey 按指标排序(#11626)
- 发现与导航:首页链接(#11851)、首页加载状态与 API 调用优化(#11557)、告警/报表执行日志列表(#11937)、首页 MVP(#11206)
- 告警与报表:图标与列序更新(#12081)、cron 选择器(#12032)、新增/编辑弹窗(#11770)、列表筛选(#11900)、"not null" 条件选项(#12077)、移除 SIP_34_UI 开关(#12085)、刷新动作(#12071)、删除与批量删除(#12053)
结语
Apache Superset 1.0 通过六大主题奠定了后续版本的基础:更直觉的卡片视图与 Explore 控件、SQL Lab 与 Explore 的无缝联动、基于 Redis Streams 与 Celery 的全局异步查询、拥抱 ECharts 的插件化可视化体系、覆盖告警/报表/缩略图/动态插件的功能开关矩阵,以及数百项稳定性修复。对正在评估升级或准备二次开发的团队,建议按上文"功能开关"一节逐项核对所需特性与后端依赖(Redis 5.0+、Celery/beat、SMTP、Selenium 等),并在升级前审阅 UPDATING.md 与 CHANGELOG.md,即可平滑获得 1.0 的全部红利。
【免费下载链接】supersetApache Superset is a Data Visualization and Data Exploration Platform项目地址: https://gitcode.com/gh_mirrors/supers/superset
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考