This is an automated email from the ASF dual-hosted git repository. kezhenxu94 pushed a commit to branch e2e/ref in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit f94e8986614c41e8b1abcd8570d7eee9cdf17c90 Author: kezhenxu94 <[email protected]> AuthorDate: Sun Dec 6 00:12:34 2020 +0800 test: extract so11y test and add logs --- .github/workflows/e2e.so11y.yaml | 61 ++++++++ docker/oap/log4j2.xml | 1 + .../provider/PrometheusFetcherProvider.java | 3 + .../docker/simple/so11y/docker-compose.yml | 36 +++++ .../java/org/apache/skywalking/e2e/ClusterE2E.java | 24 ++-- .../java/org/apache/skywalking/e2e/SO11yE2E.java | 156 +++++++++++++++++++++ .../apache/skywalking/e2e/simple/SimpleE2E.java | 61 +------- 7 files changed, 272 insertions(+), 70 deletions(-) diff --git a/.github/workflows/e2e.so11y.yaml b/.github/workflows/e2e.so11y.yaml new file mode 100644 index 0000000..da3f86f --- /dev/null +++ b/.github/workflows/e2e.so11y.yaml @@ -0,0 +1,61 @@ +# 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. + +name: E2E + +on: + pull_request: + paths: + - '**' + - '!**.md' + push: + branches: + - master + +env: + SKIP_TEST: true + SW_AGENT_JDK_VERSION: 8 + CODECOV_TOKEN: d2065307-8f01-4637-9715-2781ef096db7 + +jobs: + SelfObservability: + name: SelfObservability + runs-on: ubuntu-latest + timeout-minutes: 90 + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Cache local Maven repository + uses: actions/cache@v2 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + - name: Compile and Build + run: make docker + - name: Copy dist package + run: cp -R dist test/e2e/ + - name: ${{ matrix.case }} + run: ./mvnw --batch-mode -f test/e2e/pom.xml -am -DfailIfNoTests=false verify -Dit.test=org.apache.skywalking.e2e.SO11yE2E + - name: Report Coverage + run: bash -x tools/coverage/report.sh + - uses: actions/upload-artifact@v1 + if: failure() + with: + name: logs + path: logs diff --git a/docker/oap/log4j2.xml b/docker/oap/log4j2.xml index 28994ea..5dd32af 100644 --- a/docker/oap/log4j2.xml +++ b/docker/oap/log4j2.xml @@ -29,6 +29,7 @@ <logger name="org.elasticsearch.common.network.IfConfig" level="INFO"/> <logger name="io.grpc.netty" level="INFO"/> <logger name="org.apache.skywalking.oap.server.receiver.istio.telemetry" level="DEBUG"/> + <logger name="org.apache.skywalking.oap.server.fetcher.prometheus" level="DEBUG"/> <logger name="org.apache.skywalking.oap.server.receiver.envoy.als" level="DEBUG"/> <Root level="INFO"> <AppenderRef ref="Console"/> diff --git a/oap-server/server-fetcher-plugin/prometheus-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/prometheus/provider/PrometheusFetcherProvider.java b/oap-server/server-fetcher-plugin/prometheus-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/prometheus/provider/PrometheusFetcherProvider.java index ff9025c..3536203 100644 --- a/oap-server/server-fetcher-plugin/prometheus-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/prometheus/provider/PrometheusFetcherProvider.java +++ b/oap-server/server-fetcher-plugin/prometheus-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/prometheus/provider/PrometheusFetcherProvider.java @@ -134,6 +134,9 @@ public class PrometheusFetcherProvider extends ModuleProvider { result.addAll(mf.getMetrics()); } } + if (log.isDebugEnabled()) { + log.debug("Fetch metrics from prometheus: {}", result); + } return result; })) .flatMap(tryIt -> MetricConvert.log(tryIt, "Load metric")) diff --git a/test/e2e/e2e-test/docker/simple/so11y/docker-compose.yml b/test/e2e/e2e-test/docker/simple/so11y/docker-compose.yml new file mode 100644 index 0000000..9860146 --- /dev/null +++ b/test/e2e/e2e-test/docker/simple/so11y/docker-compose.yml @@ -0,0 +1,36 @@ +# 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. + +version: '2.1' + +services: + oap: + environment: + SW_PROMETHEUS_FETCHER: "default" + SW_TELEMETRY: prometheus + extends: + file: ../../base-compose.yml + service: oap + + ui: + extends: + file: ../../base-compose.yml + service: ui + depends_on: + oap: + condition: service_healthy + +networks: + e2e: diff --git a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/ClusterE2E.java b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/ClusterE2E.java index e365860..1a949fe 100755 --- a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/ClusterE2E.java +++ b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/ClusterE2E.java @@ -19,6 +19,7 @@ package org.apache.skywalking.e2e; import java.util.List; +import java.util.TimeZone; import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.e2e.annotation.ContainerHostAndPort; import org.apache.skywalking.e2e.annotation.DockerCompose; @@ -67,29 +68,30 @@ import static org.apache.skywalking.e2e.utils.Yamls.load; import static org.assertj.core.api.Assertions.fail; @Slf4j -@SkyWalkingE2E +// @SkyWalkingE2E public class ClusterE2E extends SkyWalkingTestAdapter { - @SuppressWarnings("unused") - @DockerCompose({ - "docker/cluster/docker-compose.yml", - "docker/cluster/docker-compose.${SW_COORDINATOR}.yml", - "docker/cluster/docker-compose.${SW_COORDINATOR}.${SW_STORAGE}.yml", - }) - protected DockerComposeContainer<?> justForSideEffects; + // @SuppressWarnings("unused") + // @DockerCompose({ + // "docker/cluster/docker-compose.yml", + // "docker/cluster/docker-compose.${SW_COORDINATOR}.yml", + // "docker/cluster/docker-compose.${SW_COORDINATOR}.${SW_STORAGE}.yml", + // }) + // protected DockerComposeContainer<?> justForSideEffects; @SuppressWarnings("unused") - @ContainerHostAndPort(name = "ui", port = 8080) - private HostAndPort swWebappHostPort; + // @ContainerHostAndPort(name = "ui", port = 8080) + private HostAndPort swWebappHostPort = HostAndPort.builder().host("localhost").port(12800).build(); @SuppressWarnings("unused") @ContainerHostAndPort(name = "consumer", port = 9092) - private HostAndPort serviceHostPort; + private HostAndPort serviceHostPort = HostAndPort.builder().host("localhost").port(8989).build(); private final String providerName = "e2e-service-provider"; private final String consumerName = "e2e-service-consumer"; @BeforeAll public void setUp() throws Exception { + TimeZone.setDefault(xxxxxxxxxxxxxx); queryClient(swWebappHostPort); trafficController(serviceHostPort, "/users"); } diff --git a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/SO11yE2E.java b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/SO11yE2E.java new file mode 100644 index 0000000..a680d4c --- /dev/null +++ b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/SO11yE2E.java @@ -0,0 +1,156 @@ +/* + * 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 java.util.List; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.e2e.annotation.ContainerHostAndPort; +import org.apache.skywalking.e2e.annotation.DockerCompose; +import org.apache.skywalking.e2e.base.SkyWalkingE2E; +import org.apache.skywalking.e2e.base.SkyWalkingTestAdapter; +import org.apache.skywalking.e2e.common.HostAndPort; +import org.apache.skywalking.e2e.metrics.AtLeastOneOfMetricsMatcher; +import org.apache.skywalking.e2e.metrics.Metrics; +import org.apache.skywalking.e2e.metrics.MetricsValueMatcher; +import org.apache.skywalking.e2e.metrics.ReadMetrics; +import org.apache.skywalking.e2e.metrics.ReadMetricsQuery; +import org.apache.skywalking.e2e.retryable.RetryableTest; +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.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.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.containers.DockerComposeContainer; + +import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SO11Y_LABELED_METRICS; +import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SO11Y_LINER_METRICS; +import static org.apache.skywalking.e2e.utils.Times.now; +import static org.apache.skywalking.e2e.utils.Yamls.load; + +/** + * A test case for simple functionality verification + * + * The components are typically: + * + * - an single agent, (provider), generating traffic data + * + * - an OAP node, (oap) + * + * - a webapp, (ui) for querying + * + * The verifications are: + * + * - services + * + * - services metrics + * + * - services relations + * + * - endpoints + * + * - endpoints metrics + * + * - instances + * + * - instance metrics + * + * - topology + * + * - traces + * + * if your case needs the same aforementioned verifications, consider simply provide a docker-compose.yml with the specific orchestration and reuse these codes. + */ +@Slf4j +@SkyWalkingE2E +public class SO11yE2E extends SkyWalkingTestAdapter { + @SuppressWarnings("unused") + @DockerCompose("docker/simple/so11y/docker-compose.yml") + protected DockerComposeContainer<?> justForSideEffects; + + @SuppressWarnings("unused") + @ContainerHostAndPort(name = "ui", port = 8080) + protected HostAndPort swWebappHostPort; + + @BeforeAll + void setUp() { + queryClient(swWebappHostPort); + } + + @AfterAll + public void tearDown() { + trafficController.stop(); + } + + @RetryableTest + void so11y() throws Exception { + List<Service> services = graphql.services(new ServicesQuery().start(startTime).end(now())); + + services = services.stream().filter(s -> s.getLabel().equals("oap::oap-server")).collect(Collectors.toList()); + LOGGER.info("services: {}", services); + load("expected/simple/so11y-services.yml").as(ServicesMatcher.class).verify(services); + for (final Service service : services) { + final Instances instances = graphql.instances( + new InstancesQuery().serviceId(service.getKey()).start(startTime).end(now()) + ); + + LOGGER.info("instances: {}", instances); + + load("expected/simple/so11y-instances.yml").as(InstancesMatcher.class).verify(instances); + for (Instance instance : instances.getInstances()) { + for (String metricsName : ALL_SO11Y_LINER_METRICS) { + LOGGER.info("verifying service instance response time: {}", instance); + final ReadMetrics instanceMetrics = graphql.readMetrics( + new ReadMetricsQuery().stepByMinute().metricsName(metricsName) + .serviceName(service.getLabel()).instanceName(instance.getLabel()) + ); + + LOGGER.info("{}: {}", metricsName, instanceMetrics); + final AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher(); + final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher(); + greaterThanZero.setValue("gt 0"); + instanceRespTimeMatcher.setValue(greaterThanZero); + instanceRespTimeMatcher.verify(instanceMetrics.getValues()); + } + for (String metricsName : ALL_SO11Y_LABELED_METRICS) { + LOGGER.info("verifying service instance response time: {}", instance); + final List<ReadMetrics> instanceMetrics = graphql.readLabeledMetrics( + new ReadMetricsQuery().stepByMinute().metricsName(metricsName) + .serviceName(service.getLabel()).instanceName(instance.getLabel()) + ); + + LOGGER.info("{}: {}", metricsName, instanceMetrics); + Metrics allValues = new Metrics(); + for (ReadMetrics readMetrics : instanceMetrics) { + allValues.getValues().addAll(readMetrics.getValues().getValues()); + } + final AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher(); + final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher(); + greaterThanZero.setValue("gt 0"); + instanceRespTimeMatcher.setValue(greaterThanZero); + instanceRespTimeMatcher.verify(allValues); + } + } + } + } +} diff --git a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java index bc5268b..09ab846 100644 --- a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java +++ b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java @@ -18,6 +18,8 @@ package org.apache.skywalking.e2e.simple; +import java.util.List; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.e2e.annotation.ContainerHostAndPort; import org.apache.skywalking.e2e.annotation.DockerCompose; @@ -28,8 +30,6 @@ 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.metrics.ReadMetrics; -import org.apache.skywalking.e2e.metrics.ReadMetricsQuery; import org.apache.skywalking.e2e.retryable.RetryableTest; import org.apache.skywalking.e2e.service.Service; import org.apache.skywalking.e2e.service.ServicesMatcher; @@ -56,9 +56,6 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.testcontainers.containers.DockerComposeContainer; -import java.util.List; -import java.util.stream.Collectors; - import static org.apache.skywalking.e2e.metrics.MetricsMatcher.verifyMetrics; import static org.apache.skywalking.e2e.metrics.MetricsMatcher.verifyPercentileMetrics; import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_ENDPOINT_METRICS; @@ -71,8 +68,6 @@ import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_METRICS import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_MULTIPLE_LINEAR_METRICS; import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_RELATION_CLIENT_METRICS; import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_RELATION_SERVER_METRICS; -import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SO11Y_LABELED_METRICS; -import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SO11Y_LINER_METRICS; import static org.apache.skywalking.e2e.utils.Times.now; import static org.apache.skywalking.e2e.utils.Yamls.load; @@ -199,58 +194,6 @@ public class SimpleE2E extends SkyWalkingTestAdapter { verifyServiceInstanceRelationMetrics(topology.getCalls()); } - @RetryableTest - void so11y() throws Exception { - List<Service> services = graphql.services(new ServicesQuery().start(startTime).end(now())); - - services = services.stream().filter(s -> s.getLabel().equals("oap::oap-server")).collect(Collectors.toList()); - LOGGER.info("services: {}", services); - load("expected/simple/so11y-services.yml").as(ServicesMatcher.class).verify(services); - for (final Service service : services) { - final Instances instances = graphql.instances( - new InstancesQuery().serviceId(service.getKey()).start(startTime).end(now()) - ); - - LOGGER.info("instances: {}", instances); - - load("expected/simple/so11y-instances.yml").as(InstancesMatcher.class).verify(instances); - for (Instance instance : instances.getInstances()) { - for (String metricsName : ALL_SO11Y_LINER_METRICS) { - LOGGER.info("verifying service instance response time: {}", instance); - final ReadMetrics instanceMetrics = graphql.readMetrics( - new ReadMetricsQuery().stepByMinute().metricsName(metricsName) - .serviceName(service.getLabel()).instanceName(instance.getLabel()) - ); - - LOGGER.info("{}: {}", metricsName, instanceMetrics); - final AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher(); - final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher(); - greaterThanZero.setValue("gt 0"); - instanceRespTimeMatcher.setValue(greaterThanZero); - instanceRespTimeMatcher.verify(instanceMetrics.getValues()); - } - for (String metricsName : ALL_SO11Y_LABELED_METRICS) { - LOGGER.info("verifying service instance response time: {}", instance); - final List<ReadMetrics> instanceMetrics = graphql.readLabeledMetrics( - new ReadMetricsQuery().stepByMinute().metricsName(metricsName) - .serviceName(service.getLabel()).instanceName(instance.getLabel()) - ); - - LOGGER.info("{}: {}", metricsName, instanceMetrics); - Metrics allValues = new Metrics(); - for (ReadMetrics readMetrics : instanceMetrics) { - allValues.getValues().addAll(readMetrics.getValues().getValues()); - } - final AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher(); - final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher(); - greaterThanZero.setValue("gt 0"); - instanceRespTimeMatcher.setValue(greaterThanZero); - instanceRespTimeMatcher.verify(allValues); - } - } - } - } - private Instances verifyServiceInstances(final Service service) throws Exception { final Instances instances = graphql.instances( new InstancesQuery().serviceId(service.getKey()).start(startTime).end(now())
