in apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsInstrumentationHelper.java [273:350]
public void baseAfterReceive(Class<?> clazz, String methodName,
@Nullable final Object abstractSpanObj,
@Nullable final MESSAGE message,
@Nullable final Throwable throwable) {
AbstractSpan<?> abstractSpan = null;
if (abstractSpanObj instanceof AbstractSpan<?>) {
abstractSpan = (AbstractSpan<?>) abstractSpanObj;
}
DESTINATION destination = null;
String destinationName = null;
boolean discard = false;
boolean addDetails = true;
if (message != null) {
try {
destination = getJMSDestination(message);
destinationName = extractDestinationName(message, destination);
discard = ignoreDestination(destinationName);
} catch (Exception e) {
logger.error("Failed to retrieve meta info from Message", e);
}
if (abstractSpan instanceof Transaction<?>) {
Transaction<?> transaction = (Transaction<?>) abstractSpan;
if (discard) {
transaction.ignoreTransaction();
} else {
transaction
.withType(MESSAGING_TYPE)
.addLink(propertyAccessorGetter(), message);
addMessageDetails(message, abstractSpan);
}
} else if (abstractSpan != null) {
abstractSpan.addLink(propertyAccessorGetter(), message);
}
} else if (abstractSpan instanceof Transaction) {
// Do not report polling transactions if not yielding messages
((Transaction<?>) abstractSpan).ignoreTransaction();
addDetails = false;
}
if (abstractSpan != null) {
try {
if (discard) {
abstractSpan.requestDiscarding();
} else if (addDetails) {
if (message != null && destinationName != null) {
abstractSpan.appendToName(" from ");
addDestinationDetails(destination, destinationName, abstractSpan);
setMessageAge(message, abstractSpan);
}
abstractSpan.captureException(throwable);
}
} finally {
abstractSpan.deactivate().end();
}
}
if (!discard && tracer.currentTransaction() == null
&& message != null
&& messagingConfiguration.getMessagePollingTransactionStrategy() != MessagingConfiguration.JmsStrategy.POLLING
&& !"receiveNoWait".equals(methodName)) {
Transaction<?> messageHandlingTransaction = startJmsTransaction(message, clazz);
if (messageHandlingTransaction != null) {
messageHandlingTransaction.withType(MESSAGE_HANDLING)
.withName(RECEIVE_NAME_PREFIX);
if (destinationName != null) {
messageHandlingTransaction.appendToName(" from ");
addDestinationDetails(destination, destinationName, messageHandlingTransaction);
addMessageDetails(message, messageHandlingTransaction);
setMessageAge(message, messageHandlingTransaction);
}
messageHandlingTransaction.activate();
}
}
}