Superset配置Report Alert实践及二次开发实践

Superset配置Report & Alert实践及二次开发实践

项目背景与概述

Apache Superset 是一个现代化的数据探索和可视化平台,提供了强大的自动报警和报表功能。通过这些功能,用户可以将仪表板或图表自动发送到指定的电子邮件收件人或Slack频道,主要包括两种类型:

  • 警报(Alert):当SQL查询满足特定条件时触发发送
  • 报表(Report):按照预设的时间计划定期发送

然而,在实际使用过程中,我发现其截屏功能存在一些限制 - 只能以固定窗口大小进行截屏,这可能导致报表中的图表内容被截断或产生多余的空白区域。为了解决这个问题,我进行了相关的二次开发。本文将详细介绍Report & Alert功能的配置方法,以及如何通过二次开发优化截屏功能。

Report & Alert配置指南

前置要求

1. 基础配置

superset_config.pysuperset_config_docker.py中需要:

  1. 启用功能标志:
FEATURE_FLAGS = {"ALERT_REPORTS": True
}
  1. 配置Celery调度:
from celery.schedules import crontabclass CeleryConfig:# ... 其他Celery配置 ...beat_schedule = {"reports.scheduler": {"task": "reports.scheduler","schedule": crontab(minute="*", hour="*"),},"reports.prune_log": {"task": "reports.prune_log","schedule": crontab(minute=0, hour=0),},}
  1. 配置通知方式(至少选择一种):
    • 邮件通知:配置SMTP_*相关设置
    • Slack通知:配置SLACK_API_TOKEN
2. 环境要求
  1. 必须安装无头浏览器(Firefox或Chrome)用于截图
  2. 如果使用Chrome,需要在配置中设置:
WEBDRIVER_TYPE = "chrome"
WEBDRIVER_OPTION_ARGS = ["--force-device-scale-factor=2.0","--high-dpi-support=2.0","--headless","--disable-gpu","--disable-dev-shm-usage","--no-sandbox","--disable-setuid-sandbox","--disable-extensions",
]

详细配置示例

# Redis配置
REDIS_HOST = "superset_cache"
REDIS_PORT = "6379"# 截图等待时间配置
SCREENSHOT_LOCATE_WAIT = 100
SCREENSHOT_LOAD_WAIT = 600# Slack配置
SLACK_API_TOKEN = "xoxb-your-token"# 邮件配置
SMTP_HOST = "smtp.sendgrid.net"
SMTP_PORT = 2525
SMTP_STARTTLS = True
SMTP_SSL_SERVER_AUTH = True
SMTP_SSL = False
SMTP_USER = "your_user"
SMTP_PASSWORD = "your_password"
SMTP_MAIL_FROM = "noreply@youremail.com"
EMAIL_REPORTS_SUBJECT_PREFIX = "[Superset] "# WebDriver配置
WEBDRIVER_BASEURL = "http://superset:8088"
WEBDRIVER_BASEURL_USER_FRIENDLY = "https://your-domain.com:8088"# 执行用户配置
from superset.tasks.types import ExecutorType
THUMBNAIL_SELENIUM_USER = 'admin'
ALERT_REPORTS_EXECUTE_AS = [ExecutorType.SELENIUM]# 最小执行间隔配置
from datetime import timedelta
ALERT_MINIMUM_INTERVAL = int(timedelta(minutes=10).total_seconds())
REPORT_MINIMUM_INTERVAL = int(timedelta(minutes=5).total_seconds())

重要说明

  1. 关于Celery并发

    • 建议使用-c 4限制并发数,因为Selenium/webdriver会消耗大量资源
    • 如果发现geckodriver进程泄露,尝试使用:celery worker --pool=prefork --max-tasks-per-child=128
  2. Worker配置

    • 建议为sql_lab和email_reports任务运行独立的worker
    • 可以通过task_annotations中的queue字段配置
  3. 故障排查

    • 检查Celery worker日志
    • 验证浏览器和webdriver安装
    • 测试邮件发送功能
    • 确认worker可以访问报表URL

