@Trace 注释中 metricName 的动态值?

问题描述 投票:0回答:1

我正在将 JmsListener 消耗的消息数据发送到 New Relic。我尝试了下面的代码

@Trace(dispatcher = true, metricName = "${jms.bulkUseruploadEventQueue.name}")
@JmsListener(destination = "${jms.bulkUseruploadEventQueue.name}", concurrency = "${jms.bulkUseruploadEventQueue.concurrency}")
public void processMessage(Message<BulkUserUploadEvent> message) {
   log.info("event:{} processed successfully", message.getPayload());
}

在这里,我可以看到 New Relic 中的数据,但我可以看到指标名称为

${jms.bulkUseruploadEventQueue.name}
,而不是从配置中获取的队列的确切值。 在这种情况下,如何将确切的队列名称设置为
metricName

trace spring-jms newrelic
1个回答
0
投票

@Trace 注解是在类加载时处理的,因此它不支持 SpEL 或其他表达式。只有普通的旧字符串才可以在那里工作。

您可以使用方法内的 API 来设置指标名称。

@Trace(dispatcher = true)
@JmsListener(destination = "${jms.bulkUseruploadEventQueue.name}", concurrency = "${jms.bulkUseruploadEventQueue.concurrency}")
public void processMessage(Message<BulkUserUploadEvent> message) {
  ExpressionParser parser = new SpelExpressionParser();
  Expression exp = parser.parseExpression("${jms.bulkUseruploadEventQueue.name}"); 
  String metricName = (String) exp.getValue();
  NewRelic.getAgent().getTracedMethod().setMetricName(metricName);
  NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.CUSTOM_HIGH, true, metricName);

前 3 行可能位于类初始化中的某个位置。您可能不需要以 NewRelic 开头的 2 行,很可能第二行就是您想要的。

© www.soinside.com 2019 - 2024. All rights reserved.