尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Metabase 警报(Alerts)完全指南:从创建、调度到源码级原理

Metabase 警报(Alerts)完全指南:从创建、调度到源码级原理 Metabase 警报Alerts完全指南从创建、调度到源码级原理【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase警报Alerts是 Metabase 中面向问题Question的主动通知机制当一个问题返回了满足特定条件的结果时Metabase 会按照你设定的调度按分钟、小时、日、周、月或 Quartz cron 表达式自动通过电子邮件、Slack 或 Webhook 把结果推送给指定的人。本文以官方文档为主线结合当前仓库后端源码src/metabase/notification、src/metabase/pulse等模块讲解三类警报的完整配置流程、调度与触发机制、权限边界及各类特殊情形帮助你掌握从创建一条警报到理解它在后台如何被定时任务执行的完整链路。前提条件先配置通知渠道警报只针对问题Question如果你想定时获取的是**仪表盘Dashboard**的结果请改用仪表盘订阅。要开始使用警报管理员需要先在 Metabase 中至少配置以下通知渠道之一电子邮件EmailSlackWebhook其中只有管理员以及拥有设置访问权限Settings access的用户才能使用 Webhook 作为警报目的地。从源码看这些渠道的实际投递由src/metabase/channel/core.clj的channel/send!与channel/render-notification多方法multimethod统一调度Email、Slack、HTTPWebhook各自实现对应的渲染与发送逻辑只有管理员可创建 Webhook 的限制则通过src/metabase/channel/settings.clj中的http-channel-allowed-networks等设置与权限校验共同约束。创建一条警报创建警报的通用步骤如下保存你的问题未保存的问题无法创建警报。点击屏幕右上角的三个点图标即问题操作菜单。选择Create an alert创建警报。选择触发条件具体选项取决于问题类型当问题返回结果时Results alerts适用于任何问题当时序图跨越目标线时Goal line alerts适用于展示时序数据的折线图、柱状图或面积图当进度条达到或低于目标时Progress bar alerts适用于进度条可视化。选择 Metabase 检查结果的频率按分钟、小时、每日、每周、每月或者自定义 Quartz cron 语法标准 cron 表达式共 6 或 7 个字段含秒与年。选择警报目的地电子邮件、Slack 或 Webhook仅管理员和拥有设置访问权限的用户。配置其他选项例如仅发送一次。点击Done完成。调度背后Quartz 定时触发器当你在界面里选择调度频率包括自定义 cron 表达式时Metabase 后端会为这条警报订阅创建一个 Quartz Cron Trigger。在 src/metabase/notification/task/send.clj 的build-trigger中可以看到关键实现触发器 ID 格式为metabase.task.notification.trigger.subscription.id调度使用cron/schedule把 cron 字符串注册进 Quartz并绑定到报表时区report timezonesend-notification-timezone依次取driver/report-timezone→ 系统时区 →UTC使用 misfire 处理指令fire-and-proceed即使某个触发点因实例繁忙或停机而错过也会立即补执行一次而不是丢弃触发器优先级设为 6高于同步任务保证警报优先于其他后台任务投递。Metabase 实例启动时InitNotificationTriggers任务会同步数据库中的订阅与已注册的 Quartz 触发器新增的创建、已删除的清理当实例的报表时区发生变化时update-send-notification-triggers-timezone!会重建所有触发器以匹配新时区。发送队列与重试触发后通知被提交到src/metabase/notification/send.clj中的去重优先级队列DedupPriorityQueue同一通知 ID 在队列中只保留一份并按 deadline由订阅的 cron 调度频率推算出的截止时间频率越高优先级越高排序由线程池消费。默认线程池大小为 3可通过内部设置notification-thread-pool-size调整——官方文档提示如果出现警报迟迟不发可能是长查询堵住了队列增大该线程池有助于疏通src/metabase/notification/settings.clj。渠道投递自带指数退避重试默认最多重试 6 次、初始间隔 500ms、倍率 2.0、抖动因子 0.1、最大间隔 30 秒开发模式下重试次数为 1Slack 的invalid-token与channel-not-found属于不可重试错误会直接放弃见 src/metabase/notification/send.clj 与 src/metabase/channel/settings.clj 中的retry-*系列设置。发送一次性警报Only send the alert once在设置警报时如果勾选了Only send the alert once仅发送一次Metabase 会在该警报触发并成功发送一次之后自动停用这条警报之后再也不会提醒任何人。这类一次性警报非常适合里程碑类场景例如通知你某个指标首次突破某一数值。源码中的行为印证在 src/metabase/notification/payload/impl/card.clj 的do-after-notification-sent中当:send_once为真且本次未被跳过时会调用notification.db/deactivate-notification!停用该通知旧版 Pulse 结构中的:alert_first_only字段同样映射自send_once见 src/metabase/pulse/api/alert.clj。测试警报测试警报前请先确认两点问题必须能返回结果如果问题返回空结果Metabase 不会发送警报——因为结果类警报的语义就是有结果才提醒然后点击Send now立即发送按钮手动触发一次警报验证渠道与内容是否符合预期。从源码看Send now 走的是通知测试流程payload 类型:notification/testing与定时调度共用同一套渲染与投递管道因此测试结果能真实反映定时警报的效果。Results 警报有结果即触发Metabase 可以按调度检查你的问题是否返回了任何结果。这类警报特别适合那些平时通常不返回结果、但你希望在一旦返回结果时收到通知的问题。典型例子你有一张名为Reviews的表想知道客户何时留下差评定义为三星以下。做法是创建一个原始数据问题返回评论列表的问题添加筛选条件只保留星级少于三颗的记录再添加一个日期筛选只包含昨天或今天的记录取决于你希望多频繁地检查这样检查结果时通常为空——这是好现象保存问题创建警报选择检查频率即可。触发原理skip-reason 机制结果类警报的判定实现在 src/metabase/notification/payload/impl/card.clj 的skip-reason中当send_condition为:has_result时如果notification.execute/is-card-empty?判断本次查询结果为空则返回:empty通知被跳过、不发送只有结果非空时才继续渲染并投递。另外问题本身若被归档archived警报同样会被跳过。发送之后若结果行数较多临时结果文件会被清理notification.payload/cleanup!并发布:event/alert-send审计事件src/metabase/notification/payload/impl/card.clj供使用分析Usage analytics统计。Goal line 警报目标线跨越触发要求使用带有目标线的折线图、柱状图或面积图。目标线警报适合跟踪日活跃用户DAU何时达到某个数值、每周订单数何时跌破某个阈值等场景。创建步骤创建一个展示数值随时间变化的折线、面积或柱状图点击左下角的齿轮图标打开可视化设置在Display显示标签页打开Show goal显示目标开关为目标设定一个数值可选加标签点击 Done保存问题点击右上角三个点选择 Create alert然后配置时序**高于above目标线时提醒还是低于below**目标线时提醒是每次跨越目标线都提醒还是仅第一次跨越时提醒检查目标线是否被跨越的频率。选择调度与接收人点击 Done。目标判定源码goal-met?src/metabase/notification/payload/impl/card.clj实现了目标线判定根据send_condition是:goal_above还是:goal_below选择或比较符从结果数据中找出目标值列与比较函数只要任意一行满足条件即认为目标达成在skip-reason中若目标未达成则返回:goal-not-met并跳过本次发送。若问题不再配置目标值则无法比较此时会抛出异常——这与文档中目标线被移除后警报降级为 Results 类型的行为相对应。Progress bar 警报进度条到达目标触发要求进度条可视化。当单个数字达到某个目标时提醒可以使用进度条可视化创建返回单个数字结果的问题选择Progress Bar图表类型在可视化设置中选择目标值保存问题点击右上角三个点创建警报。可选配置包括进度条达到目标线还是低于目标时提醒仅第一次到达目标时提醒还是每次都提醒检查目标是否达成的频率。从实现看进度条警报复用了与 Goal line 警报相同的goal-met?判定逻辑进度条的目标本质上就是目标线因此两种警报在源码层面共享同一套:goal_above/:goal_below触发路径。编辑、删除与退订警报要对某条问题上的警报进行编辑或删除点击右上角三个点并选择Edit alerts编辑警报。可编辑的范围取决于你是否是管理员。所有人Everyone只能编辑自己创建的警报不能编辑他人创建的可以查看并退订自己收到的所有警报点击右上角的个人资料或网格图标再点击自己的资料名称和邮箱进入 Account settings在Notifications页签中管理。管理员Admins可以编辑和删除任何警报此操作不可撤销请谨慎可以给任何警报添加或移除接收人即使警报不是自己创建的可以从管理设置中的 People 菜单按人批量管理订阅与警报退订其所有订阅与警报可以在 Monitor Alerts management警报管理中批量管理实例内的全部警报。Metabase 会在以下场景主动邮件通知你你创建了一条警报你被从某条警报中退订你的某条警报停止工作你退订了一条警报管理员把你添加进了某条警报。后端方面退订接口在 src/metabase/pulse/api/alert.clj 的DELETE /api/alert/:id/subscription用户调用后执行notification.api/unsubscribe-user!将自己从警报中移除并返回 204。注意该命名空间标注为^:deprecated注释说明/api/alert端点已逐步迁移到 notification APIsrc/metabase/notification/api/admin.clj等但对外行为保持不变。避免在 Slack 中重命名警报目标频道一旦你设置了一条发送到 Slack 频道的警报请避免在 Slack 中重命名该频道。如果频道被重命名Metabase 将不再知道把警报发往何处你需要回到 Metabase 中更新警报使其指向新的频道名称。从源码看Slack 渠道通过slack-cached-channels-and-usernames缓存频道与用户列表src/metabase/channel/settings.clj发送时按频道 ID 或名称匹配频道重命名后缓存中的旧名称/ID 与真实频道失配因此必须手动更新警报目标。警报过期与特殊情形以下情形会自动修改或删除警报你重命名了目标 Slack 频道警报不会被删除但 Metabase 将无处可发需要更新警报的目标频道为新名称问题上的目标线被移除支撑 Goal line 警报的问题若不再有目标线警报会自动降级为Results类型警报问题被删除Metabase 会删除该问题下设置的所有警报。警报在创建者账号失效后仍然有效例如由某个已被停用账号创建的、带有多个接收人或发送到 Slack 频道的警报会继续工作不过 Metabase 会停止向已停用的账号发送。管理员可见性查看所有警报管理员可以在Usage analytics使用分析集合中查看实例内所有人设置的警报与仪表盘订阅列表具体字段定义见 Usage analytics 参考文档中的 Alerts 模型。该模型由:event/alert-send等审计事件支撑src/metabase/notification/payload/impl/card.clj用于统计警报发送情况。警报与权限警报权限的完整规则见通知权限Notification permissions要点包括所有用户都可以创建警报与订阅、给自己创建的警报添加接收人、在 Account settings 中退订任何警报或订阅当创建者给警报添加新接收人时Metabase 以创建者的数据权限和集合权限向接收人展示数据处于身份伪装impersonation或行/列级安全row and column security组中的用户不能创建 Slack 警报或订阅但仍可设置邮件警报且邮件警报的接收人列表里只会看到自己管理员可以查看所有订阅与警报、在不改变警报本身权限的前提下安全地添加/移除接收人例如管理员把 Anya 加进 Beau 创建的订阅Anya 收到的数据与 Beau 一致而非与管理员的可见范围一致、以及删除订阅或警报。此外还有两个与 Slack 相关的注意点发送到私有 Slack 频道见 配置 Slack 文档中的对应章节从警报中移除 Metabase 品牌标识见导出结果文档中的相关章节。嵌入问题中的警报不包含链接嵌入embedded问题的查看者通常无法直接访问你的 Metabase 实例因此 Metabase 在发送来自嵌入问题的警报时会省略指向 Metabase 内容的链接避免收件人收到失效链接。实现上通知链接的基址由notification-link-base-url设置控制默认使用站点 URLsrc/metabase/channel/settings.clj嵌入场景下按此规则剔除链接。自定义可视化在警报中回退为默认图表Metabase 渲染警报时没有登录用户上下文因此使用了自定义可视化的问题在警报中会回退到其结果的默认可视化渲染。也就是说自定义图表的展示效果只存在于交互界面警报邮件/附件中使用的是标准图表。邮件投递的额外工程细节每封邮件收件人上限email-max-recipients-per-message默认 50超过时会把通知拆分为多封邮件设置为 0 可禁用分批以规避 Amazon SES 等 SMTP 提供商的单封收件人上限src/metabase/channel/settings.clj附件行数上限attachment-table-row-limit默认 20范围 1-100限制警报或订阅图片中渲染的行数可通过环境变量MB_ATTACHMENT_ROW_LIMIT覆盖Webhook 目标网络限制http-channel-allowed-networks默认external-only只允许发送到外部主机可改为allow-private允许外部与内网但排除 localhost或allow-all不设限制含 localhost防止 SSRF 类风险src/metabase/channel/settings.clj。进一步阅读仪表盘订阅Dashboard subscriptions配置电子邮件配置 Slack使用分析Usage analytics自定义可视化警报管理Monitor Alerts management通知权限【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表