功能改进:自适应截屏

问题描述

原版Superset(3.1.*)在进行截屏时使用了预设的固定窗口大小:

driver.set_window_size(*self._window)

这种方式无法根据实际内容自动调整窗口大小,可能导致以下问题:

  • 内容过长时被截断
  • 内容较短时产生多余空白
  • 无法完整捕获仪表板的所有内容

改进方案

我对get_screenshot()函数进行了优化,主要改动如下(完整代码可见GitHub提交记录):

# 屏蔽预设的窗口配置
# driver.set_window_size(*self._window)
driver.get(url)
img: bytes | None = None
selenium_headstart = current_app.config["SCREENSHOT_SELENIUM_HEADSTART"]
logger.debug("Sleeping for %i seconds", selenium_headstart)
sleep(selenium_headstart)# 使用JavaScript获取页面实际高度并设置窗口大小
height = driver.execute_script("return document.documentElement.scrollHeight")
driver.set_window_size(self._window[0], height)

改进后的代码可以:

  1. 通过JavaScript获取页面的实际高度
  2. 动态调整窗口大小以适应内容
  3. 确保截图包含所有内容,无多余空白

项目结构导读

在开始开发之前,了解Superset的项目结构很重要。以下是主要目录结构:

superset/
├── superset/              # 后端Python代码
│   ├── views/            # 视图层,处理HTTP请求
│   ├── models/           # 数据模型
│   ├── utils/            # 工具类,我们的截屏功能就在这里
│   ├── extensions/       # Flask扩展
│   └── ...
├── superset-frontend/    # 前端代码
│   ├── src/             # 源代码
│   ├── packages/        # 可重用的包
│   └── ...
├── docker/              # Docker相关配置
├── tests/              # 测试用例
└── ...

关键模块说明

  1. 后端核心模块

    • superset/views/: 包含所有视图函数,处理HTTP请求
    • superset/models/: 定义数据库模型
    • superset/utils/: 包含各种工具函数,如我们修改的截屏功能
    • superset/config.py: 配置文件
  2. 前端核心模块

    • superset-frontend/src/views/: 页面组件
    • superset-frontend/src/components/: 可重用组件
    • superset-frontend/src/visualizations/: 可视化组件
  3. Docker相关

    • docker/: 包含Docker相关配置
    • Dockerfile: 主Dockerfile文件

开发环境搭建指南

1. 使用Docker Compose搭建开发环境

因为项目依赖较多,推荐使用Docker Compose来搭建开发环境。首先需要创建一个适合开发的docker-compose配置文件。

  1. 克隆项目代码:
git clone git@github.com:apache/superset.git
cd superset
  1. 创建开发环境配置文件:
cp docker-compose.yml docker-compose-local.yml
  1. 修改docker-compose-local.yml,主要改动如下:
// ... existing code ...
x-superset-image: &superset-image apache/superset:latest-dev
// ... existing code ...superset:env_file: docker/.envbuild: context: .dockerfile: Dockerfiletarget: devimage: *superset-image
// ... existing code ...
  1. 启动开发环境:
docker compose -f docker-compose-local.yml up

主要改动说明:

  1. 将远程镜像地址 apachesuperset.docker.scarf.sh/apache/superset:${TAG:-latest-dev} 改为本地镜像名称 apache/superset:latest-dev
  2. 在 superset 服务中添加了 build 配置,指定使用本地的 Dockerfile 进行构建
  3. 使用 target: dev 指定构建开发环境镜像
    这样修改后,当您运行 docker-compose up 时,系统会先使用本地的 Dockerfile 构建镜像,而不是从远程仓库拉取。其他依赖这个镜像的服务(如 superset-worker、superset-init 等)会自动使用这个本地构建的镜像。
    记得在运行前执行:
docker-compose -f docker-compose-local.yml build

来构建本地镜像。

2. 本地开发流程

  1. 创建并切换到新的开发分支:
git checkout -b feature/screenshot-improvement
  1. 修改代码后,需要重新构建Docker镜像:
