You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让@Trace注解的metricName使用配置中的实际队列名称?

解决New Relic @Trace注解metricName无法读取配置占位符的问题

问题根源在于New Relic的@Trace注解参数是编译时静态值,无法直接解析Spring的配置占位符${...},所以会把占位符字符串直接当作metric名称。下面提供两种可行的解决方式:

方式一:编程式设置Metric名称(推荐)

  1. 通过Spring注入配置的队列名称:
@Value("${jms.bulkUseruploadEventQueue.name}")
private String queueName;
  1. 修改@Trace注解,去掉metricName参数,在方法内手动设置事务的metric名称:
@Trace(dispatcher = true)
@JmsListener(destination = "${jms.bulkUseruploadEventQueue.name}", concurrency = "${jms.bulkUseruploadEventQueue.concurrency}")
public void processMessage(Message<BulkUserUploadEvent> message) {
    // 手动设置New Relic事务的metric名称
    NewRelic.getAgent().getTransaction().setMetricName(queueName);
    log.info("event:{} processed successfully", message.getPayload());
}

这样就能把实际的队列名称作为metric上报到New Relic。

方式二:自定义Spring切面统一处理

如果有多个JmsListener需要统一处理,可以自定义切面,在方法执行前获取目标方法的@JmsListener注解的destination值,再设置到New Relic事务中:

@Component
@Aspect
public class NewRelicJmsMetricAspect {

    @Around("@annotation(org.springframework.jms.annotation.JmsListener) && @annotation(com.newrelic.api.agent.Trace)")
    public Object setJmsMetricName(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取JmsListener注解的destination值
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        JmsListener jmsListener = signature.getMethod().getAnnotation(JmsListener.class);
        String queueName = jmsListener.destination();
        
        // Spring会自动解析注解里的占位符,直接使用即可
        NewRelic.getAgent().getTransaction().setMetricName(queueName);
        
        return joinPoint.proceed();
    }
}

这种方式无需修改每个JmsListener方法,适合批量处理场景。

注意:确保项目已引入New Relic Java Agent依赖,NewRelic类可正常调用。

内容的提问来源于stack exchange,提问作者Marcus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:32:40