BanyanDB stages E2E (#13249)
This commit is contained in:
parent
ad61a58037
commit
5c1c2eb4ad
|
|
@ -716,6 +716,10 @@ jobs:
|
|||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
- run: grep -v '^#' test/e2e-v2/script/env >> "$GITHUB_ENV"
|
||||
- uses: apache/skywalking-cli/actions/setup@master
|
||||
with:
|
||||
version: ${{ env.SW_CTL_COMMIT }}
|
||||
- uses: actions/download-artifact@v4
|
||||
name: Download docker images
|
||||
with:
|
||||
|
|
@ -796,6 +800,10 @@ jobs:
|
|||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
- run: grep -v '^#' test/e2e-v2/script/env >> "$GITHUB_ENV"
|
||||
- uses: apache/skywalking-cli/actions/setup@master
|
||||
with:
|
||||
version: ${{ env.SW_CTL_COMMIT }}
|
||||
- uses: actions/download-artifact@v4
|
||||
name: Download docker images
|
||||
with:
|
||||
|
|
@ -848,6 +856,10 @@ jobs:
|
|||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
- run: grep -v '^#' test/e2e-v2/script/env >> "$GITHUB_ENV"
|
||||
- uses: apache/skywalking-cli/actions/setup@master
|
||||
with:
|
||||
version: ${{ env.SW_CTL_COMMIT }}
|
||||
- uses: actions/download-artifact@v4
|
||||
name: Download docker images
|
||||
with:
|
||||
|
|
@ -877,6 +889,111 @@ jobs:
|
|||
with:
|
||||
e2e-file: $GITHUB_WORKSPACE/test/e2e-v2/cases/simple/jdk/e2e.yaml
|
||||
|
||||
e2e-test-banyandb-stages:
|
||||
if: |
|
||||
( always() && ! cancelled() ) &&
|
||||
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
|
||||
name: E2E test
|
||||
needs: [docker, dist-tar]
|
||||
runs-on: ${{ matrix.test.runs-on || 'ubuntu-latest' }}
|
||||
timeout-minutes: 60
|
||||
env:
|
||||
BANYANDB_DATA_GENERATE_ROOT: test/e2e-v2/cases/storage/banyandb/data-generate
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
test:
|
||||
- name: BanyanDB Stages
|
||||
config: test/e2e-v2/cases/storage/banyandb/stages/e2e.yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
- run: grep -v '^#' test/e2e-v2/script/env >> "$GITHUB_ENV"
|
||||
- uses: apache/skywalking-cli/actions/setup@master
|
||||
with:
|
||||
version: ${{ env.SW_CTL_COMMIT }}
|
||||
- uses: actions/download-artifact@v4
|
||||
name: Download docker images
|
||||
with:
|
||||
name: docker-images-11
|
||||
path: docker-images
|
||||
- name: Load docker images
|
||||
run: |
|
||||
find docker-images -name "*.tar" -exec docker load -i {} \;
|
||||
find docker-images -name "*.tar" -exec rm {} \;
|
||||
- uses: actions/download-artifact@v4
|
||||
name: Download distribution tar
|
||||
with:
|
||||
name: dist
|
||||
path: dist
|
||||
- name: Login to ghcr
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Cache maven repository
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('test/e2e-v2/java-test-service/**/pom.xml') }}
|
||||
restore-keys: ${{ runner.os }}-maven-
|
||||
- name: Prepare test services
|
||||
shell: bash
|
||||
run: ./mvnw -B -q -f test/e2e-v2/java-test-service/pom.xml clean flatten:flatten package
|
||||
- name: Set env var
|
||||
run: |
|
||||
echo "${{ matrix.test.env }}" >> $GITHUB_ENV
|
||||
- name: Build test image
|
||||
if: matrix.test.docker != null
|
||||
run: docker build -t ${{ matrix.test.docker.name }} -f ${{ matrix.test.docker.base }}/${{ matrix.test.docker.file }} ${{ matrix.test.docker.base }}
|
||||
- name: Generate BanyanDB cold data
|
||||
run: |
|
||||
export $(grep -v '^#' test/e2e-v2/script/env | xargs)
|
||||
docker compose -f ${BANYANDB_DATA_GENERATE_ROOT}/docker-compose.yml up -d
|
||||
CONTAINER_ID=$(docker compose -f ${BANYANDB_DATA_GENERATE_ROOT}/docker-compose.yml ps -q banyandb)
|
||||
echo "⌛ monitoring segment files..."
|
||||
found=false
|
||||
for i in {1..60}; do
|
||||
# check if segment files exist
|
||||
if docker exec $CONTAINER_ID sh -c '[ -n "$(ls /tmp/measure-data/measure/data/day/seg* 2>/dev/null)" ]'; then
|
||||
echo "✅ found segment files"
|
||||
sleep 30
|
||||
# create and copy files
|
||||
docker cp $CONTAINER_ID:/tmp ${BANYANDB_DATA_GENERATE_ROOT}
|
||||
docker cp $CONTAINER_ID:/tmp/measure-data/measure/data/index ${BANYANDB_DATA_GENERATE_ROOT}
|
||||
found=true
|
||||
break
|
||||
else
|
||||
echo "⏳ didn't find segment files (retry $i/60)"
|
||||
sleep 10
|
||||
fi
|
||||
done
|
||||
if $found; then
|
||||
echo "✅ segment files copied to ${BANYANDB_DATA_GENERATE_ROOT}"
|
||||
else
|
||||
echo "❌ segment files not found"
|
||||
exit 1
|
||||
fi
|
||||
docker compose -f ${BANYANDB_DATA_GENERATE_ROOT}/docker-compose.yml down -v
|
||||
- name: ${{ matrix.test.name }}
|
||||
uses: apache/skywalking-infra-e2e@cf589b4a0b9f8e6f436f78e9cfd94a1ee5494180
|
||||
with:
|
||||
e2e-file: $GITHUB_WORKSPACE/${{ matrix.test.config }}
|
||||
- if: ${{ failure() }}
|
||||
run: |
|
||||
df -h
|
||||
du -sh .
|
||||
docker images
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: ${{ failure() }}
|
||||
name: Upload Logs
|
||||
with:
|
||||
name: test-logs-${{ matrix.test.name }}
|
||||
path: "${{ env.SW_INFRA_E2E_LOG_DIR }}"
|
||||
|
||||
required:
|
||||
if: always()
|
||||
name: Required
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ trigger:
|
|||
|
||||
verify:
|
||||
retry:
|
||||
count: 10
|
||||
interval: 3s
|
||||
count: 20
|
||||
interval: 10s
|
||||
cases:
|
||||
- includes:
|
||||
- ../apisix-cases.yaml
|
||||
- ../apisix-cases.yaml
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ trigger:
|
|||
|
||||
verify:
|
||||
retry:
|
||||
count: 10
|
||||
interval: 3s
|
||||
count: 20
|
||||
interval: 10s
|
||||
cases:
|
||||
- includes:
|
||||
- ./gateway-cases.yaml
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ trigger:
|
|||
|
||||
verify:
|
||||
retry:
|
||||
count: 10
|
||||
interval: 3s
|
||||
count: 20
|
||||
interval: 10s
|
||||
cases:
|
||||
- includes:
|
||||
- ./dynamodb-cases.yaml
|
||||
- ./dynamodb-cases.yaml
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ trigger:
|
|||
|
||||
verify:
|
||||
retry:
|
||||
count: 10
|
||||
interval: 3s
|
||||
count: 20
|
||||
interval: 10s
|
||||
cases:
|
||||
- includes:
|
||||
- ./eks-cases.yaml
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ trigger:
|
|||
|
||||
verify:
|
||||
retry:
|
||||
count: 10
|
||||
interval: 3s
|
||||
count: 20
|
||||
interval: 10s
|
||||
cases:
|
||||
- includes:
|
||||
- ./s3-cases.yaml
|
||||
|
|
|
|||
|
|
@ -38,10 +38,8 @@ trigger:
|
|||
verify:
|
||||
# verify with retry strategy
|
||||
retry:
|
||||
# max retry count
|
||||
count: 20
|
||||
# the interval between two retries, in millisecond.
|
||||
interval: 3s
|
||||
interval: 10s
|
||||
cases:
|
||||
# layer list
|
||||
- query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql layer ls
|
||||
|
|
|
|||
|
|
@ -0,0 +1,62 @@
|
|||
# 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:
|
||||
banyandb:
|
||||
image: "ghcr.io/apache/skywalking-banyandb:${SW_BANYANDB_COMMIT}"
|
||||
ports:
|
||||
- 17912:17912
|
||||
- 17913:17913
|
||||
command: standalone --stream-root-path /tmp/stream-data --measure-root-path /tmp/measure-data
|
||||
networks:
|
||||
- e2e
|
||||
healthcheck:
|
||||
test: [ "CMD", "sh", "-c", "nc -nz 127.0.0.1 17912" ]
|
||||
interval: 5s
|
||||
timeout: 60s
|
||||
retries: 120
|
||||
|
||||
oap:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: oap
|
||||
environment:
|
||||
SW_STORAGE: banyandb
|
||||
SW_STORAGE_BANYANDB_GR_NORMAL_TTL_DAYS: 5
|
||||
SW_STORAGE_BANYANDB_GR_SUPER_TTL_DAYS: 5
|
||||
ports:
|
||||
- 12800
|
||||
depends_on:
|
||||
banyandb:
|
||||
condition: service_healthy
|
||||
|
||||
trace-mocker:
|
||||
image: "eclipse-temurin:17-jre"
|
||||
volumes:
|
||||
- ../../../../java-test-service/trace-mocker/target/trace-mocker-2.0.0.jar:/trace-mocker-2.0.0.jar
|
||||
command: [ "java", "-jar", "/trace-mocker-2.0.0.jar" ]
|
||||
environment:
|
||||
OAP_HOST: oap
|
||||
MINUS_DAYS: 3
|
||||
networks:
|
||||
- e2e
|
||||
depends_on:
|
||||
oap:
|
||||
condition: service_healthy
|
||||
|
||||
networks:
|
||||
e2e:
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
# 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:
|
||||
etcd:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: etcd
|
||||
networks:
|
||||
- e2e
|
||||
|
||||
data-hot1:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: banyandb-data
|
||||
hostname: data-hot1
|
||||
command: data --etcd-endpoints=http://etcd:2379 --node-labels type=hot
|
||||
volumes:
|
||||
- ../data-generate/index:/tmp/measure/data/index
|
||||
networks:
|
||||
- e2e
|
||||
|
||||
data-warm1:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: banyandb-data
|
||||
hostname: data-warm1
|
||||
command: data --etcd-endpoints=http://etcd:2379 --node-labels type=warm
|
||||
networks:
|
||||
- e2e
|
||||
|
||||
data-cold1:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: banyandb-data
|
||||
hostname: data-cold1
|
||||
command: data --etcd-endpoints=http://etcd:2379 --node-labels type=cold
|
||||
volumes:
|
||||
- ../data-generate/tmp/measure-data/measure:/tmp/measure
|
||||
- ../data-generate/tmp/stream-data/stream:/tmp/stream
|
||||
- ../data-generate/tmp/property/data:/tmp/property
|
||||
networks:
|
||||
- e2e
|
||||
|
||||
liaison:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: liaison
|
||||
command: liaison --etcd-endpoints=http://etcd:2379 --data-node-selector type=hot
|
||||
networks:
|
||||
- e2e
|
||||
|
||||
oap:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: oap
|
||||
environment:
|
||||
SW_STORAGE: banyandb
|
||||
SW_STORAGE_BANYANDB_TARGETS: "liaison:17912"
|
||||
SW_STORAGE_BANYANDB_GM_MINUTE_ENABLE_WARM_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GM_MINUTE_ENABLE_COLD_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GM_HOUR_ENABLE_WARM_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GM_HOUR_ENABLE_COLD_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GM_DAY_ENABLE_WARM_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GM_DAY_ENABLE_COLD_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GR_NORMAL_ENABLE_WARM_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GR_NORMAL_ENABLE_COLD_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GR_SUPER_ENABLE_WARM_STAGE: "true"
|
||||
SW_STORAGE_BANYANDB_GR_SUPER_ENABLE_COLD_STAGE: "true"
|
||||
ports:
|
||||
- 12800:12800
|
||||
- 11800:11800
|
||||
depends_on:
|
||||
liaison:
|
||||
condition: service_healthy
|
||||
|
||||
provider:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: provider
|
||||
ports:
|
||||
- 9090
|
||||
networks:
|
||||
- e2e
|
||||
depends_on:
|
||||
oap:
|
||||
condition: service_healthy
|
||||
|
||||
consumer:
|
||||
extends:
|
||||
file: ../../../../script/docker-compose/base-compose.yml
|
||||
service: consumer
|
||||
ports:
|
||||
- 9092
|
||||
depends_on:
|
||||
oap:
|
||||
condition: service_healthy
|
||||
provider:
|
||||
condition: service_healthy
|
||||
|
||||
networks:
|
||||
e2e:
|
||||
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
# 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.
|
||||
|
||||
# This file is used to show how to write configuration files and can be used to test.
|
||||
|
||||
setup:
|
||||
env: compose
|
||||
file: docker-compose.yml
|
||||
timeout: 20m
|
||||
init-system-environment: ../../../../script/env
|
||||
steps:
|
||||
- name: set PATH
|
||||
command: export PATH=/tmp/skywalking-infra-e2e/bin:$PATH
|
||||
- name: install yq
|
||||
command: bash test/e2e-v2/script/prepare/setup-e2e-shell/install.sh yq
|
||||
- name: install swctl
|
||||
command: bash test/e2e-v2/script/prepare/setup-e2e-shell/install.sh swctl
|
||||
|
||||
trigger:
|
||||
action: http
|
||||
interval: 5s
|
||||
times: 40
|
||||
url: http://${consumer_host}:${consumer_9092}/users
|
||||
method: POST
|
||||
body: '{"id":"123","name":"skywalking"}'
|
||||
headers:
|
||||
"Content-Type": "application/json"
|
||||
|
||||
verify:
|
||||
# verify with retry strategy
|
||||
retry:
|
||||
# max retry count
|
||||
count: 20
|
||||
# the interval between two retries, in millisecond.
|
||||
interval: 10s
|
||||
cases:
|
||||
- includes:
|
||||
- ../../storage-cases.yaml
|
||||
- query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression="top_n(service_resp_time,3,des,attr0='GENERAL',attr1!='Not_exist')/100"
|
||||
expected: ../../expected/topN-OP-service.yml
|
||||
|
||||
# cold data test
|
||||
- query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression=service_resp_time --service-name=mock_a_service --start="-96h" --end="-48h" --cold=true --step=DAY
|
||||
expected: ../../expected/metrics-has-value.yml
|
||||
- query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name=mock_a_service --start="-96h" --end="-48h" --cold=true --step=DAY
|
||||
expected: ../../expected/cold/dependency-services.yml
|
||||
- query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency instance --service-name=mock_a_service --dest-service-name=mock_b_service --start="-96h" --end="-48h" --cold=true --step=DAY
|
||||
expected: ../../expected/cold/dependency-instance.yml
|
||||
- query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency endpoint --service-name=mock_a_service --endpoint-name=/dubbox-case/case/dubbox-rest/404-test --start="-96h" --end="-48h" --cold=true --step=DAY
|
||||
expected: ../../expected/cold/dependency-endpoint.yml
|
||||
# trace segment list
|
||||
- query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --tags http.method=get --start="-96h" --end="-48h" --cold=true
|
||||
expected: ../../expected/cold/traces-list.yml
|
||||
- query: |
|
||||
swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --trace-id=$( \
|
||||
swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --tags http.method=get --start="-96h" --end="-48h" --cold=true \
|
||||
| yq e '.traces | select(.[].endpointnames[0]=="/dubbox-case/case/dubbox-rest/404-test") | .[0].traceids[0]' -
|
||||
) --start="-96h" --end="-48h" --cold=true
|
||||
expected: ../../expected/cold/trace-detail.yml
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
# 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.
|
||||
|
||||
debuggingtrace: null
|
||||
nodes:
|
||||
{{- contains .nodes }}
|
||||
- id: {{ b64enc "mock_a_service" }}.1_{{ b64enc "/dubbox-case/case/dubbox-rest/404-test" }}
|
||||
name: /dubbox-case/case/dubbox-rest/404-test
|
||||
serviceid: {{ b64enc "mock_a_service" }}.1
|
||||
servicename: mock_a_service
|
||||
type: ""
|
||||
isreal: true
|
||||
- id: {{ b64enc "mock_b_service" }}.1_{{ b64enc "org.skywaking.apm.testcase.dubbo.services.GreetServiceImpl.doBusiness()" }}
|
||||
name: org.skywaking.apm.testcase.dubbo.services.GreetServiceImpl.doBusiness()
|
||||
serviceid: {{ b64enc "mock_b_service" }}.1
|
||||
servicename: mock_b_service
|
||||
type: ""
|
||||
isreal: true
|
||||
- id: {{ b64enc "User" }}.0_{{ b64enc "User" }}
|
||||
name: User
|
||||
serviceid: {{ b64enc "User" }}.0
|
||||
servicename: User
|
||||
type: ""
|
||||
isreal: false
|
||||
{{- end }}
|
||||
calls:
|
||||
{{- contains .calls }}
|
||||
- source: {{ b64enc "mock_a_service" }}.1_{{ b64enc "/dubbox-case/case/dubbox-rest/404-test" }}
|
||||
sourcecomponents: []
|
||||
target: {{ b64enc "mock_b_service" }}.1_{{ b64enc "org.skywaking.apm.testcase.dubbo.services.GreetServiceImpl.doBusiness()" }}
|
||||
targetcomponents: []
|
||||
id: {{ b64enc "mock_a_service" }}.1-{{ b64enc "/dubbox-case/case/dubbox-rest/404-test" }}-{{ b64enc "mock_b_service" }}.1-{{ b64enc "org.skywaking.apm.testcase.dubbo.services.GreetServiceImpl.doBusiness()" }}
|
||||
detectpoints:
|
||||
- SERVER
|
||||
- source: {{ b64enc "User" }}.0_{{ b64enc "User" }}
|
||||
sourcecomponents: []
|
||||
target: {{ b64enc "mock_a_service" }}.1_{{ b64enc "/dubbox-case/case/dubbox-rest/404-test" }}
|
||||
targetcomponents: []
|
||||
id: {{ b64enc "User" }}.0-{{ b64enc "User" }}-{{ b64enc "mock_a_service" }}.1-{{ b64enc "/dubbox-case/case/dubbox-rest/404-test" }}
|
||||
detectpoints:
|
||||
- SERVER
|
||||
{{- end }}
|
||||
|
|
@ -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.
|
||||
|
||||
debuggingtrace: null
|
||||
nodes:
|
||||
{{- contains .nodes }}
|
||||
- id: {{ b64enc "mock_a_service" }}.1_{{ b64enc "mock_a_service_instance" }}
|
||||
name: mock_a_service_instance
|
||||
serviceid: {{ b64enc "mock_a_service" }}.1
|
||||
servicename: mock_a_service
|
||||
type: ""
|
||||
isreal: true
|
||||
- id: {{ b64enc "mock_b_service" }}.1_{{ b64enc "mock_b_service_instance" }}
|
||||
name: mock_b_service_instance
|
||||
serviceid: {{ b64enc "mock_b_service" }}.1
|
||||
servicename: mock_b_service
|
||||
type: ""
|
||||
isreal: true
|
||||
{{- end }}
|
||||
calls:
|
||||
{{- contains .calls }}
|
||||
- source: {{ b64enc "mock_a_service" }}.1_{{ b64enc "mock_a_service_instance" }}
|
||||
sourcecomponents: []
|
||||
target: {{ b64enc "mock_b_service" }}.1_{{ b64enc "mock_b_service_instance" }}
|
||||
targetcomponents: []
|
||||
id: {{ b64enc "mock_a_service" }}.1_{{ b64enc "mock_a_service_instance" }}-{{ b64enc "mock_b_service" }}.1_{{ b64enc "mock_b_service_instance" }}
|
||||
detectpoints:
|
||||
- SERVER
|
||||
{{- end }}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
# 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.
|
||||
|
||||
debuggingtrace: null
|
||||
nodes:
|
||||
{{- contains .nodes }}
|
||||
- id: {{ b64enc "User"}}.0
|
||||
name: User
|
||||
type: USER
|
||||
isreal: false
|
||||
layers:
|
||||
- UNDEFINED
|
||||
- id: {{ b64enc "mock_a_service"}}.1
|
||||
name: mock_a_service
|
||||
type: Tomcat
|
||||
isreal: true
|
||||
layers:
|
||||
- GENERAL
|
||||
- id: {{ b64enc "mock_b_service"}}.1
|
||||
name: mock_b_service
|
||||
type: Dubbo
|
||||
isreal: true
|
||||
layers:
|
||||
- GENERAL
|
||||
{{- end }}
|
||||
calls:
|
||||
{{- contains .calls }}
|
||||
- source: {{ b64enc "mock_a_service"}}.1
|
||||
sourcecomponents:
|
||||
- Dubbo
|
||||
target: {{ b64enc "mock_b_service"}}.1
|
||||
targetcomponents:
|
||||
- Dubbo
|
||||
id: {{ b64enc "mock_a_service"}}.1-{{ b64enc "mock_b_service"}}.1
|
||||
detectpoints:
|
||||
- CLIENT
|
||||
- SERVER
|
||||
- source: {{ b64enc "User" }}.0
|
||||
sourcecomponents: []
|
||||
target: {{ b64enc "mock_a_service"}}.1
|
||||
targetcomponents:
|
||||
- Tomcat
|
||||
id: {{ b64enc "User" }}.0-{{ b64enc "mock_a_service"}}.1
|
||||
detectpoints:
|
||||
- SERVER
|
||||
{{- end }}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
# 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.
|
||||
|
||||
debuggingtrace: null
|
||||
spans:
|
||||
{{- contains .spans }}
|
||||
- traceid: {{ .traceid }}
|
||||
segmentid: {{ .segmentid }}
|
||||
spanid: {{ .spanid }}
|
||||
parentspanid: {{ .parentspanid }}
|
||||
refs: []
|
||||
servicecode: mock_a_service
|
||||
serviceinstancename: mock_a_service_instance
|
||||
starttime: {{ gt .starttime 0 }}
|
||||
endtime: {{ gt .endtime 0 }}
|
||||
endpointname: /dubbox-case/case/dubbox-rest/404-test
|
||||
type: Entry
|
||||
peer: ""
|
||||
component: Tomcat
|
||||
iserror: false
|
||||
layer: Http
|
||||
tags:
|
||||
{{- contains .tags }}
|
||||
- key: http.method
|
||||
value: get
|
||||
- key: http.status_code
|
||||
value: "404"
|
||||
- key: http.status_code
|
||||
value: "200"
|
||||
{{- end }}
|
||||
logs: []
|
||||
attachedevents: []
|
||||
{{- end }}
|
||||
|
|
@ -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.
|
||||
|
||||
debuggingtrace: null
|
||||
traces:
|
||||
{{- contains .traces }}
|
||||
- segmentid: {{ notEmpty .segmentid }}
|
||||
endpointnames:
|
||||
- /dubbox-case/case/dubbox-rest/404-test
|
||||
duration: {{ ge .duration 0 }}
|
||||
start: "{{ notEmpty .start}}"
|
||||
iserror: false
|
||||
traceids:
|
||||
- {{ index .traceids 0 }}
|
||||
{{- end }}
|
||||
|
|
@ -37,8 +37,8 @@ trigger:
|
|||
|
||||
verify:
|
||||
retry:
|
||||
count: 10
|
||||
interval: 3s
|
||||
count: 20
|
||||
interval: 10s
|
||||
cases:
|
||||
- includes:
|
||||
- ./win-cases.yaml
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
<module>e2e-protocol</module>
|
||||
<module>opentelemetry-proto</module>
|
||||
<module>e2e-mock-baseline-server</module>
|
||||
<module>trace-mocker</module>
|
||||
</modules>
|
||||
|
||||
<properties>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ 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.
|
||||
~
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>apache-skywalking-e2e</artifactId>
|
||||
<groupId>org.apache.skywalking</groupId>
|
||||
<version>2.0.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>trace-mocker</artifactId>
|
||||
|
||||
<properties>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.skywalking</groupId>
|
||||
<artifactId>e2e-protocol</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>joda-time</groupId>
|
||||
<artifactId>joda-time</artifactId>
|
||||
<version>2.10.5</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<version>3.6.0</version>
|
||||
<configuration>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>org.apache.skywalking.mock.AgentDataMock</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<appendAssemblyId>false</appendAssemblyId>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,132 @@
|
|||
/*
|
||||
* 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.mock;
|
||||
|
||||
import io.grpc.ManagedChannel;
|
||||
import io.grpc.ManagedChannelBuilder;
|
||||
import io.grpc.stub.StreamObserver;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.apache.skywalking.apm.network.common.v3.Commands;
|
||||
import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.TraceSegmentReportServiceGrpc;
|
||||
import org.apache.skywalking.apm.network.management.v3.InstancePingPkg;
|
||||
import org.apache.skywalking.apm.network.management.v3.InstanceProperties;
|
||||
import org.apache.skywalking.apm.network.management.v3.ManagementServiceGrpc;
|
||||
import org.joda.time.DateTime;
|
||||
|
||||
public class AgentDataMock {
|
||||
private static boolean IS_COMPLETED = false;
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
String oapHost = System.getenv("OAP_HOST");
|
||||
String minusDays = System.getenv("MINUS_DAYS");
|
||||
ManagedChannel channel = ManagedChannelBuilder.forAddress(oapHost, 11800).usePlaintext().build();
|
||||
|
||||
StreamObserver<SegmentObject> streamObserver = createStreamObserver(channel);
|
||||
|
||||
long startTimestamp = new DateTime().minusDays(Integer.parseInt(minusDays)).getMillis();
|
||||
|
||||
ManagementServiceGrpc.ManagementServiceBlockingStub managementServiceBlockingStub = ManagementServiceGrpc.newBlockingStub(
|
||||
channel);
|
||||
|
||||
// ServiceAMock
|
||||
ServiceAMock serviceAMock = new ServiceAMock();
|
||||
managementServiceBlockingStub.keepAlive(InstancePingPkg.newBuilder()
|
||||
.setService(ServiceAMock.SERVICE_NAME)
|
||||
.setServiceInstance(ServiceAMock.SERVICE_INSTANCE_NAME)
|
||||
.build());
|
||||
|
||||
// ServiceBMock
|
||||
ServiceBMock serviceBMock = new ServiceBMock();
|
||||
|
||||
// ServiceCMock
|
||||
ServiceCMock serviceCMock = new ServiceCMock();
|
||||
|
||||
TimeUnit.SECONDS.sleep(10);
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
String traceId = UUID.randomUUID().toString();
|
||||
String serviceASegmentId = UUID.randomUUID().toString();
|
||||
String serviceBSegmentId = UUID.randomUUID().toString();
|
||||
String serviceCSegmentId = UUID.randomUUID().toString();
|
||||
serviceAMock.mock(
|
||||
streamObserver, traceId, serviceASegmentId, startTimestamp);
|
||||
serviceBMock.mock(
|
||||
streamObserver, traceId, serviceBSegmentId, serviceASegmentId, startTimestamp);
|
||||
serviceCMock.mock(
|
||||
streamObserver, traceId, serviceCSegmentId, serviceBSegmentId, startTimestamp);
|
||||
}
|
||||
|
||||
streamObserver.onCompleted();
|
||||
|
||||
managementServiceBlockingStub.reportInstanceProperties(
|
||||
InstanceProperties.newBuilder()
|
||||
.setService(ServiceAMock.SERVICE_NAME)
|
||||
.setServiceInstance(ServiceAMock.SERVICE_INSTANCE_NAME)
|
||||
.addProperties(
|
||||
KeyStringValuePair.newBuilder()
|
||||
.setKey("os_name").setValue("MacOS")
|
||||
.build())
|
||||
.addProperties(
|
||||
KeyStringValuePair.newBuilder()
|
||||
.setKey("language").setValue("java")
|
||||
.build()
|
||||
)
|
||||
.build());
|
||||
managementServiceBlockingStub.reportInstanceProperties(
|
||||
InstanceProperties.newBuilder()
|
||||
.setService(ServiceBMock.SERVICE_NAME)
|
||||
.setServiceInstance(ServiceBMock.SERVICE_INSTANCE_NAME)
|
||||
.addProperties(
|
||||
KeyStringValuePair.newBuilder()
|
||||
.setKey("os_name").setValue("MacOS")
|
||||
.build())
|
||||
.addProperties(
|
||||
KeyStringValuePair.newBuilder()
|
||||
.setKey("language").setValue("java")
|
||||
.build()
|
||||
)
|
||||
.build());
|
||||
|
||||
while (!IS_COMPLETED) {
|
||||
TimeUnit.MILLISECONDS.sleep(500);
|
||||
}
|
||||
}
|
||||
|
||||
private static StreamObserver<SegmentObject> createStreamObserver(ManagedChannel channel) {
|
||||
TraceSegmentReportServiceGrpc.TraceSegmentReportServiceStub stub = TraceSegmentReportServiceGrpc.newStub(
|
||||
channel);
|
||||
return stub.collect(new StreamObserver<Commands>() {
|
||||
@Override
|
||||
public void onNext(Commands downstream) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable throwable) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCompleted() {
|
||||
IS_COMPLETED = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* 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.mock;
|
||||
|
||||
/**
|
||||
* The <code>Component</code> represents component library, which has been supported by skywalking sniffer.
|
||||
* <p>
|
||||
* The supported list is in {@link ComponentsDefine}.
|
||||
*/
|
||||
public interface Component {
|
||||
int getId();
|
||||
|
||||
String getName();
|
||||
}
|
||||
|
|
@ -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.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.skywalking.mock;
|
||||
|
||||
/**
|
||||
* The supported list of skywalking java sniffer.
|
||||
*/
|
||||
public class ComponentsDefine {
|
||||
|
||||
public static final OfficialComponent TOMCAT = new OfficialComponent(1, "Tomcat");
|
||||
|
||||
public static final OfficialComponent DUBBO = new OfficialComponent(3, "Dubbo");
|
||||
|
||||
public static final OfficialComponent ROCKET_MQ_PRODUCER = new OfficialComponent(38, "rocketMQ-producer");
|
||||
|
||||
public static final OfficialComponent ROCKET_MQ_CONSUMER = new OfficialComponent(39, "rocketMQ-consumer");
|
||||
|
||||
public static final OfficialComponent MONGO_DRIVER = new OfficialComponent(42, "mongodb-driver");
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* 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.mock;
|
||||
|
||||
public class OfficialComponent implements Component {
|
||||
private int id;
|
||||
private String name;
|
||||
|
||||
public OfficialComponent(int id, String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* 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.mock;
|
||||
|
||||
import io.grpc.stub.StreamObserver;
|
||||
import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanLayer;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanType;
|
||||
|
||||
class ServiceAMock {
|
||||
public static String SERVICE_NAME = "mock_a_service";
|
||||
public static String SERVICE_INSTANCE_NAME = "mock_a_service_instance";
|
||||
|
||||
static String REST_ENDPOINT = "/dubbox-case/case/dubbox-rest/404-test";
|
||||
static String DUBBO_ENDPOINT = "org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()";
|
||||
static String DUBBO_ADDRESS = "DubboIPAddress:1000";
|
||||
|
||||
void mock(StreamObserver<SegmentObject> streamObserver, String traceId,
|
||||
String segmentId, long startTimestamp) {
|
||||
streamObserver.onNext(createSegment(startTimestamp, traceId, segmentId).build());
|
||||
}
|
||||
|
||||
private SegmentObject.Builder createSegment(long startTimestamp, String traceId, String segmentId) {
|
||||
SegmentObject.Builder segment = SegmentObject.newBuilder();
|
||||
segment.setTraceId(traceId);
|
||||
segment.setTraceSegmentId(segmentId);
|
||||
segment.setService(SERVICE_NAME);
|
||||
segment.setServiceInstance(SERVICE_INSTANCE_NAME);
|
||||
segment.addSpans(createEntrySpan(startTimestamp));
|
||||
segment.addSpans(createLocalSpan(startTimestamp));
|
||||
segment.addSpans(createExitSpan(startTimestamp));
|
||||
|
||||
return segment;
|
||||
}
|
||||
|
||||
private SpanObject.Builder createEntrySpan(long startTimestamp) {
|
||||
SpanObject.Builder span = SpanObject.newBuilder();
|
||||
span.setSpanId(0);
|
||||
span.setSpanType(SpanType.Entry);
|
||||
span.setSpanLayer(SpanLayer.Http);
|
||||
span.setParentSpanId(-1);
|
||||
span.setStartTime(startTimestamp);
|
||||
span.setEndTime(startTimestamp + 6000);
|
||||
span.setComponentId(ComponentsDefine.TOMCAT.getId());
|
||||
span.setOperationName(REST_ENDPOINT);
|
||||
span.setIsError(false);
|
||||
span.addTags(KeyStringValuePair.newBuilder().setKey("http.method").setValue("get").build());
|
||||
span.addTags(KeyStringValuePair.newBuilder().setKey("http.status_code").setValue("404").build());
|
||||
span.addTags(KeyStringValuePair.newBuilder().setKey("http.status_code").setValue("200").build());
|
||||
return span;
|
||||
}
|
||||
|
||||
private SpanObject.Builder createLocalSpan(long startTimestamp) {
|
||||
SpanObject.Builder span = SpanObject.newBuilder();
|
||||
span.setSpanId(1);
|
||||
span.setSpanType(SpanType.Local);
|
||||
span.setParentSpanId(0);
|
||||
span.setStartTime(startTimestamp + 100);
|
||||
span.setEndTime(startTimestamp + 500);
|
||||
span.setOperationName("org.apache.skywalking.Local.do");
|
||||
span.setIsError(false);
|
||||
return span;
|
||||
}
|
||||
|
||||
private SpanObject.Builder createExitSpan(long startTimestamp) {
|
||||
SpanObject.Builder span = SpanObject.newBuilder();
|
||||
span.setSpanId(2);
|
||||
span.setSpanType(SpanType.Exit);
|
||||
span.setSpanLayer(SpanLayer.RPCFramework);
|
||||
span.setParentSpanId(1);
|
||||
span.setStartTime(startTimestamp + 120);
|
||||
span.setEndTime(startTimestamp + 5800);
|
||||
span.setComponentId(ComponentsDefine.DUBBO.getId());
|
||||
span.setOperationName(DUBBO_ENDPOINT);
|
||||
span.setPeer(DUBBO_ADDRESS);
|
||||
span.setIsError(false);
|
||||
return span;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* 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.mock;
|
||||
|
||||
import io.grpc.stub.StreamObserver;
|
||||
import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.RefType;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SegmentReference;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanLayer;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanType;
|
||||
|
||||
class ServiceBMock {
|
||||
public static String SERVICE_NAME = "mock_b_service";
|
||||
public static String SERVICE_INSTANCE_NAME = "mock_b_service_instance";
|
||||
|
||||
static String DUBBO_PROVIDER_ENDPOINT = "org.skywaking.apm.testcase.dubbo.services.GreetServiceImpl.doBusiness()";
|
||||
static String ROCKET_MQ_ENDPOINT = "org.apache.skywalking.RocketMQ";
|
||||
static String ROCKET_MQ_ADDRESS = "RocketMQAddress:2000";
|
||||
|
||||
void mock(StreamObserver<SegmentObject> streamObserver, String traceId,
|
||||
String segmentId, String parentSegmentId, long startTimestamp) {
|
||||
streamObserver.onNext(createSegment(startTimestamp, traceId, segmentId, parentSegmentId).build());
|
||||
}
|
||||
|
||||
private SegmentObject.Builder createSegment(long startTimestamp,
|
||||
String traceId,
|
||||
String segmentId,
|
||||
String parentSegmentId) {
|
||||
SegmentObject.Builder segment = SegmentObject.newBuilder();
|
||||
segment.setTraceId(traceId);
|
||||
segment.setTraceSegmentId(segmentId);
|
||||
segment.setService(SERVICE_NAME);
|
||||
segment.setServiceInstance(SERVICE_INSTANCE_NAME);
|
||||
segment.addSpans(createEntrySpan(startTimestamp, traceId, parentSegmentId));
|
||||
segment.addSpans(createExitSpan(startTimestamp));
|
||||
segment.addSpans(createMQExitSpan(startTimestamp));
|
||||
|
||||
return segment;
|
||||
}
|
||||
|
||||
private SegmentReference.Builder createReference(String traceId, String parentTraceSegmentId) {
|
||||
SegmentReference.Builder reference = SegmentReference.newBuilder();
|
||||
reference.setTraceId(traceId);
|
||||
reference.setParentTraceSegmentId(parentTraceSegmentId);
|
||||
reference.setParentService(ServiceAMock.SERVICE_NAME);
|
||||
reference.setParentServiceInstance(ServiceAMock.SERVICE_INSTANCE_NAME);
|
||||
reference.setParentSpanId(2);
|
||||
reference.setParentEndpoint(ServiceAMock.REST_ENDPOINT);
|
||||
reference.setRefType(RefType.CrossProcess);
|
||||
reference.setNetworkAddressUsedAtPeer(ServiceAMock.DUBBO_ADDRESS);
|
||||
|
||||
return reference;
|
||||
}
|
||||
|
||||
private SpanObject.Builder createEntrySpan(long startTimestamp, String traceId, String parentSegmentId) {
|
||||
SpanObject.Builder span = SpanObject.newBuilder();
|
||||
span.setSpanId(0);
|
||||
span.setSpanType(SpanType.Entry);
|
||||
span.setSpanLayer(SpanLayer.RPCFramework);
|
||||
span.setParentSpanId(-1);
|
||||
span.setStartTime(startTimestamp + 500);
|
||||
span.setEndTime(startTimestamp + 5000);
|
||||
span.setComponentId(ComponentsDefine.DUBBO.getId());
|
||||
span.setIsError(false);
|
||||
span.addRefs(createReference(traceId, parentSegmentId));
|
||||
|
||||
span.setOperationName(ServiceBMock.DUBBO_PROVIDER_ENDPOINT);
|
||||
return span;
|
||||
}
|
||||
|
||||
private SpanObject.Builder createExitSpan(long startTimestamp) {
|
||||
SpanObject.Builder span = SpanObject.newBuilder();
|
||||
span.setSpanId(1);
|
||||
span.setSpanType(SpanType.Exit);
|
||||
span.setSpanLayer(SpanLayer.Database);
|
||||
span.setParentSpanId(0);
|
||||
span.setStartTime(startTimestamp + 550);
|
||||
span.setEndTime(startTimestamp + 1500);
|
||||
span.setComponentId(ComponentsDefine.MONGO_DRIVER.getId());
|
||||
span.setIsError(true);
|
||||
span.addTags(KeyStringValuePair.newBuilder()
|
||||
.setKey("db.statement")
|
||||
.setValue("select * from database where complex = 1;")
|
||||
.build());
|
||||
span.addTags(KeyStringValuePair.newBuilder().setKey("db.type").setValue("mongodb").build());
|
||||
|
||||
span.setOperationName(
|
||||
"mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]");
|
||||
span.setPeer("localhost:27017");
|
||||
return span;
|
||||
}
|
||||
|
||||
private SpanObject.Builder createMQExitSpan(long startTimestamp) {
|
||||
SpanObject.Builder span = SpanObject.newBuilder();
|
||||
span.setSpanId(2);
|
||||
span.setSpanType(SpanType.Exit);
|
||||
span.setSpanLayer(SpanLayer.MQ);
|
||||
span.setParentSpanId(1);
|
||||
span.setStartTime(startTimestamp + 1100);
|
||||
span.setEndTime(startTimestamp + 1500);
|
||||
span.setComponentId(ComponentsDefine.ROCKET_MQ_PRODUCER.getId());
|
||||
span.setIsError(false);
|
||||
|
||||
span.setOperationName(ROCKET_MQ_ENDPOINT);
|
||||
span.setPeer(ROCKET_MQ_ADDRESS);
|
||||
return span;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* 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.mock;
|
||||
|
||||
import io.grpc.stub.StreamObserver;
|
||||
import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.RefType;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SegmentReference;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanLayer;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SpanType;
|
||||
|
||||
class ServiceCMock {
|
||||
public static String SERVICE_NAME = "mock_c_service";
|
||||
public static String SERVICE_INSTANCE_NAME = "mock_c_service_instance";
|
||||
|
||||
void mock(StreamObserver<SegmentObject> streamObserver, String traceId,
|
||||
String segmentId, String parentSegmentId, long startTimestamp) {
|
||||
streamObserver.onNext(createSegment(startTimestamp, traceId, segmentId, parentSegmentId).build());
|
||||
}
|
||||
|
||||
private SegmentObject.Builder createSegment(long startTimestamp,
|
||||
String traceId,
|
||||
String segmentId,
|
||||
String parentSegmentId) {
|
||||
SegmentObject.Builder segment = SegmentObject.newBuilder();
|
||||
segment.setTraceId(traceId);
|
||||
segment.setTraceSegmentId(segmentId);
|
||||
segment.setService(SERVICE_NAME);
|
||||
segment.setServiceInstance(SERVICE_INSTANCE_NAME);
|
||||
segment.addSpans(createEntrySpan(startTimestamp, traceId, parentSegmentId));
|
||||
|
||||
return segment;
|
||||
}
|
||||
|
||||
private SpanObject.Builder createEntrySpan(long startTimestamp, String traceId, String parentSegmentId) {
|
||||
SpanObject.Builder span = SpanObject.newBuilder();
|
||||
span.setSpanId(0);
|
||||
span.setSpanType(SpanType.Entry);
|
||||
span.setSpanLayer(SpanLayer.MQ);
|
||||
span.setParentSpanId(-1);
|
||||
span.setStartTime(startTimestamp + 3000);
|
||||
span.setEndTime(startTimestamp + 5000);
|
||||
span.setComponentId(ComponentsDefine.ROCKET_MQ_CONSUMER.getId());
|
||||
span.setIsError(false);
|
||||
span.addRefs(createReference(traceId, parentSegmentId));
|
||||
span.setOperationName(ServiceBMock.ROCKET_MQ_ENDPOINT);
|
||||
span.addTags(KeyStringValuePair.newBuilder().setKey("transmission.latency").setValue("100").build());
|
||||
return span;
|
||||
}
|
||||
|
||||
private SegmentReference.Builder createReference(String traceId, String parentTraceSegmentId) {
|
||||
SegmentReference.Builder reference = SegmentReference.newBuilder();
|
||||
reference.setTraceId(traceId);
|
||||
reference.setParentTraceSegmentId(parentTraceSegmentId);
|
||||
reference.setParentService(ServiceBMock.SERVICE_NAME);
|
||||
reference.setParentServiceInstance(ServiceBMock.SERVICE_INSTANCE_NAME);
|
||||
reference.setParentSpanId(2);
|
||||
reference.setRefType(RefType.CrossProcess);
|
||||
reference.setNetworkAddressUsedAtPeer(ServiceBMock.ROCKET_MQ_ADDRESS);
|
||||
reference.setParentEndpoint(ServiceBMock.DUBBO_PROVIDER_ENDPOINT);
|
||||
return reference;
|
||||
}
|
||||
}
|
||||
|
|
@ -56,8 +56,9 @@ services:
|
|||
image: "ghcr.io/apache/skywalking-banyandb:${SW_BANYANDB_COMMIT}"
|
||||
networks:
|
||||
- e2e
|
||||
expose:
|
||||
- 17912
|
||||
ports:
|
||||
- 17912:17912
|
||||
- 17913:17913
|
||||
command: standalone --stream-root-path /tmp/stream-data --measure-root-path /tmp/measure-data
|
||||
healthcheck:
|
||||
test: [ "CMD", "sh", "-c", "nc -nz 127.0.0.1 17912" ]
|
||||
|
|
@ -65,6 +66,48 @@ services:
|
|||
timeout: 60s
|
||||
retries: 120
|
||||
|
||||
banyandb-data:
|
||||
image: "ghcr.io/apache/skywalking-banyandb:${SW_BANYANDB_COMMIT}-testing"
|
||||
hostname: data
|
||||
expose:
|
||||
- 17912
|
||||
- 2121
|
||||
- 6060
|
||||
command: data --etcd-endpoints=http://etcd:2379
|
||||
healthcheck:
|
||||
test: [ "CMD", "./bydbctl", "health", "--addr=http://127.0.0.1:17913" ]
|
||||
interval: 5s
|
||||
timeout: 120s
|
||||
retries: 120
|
||||
|
||||
liaison:
|
||||
image: "ghcr.io/apache/skywalking-banyandb:${SW_BANYANDB_COMMIT}-testing"
|
||||
hostname: liaison
|
||||
ports:
|
||||
- 17913:17913
|
||||
- 17912:17912
|
||||
expose:
|
||||
- 2121
|
||||
- 6060
|
||||
command: liaison --etcd-endpoints=http://etcd:2379
|
||||
healthcheck:
|
||||
test: [ "CMD", "./bydbctl", "health", "--addr=http://liaison:17913" ]
|
||||
interval: 5s
|
||||
timeout: 120s
|
||||
retries: 120
|
||||
|
||||
etcd:
|
||||
image: gcr.io/etcd-development/etcd:v3.5.9
|
||||
ports:
|
||||
- "2379:2379"
|
||||
command: etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://etcd:2379 --max-request-bytes 10485760 --backend-batch-limit 10000
|
||||
healthcheck:
|
||||
test: [ "CMD", "etcdctl", "endpoint", "health" ]
|
||||
interval: 1m30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
provider:
|
||||
image: "ghcr.io/apache/skywalking-java/skywalking-java:${SW_AGENT_JAVA_COMMIT}-java${SW_AGENT_JDK_VERSION}"
|
||||
volumes:
|
||||
|
|
|
|||
|
|
@ -23,8 +23,8 @@ SW_AGENT_CLIENT_JS_COMMIT=af0565a67d382b683c1dbd94c379b7080db61449
|
|||
SW_AGENT_CLIENT_JS_TEST_COMMIT=4f1eb1dcdbde3ec4a38534bf01dded4ab5d2f016
|
||||
SW_KUBERNETES_COMMIT_SHA=6fe5e6f0d3b7686c6be0457733e825ee68cb9b35
|
||||
SW_ROVER_COMMIT=738b1a42fe4941e0b4e6f5816403437cf572708f
|
||||
SW_BANYANDB_COMMIT=458041a561b0acc1f2ed37690df2ce753b791283
|
||||
SW_BANYANDB_COMMIT=c4b4384f3083f44ca6067257f5fa59030427ad6b
|
||||
SW_AGENT_PHP_COMMIT=3192c553002707d344bd6774cfab5bc61f67a1d3
|
||||
SW_PREDICTOR_COMMIT=54a0197654a3781a6f73ce35146c712af297c994
|
||||
|
||||
SW_CTL_COMMIT=67cbc89dd7b214d5791321a7ca992f940cb586ba
|
||||
SW_CTL_COMMIT=7bbac156e74e8fdc0c5bd6f377be9f0b30420176
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ install_swctl() {
|
|||
if ! command -v swctl &> /dev/null; then
|
||||
echo "swctl is not installed"
|
||||
install_swctl
|
||||
elif ! swctl --version | grep -q "${SW_CTL_COMMIT}"; then
|
||||
elif ! swctl --version | grep -q "${SW_CTL_COMMIT::7}"; then
|
||||
# Check if the installed version is correct
|
||||
echo "swctl is already installed, but version is not ${SW_CTL_COMMIT}, will re-install it"
|
||||
install_swctl
|
||||
|
|
|
|||
Loading…
Reference in New Issue