docker compose -f docker-compose-local.yml down
docker compose -f docker-compose-local.yml build
docker compose -f docker-compose-local.yml up

3. 开发调试技巧

  1. 实时代码修改

    • 由于配置了代码目录挂载,修改Python代码后会自动重载
    • 修改前端代码需要在superset-frontend目录下运行npm run dev
  2. 查看日志

# 查看所有容器日志
docker compose -f docker-compose-local.yml logs -f# 只查看superset容器日志
docker compose -f docker-compose-local.yml logs -f superset
  1. 数据库操作
# 进入容器
docker exec -it superset_app bash# 执行数据库迁移
superset db upgrade# 创建管理员用户
superset fab create-admin

4. 生产环境部署

根据不同的部署环境和需求,这里提供几种部署方案:

方案一:直接修改Python包源码(最简单)

适用场景:单机部署,快速验证

  1. 找到Superset安装目录:
# 查看superset包安装位置
pip show apache-superset | grep Location
  1. 直接修改目标文件:
# 例如修改截屏功能
cd <superset安装路径>/superset/utils/
vim webdriver.py# 修改完成后重启Superset服务
sudo systemctl restart superset
# 或者
supervisorctl restart superset

优点:

  • 操作简单直接
  • 无需构建镜像
  • 适合快速验证修改

缺点:

  • 不适合多机部署
  • 版本管理困难
  • 系统升级时修改会被覆盖
方案二:使用Docker镜像(推荐)

适用场景:正式生产环境,多机部署

  1. 确保代码经过充分测试
  2. 创建发布分支
  3. 构建生产环境镜像:
docker build -t your-registry/superset:your-tag .
  1. 推送镜像到镜像仓库:
docker push your-registry/superset:your-tag
  1. 在生产环境更新镜像版本并重启服务:
# 拉取新镜像
docker pull your-registry/superset:your-tag# 更新服务
docker compose -f docker-compose-prod.yml up -d

优点:

  • 环境一致性好
  • 便于版本管理
  • 适合多机部署
  • 回滚方便

缺点:

  • 需要维护Docker镜像仓库
  • 部署流程相对复杂
方案三:使用pip安装自定义包

适用场景:需要在多个项目中复用修改,或需要维护自己的版本

  1. 创建自定义包:
# 克隆原始代码
git clone https://github.com/apache/superset.git
cd superset# 修改版本号(避免冲突)
vim setup.py  # 修改version为自定义版本,如"3.1.0-custom"
  1. 构建并上传到私有PyPI仓库:
# 构建包
python setup.py sdist bdist_wheel# 上传到私有PyPI仓库
twine upload --repository-url https://your-pypi-repo/simple/ dist/*
  1. 在生产环境安装:
pip install -i https://your-pypi-repo/simple/ apache-superset==3.1.0-custom

优点:

  • 便于在多个项目中复用
  • 可以维护自己的版本
  • 支持通过pip管理依赖

缺点:

  • 需要维护私有PyPI仓库
  • 版本号管理需要注意
方案四:使用Helm在Kubernetes中部署

适用场景:Kubernetes环境

  1. 修改Helm配置:
# values.yaml
image:repository: your-registry/supersettag: your-tag
  1. 部署/更新:
# 首次部署
helm install superset ./helm/superset -f values.yaml# 更新部署
helm upgrade superset ./helm/superset -f values.yaml

优点:

  • 适合云原生环境
  • 便于扩展和管理
  • 配置灵活

缺点:

  • 需要Kubernetes环境
  • 学习成本较高

开发建议

  1. 环境隔离:始终使用Docker进行开发,确保环境一致性

  2. 代码规范

    • 遵循项目的代码风格指南
    • 添加适当的注释
    • 编写测试用例
  3. 版本控制

    • 创建功能分支进行开发
    • 提交信息要清晰明了
    • 定期与主分支同步
  4. 测试验证

    • 本地充分测试
    • 在开发环境验证
    • 考虑边界情况

结论

