New Relic分布式追踪中传递自定义属性的技术咨询
关于New Relic自定义属性的问题解答
问题1:UI层设置的自定义属性是否自动传递到所有事务跨度?
不会自动传递。浏览器端(ReactJS UI)通过newrelic.setCustomAttribute()设置的属性仅会附加在前端的New Relic事务和跨度中,默认的分布式追踪上下文不会自动携带这类自定义属性到下游服务。
要让这个userID贯穿整个链路的所有跨度,需要手动在各层传递并设置:
- ReactJS UI:发起请求时,把
userID放到请求头(比如X-User-ID)里,同时保留前端的自定义属性设置。 - Node.js层:从请求头提取
userID,调用newrelic.setCustomAttribute('userID', user_ID)把属性附加到Node.js的事务/跨度;发送消息到Azure Service Bus时,把userID放到消息的自定义属性字段中(比如消息的applicationProperties)。 - Spring Boot应用:接收消息时提取这个属性,再通过New Relic Java API设置到自身的跨度/事务中。
问题2:Spring Boot应用中如何读取并设置该自定义属性?
按以下步骤操作:
- 提取消息中的
userID:
如果使用Azure的Spring Starter处理Service Bus消息,在消息处理方法中可以从Message对象的属性里获取。示例代码:import org.springframework.messaging.Message; @Service public class MessageHandler { public void handleMessage(Message<String> message) { // 从消息头中提取userID String userId = message.getHeaders().get("X-User-ID", String.class); // 或者从Azure Service Bus的applicationProperties中获取 // Map<String, Object> appProps = (Map<String, Object>) message.getHeaders().get("applicationProperties"); // String userId = (String) appProps.get("userID"); } } - 设置到New Relic跨度/事务:
提取到userID后,调用New Relic的Java API将属性附加到当前的追踪实体上:
这个属性会被附加到当前Spring Boot应用处理该消息对应的跨度和事务中,这样在New Relic的追踪视图里就能看到整个链路的import com.newrelic.api.agent.NewRelic; // 在消息处理逻辑中添加 if (userId != null) { NewRelic.addCustomAttribute("userID", userId); }userID属性了。
内容的提问来源于stack exchange,提问作者Sathees Rajagopal
相关产品推荐
相关产品推荐

