如何获取Azure Notification Hub推送通知的回调用户接收统计信息?
我之前也碰到过类似的需求,Azure Notification Hub的直接推送回调确实不会返回具体推送给哪些用户的明细,但可以通过以下几种方式来实现你的统计需求:
1. 利用Azure Monitor的诊断日志获取推送明细与数量
Azure Notification Hub支持将推送日志导出到Azure Monitor,你可以通过这些日志来统计成功推送的用户数,甚至查看具体的推送对象信息:
第一步:开启诊断日志
在Azure Portal中找到你的Notification Hub,进入「诊断设置」,添加新的设置,勾选NotificationHubLogs并选择保存到Log Analytics工作区。第二步:用Node.js查询日志统计数量
使用@azure/monitor-querySDK来查询Log Analytics中的日志,筛选出对应通知的成功推送记录。示例代码如下:const { LogsQueryClient, AzureKeyCredential } = require("@azure/monitor-query"); const client = new LogsQueryClient(new AzureKeyCredential("<你的工作区密钥>")); async function getNotificationStats(notificationId) { const query = `NotificationHubLogs | where NotificationId == "${notificationId}" | where Outcome == "Success"`; const result = await client.queryWorkspace("<你的工作区ID>", query, { timespan: { start: new Date(Date.now() - 3600000), end: new Date() } }); // 成功推送的数量 const successCount = result.tables[0].rows.length; // 如果需要,可以提取每条记录的RegistrationId等信息 const recipients = result.tables[0].rows.map(row => row[4]); // RegistrationId位置根据实际日志结构调整 return { successCount, recipients }; } getNotificationStats("<你的通知ID>").then(console.log);
2. 发送前查询符合Tag条件的注册数
如果你需要提前知道目标用户数量,可以在发送通知前,先查询对应Tag下的所有注册记录:
使用@azure/notification-hubs SDK的getRegistrationsByTag方法,注意处理分页(因为注册数较多时会分批返回):
const { NotificationHubClient } = require("@azure/notification-hubs"); const client = new NotificationHubClient("<连接字符串>", "<Hub名称>"); async function countTagRegistrations(tag) { let totalCount = 0; let continuationToken = null; do { const registrations = await client.getRegistrationsByTag(tag, 100, continuationToken); totalCount += registrations.length; continuationToken = registrations.continuationToken; } while (continuationToken); return totalCount; } // 先统计数量再发送通知 countTagRegistrations("yourTargetTag").then(count => { console.log(`目标用户数量:${count}`); // 这里执行发送通知的逻辑 client.sendNotification("<通知内容>", { tags: ["yourTargetTag"] }); });
注意:这个数量是符合Tag条件的注册数,和实际成功推送数可能有差异(比如部分设备已注销或离线),如果需要准确的接收数,还是要结合日志来统计。
3. 实时统计:用Azure Functions处理推送日志
如果需要实时记录每个通知的接收用户,可以设置将Azure Monitor日志导出到Event Hub,然后用Azure Functions监听Event Hub,每收到一条成功推送的日志,就更新你的业务数据库(比如记录用户ID、推送时间等)。这种方式可以实现更精细的统计和追溯。
关键注意点
- Azure Notification Hub的
sendNotification方法回调只会返回推送请求是否被Hub接收,不会返回具体的推送结果明细,因为Hub是批量异步处理推送的。 - 日志中的
NotificationId可以在发送通知时通过设置notificationId参数来指定,这样方便后续关联查询。
内容的提问来源于stack exchange,提问作者Furqan Misarwala