通过这次二次开发实践,不仅解决了Superset截屏功能的限制,也积累了宝贵的开发经验。对于想要进行Superset二次开发的开发者,建议:

  1. 充分阅读项目文档
  2. 使用Docker管理开发环境
  3. 遵循项目的开发规范
  4. 循序渐进,从小改动开始

希望这篇文章能帮助到想要进行Superset二次开发的同学们!

参考资料

  1. Superset警报和报表配置指南
  2. Superset开发环境搭建指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19630.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastadmin快速搭建导航站和API接口站点系统

这份源码是基于fastadmin框架制作的&#xff0c;不仅可以快速搭建漂亮的导航站和API接口站点&#xff0c;而且还具有可扩展性和定制性。源码开放&#xff0c;方便二次开发和定制&#xff0c;适合各种需求。快来体验这个功能强大的站点源码&#xff0c;为您的项目提供便捷解决方…

【VB语言】EXCEL中VB宏的应用

【VB语言】EXCEL中VB宏的应用 文章目录 [TOC](文章目录) 前言一、EXCEL-VB1.实验过程2.代码 二、EXCEL-VB 生成.c.h文件1.实验过程2.代码 四、参考资料总结 前言 1.WPS-VB扩展包 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、EXCEL-VB 1.实验过…

告别第三方云存储!用File Browser在Windows上自建云盘随时随地访问

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 无论是个人用户还是企业团队&#xff0c;都希望能够有一个高效、安全的解决方案来…

[250217] x-cmd 发布 v0.5.3:新增 DeepSeek AI 模型支持及飞书/钉钉群机器人 Webhook 管理

目录 X-CMD 发布 v0.5.3&#x1f4c3;Changelog&#x1f9e9; deepseek&#x1f9e9; feishu|dingtalk&#x1f4e6; x-cmd✅ 升级指南 X-CMD 发布 v0.5.3 &#x1f4c3;Changelog &#x1f9e9; deepseek 新增 deepseek 模块&#xff0c;用户可通过 deepseek 直接请求使用 …

Kubernetes控制平面组件:etcd常用配置参数

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

Docker 入门与实战:从安装到容器管理的完整指南

&#x1f680; Docker 入门与实战&#xff1a;从安装到容器管理的完整指南 &#x1f31f; &#x1f4d6; 简介 在现代软件开发中&#xff0c;容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊&#xff0c;以其轻量级、高效和跨平台的特性&#xff0c;深…

Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路

一、资料快车 1、深入了解Android输入系统&#xff1a;https://blog.csdn.net/innost/article/details/47660387 2、书籍 - Android系统源代码情景分析 二、Perface 1、参考&#xff1a; 2、系统程序分析方法 1&#xff09;加入log&#xff0c;并跟着log一步步分析 -logc…

HarmonyOS-ArkTS基础快速入门

目录 ArkTS 快速入门 ArkTS 快速入门 如图&#xff0c;index.etc里面的内容&#xff08;图中框住的大长方形区域&#xff09;会渲染到预览区中&#xff0c;而console.log(xx,xxx)用于内容的打印&#xff0c;需要在日志中查看打印的内容

FRRouting配置与OSPF介绍,配置,命令,bfd算法:

文章目录 1、frrouting的配置&#xff1a;2、ospf2.1、检测和维护邻居关系2.2、ospfDR和BDR2.3、odpf邻居表2.4、ospf常用命令2.5、bfd配置 1、frrouting的配置&#xff1a; sudo service zebra start sudo service ospfd start telnet localhost 2604 en configure termina…

2-安装YIUI

YIUI框架&#xff1a;GitHub - LiShengYang-yiyi/YIUI: Unity3D UGUI Framework, 基于UI数据事件绑定为核心 数据驱动的UGUI框架, ETUI框架, ET框架官方推荐UI框架 ET框架&#xff1a;egametang/ET: Unity3D Client And C# Server Framework (github.com) 1 - 安装YIUI框架&a…

001-监控你的文件-FSWatch-C++开源库108杰

