关于 sending-notifications
面向 PostHog 功能开发者的实时通知技能,介绍通过统一 facade 创建通知、设置接收对象和优先级,并说明访问控制与投递流程。
主要功能
- 01通过统一接口创建通知
- 02配置目标、资源与优先级
- 03按资源访问权限筛选接收者
- 04说明实时通知投递链路
- 05提供新增通知类型步骤
适用场景
- 01用户被评论提及时发送通知
- 02告警阈值触发时通知相关人员
- 03审批请求或结果变化时通知
- 04数据管道失败时发送通知
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ posthog/ posthog --skill sending-notifications安装后在 Claude Code 中输入/sending-notifications确认已加载。
详细介绍
发送实时通知
何时使用
你正在为某个 PostHog 功能添加通知支持——例如,当用户在评论中被提及时、当告警触发时,或当有人请求审批时,向该用户发送通知。
Facade API
所有通知的创建都通过一个函数完成。请从 facade 导入,而不是从内部模块导入:
from products.notifications.backend.facade.api import (
create_notification,
NotificationData,
NotificationType,
Priority,
TargetType,
)
构建一个 NotificationData 并调用 create_notification:
event = create_notification(
NotificationData(
team_id=team.id,
notification_type=NotificationType.ALERT_FIRING,
priority=Priority.CRITICAL,
title="Event ingestion latency > 30s",
body="Events are queuing up. Ingestion pipeline is degraded.",
target_type=TargetType.USER,
target_id=str(user.id),
resource_type="dashboard",
resource_id="42",
source_url="/dashboard/42",
)
)
成功时返回一个 NotificationEvent,如果该功能开关已禁用、未解析出任何接收者,或该团队不存在,则返回 None。在任何上下文中调用都是安全的。
NotificationData 字段
必填:
| 字段 | 类型 | 描述 |
|---|---|---|
team_id | int | 团队上下文——用于查找组织并检查功能开关 |
notification_type | NotificationType | 决定 UI 中的图标 |
title | str | 通知标题(建议约 100 个字符) |
body | str | 展开时显示的较长描述。可以是空字符串 |
target_type | TargetType | 谁接收此通知:user、team、organization 或 role |
target_id | str | 目标的 ID(用户 ID、团队 ID、组织 UUID 或以字符串表示的角色 UUID) |
可选:
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
resource_type | NotificationResourceType | None | None | 受访问控制的类型(例如 "dashboard")会自动过滤掉没有查看权限的接收者 |
resource_id | str | "" | 用于链接的资源的 ID |
source_url | str | "" | 相对 URL 路径(例如 /dashboard/42),在 UI 中显示为链接图标 |
priority | Priority | NORMAL | normal = 仅弹出框;critical = 弹出框 + 持久 toast |
archivable | bool | False | 选择启用按接收者的“归档”(忽略)操作,该操作会将通知移动到接收者的“已归档”标签页。当为 False 时,接收者只能将其标记为已读/未读(默认模式) |
resolver | RecipientsResolver | None | None | 自定义接收者解析器。默认处理 user/team/org/role 定位 |
选择参数
通知类型
| 类型 | 使用场景 |
|---|---|
comment_mention | 用户在评论或讨论中被 @ 提及 |
alert_firing | 监控告警阈值被突破 |
approval_requested | 某项变更需要用户审批 |
approval_resolved | 用户请求的审批已解决 |
pipeline_failure | 数据管道或批量导出失败 |
issue_assigned | 错误跟踪 issue 被分配给了该用户 |
优先级
使用 critical 时务必非常谨慎。 它会触发一个持续显示、覆盖用户屏幕的 toast 弹窗,且必须手动关闭。这是刻意设计的侵入性行为——请将其保留给真正的紧急情况,例如服务中断、安全告警或 SLA 违约。滥用 critical 会让用户逐渐完全忽略通知。如有疑问,请使用 normal。
目标类型
| 目标 | target_id 值 | 接收者 |
|---|---|---|
user | 用户 ID | 仅该用户 |
team | 团队 ID | 该团队所属组织的所有成员 |
organization | 组织 ID | 所有组织成员 |
role | 角色 ID | 所有拥有该 RBAC 角色的用户 |
资源类型与访问控制
当 resource_type 匹配一个受访问控制的资源(dashboard、feature_flag、experiment 等)时,不具备 viewer 访问权限的接收者会被自动排除。对于仅通知类型(pipeline、approval、comment),不应用任何 AC 过滤。
投递管道
Django (create_notification)
→ Postgres (NotificationEvent row)
→ Kafka (notification_events topic, on transaction commit)
→ Go livestream service (Kafka consumer)
→ Redis SPUBLISH (sharded pub/sub, keyed by org ID)
→ SSE (/notifications endpoint)
→ Browser (popover + optional toast)
Kafka 发布发生在 transaction.on_commit 上——如果事务回滚则不会触发。
添加新的通知类型
- 在
products/notifications/backend/facade/enums.py中添加枚举值 - 在
frontend/src/lib/components/NotificationsMenu/notificationToasts.tsx中添加图标映射(NOTIFICATION_TYPE_ICONS)——这是唯一的图标来源,由getNotificationIcon读取,而只有NotificationRow会调用它;侧边面板通过渲染该行来获取图标 - 在
frontend/src/lib/components/NotificationsMenu/NotificationRow.tsx中添加标签 + 描述条目(REALTIME_NOTIFICATION_TYPE_META)——驱动按类型划分的通知偏好设置 UI - 运行
python manage.py makemigrations notifications
测试
在测试中 mock 该 feature flag:
from unittest.mock import patch
with patch("posthoganalytics.feature_enabled", side_effect=lambda flag, *a, **kw: flag == "real-time-notifications"):
event = create_notification(data)
评论
支持 Markdown