diff --git a/apache-axis2-2.0/build.gradle b/apache-axis2-2.0/build.gradle new file mode 100644 index 0000000..48344c1 --- /dev/null +++ b/apache-axis2-2.0/build.gradle @@ -0,0 +1,31 @@ + +// Build.gradle generated for instrumentation module apache-axis2 + +apply plugin: 'java' + +dependencies { + implementation 'org.apache.axis2:axis2-kernel:2.0.0' + implementation 'org.apache.axis2:axis2-transport-http:2.0.0' + implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' + + // New Relic Labs Java Agent dependencies + implementation 'com.newrelic.agent.java:newrelic-agent:6.4.0' + implementation 'com.newrelic.agent.java:newrelic-api:6.4.0' + implementation fileTree(include: ['*.jar'], dir: '../libs') + implementation fileTree(include: ['*.jar'], dir: '../test-lib') +} + +jar { + manifest { + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.apache-axis2' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.0 + } +} + +verifyInstrumentation { + passes ('org.apache.axis2:axis2-transport-http:[2.0.0,)') { + compile( 'jakarta.servlet:jakarta.servlet-api:6.0.0') + } +} diff --git a/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2ExtendedRequest.java b/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2ExtendedRequest.java new file mode 100644 index 0000000..545cfe5 --- /dev/null +++ b/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2ExtendedRequest.java @@ -0,0 +1,64 @@ +package com.nr.agent.instrumentation.axis2; + +import java.util.Enumeration; + +import org.apache.axis2.transport.http.server.AxisHttpRequest; + +import com.newrelic.api.agent.ExtendedRequest; +import com.newrelic.api.agent.HeaderType; + +public class Axis2ExtendedRequest extends ExtendedRequest { + + private AxisHttpRequest request = null; + + public Axis2ExtendedRequest(AxisHttpRequest req) { + request = req; + } + + @Override + public String getRequestURI() { + return request.getRequestURI(); + } + + @Override + public String getRemoteUser() { + return null; + } + + @Override + public Enumeration getParameterNames() { + + return null; + } + + @Override + public String[] getParameterValues(String name) { + return new String[] {}; + } + + @Override + public Object getAttribute(String name) { + return null; + } + + @Override + public String getCookieValue(String name) { + return null; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.HTTP; + } + + @Override + public String getHeader(String name) { + return request.getFirstHeader(name).getValue(); + } + + @Override + public String getMethod() { + return request.getMethod(); + } + +} diff --git a/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2Headers.java b/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2Headers.java new file mode 100644 index 0000000..aae7a8c --- /dev/null +++ b/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2Headers.java @@ -0,0 +1,67 @@ +package com.nr.agent.instrumentation.axis2; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.apache.axis2.context.MessageContext; + +import com.newrelic.api.agent.HeaderType; +import com.newrelic.api.agent.Headers; + +public class Axis2Headers implements Headers { + + private MessageContext msgCtx; + + public Axis2Headers(MessageContext messageCtx) { + msgCtx = messageCtx; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.HTTP; + } + + @Override + public String getHeader(String key) { + return (String) msgCtx.getProperty(key); + } + + @Override + public Collection getHeaders(String name) { + List list = new ArrayList<>(); + String value = getHeader(name); + if(value != null && !value.isEmpty()) { + list.add(value); + } + return list; + } + + @Override + public void setHeader(String name, String value) { + msgCtx.setProperty(name, value); + } + + @Override + public void addHeader(String name, String value) { + msgCtx.setProperty(name, value); + } + + @Override + public Collection getHeaderNames() { + Iterator iterator = msgCtx.getPropertyNames(); + List names = new ArrayList<>(); + while(iterator.hasNext()) { + names.add(iterator.next()); + } + return names; + } + + @Override + public boolean containsHeader(String name) { + Collection names = getHeaderNames(); + return names.contains(name); + } + +} diff --git a/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2Utils.java b/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2Utils.java new file mode 100644 index 0000000..633d34c --- /dev/null +++ b/apache-axis2-2.0/src/main/java/com/nr/agent/instrumentation/axis2/Axis2Utils.java @@ -0,0 +1,77 @@ +package com.nr.agent.instrumentation.axis2; + +import java.util.ArrayList; + +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.description.AxisService; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; + +import jakarta.servlet.http.HttpServletRequest; + +public class Axis2Utils { + + public static String[] getAxisTransactionName(MessageContext msgContext, String requestURI, String soapAction) { + ArrayList transactionNameList = new ArrayList(); + if (msgContext != null) { + AxisService axisService = msgContext.getAxisService(); + AxisOperation axisOperation = msgContext.getAxisOperation(); + if(soapAction == null) { + soapAction = msgContext.getSoapAction(); + } + if(axisService != null && axisService.getName() != null) { + String serviceName = axisService.getName(); + if(!serviceName.isEmpty()) { + transactionNameList.add(serviceName); + AgentBridge.publicApi.addCustomParameter("Service Name", serviceName); + } + } + if(axisOperation != null && axisOperation.getName() != null) { + String opName = axisOperation.getName().getLocalPart(); + if(!opName.isEmpty()) { + transactionNameList.add(opName); + NewRelic.addCustomParameter("Operation Name", opName); + } + } + } + + if (soapAction != null && !soapAction.isEmpty()) { + String soapActionName = getSoapActionName(soapAction); + NewRelic.addCustomParameter("SOAP Action", soapActionName); + if(transactionNameList.isEmpty()) { + transactionNameList.add(soapActionName); + } + } + + if (requestURI != null && !requestURI.isEmpty()) { + NewRelic.addCustomParameter("Request URI", requestURI); + if(transactionNameList.isEmpty()) { + transactionNameList.add(requestURI); + } + } + + if(!transactionNameList.isEmpty()) { + return transactionNameList.toArray(new String[transactionNameList.size()]); + } else { + return new String[0]; + } + } + + public static String[] getAxisTransactionName(HttpServletRequest request) { + return getAxisTransactionName(null, request.getRequestURI(), null); + } + + public static String[] getAxisTransactionName(MessageContext msgContext) { + return getAxisTransactionName(msgContext, null, null); + } + + public static String getSoapActionName(String soapAction) { + if (soapAction.startsWith("urn:")) { + return soapAction.substring(4); + } else { + return soapAction; + } + } +} \ No newline at end of file diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/client/OperationClient.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/client/OperationClient.java new file mode 100644 index 0000000..8ad1c1a --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/client/OperationClient.java @@ -0,0 +1,28 @@ +package org.apache.axis2.client; + +import org.apache.axis2.context.OperationContext; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type=MatchType.BaseClass) +public abstract class OperationClient { + + public abstract OperationContext getOperationContext(); + + @Trace + public void executeImpl(boolean b) { + + OperationContext oc1 = getOperationContext(); + if(oc1 != null) { + String opName = oc1.getOperationName(); + String servicename = oc1.getServiceName(); + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","OperationClient",getClass().getSimpleName(),"execute",servicename,opName); + + } + Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/client/ServiceClient.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/client/ServiceClient.java new file mode 100644 index 0000000..362af41 --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/client/ServiceClient.java @@ -0,0 +1,76 @@ +package org.apache.axis2.client; + +import javax.xml.namespace.QName; + +import org.apache.axiom.om.OMElement; +import org.apache.axis2.client.async.AxisCallback; +import org.apache.axis2.context.ServiceContext; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave +public abstract class ServiceClient { + + public abstract ServiceContext getServiceContext(); + + @Trace + public OMElement sendReceive(QName operationQName, OMElement xmlPayload) { + ServiceContext serviceCtx = getServiceContext(); + if(serviceCtx != null) { + String serviceName = serviceCtx.getName(); + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Axis2","ServiceClient",serviceName,"sendReceive"); + } + return Weaver.callOriginal(); + } + + @Trace + public void sendReceiveNonBlocking(QName operation, OMElement elem, AxisCallback callback) { + if(callback.token == null) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + callback.token = t; + } else if(t != null) { + t.expire(); + t = null; + } + } + ServiceContext serviceCtx = getServiceContext(); + if(serviceCtx != null) { + String serviceName = serviceCtx.getName(); + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Axis2","ServiceClient",serviceName,"sendReceiveNonBlocking"); + } + Weaver.callOriginal(); + } + + @Trace + public void sendReceiveNonBlocking(OMElement elem, AxisCallback callback) { + if(callback.token == null) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + callback.token = t; + } else if(t != null) { + t.expire(); + t = null; + } + } + ServiceContext serviceCtx = getServiceContext(); + if(serviceCtx != null) { + String serviceName = serviceCtx.getName(); + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Axis2","ServiceClient",serviceName,"sendReceiveNonBlocking"); + } + Weaver.callOriginal(); + } + + public void sendRobust(QName operation, OMElement elem) { + ServiceContext serviceCtx = getServiceContext(); + if(serviceCtx != null) { + String serviceName = serviceCtx.getName(); + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Axis2","ServiceClient",serviceName,"sendRobust"); + } + Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/client/async/AxisCallback.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/client/async/AxisCallback.java new file mode 100644 index 0000000..68d342b --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/client/async/AxisCallback.java @@ -0,0 +1,56 @@ +package org.apache.axis2.client.async; + +import org.apache.axis2.context.MessageContext; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public abstract class AxisCallback { + + @NewField + public Token token = null; + + @Trace(async = true) + public void onMessage(MessageContext msgContext) { + if(token != null) { + token.linkAndExpire(); + token = null; + } + Weaver.callOriginal(); + } + + @Trace(async = true) + public void onFault(MessageContext msgContext) { + Exception e = msgContext.getFailureReason(); + if(e != null) NewRelic.noticeError(e); + if(token != null) { + token.linkAndExpire(); + token = null; + } + Weaver.callOriginal(); + } + + @Trace(async = true) + public void onError(Exception e) { + NewRelic.noticeError(e); + if(token != null) { + token.linkAndExpire(); + token = null; + } + Weaver.callOriginal(); + } + + public void onComplete() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/AxisEngine.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/AxisEngine.java new file mode 100644 index 0000000..48505e3 --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/AxisEngine.java @@ -0,0 +1,71 @@ +package org.apache.axis2.engine; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.context.MessageContext; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TransactionNamePriority; +import com.newrelic.api.agent.TransportType; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.agent.instrumentation.axis2.Axis2Headers; + +@Weave(type=MatchType.ExactClass) +public abstract class AxisEngine { + + @Trace(dispatcher=true) + public static void send(MessageContext msgContext) throws AxisFault { + Axis2Headers wrapper = new Axis2Headers(msgContext); + NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(wrapper); + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.CUSTOM_LOW, true, "AxisEngine", new String[] {"Send",msgContext.getSoapAction()}); + NewRelic.addCustomParameter("Message ID", msgContext.getMessageID()); + Weaver.callOriginal(); + } + + @Trace(dispatcher=true) + public static Handler.InvocationResponse receive(MessageContext msgContext) throws AxisFault { + Axis2Headers wrapper = new Axis2Headers(msgContext); + NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(wrapper); + NewRelic.addCustomParameter("Message ID", msgContext.getMessageID()); + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.CUSTOM_LOW, true, "AxisEngine", new String[] {"Receive",msgContext.getSoapAction()}); + return Weaver.callOriginal(); + } + + @Trace(dispatcher=true) + public static void sendFault(MessageContext msgContext) throws AxisFault { + Axis2Headers wrapper = new Axis2Headers(msgContext); + NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(wrapper); + Weaver.callOriginal(); + } + + @Trace(dispatcher=true) + public static Handler.InvocationResponse resume(MessageContext msgContext) throws AxisFault { + Axis2Headers wrapper = new Axis2Headers(msgContext); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, wrapper); + return Weaver.callOriginal(); + } + + @Trace(dispatcher=true) + public static Handler.InvocationResponse resumeReceive(MessageContext msgContext) throws AxisFault { + Axis2Headers wrapper = new Axis2Headers(msgContext); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, wrapper); + return Weaver.callOriginal(); + } + + @Trace(dispatcher=true) + public static Handler.InvocationResponse resumeSend(MessageContext msgContext) throws AxisFault { + Axis2Headers wrapper = new Axis2Headers(msgContext); + NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(wrapper); + return Weaver.callOriginal(); + } + + @Trace(dispatcher=true) + public static void resumeSendFault(MessageContext msgContext) throws AxisFault { + Axis2Headers wrapper = new Axis2Headers(msgContext); + NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(wrapper); + Weaver.callOriginal(); + } + +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/Handler_instrumentation.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/Handler_instrumentation.java new file mode 100644 index 0000000..bfe5f3a --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/Handler_instrumentation.java @@ -0,0 +1,25 @@ +package org.apache.axis2.engine; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.context.MessageContext; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.agent.instrumentation.axis2.Axis2Utils; + +@Weave(type=MatchType.Interface, +originalName = "org.apache.axis2.engine.Handler") +public abstract class Handler_instrumentation { + + public abstract String getName(); + + @Trace(dispatcher=true) + public Handler.InvocationResponse invoke(MessageContext msgContext) throws AxisFault { + String soapActionName = Axis2Utils.getSoapActionName(msgContext.getSoapAction()); + NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom", getName(), soapActionName}); + return Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/Phase.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/Phase.java new file mode 100644 index 0000000..9dd6130 --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/engine/Phase.java @@ -0,0 +1,32 @@ +package org.apache.axis2.engine; + +import java.util.logging.Level; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.context.MessageContext; + +import com.newrelic.api.agent.Logger; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.agent.instrumentation.axis2.Axis2Utils; + +@Weave(type=MatchType.BaseClass) +public abstract class Phase { + + public abstract String getName(); + public abstract String getPhaseName(); + + @Trace(dispatcher=true) + public Handler.InvocationResponse invoke(MessageContext msgContext) throws AxisFault { + Logger logger = NewRelic.getAgent().getLogger(); + logger.log(Level.FINE, "AxisEngine.Phase - In Phase: {0}", new Object[] {getClass().getCanonicalName()}); + logger.log(Level.FINE, "AxisEngine.Phase - Name: {0}", new Object[] {getName()}); + logger.log(Level.FINE, "AxisEngine.Phase - Phase Name: {0}", new Object[] {getPhaseName()}); + String soapActionName = Axis2Utils.getSoapActionName(msgContext.getSoapAction()); + NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom", soapActionName, getPhaseName()}); + return Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/receivers/AbstractMessageReceiver.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/receivers/AbstractMessageReceiver.java new file mode 100644 index 0000000..0fce80c --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/receivers/AbstractMessageReceiver.java @@ -0,0 +1,48 @@ +package org.apache.axis2.receivers; + +import java.util.logging.Level; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.description.AxisMessage; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TracedMethod; +import com.newrelic.api.agent.TransportType; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.agent.instrumentation.axis2.Axis2Headers; + +@Weave(type=MatchType.BaseClass) +public abstract class AbstractMessageReceiver { + + @Trace(dispatcher=true) + protected void invokeBusinessLogic(MessageContext msgCtx) throws AxisFault { + AxisMessage axisMsg = msgCtx.getAxisMessage(); + NewRelic.getAgent().getLogger().log(Level.FINE, "AbstractMessageReceiver - invokeBusinessLogic: {0}", + new Object[] {getClass().getCanonicalName()}); + String axisName = axisMsg.getName(); + String axisOpName = axisMsg.getAxisOperation().getName().getLocalPart(); + TracedMethod traced = NewRelic.getAgent().getTracedMethod(); + traced.setMetricName(new String[]{"Custom", "MessageReceiver", axisName, axisOpName}); + traced.addRollupMetricName(new String[]{"Custom", "MessageReceiver", "invokeBusinessLogic", axisName}); + Weaver.callOriginal(); + } + + @Trace(dispatcher=true) + public void receive(MessageContext msgCtx) throws AxisFault { + AxisMessage axisMsg = msgCtx.getAxisMessage(); + NewRelic.getAgent().getLogger().log(Level.FINE, "AbstractMessageReceiver - receive: {0}", + new Object[] {getClass().getCanonicalName()}); + Axis2Headers wrapper = new Axis2Headers(msgCtx); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, wrapper); + String axisName = axisMsg.getName(); + String axisOpName = axisMsg.getAxisOperation().getName().getLocalPart(); + TracedMethod traced = NewRelic.getAgent().getTracedMethod(); + traced.setMetricName(new String[]{"Custom", "MessageReceiver", axisName, axisOpName}); + traced.addRollupMetricName(new String[]{"Custom", "MessageReceiver", axisName}); + Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/AbstractAgent.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/AbstractAgent.java new file mode 100644 index 0000000..46d67e5 --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/AbstractAgent.java @@ -0,0 +1,21 @@ +package org.apache.axis2.transport.http; + +import java.io.IOException; + +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Weave(type=MatchType.BaseClass) +public class AbstractAgent { + + @Trace(dispatcher=true) + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/AxisServlet.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/AxisServlet.java new file mode 100644 index 0000000..74088c1 --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/AxisServlet.java @@ -0,0 +1,51 @@ +package org.apache.axis2.transport.http; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TransactionNamePriority; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.agent.instrumentation.axis2.Axis2Utils; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Weave +public abstract class AxisServlet { + + @Trace(dispatcher = true) + protected void doDelete(HttpServletRequest request, HttpServletResponse response) { + String[] uri = Axis2Utils.getAxisTransactionName(request); + if(uri.length > 0) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, true, "Axis", uri); + } + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + String[] uri = Axis2Utils.getAxisTransactionName(request); + if(uri.length > 0) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, true, "Axis", uri); + } + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + String[] uri = Axis2Utils.getAxisTransactionName(request); + if(uri.length > 0) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, true, "Axis", uri); + } + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + protected void doPut(HttpServletRequest request, HttpServletResponse response) { + String[] uri = Axis2Utils.getAxisTransactionName(request); + if(uri.length > 0) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, true, "Axis", uri); + } + Weaver.callOriginal(); + } +} \ No newline at end of file diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/HTTPSender.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/HTTPSender.java new file mode 100644 index 0000000..3d34879 --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/HTTPSender.java @@ -0,0 +1,19 @@ +package org.apache.axis2.transport.http; + +import java.net.URL; + +import org.apache.axis2.context.MessageContext; + +//import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave +public abstract class HTTPSender { + + @Trace(dispatcher=true,leaf=true) + public void send(MessageContext msgContext, URL url, String soapActionString) { + Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/HTTPTransportUtils.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/HTTPTransportUtils.java new file mode 100644 index 0000000..aa4ec5c --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/HTTPTransportUtils.java @@ -0,0 +1,44 @@ +package org.apache.axis2.transport.http; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Map; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.context.ConfigurationContext; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.engine.Handler; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TransactionNamePriority; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.agent.instrumentation.axis2.Axis2Utils; + +@Weave +public abstract class HTTPTransportUtils { + + @SuppressWarnings("rawtypes") + @Trace(dispatcher=true) + public static boolean processHTTPGetRequest(MessageContext msgContext, OutputStream out, String soapAction, + String requestURI, ConfigurationContext configurationContext, Map requestParameters) throws AxisFault { + boolean return_bool = Weaver.callOriginal(); + String[] transactionNames = Axis2Utils.getAxisTransactionName(msgContext, requestURI, soapAction); + if(transactionNames.length > 0) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.CUSTOM_HIGH, true, "Axis HTTP Get", transactionNames); + } + return return_bool; + } + + @Trace(dispatcher=true) + public static Handler.InvocationResponse processHTTPPostRequest(MessageContext msgContext, InputStream in, + OutputStream out, String contentType, String soapActionHeader, String requestURI) throws AxisFault { + Handler.InvocationResponse return_response = Weaver.callOriginal(); + String[] transactionNames = Axis2Utils.getAxisTransactionName(msgContext, requestURI, soapActionHeader); + if(transactionNames.length > 0) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.CUSTOM_HIGH, true, "Axis HTTP Post", transactionNames); + } + return return_response; + } +} \ No newline at end of file diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/server/AxisHttpService.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/server/AxisHttpService.java new file mode 100644 index 0000000..8a480eb --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/server/AxisHttpService.java @@ -0,0 +1,22 @@ +package org.apache.axis2.transport.http.server; + +import org.apache.axis2.context.MessageContext; +import org.apache.hc.core5.http.protocol.HttpContext; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TransactionNamePriority; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.agent.instrumentation.axis2.Axis2ExtendedRequest; + +@Weave +public abstract class AxisHttpService { + + @Trace(dispatcher = true) + protected void doService(AxisHttpRequest request, AxisHttpResponse response, HttpContext context, MessageContext msgContext) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "AxisHttpService", "Axis2",request.getRequestURI(),request.getMethod()); + NewRelic.getAgent().getTransaction().setWebRequest(new Axis2ExtendedRequest(request)); + Weaver.callOriginal(); + } +} diff --git a/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/util/RESTUtil.java b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/util/RESTUtil.java new file mode 100644 index 0000000..be98e1b --- /dev/null +++ b/apache-axis2-2.0/src/main/java/org/apache/axis2/transport/http/util/RESTUtil.java @@ -0,0 +1,43 @@ +package org.apache.axis2.transport.http.util; + +import java.io.InputStream; +import java.io.OutputStream; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.engine.Handler; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TransactionNamePriority; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.agent.instrumentation.axis2.Axis2Utils; + +@Weave +public abstract class RESTUtil { + + @Trace(dispatcher=true) + public static Handler.InvocationResponse processURLRequest(MessageContext msgContext, OutputStream out, String contentType) throws AxisFault { + Handler.InvocationResponse return_response = Weaver.callOriginal(); + + String[] transactionNames = Axis2Utils.getAxisTransactionName(msgContext); + if(transactionNames.length > 0) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.CUSTOM_HIGH, true, "Axis REST URL", transactionNames); + } + + return return_response; + } + + @Trace(dispatcher=true) + public static Handler.InvocationResponse processXMLRequest(MessageContext msgContext, InputStream in, OutputStream out, String contentType) throws AxisFault { + Handler.InvocationResponse return_response = Weaver.callOriginal(); + + String[] transactionNames = Axis2Utils.getAxisTransactionName(msgContext); + if(transactionNames.length > 0) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.CUSTOM_HIGH, true, "Axis REST XML", transactionNames); + } + + return return_response; + } +} diff --git a/apache-axis2/build.gradle b/apache-axis2/build.gradle index c2a839b..7845b98 100644 --- a/apache-axis2/build.gradle +++ b/apache-axis2/build.gradle @@ -26,5 +26,5 @@ jar { verifyInstrumentation { passes 'org.apache.axis2:axis2-kernel:[1.4.1,1.5)' - passes 'org.apache.axis2:axis2-transport-http:[1.5,)' + passes 'org.apache.axis2:axis2-transport-http:[1.5,2.0.0)' } diff --git a/settings.gradle b/settings.gradle index 632a465..abecc27 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,3 @@ rootProject.name = 'java-instrumentation-template' include 'apache-axis2' +include 'apache-axis2-2.0'