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.HttpClientRequestAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.http.HttpResponseAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.http.data.HttpRequest; import rocks.inspectit.agent.java.tracing.core.adapter.http.data.HttpResponse; import rocks.inspectit.agent.java.tracing.core.adapter.http.data.impl.ApacheHttpClientV40HttpClientRequest; import rocks.inspectit.agent.java.tracing.core.adapter.http.data.impl.ApacheHttpClientV40HttpResponse; /** * Remote client sensor for intercepting HTTP calls made with Apache HTTP client. Targeted to work * with all 4.x versions of Apache HTTP client. Currently supports only sync calls. * <p> * Targeted instrumentation method: * <ul> * <li>{@code org.apache.http.impl.client.CloseableHttpClient#doExecute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)} * <li>{@code org.apache.http.client.HttpClient#execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)} * <li>{@code org.apache.http.client.RequestDirector#execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)} * </ul> * * @author Ivan Senic */ public class ApacheHttpClientV40Sensor extends RemoteClientSensor implements ClientAdapterProvider { /** * {@inheritDoc} */ @Override public ClientRequestAdapter<TextMap> getClientRequestAdapter(Object object, Object[] parameters, RegisteredSensorConfig rsc) { // Apache HTTP request is second parameter Object httpRequest = parameters[1]; HttpRequest request = new ApacheHttpClientV40HttpClientRequest(httpRequest, CACHE); return new HttpClientRequestAdapter(request); } /** * {@inheritDoc} */ @Override public ResponseAdapter getClientResponseAdapter(Object object, Object[] parameters, Object result, RegisteredSensorConfig rsc) { // Apache HTTP response is result of method invocation // in case of exceptions, result will be null, thus we can only use empty adapter if (null != result) { Object httpResponse = result; HttpResponse response = new ApacheHttpClientV40HttpResponse(httpResponse, CACHE); return new HttpResponseAdapter(response); } else { return EmptyResponseAdapter.INSTANCE; } } /** * {@inheritDoc} */ @Override protected ClientAdapterProvider getClientAdapterProvider() { return this; } }