diff --git a/test/e2e-v2/cases/alarm/alarm-cases.yaml b/test/e2e-v2/cases/alarm/alarm-cases.yaml index d2189f4fbb1d..aa07203bf8c2 100644 --- a/test/e2e-v2/cases/alarm/alarm-cases.yaml +++ b/test/e2e-v2/cases/alarm/alarm-cases.yaml @@ -25,6 +25,11 @@ # before silence alarm list level=CRITICAL,receivers=zhangsan - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql alarm ls --tags level=CRITICAL,receivers=zhangsan expected: expected/silence-before-graphql-critical.yml + # query auto complete tag key and value + - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql alarm autocomplete-keys + expected: expected/tag-keys.yml + - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql alarm autocomplete-values --key=level + expected: expected/tag-values.yml # before silence webhook - query: curl -s -XPOST http://${provider_host}:${provider_9090}/alarm/read expected: expected/silence-before-webhook.yml diff --git a/test/e2e-v2/cases/alarm/expected/silence-after-graphql-critical.yml b/test/e2e-v2/cases/alarm/expected/silence-after-graphql-critical.yml index 300e4784f9bd..304c98e281ad 100644 --- a/test/e2e-v2/cases/alarm/expected/silence-after-graphql-critical.yml +++ b/test/e2e-v2/cases/alarm/expected/silence-after-graphql-critical.yml @@ -18,6 +18,7 @@ msgs: - starttime: {{ gt .starttime 0 }} scope: Service id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 + name: e2e-service-provider message: Service e2e-service-provider response time is more than 10ms and sla is more than 1%. tags: - key: level @@ -39,28 +40,22 @@ msgs: endtime: {{ gt .endtime 0 }} layer: GENERAL {{- end }} - - starttime: {{ gt .starttime 0 }} - scope: Service - id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 - message: Service e2e-service-provider response time is more than 10ms and sla is more than 1%. - tags: - - key: level - value: CRITICAL - - key: receivers - value: zhangsan - events: - {{- contains .events }} - - uuid: {{ notEmpty .uuid }} - source: - service: e2e-service-provider - serviceinstance: "" - endpoint: "" - name: Alarm - type: "" - message: {{ notEmpty .message}} - parameters: [] - starttime: {{ gt .starttime 0 }} - endtime: {{ gt .endtime 0 }} - layer: GENERAL + snapshot: + expression: sum((service_resp_time > 10) * (service_sla > 100)) >= 1 + metrics: + {{- contains .snapshot.metrics }} + - name: service_resp_time + results: + {{- contains .results }} + - metric: + labels: [] + values: + {{- contains .values }} + - id: {{ notEmpty .id }} + owner: null + value: {{ .value }} + traceid: null + {{- end }} + {{- end }} {{- end }} {{- end }} diff --git a/test/e2e-v2/cases/alarm/expected/silence-after-graphql-warn.yml b/test/e2e-v2/cases/alarm/expected/silence-after-graphql-warn.yml index c3f71b81ce9c..f2c9abe6e22f 100644 --- a/test/e2e-v2/cases/alarm/expected/silence-after-graphql-warn.yml +++ b/test/e2e-v2/cases/alarm/expected/silence-after-graphql-warn.yml @@ -18,6 +18,7 @@ msgs: - starttime: {{ gt .starttime 0 }} scope: Service id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 + name: e2e-service-provider message: Percentile response time of service e2e-service-provider alarm in 3 minutes of last 10 minutes, due to more than one condition of p50 > 10, p75 > 10, p90 > 10, p95 > 10, p99 > 10. tags: - key: level @@ -39,9 +40,30 @@ msgs: endtime: {{ gt .endtime 0 }} layer: GENERAL {{- end }} + snapshot: + expression: sum(service_percentile{p='50,75,90,95,99'} > 10) >= 3 + metrics: + {{- contains .snapshot.metrics }} + - name: service_percentile + results: + {{- contains .results }} + - metric: + labels: + - key: p + value: "50" + values: + {{- contains .values }} + - id: {{ notEmpty .id }} + owner: null + value: "{{ .value }}" + traceid: null + {{- end }} + {{- end }} + {{- end }} - starttime: {{ gt .starttime 0 }} scope: Service id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 + name: e2e-service-provider message: Response time of service e2e-service-provider is increase/decrease in 1 minutes of last 10 minutes. tags: - key: level @@ -63,52 +85,22 @@ msgs: endtime: {{ gt .endtime 0 }} layer: GENERAL {{- end }} - - starttime: {{ gt .starttime 0 }} - scope: Service - id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 - message: Percentile response time of service e2e-service-provider alarm in 3 minutes of last 10 minutes, due to more than one condition of p50 > 10, p75 > 10, p90 > 10, p95 > 10, p99 > 10. - tags: - - key: level - value: WARNING - - key: receivers - value: lisi - events: - {{- contains .events }} - - uuid: {{ notEmpty .uuid }} - source: - service: e2e-service-provider - serviceinstance: "" - endpoint: "" - name: Alarm - type: "" - message: {{ notEmpty .message }} - parameters: [] - starttime: {{ gt .starttime 0 }} - endtime: {{ gt .endtime 0 }} - layer: GENERAL - {{- end }} - - starttime: {{ gt .starttime 0 }} - scope: Service - id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 - message: Response time of service e2e-service-provider is increase/decrease in 1 minutes of last 10 minutes. - tags: - - key: level - value: WARNING - - key: receivers - value: lisi - events: - {{- contains .events }} - - uuid: {{ notEmpty .uuid }} - source: - service: e2e-service-provider - serviceinstance: "" - endpoint: "" - name: Alarm - type: "" - message: {{ notEmpty .message}} - parameters: [] - starttime: {{ gt .starttime 0 }} - endtime: {{ gt .endtime 0 }} - layer: GENERAL + snapshot: + expression: sum(abs(increase(service_resp_time,1)) > 0) >= 1 + metrics: + {{- contains .snapshot.metrics }} + - name: service_resp_time + results: + {{- contains .results }} + - metric: + labels: [] + values: + {{- contains .values }} + - id: {{ notEmpty .id }} + owner: null + value: {{ .value }} + traceid: null + {{- end }} + {{- end }} {{- end }} - {{- end }} + {{- end }} \ No newline at end of file diff --git a/test/e2e-v2/cases/alarm/expected/silence-before-graphql-critical.yml b/test/e2e-v2/cases/alarm/expected/silence-before-graphql-critical.yml index beab18d91cd6..304c98e281ad 100644 --- a/test/e2e-v2/cases/alarm/expected/silence-before-graphql-critical.yml +++ b/test/e2e-v2/cases/alarm/expected/silence-before-graphql-critical.yml @@ -18,6 +18,7 @@ msgs: - starttime: {{ gt .starttime 0 }} scope: Service id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 + name: e2e-service-provider message: Service e2e-service-provider response time is more than 10ms and sla is more than 1%. tags: - key: level @@ -39,4 +40,22 @@ msgs: endtime: {{ gt .endtime 0 }} layer: GENERAL {{- end }} + snapshot: + expression: sum((service_resp_time > 10) * (service_sla > 100)) >= 1 + metrics: + {{- contains .snapshot.metrics }} + - name: service_resp_time + results: + {{- contains .results }} + - metric: + labels: [] + values: + {{- contains .values }} + - id: {{ notEmpty .id }} + owner: null + value: {{ .value }} + traceid: null + {{- end }} + {{- end }} + {{- end }} {{- end }} diff --git a/test/e2e-v2/cases/alarm/expected/silence-before-graphql-warn.yml b/test/e2e-v2/cases/alarm/expected/silence-before-graphql-warn.yml index a766327f30c7..2bf89eb7b16d 100644 --- a/test/e2e-v2/cases/alarm/expected/silence-before-graphql-warn.yml +++ b/test/e2e-v2/cases/alarm/expected/silence-before-graphql-warn.yml @@ -18,6 +18,7 @@ msgs: - starttime: {{ gt .starttime 0 }} scope: Service id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 + name: e2e-service-provider message: Percentile response time of service e2e-service-provider alarm in 3 minutes of last 10 minutes, due to more than one condition of p50 > 10, p75 > 10, p90 > 10, p95 > 10, p99 > 10. tags: - key: level @@ -39,9 +40,30 @@ msgs: endtime: {{ gt .endtime 0 }} layer: GENERAL {{- end }} + snapshot: + expression: sum(service_percentile{p='50,75,90,95,99'} > 10) >= 3 + metrics: + {{- contains .snapshot.metrics }} + - name: service_percentile + results: + {{- contains .results }} + - metric: + labels: + - key: p + value: "50" + values: + {{- contains .values }} + - id: {{ notEmpty .id }} + owner: null + value: "{{ .value }}" + traceid: null + {{- end }} + {{- end }} + {{- end }} - starttime: {{ gt .starttime 0 }} scope: Service id: ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1 + name: e2e-service-provider message: Response time of service e2e-service-provider is increase/decrease in 1 minutes of last 10 minutes. tags: - key: level @@ -63,4 +85,22 @@ msgs: endtime: {{ gt .endtime 0 }} layer: GENERAL {{- end }} + snapshot: + expression: sum(abs(increase(service_resp_time,1)) > 0) >= 1 + metrics: + {{- contains .snapshot.metrics }} + - name: service_resp_time + results: + {{- contains .results }} + - metric: + labels: [] + values: + {{- contains .values }} + - id: {{ notEmpty .id }} + owner: null + value: {{ .value }} + traceid: null + {{- end }} + {{- end }} + {{- end }} {{- end }} diff --git a/test/e2e-v2/cases/alarm/expected/tag-keys.yml b/test/e2e-v2/cases/alarm/expected/tag-keys.yml new file mode 100644 index 000000000000..cb1c61308dab --- /dev/null +++ b/test/e2e-v2/cases/alarm/expected/tag-keys.yml @@ -0,0 +1,19 @@ +# 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. + +{{- contains . }} +- level +- receivers +{{- end }} diff --git a/test/e2e-v2/cases/alarm/expected/tag-values.yml b/test/e2e-v2/cases/alarm/expected/tag-values.yml new file mode 100644 index 000000000000..5f3381000eb9 --- /dev/null +++ b/test/e2e-v2/cases/alarm/expected/tag-values.yml @@ -0,0 +1,19 @@ +# 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. + +{{- contains . }} +- WARNING +- CRITICAL +{{- end }} diff --git a/test/e2e-v2/cases/mqe/expected/topN-OP-instance.yml b/test/e2e-v2/cases/mqe/expected/topN-OP-instance.yml index df5c572ee1df..2c0c9e5df7da 100644 --- a/test/e2e-v2/cases/mqe/expected/topN-OP-instance.yml +++ b/test/e2e-v2/cases/mqe/expected/topN-OP-instance.yml @@ -20,7 +20,15 @@ results: labels: [] values: - id: provider1 - value: "100" + value: "{{ (index (index .results 0).values 0).value }}" traceid: null - owner: null + owner: + scope: ServiceInstance + serviceid: {{ b64enc "e2e-service-provider"}}.1 + servicename: e2e-service-provider + normal: true + serviceinstanceid: {{ b64enc "e2e-service-provider"}}.1_{{ b64enc "provider1"}} + serviceinstancename: provider1 + endpointid: null + endpointname: null error: null diff --git a/test/e2e-v2/cases/mqe/expected/topN-OP-service.yml b/test/e2e-v2/cases/mqe/expected/topN-OP-service.yml index b889bdd1f8ef..ba83bd768934 100644 --- a/test/e2e-v2/cases/mqe/expected/topN-OP-service.yml +++ b/test/e2e-v2/cases/mqe/expected/topN-OP-service.yml @@ -22,9 +22,25 @@ results: - id: e2e-service-consumer value: "{{ (index (index .results 0).values 0).value }}" traceid: null - owner: null + owner: + scope: Service + serviceid: {{ b64enc "e2e-service-consumer"}}.1 + servicename: e2e-service-consumer + normal: true + serviceinstanceid: null + serviceinstancename: null + endpointid: null + endpointname: null - id: e2e-service-provider value: "{{ (index (index .results 0).values 1).value }}" traceid: null - owner: null + owner: + scope: Service + serviceid: {{ b64enc "e2e-service-provider"}}.1 + servicename: e2e-service-provider + normal: true + serviceinstanceid: null + serviceinstancename: null + endpointid: null + endpointname: null error: null \ No newline at end of file diff --git a/test/e2e-v2/cases/mqe/mqe-cases.yaml b/test/e2e-v2/cases/mqe/mqe-cases.yaml index 78eafd122003..0805f2f34b0e 100644 --- a/test/e2e-v2/cases/mqe/mqe-cases.yaml +++ b/test/e2e-v2/cases/mqe/mqe-cases.yaml @@ -40,13 +40,13 @@ cases: - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression="top_n(service_resp_time,3,des)" expected: expected/topN-OP-service.yml # topN-OP-service Global with attrs - - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression="top_n(service_sla,3,des,attr0='GENERAL')/100" + - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression="top_n(service_resp_time,3,des,attr0='GENERAL')/100" expected: expected/topN-OP-service.yml - - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression="top_n(service_sla,3,des,attr0!='Not_GENERAL')/100" + - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression="top_n(service_resp_time,3,des,attr0!='Not_GENERAL')/100" expected: expected/topN-OP-service.yml # topN-OP-isntance - - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression="top_n(service_instance_sla,3,des)/100" --service-name=e2e-service-provider + - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics exec --expression="top_n(service_instance_resp_time,3,des)/100" --service-name=e2e-service-provider expected: expected/topN-OP-instance.yml # select labels and relabels diff --git a/test/e2e-v2/cases/profiling/ebpf/access_log/accesslog-cases.yaml b/test/e2e-v2/cases/profiling/ebpf/access_log/accesslog-cases.yaml index cbedf30be6c8..8ae7b7f56de9 100644 --- a/test/e2e-v2/cases/profiling/ebpf/access_log/accesslog-cases.yaml +++ b/test/e2e-v2/cases/profiling/ebpf/access_log/accesslog-cases.yaml @@ -89,7 +89,7 @@ cases: swctl --display yaml --base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql metrics exec --expression=kubernetes_service_instance_http_call_cpm --service-name=reviews.default --instance-name=$instance_name expected: expected/metrics-has-value.yml - query: swctl --display yaml --base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql metrics exec --expression="top_n(kubernetes_service_instance_write_l4_time,10,des)" --service-name=details.default - expected: expected/metrics-sorted-has-value.yml + expected: expected/metrics-sorted-has-value-instance.yml # service endpoint level metrics - query: swctl --display yaml --base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql metrics exec --expression=kubernetes_service_endpoint_call_cpm --service-name=details.default --endpoint-name=GET:/details/0 @@ -97,7 +97,7 @@ cases: - query: swctl --display yaml --base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql metrics exec --expression=kubernetes_service_endpoint_http_call_cpm --service-name=details.default --endpoint-name=GET:/details/0 expected: expected/metrics-has-value.yml - query: swctl --display yaml --base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql metrics exec --expression="top_n(kubernetes_service_endpoint_call_time,10,des)" --service-name=details.default - expected: expected/metrics-sorted-has-value.yml + expected: expected/metrics-sorted-has-value-endpoint.yml # service relation metrics - query: swctl --display yaml --base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql metrics exec --expression=kubernetes_service_relation_connect_cpm --service-name=productpage.default --dest-service-name=details.default diff --git a/test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value.yml b/test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value-endpoint.yml similarity index 75% rename from test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value.yml rename to test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value-endpoint.yml index 5f05b5e751d4..7073c49a9ea7 100644 --- a/test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value.yml +++ b/test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value-endpoint.yml @@ -23,8 +23,16 @@ results: {{- contains .values }} - id: {{ notEmpty .id }} value: {{ .value }} - owner: null traceid: null + owner: + scope: {{ .owner.scope }} + serviceid: {{ .owner.serviceid }} + servicename: {{ .owner.servicename }} + normal: true + serviceinstanceid: null + serviceinstancename: null + endpointid: {{ .owner.endpointid }} + endpointname: {{ .owner.endpointname }} {{- end}} {{- end}} error: null \ No newline at end of file diff --git a/test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value-instance.yml b/test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value-instance.yml new file mode 100644 index 000000000000..d0f9daf3191a --- /dev/null +++ b/test/e2e-v2/cases/profiling/ebpf/access_log/expected/metrics-sorted-has-value-instance.yml @@ -0,0 +1,38 @@ +# 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 +type: SORTED_LIST +results: + {{- contains .results }} + - metric: + labels: [] + values: + {{- contains .values }} + - id: {{ notEmpty .id }} + value: {{ .value }} + traceid: null + owner: + scope: {{ .owner.scope }} + serviceid: {{ .owner.serviceid }} + servicename: {{ .owner.servicename }} + normal: true + serviceinstanceid: {{ .owner.serviceinstanceid }} + serviceinstancename: {{ .owner.serviceinstancename }} + endpointid: null + endpointname: null + {{- end}} + {{- end}} +error: null \ No newline at end of file diff --git a/test/e2e-v2/cases/storage/expected/topN-OP-endpoint.yml b/test/e2e-v2/cases/storage/expected/topN-OP-endpoint.yml index 5406006d70a6..d42453ed2d47 100644 --- a/test/e2e-v2/cases/storage/expected/topN-OP-endpoint.yml +++ b/test/e2e-v2/cases/storage/expected/topN-OP-endpoint.yml @@ -23,12 +23,16 @@ results: {{- contains .values }} - id: {{ notEmpty .id }} value: "100" - owner: null - traceid: null - - id: {{ notEmpty .id }} - value: "100" - owner: null traceid: null + owner: + scope: Endpoint + serviceid: {{ notEmpty .owner.serviceid }} + servicename: {{ notEmpty .owner.servicename }} + normal: true + serviceinstanceid: null + serviceinstancename: null + endpointid: {{ notEmpty .owner.endpointid }} + endpointname: {{ notEmpty .owner.endpointname }} {{- end }} {{- end }} error: null diff --git a/test/e2e-v2/cases/storage/expected/topN-OP-service.yml b/test/e2e-v2/cases/storage/expected/topN-OP-service.yml index b45180f5e244..b3a0ed1586fe 100644 --- a/test/e2e-v2/cases/storage/expected/topN-OP-service.yml +++ b/test/e2e-v2/cases/storage/expected/topN-OP-service.yml @@ -22,13 +22,17 @@ results: values: {{- contains .values }} - id: {{ notEmpty .id }} - owner: null - value: "100" - traceid: null - - id: {{ notEmpty .id }} - owner: null value: "100" traceid: null + owner: + scope: Service + serviceid: {{ notEmpty .owner.serviceid }} + servicename: {{ notEmpty .owner.servicename }} + normal: true + serviceinstanceid: null + serviceinstancename: null + endpointid: null + endpointname: null {{- end }} {{- end }} error: null diff --git a/test/e2e-v2/cases/vm/expected/topN.yml b/test/e2e-v2/cases/vm/expected/topN.yml index bb3af0dc725d..0a0d5b82a26c 100644 --- a/test/e2e-v2/cases/vm/expected/topN.yml +++ b/test/e2e-v2/cases/vm/expected/topN.yml @@ -19,12 +19,20 @@ results: {{- contains .results }} - metric: labels: [] - {{- contains .values }} values: + {{- contains .values }} - id: vm-service - value: {{ .value }} + value: "{{ .value }}" traceid: null - owner: null + owner: + scope: Service + serviceid: {{ b64enc "vm-service" }}.1 + servicename: vm-service + normal: true + serviceinstanceid: null + serviceinstancename: null + endpointid: null + endpointname: null {{- end }} {{- end }} error: null diff --git a/test/e2e-v2/script/env b/test/e2e-v2/script/env index d684800391db..5e6fc2cdedad 100644 --- a/test/e2e-v2/script/env +++ b/test/e2e-v2/script/env @@ -26,4 +26,4 @@ SW_ROVER_COMMIT=0ae8f12d6eb6cc9fa125c603ee57d0b21fc8c6d0 SW_BANYANDB_COMMIT=7f291fc5c626ea8b0d33c947563f7984cfc4886e SW_AGENT_PHP_COMMIT=3192c553002707d344bd6774cfab5bc61f67a1d3 -SW_CTL_COMMIT=6210a3b79089535af782ca51359ce6c5b68890b2 +SW_CTL_COMMIT=67cbc89dd7b214d5791321a7ca992f940cb586ba