From ea9acc5c24ee386cbac1f14bb90d87944861eaa6 Mon Sep 17 00:00:00 2001 From: kezhenxu94 Date: Thu, 26 Dec 2019 15:26:08 +0800 Subject: [PATCH] =?UTF-8?q?Add=20E2E=20test=20case=20to=20verify=20compati?= =?UTF-8?q?bility=20between=206.x=20agents=20and=207.x=20=E2=80=A6=20(#413?= =?UTF-8?q?2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/e2e.yaml | 16 + .../pom.xml | 146 +++++++ .../src/docker/rc.d/rc0-prepare.sh | 27 ++ .../src/docker/rc.d/rc1-startup.sh | 40 ++ .../client/SampleClientApplication.java | 34 ++ .../e2e/sample/client/TestController.java | 49 +++ .../skywalking/e2e/sample/client/User.java | 56 +++ .../e2e/sample/client/UserRepo.java | 27 ++ .../src/main/resources/application.yml | 35 ++ .../e2e/SampleVerificationITCase.java | 372 ++++++++++++++++++ ...e2e.SampleVerificationITCase.endpoints.yml | 27 ++ ...e2e.SampleVerificationITCase.instances.yml | 34 ++ ...VerificationITCase.serviceInstanceTopo.yml | 41 ++ ....e2e.SampleVerificationITCase.services.yml | 25 ++ ...king.e2e.SampleVerificationITCase.topo.yml | 46 +++ ...ng.e2e.SampleVerificationITCase.traces.yml | 31 ++ test/e2e/pom.xml | 1 + 17 files changed, 1007 insertions(+) create mode 100755 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/pom.xml create mode 100755 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/docker/rc.d/rc0-prepare.sh create mode 100755 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/docker/rc.d/rc1-startup.sh create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/SampleClientApplication.java create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/TestController.java create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/User.java create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/UserRepo.java create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/resources/application.yml create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/java/org/apache/skywalking/e2e/SampleVerificationITCase.java create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.endpoints.yml create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.instances.yml create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.serviceInstanceTopo.yml create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.services.yml create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.topo.yml create mode 100644 test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.traces.yml diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index effd6f32f7..2f0065286c 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -80,3 +80,19 @@ jobs: run: export E2E_VERSION=jdk8-1.3 && bash -x test/e2e/run.sh e2e-ttl/e2e-ttl-es - name: TTL ES7 Tests(JDK8) run: export E2E_VERSION=jdk8-1.3 DIST_PACKAGE=apache-skywalking-apm-bin-es7.tar.gz ES_VERSION=7.4.2 && bash -x test/e2e/run.sh e2e-ttl/e2e-ttl-es + + Compatibilities: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + with: + submodules: true + - name: Set environment + run: export MAVEN_OPTS='-Dmaven.repo.local=~/.m2/repository -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit -Xmx3g' + - name: Compile & Install Test Codes + run: | + ./mvnw checkstyle:check apache-rat:check + ./mvnw -Dcheckstyle.skip -Drat.skip -T2 -Dmaven.compile.fork -Dmaven.compiler.maxmem=3072 -DskipTests clean install + ./mvnw -f test/e2e/pom.xml -pl e2e-base clean install + - name: 6.x Agents & 7.x Backend + run: export E2E_VERSION=jdk8-1.3 && bash -x test/e2e/run.sh e2e-6.x-agent-7.x-oap-compatibility \ No newline at end of file diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/pom.xml b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/pom.xml new file mode 100755 index 0000000000..56e6717810 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/pom.xml @@ -0,0 +1,146 @@ + + + + + + apache-skywalking-e2e + org.apache.skywalking + 1.0.0 + + + 4.0.0 + + e2e-6.x-agent-7.x-oap-compatibility + This test case verifies the compatibility between SkyWalking 6.x agents and SkyWalking 7.x backend + + + skywalking-e2e-container-${build.id}-e2e-6.x-agent-7.x-oap-compatibility + + + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring.boot.version} + + + com.h2database + h2 + ${h2.version} + + + + org.apache.skywalking + e2e-base + ${project.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + true + true + true + + + + + repackage + + + + + + io.fabric8 + docker-maven-plugin + + %a-%t-%i + + + skyapm/e2e-container:${e2e.container.version} + ${e2e.container.name.prefix} + + + ${project.build.finalName}.jar + + + +webapp.host:webapp.port:8081 + +client.host:client.port:9090 + + + + ${sw.home}:/sw + ${project.build.directory}:/home + ${project.basedir}/src/docker/rc.d:/rc.d:ro + + + + + + http://${docker.host.address}:${client.port}/e2e/health-check + + GET + 200 + + + + + + + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + ${webapp.host} + + + ${webapp.port} + + + ${client.host} + + + ${client.port} + + + + + + + verify + + + + + + + diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/docker/rc.d/rc0-prepare.sh b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/docker/rc.d/rc0-prepare.sh new file mode 100755 index 0000000000..9b767d3aea --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/docker/rc.d/rc0-prepare.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Licensed to the SkyAPM 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. + +AGENT_VERSION=6.5.0 + +ls /sw && echo 'Remove SkyWalking agent directory' && rm -rf /sw/agent && ls /sw + +echo 'Download SkyWalking 6.x...' \ + && curl -o /tmp/sw.tar.gz https://archive.apache.org/dist/skywalking/${AGENT_VERSION}/apache-skywalking-apm-${AGENT_VERSION}.tar.gz \ + && tar -C / -zxvf /tmp/sw.tar.gz \ + && ls /apache-skywalking-apm-bin \ + && mv /apache-skywalking-apm-bin/agent /sw/agent \ + && ls /sw diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/docker/rc.d/rc1-startup.sh b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/docker/rc.d/rc1-startup.sh new file mode 100755 index 0000000000..f9382e4343 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/docker/rc.d/rc1-startup.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# Licensed to the SkyAPM 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. + +echo 'starting OAP server...' && start_oap 'init' + +echo 'starting Web app...' && start_webapp '0.0.0.0' 8081 + +echo 'starting instrumented services...' && start_instrumented_services + +check_tcp 127.0.0.1 \ + 9090 \ + 60 \ + 10 \ + "waiting for the instrumented service to be ready" + +if [[ $? -ne 0 ]]; then + echo "instrumented service 0 failed to start in 30 * 10 seconds: " + cat ${SERVICE_LOG}/* + exit 1 +fi + +echo "SkyWalking e2e container is ready for tests" + +tail -f ${OAP_LOG_DIR}/* \ + ${WEBAPP_LOG_DIR}/* \ + ${SERVICE_LOG}/* diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/SampleClientApplication.java b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/SampleClientApplication.java new file mode 100644 index 0000000000..a55dbd6857 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/SampleClientApplication.java @@ -0,0 +1,34 @@ +/* + * 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.e2e.sample.client; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +/** + * @author kezhenxu94 + */ +@EnableJpaRepositories +@SpringBootApplication +public class SampleClientApplication { + public static void main(String[] args) { + SpringApplication.run(SampleClientApplication.class, args); + } +} diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/TestController.java b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/TestController.java new file mode 100644 index 0000000000..566bcdea4a --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/TestController.java @@ -0,0 +1,49 @@ +/* + * 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.e2e.sample.client; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author kezhenxu94 + */ +@RestController +@RequestMapping("/e2e") +public class TestController { + private final UserRepo userRepo; + + public TestController(final UserRepo userRepo) { + this.userRepo = userRepo; + } + + @GetMapping("/health-check") + public String hello() { + return "healthy"; + } + + @PostMapping("/users") + public User createAuthor(@RequestBody final User user) throws InterruptedException { + Thread.sleep(1000L); + return userRepo.save(user); + } +} diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/User.java b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/User.java new file mode 100644 index 0000000000..4589c7f2c4 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/User.java @@ -0,0 +1,56 @@ +/* + * 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.e2e.sample.client; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * @author kezhenxu94 + */ +@Entity +public class User { + public User() { + } + + @Id + @GeneratedValue + private Long id; + + @Column + private String name; + + public Long getId() { + return id; + } + + public void setId(final Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } +} diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/UserRepo.java b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/UserRepo.java new file mode 100644 index 0000000000..882af92a82 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/java/org/apache/skywalking/e2e/sample/client/UserRepo.java @@ -0,0 +1,27 @@ +/* + * 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.e2e.sample.client; + +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * @author kezhenxu94 + */ +public interface UserRepo extends JpaRepository { +} diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/resources/application.yml b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/resources/application.yml new file mode 100644 index 0000000000..ef3ed01cd4 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/main/resources/application.yml @@ -0,0 +1,35 @@ +# 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. + +server: + port: 9090 + +spring: + main: + banner-mode: 'off' + datasource: + url: jdbc:h2:mem:testdb + driver-class-name: org.h2.Driver + data-username: sa + password: sa + platform: org.hibernate.dialect.H2Dialect + jpa: + generate-ddl: true + hibernate: + ddl-auto: create-drop + properties: + hibernate.format_sql: true + show-sql: true diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/java/org/apache/skywalking/e2e/SampleVerificationITCase.java b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/java/org/apache/skywalking/e2e/SampleVerificationITCase.java new file mode 100644 index 0000000000..cd592bb45f --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/java/org/apache/skywalking/e2e/SampleVerificationITCase.java @@ -0,0 +1,372 @@ +/* + * 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.e2e; + +import org.apache.skywalking.e2e.metrics.AtLeastOneOfMetricsMatcher; +import org.apache.skywalking.e2e.metrics.Metrics; +import org.apache.skywalking.e2e.metrics.MetricsQuery; +import org.apache.skywalking.e2e.metrics.MetricsValueMatcher; +import org.apache.skywalking.e2e.service.Service; +import org.apache.skywalking.e2e.service.ServicesMatcher; +import org.apache.skywalking.e2e.service.ServicesQuery; +import org.apache.skywalking.e2e.service.endpoint.Endpoint; +import org.apache.skywalking.e2e.service.endpoint.EndpointQuery; +import org.apache.skywalking.e2e.service.endpoint.Endpoints; +import org.apache.skywalking.e2e.service.endpoint.EndpointsMatcher; +import org.apache.skywalking.e2e.service.instance.Instance; +import org.apache.skywalking.e2e.service.instance.Instances; +import org.apache.skywalking.e2e.service.instance.InstancesMatcher; +import org.apache.skywalking.e2e.service.instance.InstancesQuery; +import org.apache.skywalking.e2e.topo.*; +import org.apache.skywalking.e2e.trace.Trace; +import org.apache.skywalking.e2e.trace.TracesMatcher; +import org.apache.skywalking.e2e.trace.TracesQuery; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.client.RestTemplate; +import org.yaml.snakeyaml.Yaml; + +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.apache.skywalking.e2e.metrics.MetricsMatcher.verifyMetrics; +import static org.apache.skywalking.e2e.metrics.MetricsQuery.*; +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author kezhenxu94 + */ +@RunWith(SpringJUnit4ClassRunner.class) +public class SampleVerificationITCase { + private static final Logger LOGGER = LoggerFactory.getLogger(SampleVerificationITCase.class); + + private final RestTemplate restTemplate = new RestTemplate(); + private final int retryInterval = 30; + + private SimpleQueryClient queryClient; + private String instrumentedServiceUrl; + + @Before + public void setUp() { + final String swWebappHost = System.getProperty("sw.webapp.host", "127.0.0.1"); + final String swWebappPort = System.getProperty("sw.webapp.port", "32783"); + final String instrumentedServiceHost = System.getProperty("client.host", "127.0.0.1"); + final String instrumentedServicePort = System.getProperty("client.port", "32782"); + queryClient = new SimpleQueryClient(swWebappHost, swWebappPort); + instrumentedServiceUrl = "http://" + instrumentedServiceHost + ":" + instrumentedServicePort; + } + + @Test(timeout = 1200000) + @DirtiesContext + public void verify() throws Exception { + final LocalDateTime minutesAgo = LocalDateTime.now(ZoneOffset.UTC); + + while (true) { + try { + final Map user = new HashMap<>(); + user.put("name", "SkyWalking"); + final ResponseEntity responseEntity = restTemplate.postForEntity( + instrumentedServiceUrl + "/e2e/users", + user, + String.class + ); + LOGGER.info("responseEntity: {}", responseEntity); + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); + final List traces = queryClient.traces( + new TracesQuery() + .start(minutesAgo) + .end(LocalDateTime.now()) + .orderByDuration() + ); + if (!traces.isEmpty()) { + break; + } + Thread.sleep(10000L); + } catch (Exception ignored) { + } + } + + doRetryableVerification(() -> { + try { + verifyTraces(minutesAgo); + } catch (Exception e) { + LOGGER.warn(e.getMessage(), e); + } + }); + + doRetryableVerification(() -> { + try { + verifyServices(minutesAgo); + } catch (Exception e) { + LOGGER.warn(e.getMessage(), e); + } + }); + + doRetryableVerification(() -> { + try { + verifyTopo(minutesAgo); + } catch (Exception e) { + LOGGER.warn(e.getMessage(), e); + } + }); + + doRetryableVerification(() -> { + try{ + verifyServiceInstanceTopo(minutesAgo); + }catch (Exception e) { + LOGGER.warn(e.getMessage(), e); + } + }); + } + + private void verifyTopo(LocalDateTime minutesAgo) throws Exception { + final LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC); + + final TopoData topoData = queryClient.topo( + new TopoQuery() + .stepByMinute() + .start(minutesAgo.minusDays(1)) + .end(now) + ); + LOGGER.info("topoData: {}", topoData); + + InputStream expectedInputStream = + new ClassPathResource("expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.topo.yml").getInputStream(); + + final TopoMatcher topoMatcher = new Yaml().loadAs(expectedInputStream, TopoMatcher.class); + topoMatcher.verify(topoData); + verifyServiceRelationMetrics(topoData.getCalls(), minutesAgo); + } + + private void verifyServiceInstanceTopo(LocalDateTime minutesAgo) throws Exception { + final LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC); + + final ServiceInstanceTopoData topoData = queryClient.serviceInstanceTopo( + new ServiceInstanceTopoQuery() + .stepByMinute() + .start(minutesAgo.minusDays(1)) + .end(now) + .clientServiceId("1") + .serverServiceId("2") + ); + LOGGER.info("instanceTopoData: {}", topoData); + + InputStream expectedInputStream = + new ClassPathResource("expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.serviceInstanceTopo.yml").getInputStream(); + + final ServiceInstanceTopoMatcher topoMatcher = new Yaml().loadAs(expectedInputStream, ServiceInstanceTopoMatcher.class); + topoMatcher.verify(topoData); + verifyServiceInstanceRelationMetrics(topoData.getCalls(), minutesAgo); + } + + private void verifyServices(LocalDateTime minutesAgo) throws Exception { + final LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC); + + final List services = queryClient.services( + new ServicesQuery() + .start(minutesAgo) + .end(now) + ); + LOGGER.info("services: {}", services); + + InputStream expectedInputStream = + new ClassPathResource("expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.services.yml").getInputStream(); + + final ServicesMatcher servicesMatcher = new Yaml().loadAs(expectedInputStream, ServicesMatcher.class); + servicesMatcher.verify(services); + + for (Service service : services) { + LOGGER.info("verifying service instances: {}", service); + + verifyServiceMetrics(service); + + Instances instances = verifyServiceInstances(minutesAgo, now, service); + + verifyInstancesMetrics(instances); + + Endpoints endpoints = verifyServiceEndpoints(minutesAgo, now, service); + + verifyEndpointsMetrics(endpoints); + } + } + + private Instances verifyServiceInstances(LocalDateTime minutesAgo, LocalDateTime now, + Service service) throws Exception { + InputStream expectedInputStream; + Instances instances = queryClient.instances( + new InstancesQuery() + .serviceId(service.getKey()) + .start(minutesAgo) + .end(now) + ); + LOGGER.info("instances: {}", instances); + expectedInputStream = + new ClassPathResource("expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.instances.yml").getInputStream(); + final InstancesMatcher instancesMatcher = new Yaml().loadAs(expectedInputStream, InstancesMatcher.class); + instancesMatcher.verify(instances); + return instances; + } + + private Endpoints verifyServiceEndpoints(LocalDateTime minutesAgo, LocalDateTime now, + Service service) throws Exception { + Endpoints instances = queryClient.endpoints( + new EndpointQuery().serviceId(service.getKey()) + ); + LOGGER.info("instances: {}", instances); + InputStream expectedInputStream = + new ClassPathResource("expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.endpoints.yml").getInputStream(); + final EndpointsMatcher endpointsMatcher = new Yaml().loadAs(expectedInputStream, EndpointsMatcher.class); + endpointsMatcher.verify(instances); + return instances; + } + + private void verifyInstancesMetrics(Instances instances) throws Exception { + for (Instance instance : instances.getInstances()) { + for (String metricsName : ALL_INSTANCE_METRICS) { + LOGGER.info("verifying service instance response time: {}", instance); + final Metrics instanceMetrics = queryClient.metrics( + new MetricsQuery() + .stepByMinute() + .metricsName(metricsName) + .id(instance.getKey()) + ); + LOGGER.info("instanceMetrics: {}", instanceMetrics); + AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher(); + MetricsValueMatcher greaterThanZero = new MetricsValueMatcher(); + greaterThanZero.setValue("gt 0"); + instanceRespTimeMatcher.setValue(greaterThanZero); + instanceRespTimeMatcher.verify(instanceMetrics); + LOGGER.info("{}: {}", metricsName, instanceMetrics); + } + } + } + + private void verifyEndpointsMetrics(Endpoints endpoints) throws Exception { + for (Endpoint endpoint : endpoints.getEndpoints()) { + if (!endpoint.getLabel().equals("/e2e/users")) { + continue; + } + for (String metricName : ALL_ENDPOINT_METRICS) { + LOGGER.info("verifying endpoint {}, metrics: {}", endpoint, metricName); + final Metrics metrics = queryClient.metrics( + new MetricsQuery() + .stepByMinute() + .metricsName(metricName) + .id(endpoint.getKey()) + ); + LOGGER.info("metrics: {}", metrics); + AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher(); + MetricsValueMatcher greaterThanZero = new MetricsValueMatcher(); + greaterThanZero.setValue("gt 0"); + instanceRespTimeMatcher.setValue(greaterThanZero); + instanceRespTimeMatcher.verify(metrics); + LOGGER.info("{}: {}", metricName, metrics); + } + } + } + + private void verifyServiceMetrics(Service service) throws Exception { + for (String metricName : ALL_SERVICE_METRICS) { + LOGGER.info("verifying service {}, metrics: {}", service, metricName); + final Metrics serviceMetrics = queryClient.metrics( + new MetricsQuery() + .stepByMinute() + .metricsName(metricName) + .id(service.getKey()) + ); + LOGGER.info("serviceMetrics: {}", serviceMetrics); + AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher(); + MetricsValueMatcher greaterThanZero = new MetricsValueMatcher(); + greaterThanZero.setValue("gt 0"); + instanceRespTimeMatcher.setValue(greaterThanZero); + instanceRespTimeMatcher.verify(serviceMetrics); + LOGGER.info("{}: {}", metricName, serviceMetrics); + } + } + + private void verifyTraces(LocalDateTime minutesAgo) throws Exception { + final LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC); + + final List traces = queryClient.traces( + new TracesQuery() + .start(minutesAgo) + .end(now) + .orderByDuration() + ); + LOGGER.info("traces: {}", traces); + + InputStream expectedInputStream = + new ClassPathResource("expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.traces.yml").getInputStream(); + + final TracesMatcher tracesMatcher = new Yaml().loadAs(expectedInputStream, TracesMatcher.class); + tracesMatcher.verify(traces); + } + + private void verifyServiceInstanceRelationMetrics(List calls, final LocalDateTime minutesAgo) throws Exception { + verifyRelationMetrics(calls, minutesAgo, ALL_SERVICE_INSTANCE_RELATION_CLIENT_METRICS, ALL_SERVICE_INSTANCE_RELATION_SERVER_METRICS); + } + + private void verifyServiceRelationMetrics(List calls, final LocalDateTime minutesAgo) throws Exception { + verifyRelationMetrics(calls, minutesAgo, ALL_SERVICE_RELATION_CLIENT_METRICS, ALL_SERVICE_RELATION_SERVER_METRICS); + } + + private void verifyRelationMetrics(List calls, final LocalDateTime minutesAgo, String[] relationClientMetrics, String[] relationServerMetrics) throws Exception { + for (Call call : calls) { + for (String detectPoint : call.getDetectPoints()) { + switch (detectPoint) { + case "CLIENT": { + for (String metricName : relationClientMetrics) { + verifyMetrics(queryClient, metricName, call.getId(), minutesAgo); + } + break; + } + case "SERVER": { + for (String metricName : relationServerMetrics) { + verifyMetrics(queryClient, metricName, call.getId(), minutesAgo); + } + break; + } + } + } + } + } + + private void doRetryableVerification(Runnable runnable) throws InterruptedException { + while (true) { + try { + runnable.run(); + break; + } catch (Throwable ignored) { + Thread.sleep(retryInterval); + } + } + } +} diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.endpoints.yml b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.endpoints.yml new file mode 100644 index 0000000000..a1f5b450af --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.endpoints.yml @@ -0,0 +1,27 @@ +# 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. + +# 1 health-check by docker-maven-plugin +# 1 drop table if exists, because we have `ddl-auto: create-drop` +# 1 drop sequence +# 1 create sequence +# 1 create table statement + +endpoints: + - key: not null + label: /e2e/health-check + - key: not null + label: /e2e/users diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.instances.yml b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.instances.yml new file mode 100644 index 0000000000..26bb314d2b --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.instances.yml @@ -0,0 +1,34 @@ +# 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. + +# 1 health-check by docker-maven-plugin +# 1 drop table if exists, because we have `ddl-auto: create-drop` +# 1 drop sequence +# 1 create sequence +# 1 create table statement + +instances: + - key: 2 + label: not null + attributes: + - name: os_name + value: not null + - name: host_name + value: not null + - name: process_no + value: gt 0 + - name: ipv4s + value: not null diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.serviceInstanceTopo.yml b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.serviceInstanceTopo.yml new file mode 100644 index 0000000000..d312bd8a78 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.serviceInstanceTopo.yml @@ -0,0 +1,41 @@ +# 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. + +# 1 health-check by docker-maven-plugin +# 1 drop table if exists, because we have `ddl-auto: create-drop` +# 1 drop sequence +# 1 create sequence +# 1 create table statement + +nodes: + - id: 1 + name: User + type: USER + serviceId: 1 + serviceName: User + isReal: false + - id: 2 + name: not null + serviceId: 2 + serviceName: Your_ApplicationName + type: Tomcat + isReal: true +calls: + - id: 1_2 + source: 1 + detectPoints: + - SERVER + target: 2 diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.services.yml b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.services.yml new file mode 100644 index 0000000000..07ff835878 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.services.yml @@ -0,0 +1,25 @@ +# 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. + +# 1 health-check by docker-maven-plugin +# 1 drop table if exists, because we have `ddl-auto: create-drop` +# 1 drop sequence +# 1 create sequence +# 1 create table statement + +services: + - key: 2 + label: "Your_ApplicationName" diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.topo.yml b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.topo.yml new file mode 100644 index 0000000000..3a455f5b60 --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.topo.yml @@ -0,0 +1,46 @@ +# 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. + +# 1 health-check by docker-maven-plugin +# 1 drop table if exists, because we have `ddl-auto: create-drop` +# 1 drop sequence +# 1 create sequence +# 1 create table statement + +nodes: + - id: 1 + name: User + type: USER + isReal: false + - id: 2 + name: Your_ApplicationName + type: Tomcat + isReal: true + - id: 3 + name: "localhost:-1" + type: H2 + isReal: false +calls: + - id: 2_3 + source: 2 + detectPoints: + - CLIENT + target: 3 + - id: 1_2 + source: 1 + detectPoints: + - SERVER + target: 2 diff --git a/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.traces.yml b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.traces.yml new file mode 100644 index 0000000000..2052aad3ac --- /dev/null +++ b/test/e2e/e2e-6.x-agent-7.x-oap-compatibility/src/test/resources/expected-data/org.apache.skywalking.e2e.SampleVerificationITCase.traces.yml @@ -0,0 +1,31 @@ +# 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. + +# 1 health-check by docker-maven-plugin +# 1 drop table if exists, because we have `ddl-auto: create-drop` +# 1 drop sequence +# 1 create sequence +# 1 create table statement + +traces: + - key: not null + endpointNames: + - /e2e/users + duration: ge 0 + start: gt 0 + isError: false + traceIds: + - not null diff --git a/test/e2e/pom.xml b/test/e2e/pom.xml index 1d21ed82a2..790f774187 100644 --- a/test/e2e/pom.xml +++ b/test/e2e/pom.xml @@ -39,6 +39,7 @@ e2e-cluster-with-gateway e2e-agent-reboot e2e-ttl + e2e-6.x-agent-7.x-oap-compatibility -- GitLab