diff --git a/CHANGES.md b/CHANGES.md index 20e358284..1d52e09bc 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,12 +15,14 @@ Release Notes. * Add plugin to support [brpc-java-3.x](https://github.com/baidu/starlight/tree/brpc-java-v3) * Update `compose-start-script.template` to make compatible with new version docker compose * Bump up grpc to 1.50.0 to fix CVE-2022-3171 +* Polish up nats plugin to unify MQ related tags #### Documentation * Update `configuration` doc about overriding default value as empty map/list accordingly. * Update plugin dev tags for cache relative tags. * Add plugin dev docs for virtual database tags. +* Add plugin dev docs for virtual MQ tags. All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/150?closed=1) diff --git a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jedis/v4/ConnectionSendCmdInterceptor.java b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jedis/v4/ConnectionSendCmdInterceptor.java index 05b17c695..447ebdfd7 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jedis/v4/ConnectionSendCmdInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jedis/v4/ConnectionSendCmdInterceptor.java @@ -24,7 +24,6 @@ import java.util.Iterator; public class ConnectionSendCmdInterceptor extends AbstractConnectionInterceptor { - //public void sendCommand(final CommandArguments args) @Override protected Iterator getCommands(Object[] allArguments) { CommandArguments commandArguments = (CommandArguments) allArguments[0]; diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/CreateDispatcherInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/CreateDispatcherInterceptor.java index e4686d256..837471692 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/CreateDispatcherInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/CreateDispatcherInterceptor.java @@ -17,6 +17,7 @@ package org.apache.skywalking.apm.plugin.nats.client; +import io.nats.client.Connection; import io.nats.client.MessageHandler; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; @@ -24,13 +25,14 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInt import java.lang.reflect.Method; +import static org.apache.skywalking.apm.plugin.nats.client.NatsCommons.buildServers; import static org.apache.skywalking.apm.plugin.nats.client.NatsCommons.buildTraceMsgHandler; public class CreateDispatcherInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - allArguments[0] = buildTraceMsgHandler((MessageHandler) allArguments[0]); + allArguments[0] = buildTraceMsgHandler(buildServers((Connection) objInst), (MessageHandler) allArguments[0]); } @Override diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/CreateSubInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/CreateSubInterceptor.java index 268b20422..9804ce77c 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/CreateSubInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/CreateSubInterceptor.java @@ -29,7 +29,9 @@ import static org.apache.skywalking.apm.plugin.nats.client.NatsCommons.buildTrac public class CreateSubInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - allArguments[3] = buildTraceMsgHandler((MessageHandler) allArguments[3]); + //set by NatsJetStreamConstructorInterceptor + final String servers = (String) objInst.getSkyWalkingDynamicField(); + allArguments[3] = buildTraceMsgHandler(servers , (MessageHandler) allArguments[3]); } @Override diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/DeliverReplyInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/DeliverReplyInterceptor.java index 5ff7f4b6d..c54e2af32 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/DeliverReplyInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/DeliverReplyInterceptor.java @@ -17,8 +17,10 @@ package org.apache.skywalking.apm.plugin.nats.client; +import io.nats.client.Connection; import io.nats.client.Message; import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; @@ -26,13 +28,15 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInt import java.lang.reflect.Method; +import static org.apache.skywalking.apm.plugin.nats.client.NatsCommons.buildServers; import static org.apache.skywalking.apm.plugin.nats.client.NatsCommons.createEntrySpan; public class DeliverReplyInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - createEntrySpan((Message) allArguments[0]); + final AbstractSpan entrySpan = createEntrySpan((Message) allArguments[0]); + Tags.MQ_BROKER.set(entrySpan, buildServers((Connection) objInst)); } @Override @@ -45,6 +49,5 @@ public class DeliverReplyInterceptor implements InstanceMethodsAroundInterceptor public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { AbstractSpan span = ContextManager.activeSpan(); span.log(t).errorOccurred(); - ContextManager.stopSpan(span); } } diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsCommons.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsCommons.java index 9d29df7d1..cf08c018d 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsCommons.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsCommons.java @@ -17,6 +17,7 @@ package org.apache.skywalking.apm.plugin.nats.client; +import io.nats.client.Connection; import io.nats.client.Message; import io.nats.client.MessageHandler; import org.apache.skywalking.apm.agent.core.context.CarrierItem; @@ -24,6 +25,7 @@ import org.apache.skywalking.apm.agent.core.context.ContextCarrier; import org.apache.skywalking.apm.agent.core.context.ContextManager; import org.apache.skywalking.apm.agent.core.context.tag.IntegerTag; import org.apache.skywalking.apm.agent.core.context.tag.StringTag; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; @@ -37,6 +39,7 @@ public class NatsCommons { private static final String REPLY_TO = "reply_to"; private static final String MSG_STATE = "state"; private static final String MSG = "message"; + private static final String UNKNOWN_SERVER = "unknown_server"; static boolean skipTrace(Object msg) { // include null @@ -64,11 +67,12 @@ public class NatsCommons { static void injectCarrier(Message message) { ContextCarrier contextCarrier = new ContextCarrier(); ContextManager.inject(contextCarrier); + contextCarrier.extensionInjector().injectSendingTimestamp(); CarrierItem next = contextCarrier.items(); while (next.hasNext()) { next = next.next(); if (StringUtil.isNotEmpty(next.getHeadKey()) - && StringUtil.isNotEmpty(next.getHeadValue())) { + && StringUtil.isNotEmpty(next.getHeadValue())) { message.getHeaders().add(next.getHeadKey(), next.getHeadValue()); } } @@ -77,6 +81,7 @@ public class NatsCommons { static void addCommonTag(AbstractSpan span, Message message) { Optional.ofNullable(message.getReplyTo()).ifPresent(v -> span.tag(new StringTag(REPLY_TO), v)); Optional.ofNullable(message.getSID()).ifPresent(v -> span.tag(new StringTag(SID), v)); + Tags.MQ_QUEUE.set(span, message.getSubject()); span.setComponent(ComponentsDefine.NATS); SpanLayer.asMQ(span); if (message.getStatus() != null) { @@ -92,7 +97,7 @@ public class NatsCommons { } } - static MessageHandler buildTraceMsgHandler(MessageHandler msgHandler) { + static MessageHandler buildTraceMsgHandler(String servers, MessageHandler msgHandler) { if (msgHandler == null) { return null; } @@ -102,6 +107,7 @@ public class NatsCommons { return; } AbstractSpan span = NatsCommons.createEntrySpan(msg); + Tags.MQ_BROKER.set(span, servers); try { msgHandler.onMessage(msg); } catch (Exception e) { @@ -113,4 +119,9 @@ public class NatsCommons { }; } + + static String buildServers(Connection connection) { + return connection.getServers().stream().reduce((a, b) -> a + "," + b).orElse(UNKNOWN_SERVER); + } + } diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/SocketDataPortConnectInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsConnectionWriterConstructorInterceptor.java similarity index 54% rename from apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/SocketDataPortConnectInterceptor.java rename to apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsConnectionWriterConstructorInterceptor.java index 4d3be6a5f..927b0cfdd 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/SocketDataPortConnectInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsConnectionWriterConstructorInterceptor.java @@ -17,27 +17,17 @@ package org.apache.skywalking.apm.plugin.nats.client; +import io.nats.client.Connection; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -import java.lang.reflect.Method; +import static org.apache.skywalking.apm.plugin.nats.client.NatsCommons.buildServers; -public class SocketDataPortConnectInterceptor implements InstanceMethodsAroundInterceptor { - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - - } +public class NatsConnectionWriterConstructorInterceptor implements InstanceConstructorInterceptor { @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - //Hold current serverURI - objInst.setSkyWalkingDynamicField(allArguments[0]); - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { - + public void onConstruct(final EnhancedInstance objInst, final Object[] allArguments) throws Throwable { + Connection connection = (Connection) allArguments[0]; + objInst.setSkyWalkingDynamicField(buildServers(connection)); } } diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsJetStreamConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsJetStreamConstructorInterceptor.java new file mode 100644 index 000000000..967e18e1c --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsJetStreamConstructorInterceptor.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.skywalking.apm.plugin.nats.client; + +import io.nats.client.Connection; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; + +import static org.apache.skywalking.apm.plugin.nats.client.NatsCommons.buildServers; + +public class NatsJetStreamConstructorInterceptor implements InstanceConstructorInterceptor { + @Override + public void onConstruct(final EnhancedInstance objInst, final Object[] allArguments) throws Throwable { + final Connection connection = (Connection) allArguments[0]; + objInst.setSkyWalkingDynamicField(buildServers(connection)); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsSubscriptionConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsSubscriptionConstructorInterceptor.java new file mode 100644 index 000000000..a94065b1f --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/NatsSubscriptionConstructorInterceptor.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.skywalking.apm.plugin.nats.client; + +import io.nats.client.Connection; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; + +import static org.apache.skywalking.apm.plugin.nats.client.NatsCommons.buildServers; + +public class NatsSubscriptionConstructorInterceptor implements InstanceConstructorInterceptor { + @Override + public void onConstruct(final EnhancedInstance objInst, final Object[] allArguments) throws Throwable { + Connection connection = (Connection) allArguments[3]; + objInst.setSkyWalkingDynamicField(buildServers(connection)); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/SubscriptionNextMsgInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/SubscriptionNextMsgInterceptor.java index e2a207307..ca81d5c56 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/SubscriptionNextMsgInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/SubscriptionNextMsgInterceptor.java @@ -19,6 +19,7 @@ package org.apache.skywalking.apm.plugin.nats.client; import io.nats.client.Message; import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; @@ -39,9 +40,11 @@ public class SubscriptionNextMsgInterceptor implements InstanceMethodsAroundInte if (ret == null) { return null; } - + // set by NatsSubscriptionConstructorInterceptor + String servers = (String) objInst.getSkyWalkingDynamicField(); Message msg = (Message) ret; AbstractSpan span = createEntrySpan(msg); + Tags.MQ_BROKER.set(span , servers); // Close the span immediately , as no chance to trace what user want to do ContextManager.stopSpan(span); return ret; diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/WriterQueueInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/WriterQueueInterceptor.java index e931d20c9..0b1a02dbb 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/WriterQueueInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/WriterQueueInterceptor.java @@ -62,7 +62,6 @@ public class WriterQueueInterceptor implements InstanceMethodsAroundInterceptor @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { - AbstractSpan span = ContextManager.activeSpan().errorOccurred().log(t); - ContextManager.stopSpan(span); + ContextManager.activeSpan().errorOccurred().log(t); } } diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/WriterSendMessageBatchInterceptor.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/WriterSendMessageBatchInterceptor.java index 802bfd637..c238f9a55 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/WriterSendMessageBatchInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/WriterSendMessageBatchInterceptor.java @@ -21,6 +21,7 @@ import io.nats.client.Message; import io.nats.client.impl.NatsMessage; import org.apache.skywalking.apm.agent.core.context.ContextManager; import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.plugin.PluginException; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; @@ -53,13 +54,15 @@ public class WriterSendMessageBatchInterceptor implements InstanceMethodsAroundI @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { Object next = allArguments[0]; - String serverURI = (String) ((EnhancedInstance) allArguments[1]).getSkyWalkingDynamicField(); + // set by NatsConnectionWriterConstructorInterceptor + final String services = (String) objInst.getSkyWalkingDynamicField(); while (next != null) { if (!skipTrace(next)) { Message message = (Message) next; EnhancedInstance enhanced = (EnhancedInstance) next; - AbstractSpan span = ContextManager.createExitSpan("Nats/Pub/" + message.getSubject(), serverURI); + AbstractSpan span = ContextManager.createExitSpan("Nats/Pub/" + message.getSubject(), services); addCommonTag(span, message); + Tags.MQ_BROKER.set(span, services); Optional.ofNullable(enhanced.getSkyWalkingDynamicField()) .ifPresent(snapshot -> ContextManager.continued((ContextSnapshot) snapshot)); injectCarrier(message); diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsConnectionWriterInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsConnectionWriterInstrumentation.java index ec2bd9c0b..f3a315314 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsConnectionWriterInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsConnectionWriterInstrumentation.java @@ -33,6 +33,7 @@ public class NatsConnectionWriterInstrumentation extends ClassInstanceMethodsEnh private static final String ENHANCE_CLASS = "io.nats.client.impl.NatsConnectionWriter"; private static final String PUBLISH_INTERCEPTOR_CLASS_NAME = "org.apache.skywalking.apm.plugin.nats.client.WriterSendMessageBatchInterceptor"; private static final String QUEUE_INTERCEPTOR_CLASS_NAME = "org.apache.skywalking.apm.plugin.nats.client.WriterQueueInterceptor"; + private static final String CONSTRUCTOR_INTERCEPTOR_CLASS_NAME = "org.apache.skywalking.apm.plugin.nats.client.NatsConnectionWriterConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { @@ -41,7 +42,19 @@ public class NatsConnectionWriterInstrumentation extends ClassInstanceMethodsEnh @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; + return new ConstructorInterceptPoint[] { + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(1); + } + + @Override + public String getConstructorInterceptor() { + return CONSTRUCTOR_INTERCEPTOR_CLASS_NAME; + } + } + }; } @Override diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsJetStreamInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsJetStreamInstrumentation.java index 88dc357e1..a635658c4 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsJetStreamInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsJetStreamInstrumentation.java @@ -32,6 +32,7 @@ public class NatsJetStreamInstrumentation extends ClassInstanceMethodsEnhancePlu private static final String ENHANCE_CLASS = "io.nats.client.impl.NatsJetStream"; private static final String CREATE_SUB_INTERCEPTOR = "org.apache.skywalking.apm.plugin.nats.client.CreateSubInterceptor"; + private static final String CONSTRUCTOR_INTERCEPTOR = "org.apache.skywalking.apm.plugin.nats.client.NatsJetStreamConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { @@ -40,7 +41,19 @@ public class NatsJetStreamInstrumentation extends ClassInstanceMethodsEnhancePlu @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; + return new ConstructorInterceptPoint[] { + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(2); + } + + @Override + public String getConstructorInterceptor() { + return CONSTRUCTOR_INTERCEPTOR; + } + } + }; } @Override diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsSubscriptionInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsSubscriptionInstrumentation.java index abbd8bb73..a04433722 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsSubscriptionInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/NatsSubscriptionInstrumentation.java @@ -32,6 +32,7 @@ public class NatsSubscriptionInstrumentation extends ClassInstanceMethodsEnhance private static final String ENHANCE_CLASS = "io.nats.client.impl.NatsSubscription"; private static final String NEXT_MSG_INTERCEPTOR = "org.apache.skywalking.apm.plugin.nats.client.SubscriptionNextMsgInterceptor"; + private static final String CONSTRUCTOR_INTERCEPTOR = "org.apache.skywalking.apm.plugin.nats.client.NatsSubscriptionConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { @@ -40,7 +41,19 @@ public class NatsSubscriptionInstrumentation extends ClassInstanceMethodsEnhance @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; + return new ConstructorInterceptPoint[] { + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(5); + } + + @Override + public String getConstructorInterceptor() { + return CONSTRUCTOR_INTERCEPTOR; + } + } + }; } @Override diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/SocketDataPortInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/SocketDataPortInstrumentation.java deleted file mode 100644 index 2dcdfe1fd..000000000 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/nats/client/define/SocketDataPortInstrumentation.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.skywalking.apm.plugin.nats.client.define; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; - -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; - -public class SocketDataPortInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "io.nats.client.impl.SocketDataPort"; - private static final String CONSTRUCTOR_INTERCEPTOR = "org.apache.skywalking.apm.plugin.nats.client.SocketDataPortConnectInterceptor"; - - @Override - protected ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[]{ - new InstanceMethodsInterceptPoint() { - @Override - public ElementMatcher getMethodsMatcher() { - return named("connect").and(takesArguments(3)); - } - - @Override - public String getMethodsInterceptor() { - return CONSTRUCTOR_INTERCEPTOR; - } - - @Override - public boolean isOverrideArgs() { - return false; - } - } - }; - } -} \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/resources/skywalking-plugin.def index 9f8a26701..cc15654fc 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.15.x-plugin/src/main/resources/skywalking-plugin.def @@ -18,5 +18,4 @@ nats-client-2.14.x-2.15.x=org.apache.skywalking.apm.plugin.nats.client.define.Na nats-client-2.14.x-2.15.x=org.apache.skywalking.apm.plugin.nats.client.define.NatsConnectionInstrumentation nats-client-2.14.x-2.15.x=org.apache.skywalking.apm.plugin.nats.client.define.NatsConnectionWriterInstrumentation nats-client-2.14.x-2.15.x=org.apache.skywalking.apm.plugin.nats.client.define.NatsSubscriptionInstrumentation -nats-client-2.14.x-2.15.x=org.apache.skywalking.apm.plugin.nats.client.define.NatsJetStreamInstrumentation -nats-client-2.14.x-2.15.x=org.apache.skywalking.apm.plugin.nats.client.define.SocketDataPortInstrumentation \ No newline at end of file +nats-client-2.14.x-2.15.x=org.apache.skywalking.apm.plugin.nats.client.define.NatsJetStreamInstrumentation \ No newline at end of file diff --git a/docs/en/setup/service-agent/java-agent/Java-Plugin-Development-Guide.md b/docs/en/setup/service-agent/java-agent/Java-Plugin-Development-Guide.md index 289a20efa..29438b856 100644 --- a/docs/en/setup/service-agent/java-agent/Java-Plugin-Development-Guide.md +++ b/docs/en/setup/service-agent/java-agent/Java-Plugin-Development-Guide.md @@ -186,7 +186,7 @@ The value of `x-le` should be in JSON format. There are two options: } ``` -#### Vitural Database Relative Tags +#### Virtual Database Relative Tags SkyWalking analysis Database(SQL-like) performance metrics through the following tags. ```java @@ -199,8 +199,8 @@ SkyWalking analysis Database(SQL-like) performance metrics through the following Read [backend's virtual database doc](https://skywalking.apache.org/docs/main/next/en/setup/service-agent/virtual-database/) for more details. -#### Vitural Cache Relative Tags -Skywalking analysis cache performance related metrics through the following tags. +#### Virtual Cache Relative Tags +SkyWalking analysis cache performance related metrics through the following tags. ```java public static final StringTag CACHE_TYPE = new StringTag(15, "cache.type"); @@ -209,7 +209,7 @@ Skywalking analysis cache performance related metrics through the following tags public static final StringTag CACHE_KEY = new StringTag(18, "cache.key"); ``` -* `cache.type` indicates the cache type , usually it's cache client library name (e.g. Jedis) +* `cache.type` indicates the cache type , usually it's official name of cache (e.g. Redis) * `cache.cmd` indicates the cache command that would be sent to cache server (e.g. setnx) * `cache.op` indicates the command is used for `write` or `read` operation , usually the value is converting from `command` * `cache.key` indicates the cache key that would be sent to cache server , this tag maybe null , as string type key would be collected usually. @@ -217,6 +217,22 @@ Skywalking analysis cache performance related metrics through the following tags In order to decide which `op` should be converted to flexibly , It's better that providing config property . Reference [Jedis-4.x-plugin](https://github.com/apache/skywalking-java/blob/main/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jedis/v4/JedisPluginConfig.java) +#### Virtual Message Queue (MQ) Relative Tags + +SkyWalking analysis MQ performance related metrics through the following tags. + +```java + public static final StringTag MQ_QUEUE = new StringTag(7, "mq.queue"); + public static final StringTag MQ_BROKER = new StringTag(8, "mq.broker"); + public static final StringTag MQ_TOPIC = new StringTag(9, "mq.topic"); + public static final StringTag TRANSMISSION_LATENCY = new StringTag(15, "transmission.latency", false); +``` +* `mq.brokers` indicates MQ address ,SkyWalking organize the value as service . Both of consumer , producer must record the tag , and ensure the value is consistent . +* `mq.queue` indicates MQ queue name +* `mq.topic` indicates MQ topic name , It's optional as some MQ don't hava concept of `topic` +* `transmission.latency` The transmission latency from consumer to producer. Usually you needn't to record this tag manually, instead to call `contextCarrier.extensionInjector().injectSendingTimestamp();` to record tag `sendingTimestamp` on producer side , and SkyWalking would record this tag on consumer side if `sw8-x` context carrier(from producer side) contains `sendingTimestamp` + + ### Advanced APIs #### Async Span APIs diff --git a/test/plugin/scenarios/nats-2.14.x-2.15.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/nats-2.14.x-2.15.x-scenario/config/expectedData.yaml index 2ce382794..facf8d25d 100644 --- a/test/plugin/scenarios/nats-2.14.x-2.15.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/nats-2.14.x-2.15.x-scenario/config/expectedData.yaml @@ -33,7 +33,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: Nats/Pub/$JS.API.STREAM.INFO.scenario-8080-test-stream-3 @@ -50,7 +50,9 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} + refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.STREAM.INFO.scenario-8080-test-stream-3, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -72,7 +74,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: Nats/Pub/$JS.API.STREAM.CREATE.scenario-8080-test-stream-3 @@ -89,7 +91,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.STREAM.CREATE.scenario-8080-test-stream-3, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -111,7 +114,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: Nats/Pub/$JS.API.CONSUMER.CREATE.scenario-8080-test-stream-3 @@ -128,7 +131,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.CONSUMER.CREATE.scenario-8080-test-stream-3, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -150,7 +154,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: Nats/Pub/$JS.API.STREAM.INFO.scenario-8080-test-stream-4 @@ -167,7 +171,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.STREAM.INFO.scenario-8080-test-stream-4, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -189,7 +194,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: Nats/Pub/$JS.API.STREAM.CREATE.scenario-8080-test-stream-4 @@ -206,7 +211,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.STREAM.CREATE.scenario-8080-test-stream-4, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -228,7 +234,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.STREAM.NAMES, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -250,7 +257,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: Nats/Pub/Enqueue/$JS.API.STREAM.NAMES @@ -267,7 +274,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: Nats/Pub/$JS.API.CONSUMER.INFO.scenario-8080-test-stream-4.scenario-8080-test-stream-4-durable @@ -284,7 +291,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.CONSUMER.INFO.scenario-8080-test-stream-4.scenario-8080-test-stream-4-durable, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -306,6 +314,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: Nats/Pub/$JS.API.CONSUMER.DURABLE.CREATE.scenario-8080-test-stream-4.scenario-8080-test-stream-4-durable @@ -322,7 +331,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.CONSUMER.DURABLE.CREATE.scenario-8080-test-stream-4.scenario-8080-test-stream-4-durable, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -344,7 +354,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/Enqueue/$JS.API.CONSUMER.MSG.NEXT.scenario-8080-test-stream-4.scenario-8080-test-stream-4-durable, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, @@ -366,7 +377,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - segmentId: not null spans: - operationName: HEAD:/nats/check @@ -400,7 +411,8 @@ segmentItems: peer: nats://nats-server:4222 skipAnalysis: false tags: - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: 'GET:/nats/start', networkAddress: '', refType: CrossThread, parentSpanId: 1, parentTraceSegmentId: not null, @@ -421,7 +433,10 @@ segmentItems: peer: '' skipAnalysis: false tags: + - {key: transmission.latency, value: not null} - {key: sid, value: '1'} + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/scenario-8080-subject-1, networkAddress: 'nats://nats-server:4222', refType: CrossProcess, parentSpanId: 0, parentTraceSegmentId: not null, @@ -443,7 +458,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: 'GET:/nats/start', networkAddress: '', refType: CrossThread, parentSpanId: 2, parentTraceSegmentId: not null, @@ -464,7 +480,8 @@ segmentItems: peer: nats://nats-server:4222 skipAnalysis: false tags: - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Sub/scenario-8080-subject-2, networkAddress: '', refType: CrossThread, parentSpanId: 1, parentTraceSegmentId: not null, @@ -485,7 +502,8 @@ segmentItems: peer: '' skipAnalysis: false tags: - + - {key: mq.queue, value: not null} + - operationName: Nats/Sub/scenario-8080-subject-2 operationId: 0 parentSpanId: -1 @@ -499,8 +517,11 @@ segmentItems: peer: '' skipAnalysis: false tags: + - {key: transmission.latency, value: not null} - {key: reply_to, value: not null} - {key: sid, value: '1'} + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/scenario-8080-subject-2, networkAddress: 'nats://nats-server:4222', refType: CrossProcess, parentSpanId: 0, parentTraceSegmentId: not null, @@ -521,7 +542,10 @@ segmentItems: peer: '' skipAnalysis: false tags: + - {key: transmission.latency, value: not null} - {key: sid, value: '1'} + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: not null, networkAddress: 'nats://nats-server:4222', refType: CrossProcess, parentSpanId: 0, @@ -544,7 +568,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: 'GET:/nats/start', networkAddress: '', refType: CrossThread, parentSpanId: 3, parentTraceSegmentId: not null, @@ -565,7 +590,8 @@ segmentItems: peer: '' skipAnalysis: false tags: - + - {key: mq.queue, value: not null} + - operationName: Nats/Sub/scenario-8080-subject-3 operationId: 0 parentSpanId: -1 @@ -579,8 +605,12 @@ segmentItems: peer: '' skipAnalysis: false tags: + - {key: transmission.latency, value: not null} - {key: reply_to, value: not null} - {key: sid, value: '2'} + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} + refs: - {parentEndpoint: Nats/Pub/scenario-8080-subject-3, networkAddress: 'nats://nats-server:4222', refType: CrossProcess, parentSpanId: 0, parentTraceSegmentId: not null, @@ -601,7 +631,8 @@ segmentItems: peer: nats://nats-server:4222 skipAnalysis: false tags: - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Sub/scenario-8080-subject-3, networkAddress: '', refType: CrossThread, parentSpanId: 1, parentTraceSegmentId: not null, @@ -623,7 +654,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: 'GET:/nats/start', networkAddress: '', refType: CrossThread, parentSpanId: 4, parentTraceSegmentId: not null, @@ -645,7 +677,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: 'GET:/nats/start', networkAddress: '', refType: CrossThread, parentSpanId: 6, parentTraceSegmentId: not null, @@ -666,8 +699,11 @@ segmentItems: peer: '' skipAnalysis: false tags: + - {key: transmission.latency, value: not null} - {key: reply_to, value: not null} - {key: sid, value: '2'} + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: Nats/Pub/scenario-8080-subject-4, networkAddress: 'nats://nats-server:4222', refType: CrossProcess, parentSpanId: 0, parentTraceSegmentId: not null, @@ -688,7 +724,7 @@ segmentItems: peer: '' skipAnalysis: false tags: - + - {key: mq.queue, value: not null} - operationName: Nats/Pub/Enqueue/scenario-8080-subject-2 operationId: 0 parentSpanId: 0 @@ -703,7 +739,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - operationName: Nats/Pub/Enqueue/$JS.API.STREAM.INFO.scenario-8080-test-stream-3 operationId: 0 parentSpanId: 0 @@ -718,7 +755,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - operationName: Nats/Pub/Enqueue/scenario-8080-subject-3 operationId: 0 parentSpanId: 0 @@ -733,7 +770,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - operationName: Nats/Pub/Enqueue/$JS.API.STREAM.INFO.scenario-8080-test-stream-4 operationId: 0 parentSpanId: 0 @@ -748,7 +785,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - operationName: Nats/Pub/Enqueue/scenario-8080-subject-4 operationId: 0 parentSpanId: 0 @@ -763,7 +800,7 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} - operationName: GET:/nats/start operationId: 0 parentSpanId: -1 @@ -796,7 +833,8 @@ segmentItems: skipAnalysis: false tags: - {key: reply_to, value: not null} - + - {key: mq.queue, value: not null} + - {key: mq.broker, value: 'nats://nats-server:4222'} refs: - {parentEndpoint: 'GET:/nats/start', networkAddress: '', refType: CrossThread, parentSpanId: 5, parentTraceSegmentId: not null,