package rocks.inspectit.agent.java.sensor.method.remote.client.mq; import io.opentracing.propagation.TextMap; import rocks.inspectit.agent.java.config.impl.RegisteredSensorConfig; import rocks.inspectit.agent.java.sensor.method.remote.client.RemoteClientSensor; import rocks.inspectit.agent.java.tracing.core.adapter.ClientAdapterProvider; import rocks.inspectit.agent.java.tracing.core.adapter.ClientRequestAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.ResponseAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.empty.EmptyResponseAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.mq.MQRequestAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.mq.data.impl.JmsMessage; /** * Remote client sensor for intercepting JMS message sending. * <p> * Targeted instrumentation method: * <ul> * <li>{@code javax.jms.MessageProducer#send(javax.jms.Message)} * <li>{@code javax.jms.MessageProducer#send(javax.jms.Message int int long)} * <li>{@code javax.jms.MessageProducer#send(javax.jms.Queue javax.jms.Message)} * <li>{@code javax.jms.MessageProducer#send(javax.jms.Queue javax.jms.Message int int long)} * </ul> * <p> * Please note that this sensor would work with any method has the javax.jms.Message as one of the * parameters, as we are figuring out the parameter index by inspecting the * {@link RegisteredSensorConfig}. * * @author Ivan Senic */ public class JmsRemoteClientSensor extends RemoteClientSensor implements ClientAdapterProvider { /** * {@inheritDoc} */ @Override protected ClientAdapterProvider getClientAdapterProvider() { return this; } /** * {@inheritDoc} */ @Override public ClientRequestAdapter<TextMap> getClientRequestAdapter(Object object, Object[] parameters, RegisteredSensorConfig rsc) { Object message = getMessage(parameters, rsc); JmsMessage jmsMessage = new JmsMessage(message, CACHE); return new MQRequestAdapter(jmsMessage); } /** * {@inheritDoc} */ @Override public ResponseAdapter getClientResponseAdapter(Object object, Object[] parameters, Object result, RegisteredSensorConfig rsc) { return EmptyResponseAdapter.INSTANCE; } /** * Gets the message object from the parameters. This method will consult the * {@link RegisteredSensorConfig} in order to find parameter index with the FQN of * {@value JmsMessage#JAVAX_JMS_MESSAGE}. * * @param parameters * Parameters of method invocation. * @param rsc * {@link RegisteredSensorConfig} * @return Message object or <code>null</code> if one can not be located. */ private Object getMessage(Object[] parameters, RegisteredSensorConfig rsc) { int index = rsc.getParameterTypes().indexOf(JmsMessage.JAVAX_JMS_MESSAGE); if (index >= 0) { return parameters[index]; } return null; } }