From f1fa2c06240e1eb86634181d5c06a650865d4a19 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Wed, 15 Jan 2025 07:47:28 -0600 Subject: [PATCH] added --- fabric-runtime/build.gradle | 33 +++++++++++++++ .../labs/fabric/runtime/FabricPathInfo.java | 23 +++++++++++ .../fabric/runtime/FabricRuntimeUtils.java | 32 +++++++++++++++ .../platform/blocks/mesh/MeshImpl.java | 37 +++++++++++++++++ .../platform/blocks/mesh/MessageHandler.java | 40 +++++++++++++++++++ .../platform/blocks/mesh/MessageRouter.java | 35 ++++++++++++++++ .../blocks/soap/FabricProviderServlet.java | 36 +++++++++++++++++ 7 files changed, 236 insertions(+) create mode 100644 fabric-runtime/build.gradle create mode 100644 fabric-runtime/src/main/java/com/newrelic/instrumentation/labs/fabric/runtime/FabricPathInfo.java create mode 100644 fabric-runtime/src/main/java/com/newrelic/instrumentation/labs/fabric/runtime/FabricRuntimeUtils.java create mode 100644 fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MeshImpl.java create mode 100644 fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MessageHandler.java create mode 100644 fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MessageRouter.java create mode 100644 fabric-runtime/src/main/java/oracle/integration/platform/blocks/soap/FabricProviderServlet.java diff --git a/fabric-runtime/build.gradle b/fabric-runtime/build.gradle new file mode 100644 index 0000000..5958374 --- /dev/null +++ b/fabric-runtime/build.gradle @@ -0,0 +1,33 @@ + +// Build.gradle generated for instrumentation module fabric-runtime + +apply plugin: 'java' + +dependencies { + implementation 'javax.servlet:servlet-api:2.5' + compileOnly group: 'javax', name: 'javaee-api', version: '6.0' + + // New Relic 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: 'lib') + implementation fileTree(include: ['*.jar'], dir: '../test-lib') +} + +jar { + manifest { + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.fabric-runtime' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.0 + } +} + +verifyInstrumentation { + // Verifier plugin documentation: + // https://github.com/newrelic/newrelic-gradle-verify-instrumentation + // Example: + // passes 'javax.servlet:servlet-api:[2.2,2.5]' + // exclude 'javax.servlet:servlet-api:2.4.public_draft' +} \ No newline at end of file diff --git a/fabric-runtime/src/main/java/com/newrelic/instrumentation/labs/fabric/runtime/FabricPathInfo.java b/fabric-runtime/src/main/java/com/newrelic/instrumentation/labs/fabric/runtime/FabricPathInfo.java new file mode 100644 index 0000000..bc51be7 --- /dev/null +++ b/fabric-runtime/src/main/java/com/newrelic/instrumentation/labs/fabric/runtime/FabricPathInfo.java @@ -0,0 +1,23 @@ +package com.newrelic.instrumentation.labs.fabric.runtime; + +public class FabricPathInfo { + + private String dn; + private String serviceName; + + public FabricPathInfo(String dn, String serviceName) { + super(); + this.dn = dn; + this.serviceName = serviceName; + } + + public String getDn() { + return dn; + } + + public String getServiceName() { + return serviceName; + } + + +} diff --git a/fabric-runtime/src/main/java/com/newrelic/instrumentation/labs/fabric/runtime/FabricRuntimeUtils.java b/fabric-runtime/src/main/java/com/newrelic/instrumentation/labs/fabric/runtime/FabricRuntimeUtils.java new file mode 100644 index 0000000..e9ea2cb --- /dev/null +++ b/fabric-runtime/src/main/java/com/newrelic/instrumentation/labs/fabric/runtime/FabricRuntimeUtils.java @@ -0,0 +1,32 @@ +package com.newrelic.instrumentation.labs.fabric.runtime; + +import oracle.integration.platform.blocks.PathInfo; +import oracle.integration.platform.blocks.soap.WebServiceEntryBindingComponent; + +public class FabricRuntimeUtils { + + + public static FabricPathInfo getServiceName(String pathInfo, WebServiceEntryBindingComponent wsEntryBC) { + if(pathInfo == null || pathInfo.isEmpty()) return null; + + String temp = pathInfo.startsWith("/") ? pathInfo.substring(1) : pathInfo; + String[] path = temp.split("/"); + if(path.length == 0) return null; + + if(path.length == 1) { + PathInfo info = wsEntryBC.getCustomPath(pathInfo); + if(info != null) { + return new FabricPathInfo(info.getCompositeName(), info.getService()); + } + } else { + String dn = path[0] + '/' + path[1]; + String serviceName = path.length == 3 ? path[2] : null; + return new FabricPathInfo(dn, serviceName); + } + + + + return null; + } + +} diff --git a/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MeshImpl.java b/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MeshImpl.java new file mode 100644 index 0000000..6d22c9f --- /dev/null +++ b/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MeshImpl.java @@ -0,0 +1,37 @@ +package oracle.integration.platform.blocks.mesh; + + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +import oracle.fabric.common.InvocationContext; +import oracle.fabric.common.NormalizedMessage; +import oracle.fabric.common.Operation; + +@Weave +public class MeshImpl { + + @Trace + public NormalizedMessage request(NormalizedMessage message, Operation operation, InvocationContext context) { + if(operation != null) { + String opName = operation.getName(); + if(opName != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Fabric","Mesh","request",opName); + } + } + return Weaver.callOriginal(); + } + + @Trace + public void post(NormalizedMessage message, Operation operation, InvocationContext context) { + if(operation != null) { + String opName = operation.getName(); + if(opName != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Fabric","Mesh","post",opName); + } + } + Weaver.callOriginal(); + } +} diff --git a/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MessageHandler.java b/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MessageHandler.java new file mode 100644 index 0000000..bd5e660 --- /dev/null +++ b/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MessageHandler.java @@ -0,0 +1,40 @@ +package oracle.integration.platform.blocks.mesh; + +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 oracle.fabric.common.InvocationContext; +import oracle.fabric.common.NormalizedMessage; +import oracle.fabric.common.Operation; + +@Weave(type = MatchType.Interface) +public abstract class MessageHandler { + + @Trace + public NormalizedMessage doCallbackRequest(NormalizedMessage var1, Operation var2, InvocationContext var3) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Fabric","MessageHandler",getClass().getSimpleName(),"doCallbackRequest"); + return Weaver.callOriginal(); + } + + @Trace + public NormalizedMessage doRequest(NormalizedMessage var1, Operation var2, InvocationContext var3) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Fabric","MessageHandler",getClass().getSimpleName(),"doRequest"); + return Weaver.callOriginal(); + } + + @Trace + public void doCallbackPost(NormalizedMessage var1, Operation var2, InvocationContext var3) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Fabric","MessageHandler",getClass().getSimpleName(),"doCallbackPost"); + Weaver.callOriginal(); + } + + @Trace + public void doPost(NormalizedMessage var1, Operation var2, InvocationContext var3) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Fabric","MessageHandler",getClass().getSimpleName(),"doPost"); + Weaver.callOriginal(); + } + +} diff --git a/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MessageRouter.java b/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MessageRouter.java new file mode 100644 index 0000000..3b29840 --- /dev/null +++ b/fabric-runtime/src/main/java/oracle/integration/platform/blocks/mesh/MessageRouter.java @@ -0,0 +1,35 @@ +package oracle.integration.platform.blocks.mesh; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +import oracle.fabric.common.InvocationContext; +import oracle.fabric.common.NormalizedMessage; +import oracle.fabric.common.Operation; + +@Weave +public abstract class MessageRouter { + + @Trace + public NormalizedMessage request(NormalizedMessage message, Operation operation, InvocationContext context) { + if(operation != null) { + String opName = operation.getName(); + if(opName != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Fabric","MessageRouter","request",opName); + } + } + return Weaver.callOriginal(); + } + + public void post(NormalizedMessage message, Operation operation, InvocationContext context) { + if(operation != null) { + String opName = operation.getName(); + if(opName != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Fabric","MessageRouter","post",opName); + } + } + Weaver.callOriginal(); + } +} diff --git a/fabric-runtime/src/main/java/oracle/integration/platform/blocks/soap/FabricProviderServlet.java b/fabric-runtime/src/main/java/oracle/integration/platform/blocks/soap/FabricProviderServlet.java new file mode 100644 index 0000000..028527d --- /dev/null +++ b/fabric-runtime/src/main/java/oracle/integration/platform/blocks/soap/FabricProviderServlet.java @@ -0,0 +1,36 @@ +package oracle.integration.platform.blocks.soap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +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.newrelic.instrumentation.labs.fabric.runtime.FabricPathInfo; +import com.newrelic.instrumentation.labs.fabric.runtime.FabricRuntimeUtils; + +@Weave +public abstract class FabricProviderServlet { + + protected WebServiceEntryBindingComponent wsEntryBC = Weaver.callOriginal(); + + @Trace + protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { + Weaver.callOriginal(); + } + + @Trace + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + String pInfo = request.getPathInfo(); + if(pInfo != null) { + FabricPathInfo fInfo = FabricRuntimeUtils.getServiceName(pInfo, wsEntryBC); + if(fInfo != null) { + String tName = fInfo.getServiceName() != null ? fInfo.getDn() + "/" + fInfo.getServiceName() : fInfo.getDn() + "/Unknown"; + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "Fabric", tName); + } + } + Weaver.callOriginal(); + } +}