Skip to content

Axis2 2.0 #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions apache-axis2-2.0/build.gradle
Original file line number Diff line number Diff line change
@@ -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')
}
}
Original file line number Diff line number Diff line change
@@ -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();
}

}
Original file line number Diff line number Diff line change
@@ -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<String> getHeaders(String name) {
List<String> 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<String> getHeaderNames() {
Iterator<String> iterator = msgCtx.getPropertyNames();
List<String> names = new ArrayList<>();
while(iterator.hasNext()) {
names.add(iterator.next());
}
return names;
}

@Override
public boolean containsHeader(String name) {
Collection<String> names = getHeaderNames();
return names.contains(name);
}

}
Original file line number Diff line number Diff line change
@@ -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<String> transactionNameList = new ArrayList<String>();
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;
}
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Loading