MassTransit调度消费者未更新Prometheus指标问题咨询
问题根因
该问题是MassTransit 7.2.2版本的已知特性缺陷,核心由两个原因导致:
- 中间件注册顺序错误:当前配置里
UsePrometheusMetrics注册在UseHangfireScheduler之前,MassTransit的中间件执行顺序为注册顺序从前到后,Hangfire内部触发的调度消息发送逻辑会绕开外层的指标采集过滤器,导致发送、发布指标无法统计。 - 调度消息上下文丢失时间戳:Hangfire持久化调度任务时,未正确保留消息的初始发送时间戳,导致消费时计算交付时长无法获取起始时间,最终显示为无限大。
解决方案
第一步:调整中间件注册顺序
将UseHangfireScheduler放在UsePrometheusMetrics之前注册,让指标采集过滤器可以覆盖Hangfire触发的消息发送逻辑,调整后的配置如下:
services.AddMassTransit(config => { config.AddMessageScheduler(new Uri("queue:my-scheduler")); config.UsingRabbitMq((ctx, cfg) => { // 先注册Hangfire调度 cfg.UseHangfireScheduler("my-scheduler"); // 再注册Prometheus指标采集 cfg.UsePrometheusMetrics(serviceName: "my.service.name"); }); });
修改后重启服务,即可正常采集到调度消息的mt_publish_total、mt_send_total指标。
第二步:修复交付时长无限大问题
如果调整顺序后交付时长指标仍然异常,可选择两种方案处理:
- 升级MassTransit到7.2.4及以上的7.2.x小版本,官方已经在该版本修复了调度消息时间戳传递的缺陷。
- 若暂时无法升级版本,可手动添加发送过滤器,在调度消息入队时写入自定义时间戳头,消费时读取该头计算交付时长即可。
验证方式
调整配置后触发1-2条调度消息,访问/metrics端点即可看到对应消息类型的发送/发布指标增长,交付时长也会显示为正常的数值。
内容的提问来源于stack exchange,提问作者Piotr Jakóbczyk
相关产品推荐
相关产品推荐