fswatch 原理与应用简介fswatch 安装fswatch 实践应用具体应用场景与细节补充 1. 简介 有些知识&#xff0c;你知道了不算厉害&#xff0c;但你要是不知道&#xff0c;就容易出乱。 很多时候&#xff0c;程序需要及时获取磁盘上某个文件对象&#xff08;文件夹、文件&#xff0…

机器学习--逻辑回归

机器学习–逻辑回归 一、认知革命&#xff1a;从线性回归到逻辑回归 1.1 本质差异对比 维度线性回归逻辑回归输出类型连续值概率值 (0-1)目标函数最小二乘法极大似然估计数学表达式 y w T x b yw^Txb ywTxb p 1 1 e − ( w T x b ) p\frac{1}{1e^{-(w^Txb)}} p1e−(wTxb…

s1K 数据集:是一个用于提升语言模型推理能力的高质量数据集。包含 1,000 个问题,每个问题都配有详细的 推理路径 和 答案。

2025-02-07&#xff0c; 由斯坦福大学、华盛顿大学等研究机构创建了 s1K 数据集&#xff0c;该数据集包含 1,000 个精心挑选的问题&#xff0c;并配以推理轨迹和答案&#xff0c;为语言模型推理能力的提升提供了重要的数据基础。 一、研究背景 1. 研究背景 近年来&#xff0c;…

DockerDesktop更改默认的磁盘镜像地存储位置

DockerDesktop更改默认的磁盘镜像地存储位置 文章目录 DockerDesktop更改默认的磁盘镜像地存储位置1. 默认存储位置2. 新建一个目录3. 将磁盘镜像存储位置改为新建的目录下 1. 默认存储位置 2. 新建一个目录 如&#xff1a;D:\DiskImagelocationData 3. 将磁盘镜像存储位置改为…

ASP.NET Core SixLabors.ImageSharp 位图图像创建和下载

从 MVC 控制器内部创建位图图像并将其发送到浏览器&#xff1b;用 C# 编写并与 Linux 和 Windows 服务器兼容。 使用从 ASP.NET MVC 中的控制器下载任何文件类型File。 此示例创建一个位图 (jpeg) 并将其发送到浏览器。它需要 NuGet 包SixLabors.ImageSharp v1.0.4。 另请参…

容联云联络中心AICC:深度整合DeepSeek,业务验证结果公开

容联云重磅推出AICC3.2版本&#xff0c;实现了智能化的升级与外呼效率的突破——深度整合DeepSeek-R1大模型、预测式外呼在数据分析侧的增强、全渠道路由能力、一键多呼效率的强化。 同时&#xff0c;全面接入DeepSeek-R1的容联云 AICC3.2 &#xff0c;目前已与某知名汽车金融企…

链表和list

链表和list ‍ ​ ​ ​ ​ ​ ​ ​ ​ ​ 算法题中的经典操作&#xff1a;用空间代替时间​ ​ ​ ​ 双链表头插顺序&#xff1a; 1.先修改新结点的左右指针 2.然后修改结点y的左指针 3.最后修改哨兵位的右指针 双链表在任意位置&#xff08;p&#xff09;之后插入…

Junit——白盒测试

Java单元测试框架&#xff0c;主要用于测试Java程序中的各个单元。 1.验证代码功能是否符合预期 2.及时 发现修复 代码中的缺陷&#xff0c;提高代码质量 入门 最早学习java&#xff0c;代码对不对&#xff0c;通过main 方法运行&#xff0c;观看结果是否符合预期。 packa…

1.MySQL概述

1.1 数据模型 介绍完了Mysql数据库的安装配置之后&#xff0c;接下来我们再来聊一聊Mysql当中的数据模型。学完了这一小节之后&#xff0c;我们就能够知道在Mysql数据库当中到底是如何来存储和管理数据的。 在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#x…

Deep seek学习日记1

Deepseek最强大的就是它的深度思考&#xff0c;并且展现了它的思考过程。 五种可使用Deep seek的方式&#xff08;应该不限于这五种&#xff0c;后续嵌入deepseek的应该更多&#xff0c;多了解一点因为官网容易崩~~&#xff09;&#xff1a; 1.deep seek官网 2.硅基流动silicon…