活动合约
查询期望的字段
| 字段 | 类型 | 为什么存在 |
|---|---|---|
| timestamp_utc | Timestamp | 当处理尝试结束时。 |
| delivery_id | Utf8 | 由重试尝试共享的稳定标识符。 |
| provider | Utf8 | Webhook 提供商。 |
| event_type | Utf8 | 提供者事件类型。 |
| attempt | Int64 | 基于一的处理尝试。 |
| status | Utf8 | 成功、失败或重复数据删除。 |
DataFusion SQL
复制查询
sql
WITH delivery_outcomes AS (
SELECT
delivery_id,
provider,
event_type,
MAX(attempt) AS attempts,
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed_attempts,
SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) AS successful_attempts,
SUM(CASE WHEN status = 'deduplicated' THEN 1 ELSE 0 END) AS deduplicated_attempts
FROM webhook_deliveries
WHERE timestamp_utc >= now() - INTERVAL '7 days'
GROUP BY delivery_id, provider, event_type
)
SELECT
provider,
event_type,
COUNT(*) AS deliveries,
SUM(CASE
WHEN failed_attempts > 0 AND successful_attempts > 0 THEN 1 ELSE 0
END) AS recovered,
SUM(CASE
WHEN failed_attempts > 0 AND successful_attempts = 0 THEN 1 ELSE 0
END) AS permanent_failures,
SUM(deduplicated_attempts) AS duplicates_suppressed
FROM delivery_outcomes
GROUP BY provider, event_type
ORDER BY permanent_failures DESC, recovered DESC;此只读查询是针对空类型表计划和执行的 阿帕奇 DataFusion 45.2.0。确定性样本输出是综合的并单独审查;根据您自己的数据验证字段类型、阈值和业务定义。 阅读测试方法。
查询结果
Webhook 事件导致永久失败
恢复的事件仍然可见,但不会被视为永久的客户影响。
invoice.payment_succeeded
1
comparison 1
push
0
comparison 1
| provider | event_type | deliveries | recovered | permanent_failures | duplicates_suppressed |
|---|---|---|---|---|---|
| stripe | invoice.payment_succeeded | 4 | 1 | 1 | 1 |
| github | push | 3 | 1 | 0 | 1 |
综合示例输出。在将其用于操作决策之前,针对您自己的事件架构和阈值运行查询。
SQL 是如何工作的
- 1第一个 CTE 将一次交付的所有尝试折叠成一个结果记录。
- 2恢复的传递至少有一次失败的尝试和至少一次成功的尝试。永久的失败永远不会成功。
- 3重复抑制是单独跟踪的,因为正确的幂等性是一个健康的结果,而不是处理失败。
需要决定的边缘情况
- 保留提供商交付 ID,以便可以可靠地对重试进行分组。
- 查询窗口后可能会恢复交付;使用足够长的窗口来覆盖提供商的重试时间表。
- 当成功需要的不仅仅是确认提供者时,将接收与下游副作用分开。
推荐仪表板
- 分组条:由 event_type 恢复和 permanent_failures
- Stat:重复抑制率
- 表:下游作业上下文的最新永久性故障
让查询示例发挥作用
相关埋点和指南
定义源数据
此分析的事件模式
继续分析
在真实事件中运行它
创建表,调整字段并保存结果
免费开始,发送结构化事件,并将查询结果用作图表、共享仪表板小部件或警报输入。