package rocks.inspectit.agent.java.sensor.method.remote.client.http;
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.http.AsyncHttpClientRequestAdapter;
import rocks.inspectit.agent.java.tracing.core.adapter.http.HttpClientRequestAdapter;
import rocks.inspectit.agent.java.tracing.core.adapter.http.HttpResponseAdapter;
import rocks.inspectit.agent.java.tracing.core.adapter.http.data.HttpResponse;
import rocks.inspectit.agent.java.tracing.core.adapter.http.data.impl.AsyncHttpResponse;
import rocks.inspectit.agent.java.tracing.core.adapter.http.data.impl.SpringRestTemplateHttpClientRequest;
import rocks.inspectit.agent.java.tracing.core.adapter.http.data.impl.SpringRestTemplateHttpResponse;
/**
* Remote client sensor for intercepting HTTP calls made with Spring Rest Template wrapper.
* <p>
* Targeted instrumentation method:
* <ul>
* <li>{@code org.springframework.http.client.ClientHttpRequest#execute()}
* <li>{@code org.springframework.http.client.AsyncClientHttpRequest#executeAsync()}
* </ul>
*
* @author Ivan Senic
*/
public class SpringRestTemplateClientSensor extends RemoteClientSensor implements ClientAdapterProvider {
/**
* Target method name for the asynchronous execution.
*/
private static final String ASYNC_METHOD_NAME = "executeAsync";
/**
* {@inheritDoc}
*/
@Override
protected ClientAdapterProvider getClientAdapterProvider() {
return this;
}
/**
* {@inheritDoc}
*/
@Override
public ClientRequestAdapter<TextMap> getClientRequestAdapter(Object object, Object[] parameters, RegisteredSensorConfig rsc) {
Object request = object;
SpringRestTemplateHttpClientRequest clientRequest = new SpringRestTemplateHttpClientRequest(request, CACHE);
// we know which one we are going for, can be only executeAsync or execute
if (ASYNC_METHOD_NAME.equals(rsc.getTargetMethodName())) {
return new AsyncHttpClientRequestAdapter(clientRequest);
} else {
return new HttpClientRequestAdapter(clientRequest);
}
}
/**
* {@inheritDoc}
*/
@Override
public ResponseAdapter getClientResponseAdapter(Object object, Object[] parameters, Object result, RegisteredSensorConfig rsc) {
if (ASYNC_METHOD_NAME.equals(rsc.getTargetMethodName())) {
return new HttpResponseAdapter(AsyncHttpResponse.INSTANCE);
} else if (null != result) {
Object response = result;
HttpResponse httpResponse = new SpringRestTemplateHttpResponse(response, CACHE);
return new HttpResponseAdapter(httpResponse);
} else {
return EmptyResponseAdapter.INSTANCE;
}
}
}