From f471293cdcfff114ce51b516c190236ae9d393a9 Mon Sep 17 00:00:00 2001 From: zhangwei Date: Sun, 27 Oct 2019 18:33:38 +0800 Subject: [PATCH] [test/plugin] immigrate undertow scenario (#3698) --- Jenkinsfile-Agent-Test | 9 +- Jenkinsfile-Agent-Test-2 | 7 +- .../v2x/HttpServerExchangeInterceptor.java | 51 ++++++++ .../apm/plugin/undertow/v2x/SWRunnable.java | 53 ++++++++ .../HttpServerExchangeInstrumentation.java | 77 ++++++++++++ .../src/main/resources/skywalking-plugin.def | 2 + .../java-agent/Supported-list.md | 2 +- .../undertow-routing-scenario/bin/startup.sh | 21 ++++ .../config/expectedData.yaml | 106 ++++++++++++++++ .../configuration.yml | 21 ++++ .../undertow-routing-scenario/pom.xml | 114 ++++++++++++++++++ .../src/main/assembly/assembly.xml | 41 +++++++ .../amp/testcase/undertow/Application.java | 72 +++++++++++ .../support-version.list | 44 +++++++ .../undertow-scenario/bin/startup.sh | 21 ++++ .../config/expectedData.yaml | 105 ++++++++++++++++ .../undertow-scenario/configuration.yml | 21 ++++ .../scenarios/undertow-scenario/pom.xml | 114 ++++++++++++++++++ .../src/main/assembly/assembly.xml | 41 +++++++ .../amp/testcase/undertow/Application.java | 69 +++++++++++ .../undertow-scenario/support-version.list | 44 +++++++ 21 files changed, 1031 insertions(+), 4 deletions(-) create mode 100644 apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/HttpServerExchangeInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/SWRunnable.java create mode 100644 apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/define/HttpServerExchangeInstrumentation.java create mode 100644 test/plugin/scenarios/undertow-routing-scenario/bin/startup.sh create mode 100644 test/plugin/scenarios/undertow-routing-scenario/config/expectedData.yaml create mode 100644 test/plugin/scenarios/undertow-routing-scenario/configuration.yml create mode 100644 test/plugin/scenarios/undertow-routing-scenario/pom.xml create mode 100644 test/plugin/scenarios/undertow-routing-scenario/src/main/assembly/assembly.xml create mode 100644 test/plugin/scenarios/undertow-routing-scenario/src/main/java/org/apache/skywalking/amp/testcase/undertow/Application.java create mode 100644 test/plugin/scenarios/undertow-routing-scenario/support-version.list create mode 100644 test/plugin/scenarios/undertow-scenario/bin/startup.sh create mode 100644 test/plugin/scenarios/undertow-scenario/config/expectedData.yaml create mode 100644 test/plugin/scenarios/undertow-scenario/configuration.yml create mode 100644 test/plugin/scenarios/undertow-scenario/pom.xml create mode 100644 test/plugin/scenarios/undertow-scenario/src/main/assembly/assembly.xml create mode 100644 test/plugin/scenarios/undertow-scenario/src/main/java/org/apache/skywalking/amp/testcase/undertow/Application.java create mode 100644 test/plugin/scenarios/undertow-scenario/support-version.list diff --git a/Jenkinsfile-Agent-Test b/Jenkinsfile-Agent-Test index cdaa3d522..cb62f10a3 100755 --- a/Jenkinsfile-Agent-Test +++ b/Jenkinsfile-Agent-Test @@ -66,7 +66,7 @@ pipeline { sh './mvnw -f test/plugin/pom.xml clean package -DskipTests -Dbuild_id=wl1_${BUILD_ID} docker:build' } } - stage('Test Cases Report (139)') { + stage('Test Cases Report (162)') { steps { echo "reserve." } @@ -113,7 +113,12 @@ pipeline { sh 'bash test/plugin/run.sh --build_id=wl1_${BUILD_ID} jetty-scenario' } } - } + stage('undertow-routing-scenario 1.3.0-2.0.27 (23)') { + steps { + sh 'bash test/plugin/run.sh --build_id=wl1_${BUILD_ID} undertow-routing-scenario' + } + } + } } } } diff --git a/Jenkinsfile-Agent-Test-2 b/Jenkinsfile-Agent-Test-2 index af0cbed26..c3b0f3757 100755 --- a/Jenkinsfile-Agent-Test-2 +++ b/Jenkinsfile-Agent-Test-2 @@ -66,7 +66,7 @@ pipeline { sh './mvnw -f test/plugin/pom.xml clean package -DskipTests -Dbuild_id=wl2_${BUILD_ID} docker:build' } } - stage('Test Cases Report (132)') { + stage('Test Cases Report (155)') { steps { echo "reserve." } @@ -125,6 +125,11 @@ pipeline { sh 'bash test/plugin/run.sh --build_id=wl2_${BUILD_ID} spring-4.3.x-scenario' } } + stage('undertow-scenario 1.3.0-2.0.27 (23)') { + steps { + sh 'bash test/plugin/run.sh --build_id=wl2_${BUILD_ID} undertow-scenario' + } + } } } } diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/HttpServerExchangeInterceptor.java b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/HttpServerExchangeInterceptor.java new file mode 100644 index 000000000..87b7b7895 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/HttpServerExchangeInterceptor.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.skywalking.apm.plugin.undertow.v2x; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; + +import java.lang.reflect.Method; + +/** + * @author zhangwei + */ +public class HttpServerExchangeInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + if (ContextManager.isActive()) { + Object argument = allArguments[1]; + if (argument != null) { + allArguments[1] = new SWRunnable((Runnable) argument, ContextManager.capture()); + } + } + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + + } +} diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/SWRunnable.java b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/SWRunnable.java new file mode 100644 index 000000000..75796bf6a --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/SWRunnable.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.undertow.v2x; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; + +/** + * @author zhangwei + */ +public class SWRunnable implements Runnable { + + private static final String OPERATION_NAME = "UndertowDispatch"; + + private Runnable runnable; + + private ContextSnapshot snapshot; + + public SWRunnable(Runnable runnable, ContextSnapshot snapshot) { + this.runnable = runnable; + this.snapshot = snapshot; + } + + @Override + public void run() { + AbstractSpan span = ContextManager.createLocalSpan(SWRunnable.OPERATION_NAME); + span.setComponent(ComponentsDefine.UNDERTOW); + try { + ContextManager.continued(snapshot); + runnable.run(); + } finally { + ContextManager.stopSpan(); + } + } +} diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/define/HttpServerExchangeInstrumentation.java b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/define/HttpServerExchangeInstrumentation.java new file mode 100644 index 000000000..d63f57e83 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/undertow/v2x/define/HttpServerExchangeInstrumentation.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.undertow.v2x.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; + +import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; + + +/** + * @author zhangwei + */ +public class HttpServerExchangeInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_METHOD = "dispatch"; + + private static final String ENHANCE_CLASS = "io.undertow.server.HttpServerExchange"; + + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.undertow.v2x.HttpServerExchangeInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named(ENHANCE_METHOD) + .and(takesArgumentWithType(0, "java.util.concurrent.Executor")) + .and(takesArgumentWithType(1, "java.lang.Runnable")); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPTOR_CLASS; + } + + @Override + public boolean isOverrideArgs() { + return true; + } + } + }; + } +} diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/resources/skywalking-plugin.def index 315079b47..2a504e608 100644 --- a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/main/resources/skywalking-plugin.def @@ -19,3 +19,5 @@ undertow-2.x-plugin=org.apache.skywalking.apm.plugin.undertow.v2x.define.Request undertow-2.x-plugin=org.apache.skywalking.apm.plugin.undertow.v2x.define.UndertowRootHandlerInstrumentation undertow-2.x-plugin=org.apache.skywalking.apm.plugin.undertow.v2x.define.UndertowAddListenerInstrumentation undertow-2.x-plugin=org.apache.skywalking.apm.plugin.undertow.v2x.define.UndertowListenerConfigInstrumentation +undertow-2.x-plugin=org.apache.skywalking.apm.plugin.undertow.v2x.define.HttpServerExchangeInstrumentation + diff --git a/docs/en/setup/service-agent/java-agent/Supported-list.md b/docs/en/setup/service-agent/java-agent/Supported-list.md index cc139fda3..ef610a817 100644 --- a/docs/en/setup/service-agent/java-agent/Supported-list.md +++ b/docs/en/setup/service-agent/java-agent/Supported-list.md @@ -10,7 +10,7 @@ * [Resin](http://www.caucho.com/resin-4.0/) 4 (Optional¹) * [Jetty Server](http://www.eclipse.org/jetty/) 9 * [Spring Webflux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html) 5.x - * [Undertow](http://undertow.io/) 2.0.0.Final -> 2.0.13.Final + * [Undertow](http://undertow.io/) 1.3.0.Final -> 2.0.27.Final * [RESTEasy](https://resteasy.github.io/) 3.1.0.Final -> 3.7.0.Final * [Play Framework](https://www.playframework.com/) 2.6.x -> 2.7.x (Optional²) * [Light4J Microservices Framework](https://doc.networknt.com/) 1.6.x -> 2.x diff --git a/test/plugin/scenarios/undertow-routing-scenario/bin/startup.sh b/test/plugin/scenarios/undertow-routing-scenario/bin/startup.sh new file mode 100644 index 000000000..52f5a542f --- /dev/null +++ b/test/plugin/scenarios/undertow-routing-scenario/bin/startup.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +home="$(cd "$(dirname $0)"; pwd)" + +java -jar ${agent_opts} ${home}/../libs/undertow-routing-scenario.jar & \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-routing-scenario/config/expectedData.yaml b/test/plugin/scenarios/undertow-routing-scenario/config/expectedData.yaml new file mode 100644 index 000000000..b8439feff --- /dev/null +++ b/test/plugin/scenarios/undertow-routing-scenario/config/expectedData.yaml @@ -0,0 +1,106 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +registryItems: + applications: + - {undertow-routing-scenario: 2} + instances: + - {undertow-routing-scenario: 1} + operationNames: + - undertow-routing-scenario: [/undertow-routing-scenario/case/undertow1, '/undertow-routing-scenario/case/{context}'] + heartbeat: [] +segmentItems: + - applicationCode: undertow-routing-scenario + segmentSize: gt 3 + segments: + - segmentId: not null + spans: + - operationName: /undertow-routing-scenario/case/{context} + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: nq 0 + endTime: nq 0 + componentId: 49 + componentName: '' + isError: false + spanType: Entry + peer: '' + peerId: 0 + tags: + - {key: url, value: 'http://localhost:8080/undertow-routing-scenario/case/undertow'} + - {key: http.method, value: GET} + - segmentId: not null + spans: + - operationName: /undertow-routing-scenario/case/{context} + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: nq 0 + endTime: nq 0 + componentId: 49 + componentName: '' + isError: false + spanType: Entry + peer: '' + peerId: 0 + tags: + - {key: url, value: 'http://localhost:8080/undertow-routing-scenario/case/undertow1'} + - {key: http.method, value: GET} + refs: + - {parentEndpointId: 0, parentEndpoint: UndertowDispatch, networkAddressId: 0, + entryEndpointId: 0, refType: CrossProcess, parentSpanId: 1, parentTraceSegmentId: not null, + parentServiceInstanceId: 1, networkAddress: 'localhost:8080', entryEndpoint: '/undertow-routing-scenario/case/{context}', + entryServiceInstanceId: 1} + - segmentId: not null + spans: + - operationName: /undertow-routing-scenario/case/undertow1 + operationId: 0 + parentSpanId: 0 + spanId: 1 + spanLayer: Http + startTime: nq 0 + endTime: nq 0 + componentId: 2 + componentName: '' + isError: false + spanType: Exit + peer: localhost:8080 + peerId: 0 + tags: + - {key: url, value: 'http://localhost:8080/undertow-routing-scenario/case/undertow1?send=httpHandler'} + - {key: http.method, value: GET} + - operationName: UndertowDispatch + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Unknown + startTime: nq 0 + endTime: nq 0 + componentId: 49 + componentName: '' + isError: false + spanType: Local + peer: '' + peerId: 0 + refs: + - {parentEndpointId: 0, parentEndpoint: '/undertow-routing-scenario/case/{context}', + networkAddressId: 0, entryEndpointId: 0, refType: CrossThread, parentSpanId: 0, + parentTraceSegmentId: not null, parentServiceInstanceId: 1, + networkAddress: '', entryEndpoint: '/undertow-routing-scenario/case/{context}', + entryServiceInstanceId: 1} \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-routing-scenario/configuration.yml b/test/plugin/scenarios/undertow-routing-scenario/configuration.yml new file mode 100644 index 000000000..c32ce969f --- /dev/null +++ b/test/plugin/scenarios/undertow-routing-scenario/configuration.yml @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +type: jvm +entryService: http://localhost:8080/undertow-routing-scenario/case/undertow +healthCheck: http://localhost:8080/undertow-routing-scenario/case/healthCheck +startScript: ./bin/startup.sh +framework: undertow \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-routing-scenario/pom.xml b/test/plugin/scenarios/undertow-routing-scenario/pom.xml new file mode 100644 index 000000000..7ab0a460e --- /dev/null +++ b/test/plugin/scenarios/undertow-routing-scenario/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + org.apache.skywalking + undertow-routing-scenario + jar + 5.0.0 + + + UTF-8 + 1.8 + org.apache.skywalking.amp.testcase.undertow.Application + + undertow + 1.3.0.Final + + + skywalking-undertow-routing-scenario + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + io.undertow + undertow-core + ${test.framework.version} + + + + org.apache.httpcomponents + httpclient + 4.3 + + + + + undertow-routing-scenario + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + maven-compiler-plugin + + ${compiler.version} + ${compiler.version} + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assemble + package + + single + + + + src/main/assembly/assembly.xml + + ./target/ + + + + + + + + + + spring-snapshots + http://repo.spring.io/snapshot + + + spring-milestones + http://repo.spring.io/milestone + + + \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-routing-scenario/src/main/assembly/assembly.xml b/test/plugin/scenarios/undertow-routing-scenario/src/main/assembly/assembly.xml new file mode 100644 index 000000000..9d3588c2f --- /dev/null +++ b/test/plugin/scenarios/undertow-routing-scenario/src/main/assembly/assembly.xml @@ -0,0 +1,41 @@ + + + + + zip + + + + + ./bin + 0775 + + + + + + ${project.build.directory}/undertow-routing-scenario.jar + ./libs + 0775 + + + diff --git a/test/plugin/scenarios/undertow-routing-scenario/src/main/java/org/apache/skywalking/amp/testcase/undertow/Application.java b/test/plugin/scenarios/undertow-routing-scenario/src/main/java/org/apache/skywalking/amp/testcase/undertow/Application.java new file mode 100644 index 000000000..4a33673c8 --- /dev/null +++ b/test/plugin/scenarios/undertow-routing-scenario/src/main/java/org/apache/skywalking/amp/testcase/undertow/Application.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.amp.testcase.undertow; + +import io.undertow.Undertow; +import io.undertow.server.HttpHandler; +import io.undertow.server.RoutingHandler; +import io.undertow.util.Headers; +import io.undertow.util.Methods; +import org.apache.http.HttpEntity; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; + +public class Application { + + private static final String TEMPLATE = "/undertow-routing-scenario/case/{context}"; + + private static final String CASE_URL = "/undertow-routing-scenario/case/undertow"; + + public static void main(String[] args) { + HttpHandler httpHandler = exchange -> { + if (CASE_URL.equals(exchange.getRequestPath())) { + exchange.dispatch(httpServerExchange -> visit("http://localhost:8080/undertow-routing-scenario/case/undertow1?send=httpHandler")); + } + exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain"); + exchange.getResponseSender().send("Success"); + }; + RoutingHandler handler = new RoutingHandler(); + handler.add(Methods.GET, TEMPLATE, httpHandler); + handler.add(Methods.HEAD, TEMPLATE, httpHandler); + Undertow server = Undertow.builder() + .addHttpListener(8080, "0.0.0.0") + .setHandler(handler).build(); + Runtime.getRuntime().addShutdownHook(new Thread(server::stop)); + server.start(); + } + + private static void visit(String url) throws IOException { + CloseableHttpClient httpclient = HttpClients.createDefault(); + try { + HttpGet httpget = new HttpGet(url); + ResponseHandler responseHandler = response -> { + HttpEntity entity = response.getEntity(); + return entity != null ? EntityUtils.toString(entity) : null; + }; + httpclient.execute(httpget, responseHandler); + } finally { + httpclient.close(); + } + } +} diff --git a/test/plugin/scenarios/undertow-routing-scenario/support-version.list b/test/plugin/scenarios/undertow-routing-scenario/support-version.list new file mode 100644 index 000000000..3a6f7d0e8 --- /dev/null +++ b/test/plugin/scenarios/undertow-routing-scenario/support-version.list @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# undertow has a total of 90 versions from 1.3.0 to 2.0.27, in order to reduce the workload of agent-plugin-test, +# so, some test cases are excluded according to the following rules. +# 1.3.x 1.4.x: select the first, middle, and last version +# 2.0.x: when there are many releases in the same month, choose the last one + +1.3.0.Final +1.3.17.Final +1.3.33.Final +1.4.0.Final +1.4.12.Final +1.4.27.Final +2.0.0.Final +2.0.3.Final +2.0.4.Final +2.0.8.Final +2.0.9.Final +2.0.11.Final +2.0.13.Final +2.0.15.Final +2.0.16.Final +2.0.17.Final +2.0.19.Final +2.0.20.Final +2.0.21.Final +2.0.22.Final +2.0.23.Final +2.0.26.Final +2.0.27.Final \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-scenario/bin/startup.sh b/test/plugin/scenarios/undertow-scenario/bin/startup.sh new file mode 100644 index 000000000..c6afdcda5 --- /dev/null +++ b/test/plugin/scenarios/undertow-scenario/bin/startup.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +home="$(cd "$(dirname $0)"; pwd)" + +java -jar ${agent_opts} ${home}/../libs/undertow-scenario.jar & \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-scenario/config/expectedData.yaml b/test/plugin/scenarios/undertow-scenario/config/expectedData.yaml new file mode 100644 index 000000000..bbfbafb22 --- /dev/null +++ b/test/plugin/scenarios/undertow-scenario/config/expectedData.yaml @@ -0,0 +1,105 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +registryItems: + applications: + - {undertow-scenario: 2} + instances: + - {undertow-scenario: 1} + operationNames: + - undertow-scenario: [/undertow-scenario/case/undertow1, /undertow-scenario/case/undertow] + heartbeat: [] +segmentItems: + - applicationCode: undertow-scenario + segmentSize: gt 3 + segments: + - segmentId: not null + spans: + - operationName: /undertow-scenario/case/undertow + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: nq 0 + endTime: nq 0 + componentId: 49 + componentName: '' + isError: false + spanType: Entry + peer: '' + peerId: 0 + tags: + - {key: url, value: 'http://localhost:8080/undertow-scenario/case/undertow'} + - {key: http.method, value: GET} + - segmentId: not null + spans: + - operationName: /undertow-scenario/case/undertow1 + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: nq 0 + endTime: nq 0 + componentId: 49 + componentName: '' + isError: false + spanType: Entry + peer: '' + peerId: 0 + tags: + - {key: url, value: 'http://localhost:8080/undertow-scenario/case/undertow1'} + - {key: http.method, value: GET} + refs: + - {parentEndpointId: 0, parentEndpoint: UndertowDispatch, networkAddressId: 0, + entryEndpointId: 0, refType: CrossProcess, parentSpanId: 1, parentTraceSegmentId: not null, + parentServiceInstanceId: 1, networkAddress: 'localhost:8080', entryEndpoint: /undertow-scenario/case/undertow, + entryServiceInstanceId: 1} + - segmentId: not null + spans: + - operationName: /undertow-scenario/case/undertow1 + operationId: 0 + parentSpanId: 0 + spanId: 1 + spanLayer: Http + startTime: nq 0 + endTime: nq 0 + componentId: 2 + componentName: '' + isError: false + spanType: Exit + peer: localhost:8080 + peerId: 0 + tags: + - {key: url, value: 'http://localhost:8080/undertow-scenario/case/undertow1?send=runnable'} + - {key: http.method, value: GET} + - operationName: UndertowDispatch + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Unknown + startTime: nq 0 + endTime: nq 0 + componentId: 49 + componentName: '' + isError: false + spanType: Local + peer: '' + peerId: 0 + refs: + - {parentEndpointId: 0, parentEndpoint: /undertow-scenario/case/undertow, networkAddressId: 0, + entryEndpointId: 0, refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, + parentServiceInstanceId: 1, networkAddress: '', entryEndpoint: /undertow-scenario/case/undertow, + entryServiceInstanceId: 1} \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-scenario/configuration.yml b/test/plugin/scenarios/undertow-scenario/configuration.yml new file mode 100644 index 000000000..277dea571 --- /dev/null +++ b/test/plugin/scenarios/undertow-scenario/configuration.yml @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +type: jvm +entryService: http://localhost:8080/undertow-scenario/case/undertow +healthCheck: http://localhost:8080/undertow-scenario/case/healthCheck +startScript: ./bin/startup.sh +framework: undertow \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-scenario/pom.xml b/test/plugin/scenarios/undertow-scenario/pom.xml new file mode 100644 index 000000000..9bf672e85 --- /dev/null +++ b/test/plugin/scenarios/undertow-scenario/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + org.apache.skywalking + undertow-scenario + jar + 5.0.0 + + + UTF-8 + 1.8 + org.apache.skywalking.amp.testcase.undertow.Application + + undertow + 1.3.0.Final + + + skywalking-undertow-scenario + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + io.undertow + undertow-core + ${test.framework.version} + + + + org.apache.httpcomponents + httpclient + 4.3 + + + + + undertow-scenario + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + maven-compiler-plugin + + ${compiler.version} + ${compiler.version} + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assemble + package + + single + + + + src/main/assembly/assembly.xml + + ./target/ + + + + + + + + + + spring-snapshots + http://repo.spring.io/snapshot + + + spring-milestones + http://repo.spring.io/milestone + + + \ No newline at end of file diff --git a/test/plugin/scenarios/undertow-scenario/src/main/assembly/assembly.xml b/test/plugin/scenarios/undertow-scenario/src/main/assembly/assembly.xml new file mode 100644 index 000000000..1455d1de9 --- /dev/null +++ b/test/plugin/scenarios/undertow-scenario/src/main/assembly/assembly.xml @@ -0,0 +1,41 @@ + + + + + zip + + + + + ./bin + 0775 + + + + + + ${project.build.directory}/undertow-scenario.jar + ./libs + 0775 + + + diff --git a/test/plugin/scenarios/undertow-scenario/src/main/java/org/apache/skywalking/amp/testcase/undertow/Application.java b/test/plugin/scenarios/undertow-scenario/src/main/java/org/apache/skywalking/amp/testcase/undertow/Application.java new file mode 100644 index 000000000..f1fa0bd96 --- /dev/null +++ b/test/plugin/scenarios/undertow-scenario/src/main/java/org/apache/skywalking/amp/testcase/undertow/Application.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.amp.testcase.undertow; + +import io.undertow.Undertow; +import io.undertow.util.Headers; +import org.apache.http.HttpEntity; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; + +public class Application { + + private static final String CASE_URL = "/undertow-scenario/case/undertow"; + + public static void main(String[] args) throws InterruptedException { + Undertow server = Undertow.builder() + .addHttpListener(8080, "0.0.0.0") + .setHandler(exchange -> { + if (CASE_URL.equals(exchange.getRequestPath())) { + exchange.dispatch(() -> { + try { + visit("http://localhost:8080/undertow-scenario/case/undertow1?send=runnable"); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } + exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain"); + exchange.getResponseSender().send("Success"); + }).build(); + Runtime.getRuntime().addShutdownHook(new Thread(server::stop)); + server.start(); + } + + private static void visit(String url) throws IOException { + CloseableHttpClient httpclient = HttpClients.createDefault(); + try { + HttpGet httpget = new HttpGet(url); + ResponseHandler responseHandler = response -> { + HttpEntity entity = response.getEntity(); + return entity != null ? EntityUtils.toString(entity) : null; + }; + httpclient.execute(httpget, responseHandler); + } finally { + httpclient.close(); + } + } +} diff --git a/test/plugin/scenarios/undertow-scenario/support-version.list b/test/plugin/scenarios/undertow-scenario/support-version.list new file mode 100644 index 000000000..3a6f7d0e8 --- /dev/null +++ b/test/plugin/scenarios/undertow-scenario/support-version.list @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# undertow has a total of 90 versions from 1.3.0 to 2.0.27, in order to reduce the workload of agent-plugin-test, +# so, some test cases are excluded according to the following rules. +# 1.3.x 1.4.x: select the first, middle, and last version +# 2.0.x: when there are many releases in the same month, choose the last one + +1.3.0.Final +1.3.17.Final +1.3.33.Final +1.4.0.Final +1.4.12.Final +1.4.27.Final +2.0.0.Final +2.0.3.Final +2.0.4.Final +2.0.8.Final +2.0.9.Final +2.0.11.Final +2.0.13.Final +2.0.15.Final +2.0.16.Final +2.0.17.Final +2.0.19.Final +2.0.20.Final +2.0.21.Final +2.0.22.Final +2.0.23.Final +2.0.26.Final +2.0.27.Final \ No newline at end of file