You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2020/12/11 09:20:53 UTC

[skywalking-rocketbot-ui] branch master updated: Feat: Implement group selector in the topology (#399)

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-rocketbot-ui.git


The following commit(s) were added to refs/heads/master by this push:
     new dfedfae  Feat: Implement group selector in the topology (#399)
dfedfae is described below

commit dfedfae78e5601253793854576b6ea52fb64110b
Author: Qiuxia Fan <fi...@outlook.com>
AuthorDate: Fri Dec 11 17:20:44 2020 +0800

    Feat: Implement group selector in the topology (#399)
---
 src/graph/fragments/option.ts                      |  1 +
 src/views/components/topology/radial.vue           |  2 +-
 src/views/components/topology/topo-aside.vue       |  8 +-
 .../components/topology/topo-detect-point.vue      |  2 +-
 .../topology/topo-endpoint-dependency.vue          |  2 +-
 .../topology/topo-group/create-group.vue           |  2 +-
 .../components/topology/topo-group/group-item.vue  | 31 ++++----
 src/views/components/topology/topo-select.vue      |  5 +-
 src/views/components/topology/topo-services.vue    | 92 +++++++++++++++++-----
 9 files changed, 103 insertions(+), 42 deletions(-)

diff --git a/src/graph/fragments/option.ts b/src/graph/fragments/option.ts
index 9f9cb1b..205568c 100644
--- a/src/graph/fragments/option.ts
+++ b/src/graph/fragments/option.ts
@@ -21,6 +21,7 @@ export const Services = {
     services: getAllServices(duration: $duration, group: $keyword) {
       key: id
       label: name
+      group
     }
   `,
 };
diff --git a/src/views/components/topology/radial.vue b/src/views/components/topology/radial.vue
index debe503..a69a0a5 100644
--- a/src/views/components/topology/radial.vue
+++ b/src/views/components/topology/radial.vue
@@ -74,7 +74,7 @@ limitations under the License. -->
             '#96dee8',
           ],
            legend: {
-              top: 25,
+              top: 50,
               textStyle: {
                 color: '#ddd',
               },
diff --git a/src/views/components/topology/topo-aside.vue b/src/views/components/topology/topo-aside.vue
index fbef552..2e61b33 100644
--- a/src/views/components/topology/topo-aside.vue
+++ b/src/views/components/topology/topo-aside.vue
@@ -16,7 +16,7 @@ limitations under the License. -->
 <template>
   <aside class="link-topo-aside">
     <Radial v-if="radioStatus" :datas="{ nodes: stateTopo.nodes, calls: stateTopo.calls }" />
-    <svg class="link-topo-aside-btn icon cp lg" @click="showRadial()" :style="`position:absolute;left:290px;`">
+    <svg class="link-topo-aside-btn icon cp lg" @click="showRadial()" :style="`position:absolute;left:580px;`">
       <use xlink:href="#issues" />
     </svg>
     <svg
@@ -53,8 +53,8 @@ limitations under the License. -->
             v-if="stateTopo.serviceSLA.length"
             :data="stateTopo.serviceSLA"
             :intervalTime="intervalTime"
-            title="Service SLA"
-            unit="%"
+            :title="$t('avgSLA')"
+            unit=""
           />
         </div>
       </div>
@@ -168,7 +168,7 @@ limitations under the License. -->
     display: block;
     background: #252a2f9a;
     color: #ddd;
-    border-radius: 4px 4px 4px 4px;
+    border-radius: 4px;
     text-align: center;
     padding: 10px;
     z-index: 101;
diff --git a/src/views/components/topology/topo-detect-point.vue b/src/views/components/topology/topo-detect-point.vue
index 93eb6ab..72191e4 100644
--- a/src/views/components/topology/topo-detect-point.vue
+++ b/src/views/components/topology/topo-detect-point.vue
@@ -67,7 +67,7 @@ limitations under the License. -->
           :intervalTime="intervalTime"
           :precent="true"
           :title="$t('avgSLA')"
-          unit="%"
+          unit=""
         />
         <ChartLine
           v-if="stateTopo.responsePercentile.p50.length"
diff --git a/src/views/components/topology/topo-endpoint-dependency.vue b/src/views/components/topology/topo-endpoint-dependency.vue
index 3bcb97d..54839b1 100644
--- a/src/views/components/topology/topo-endpoint-dependency.vue
+++ b/src/views/components/topology/topo-endpoint-dependency.vue
@@ -32,7 +32,7 @@ limitations under the License. -->
         <TopoChart :data="cpm" :intervalTime="intervalTime" :title="$t('avgThroughput')" unit="cpm" />
       </div>
       <div v-if="sla.length">
-        <TopoChart :data="sla" :intervalTime="intervalTime" :precent="true" :title="$t('avgSLA')" unit="%" />
+        <TopoChart :data="sla" :intervalTime="intervalTime" :precent="true" :title="$t('avgSLA')" unit="" />
       </div>
       <div v-if="percentile.p50">
         <ChartLine :data="percentile" :intervalTime="intervalTime" :title="$t('percentResponse')" />
diff --git a/src/views/components/topology/topo-group/create-group.vue b/src/views/components/topology/topo-group/create-group.vue
index b5bbf1c..7dae457 100644
--- a/src/views/components/topology/topo-group/create-group.vue
+++ b/src/views/components/topology/topo-group/create-group.vue
@@ -15,7 +15,7 @@ limitations under the License. -->
 <template>
   <div>
     <div v-if="create">
-      <input class="group-create-input mr-5" placeholder="Group Name" v-model="name" />
+      <input class="group-create-input mr-5" placeholder="Add local view" v-model="name" />
       <RkButton class="mr-5" @click="handleCreateGroup">Confirm</RkButton>
       <RkButton @click="create = false">Cancel</RkButton>
     </div>
diff --git a/src/views/components/topology/topo-group/group-item.vue b/src/views/components/topology/topo-group/group-item.vue
index 9c32571..866d28e 100644
--- a/src/views/components/topology/topo-group/group-item.vue
+++ b/src/views/components/topology/topo-group/group-item.vue
@@ -21,20 +21,20 @@ limitations under the License. -->
     </div>
     <div class="group-services">
       <div class="group-services-wrapper">
-      <div class="ell mb-10" v-for="i in servicesMap" :key="i.key">
-        <input
-          type="checkbox"
-          @click="
-            (e) => {
-              !e.target.checked
-                ? DELETE_GROUP_SERVICE({ id: data.id, service: i })
-                : ADD_GROUP_SERVICE({ id: data.id, service: i });
-            }
-          "
-          :checked="data.services.some((service) => service.label === i.label)"
-        />
-        <span>{{ i.label }}</span>
-      </div>
+        <div class="ell mb-10" v-for="i in servicesMap" :key="i.key">
+          <input
+            type="checkbox"
+            @click="
+              (e) => {
+                !e.target.checked
+                  ? DELETE_GROUP_SERVICE({ id: data.id, service: i })
+                  : ADD_GROUP_SERVICE({ id: data.id, service: i });
+              }
+            "
+            :checked="data.services.some((service) => service.label === i.label)"
+          />
+          <span>{{ i.label }}</span>
+        </div>
       </div>
 
       <RkButton size="sm" class="mr-5" @click="$emit('select', data.id)">Render</RkButton>
@@ -56,6 +56,7 @@ limitations under the License. -->
 </script>
 <style lang="scss">
   .topo-group {
+    z-index: 101;
     .group-wrapper {
       position: relative;
       margin-bottom: 5px;
@@ -65,7 +66,7 @@ limitations under the License. -->
         }
       }
     }
-    .group-services-wrapper{
+    .group-services-wrapper {
       max-height: 250px;
       overflow: auto;
       padding-right: 15px;
diff --git a/src/views/components/topology/topo-select.vue b/src/views/components/topology/topo-select.vue
index 16e9475..60a602a 100644
--- a/src/views/components/topology/topo-select.vue
+++ b/src/views/components/topology/topo-select.vue
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License. -->
 <template>
   <div
-    class="rk-topo-bar-select cp flex-h"
+    class="rk-topo-bar-select cp"
     v-clickout="
       () => {
         visible = false;
@@ -85,6 +85,9 @@ limitations under the License. -->
     z-index: 1;
     height: 40px;
     justify-content: space-between;
+    background-color: #2b3037;
+    color: #ddd;
+    width: 280px;
     .sm {
       line-height: 12px;
     }
diff --git a/src/views/components/topology/topo-services.vue b/src/views/components/topology/topo-services.vue
index 26a24a1..8193af9 100644
--- a/src/views/components/topology/topo-services.vue
+++ b/src/views/components/topology/topo-services.vue
@@ -13,8 +13,9 @@ 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. -->
 <template>
-  <div class="link-topo-aside-box" style="padding:0;">
-    <TopoSelect :current="service" :data="services" @onChoose="handleChange" />
+  <div class="selector-topo-aside-box">
+    <TopoSelect :current="group" :data="groups" @onChoose="changeGroup" />
+    <TopoSelect :current="service" :data="currentServices" @onChoose="changeService" />
   </div>
 </template>
 <script lang="ts">
@@ -30,32 +31,71 @@ limitations under the License. -->
     @Action('rocketTopo/GET_TOPO') public GET_TOPO: any;
     @Action('rocketTopo/GET_SERVICES') private GET_SERVICES: any;
     @Mutation('rocketTopoGroup/UNSELECT_GROUP') private UNSELECT_GROUP: any;
-    private services = [{ key: 0, label: 'All services' }];
-    private service = { key: 0, label: 'All services' };
+    private services = [{ key: '', label: 'All services', group: '' }];
+    private currentServices = [{ key: '', label: 'All services' }];
+    private service = { key: '', label: 'All services' };
+    private groups = [{ key: '', label: 'All groups' }];
+    private group = { key: '', label: 'All groups' };
 
     private created() {
       this.fetchData();
-      this.renderTopo();
     }
 
-    private fetchData() {
-      this.GET_SERVICES({ duration: this.durationTime }).then((json: any[]) => {
-        this.services = [...this.services, ...json];
-      });
+    get currentServiceList() {
+      const services = this.group.key ? this.services.filter((item) => item.group === this.group.key) : this.services;
+
+      return [{ key: '', label: 'All services' }, ...services];
     }
 
-    @Watch('durationTime')
-    private watchDurationTime(newValue: DurationTime, oldValue: DurationTime) {
-      // Avoid repeating fetchData() after enter the component for the first time.
-      if (compareObj(newValue, oldValue)) {
-        this.fetchData();
-        this.renderTopo();
-      }
+    private fetchData() {
+      this.GET_SERVICES({ duration: this.durationTime }).then(
+        (json: Array<{ key: string; label: string; group: string }>) => {
+          const groups = [] as string[];
+          for (const g of json) {
+            if (!groups.includes(g.group)) {
+              groups.push(g.group);
+            }
+          }
+          this.groups = [
+            ...groups.map((g) => {
+              return {
+                key: g,
+                label: g,
+              };
+            }),
+            { key: '', label: 'All groups' },
+          ];
+          this.group = this.groups[0];
+          this.services = json;
+          this.currentServices = this.currentServiceList;
+          this.service = this.currentServiceList.length > 1 ? this.currentServices[1] : this.currentServices[0];
+          this.renderTopo();
+        },
+      );
     }
 
-    private handleChange(i: any) {
+    private changeService(i: { key: string; label: string; group: string }) {
       this.service = i;
       this.UNSELECT_GROUP();
+      if (this.service.key) {
+        this.GET_TOPO({
+          serviceId: this.service.key,
+          duration: this.durationTime,
+        });
+      } else {
+        const serviceIds = this.group.key ? this.currentServices.map((item) => item.key) : undefined;
+
+        this.GET_TOPO({
+          serviceIds,
+          duration: this.durationTime,
+        });
+      }
+    }
+
+    private changeGroup(i: { key: string; label: string }) {
+      this.group = i;
+      this.currentServices = this.currentServiceList;
+      this.service = this.currentServiceList.length > 1 ? this.currentServices[1] : this.currentServices[0];
       this.GET_TOPO({
         serviceId: this.service.key,
         duration: this.durationTime,
@@ -68,7 +108,7 @@ limitations under the License. -->
         const jsonGroup = JSON.parse(groups);
         if (!jsonGroup.length) {
           this.GET_TOPO({
-            serviceId: 0,
+            serviceId: this.service.key,
             duration: this.durationTime,
           });
         }
@@ -79,10 +119,26 @@ limitations under the License. -->
         });
       }
     }
+
+    @Watch('durationTime')
+    private watchDurationTime(newValue: DurationTime, oldValue: DurationTime) {
+      // Avoid repeating fetchData() after enter the component for the first time.
+      if (compareObj(newValue, oldValue)) {
+        this.fetchData();
+      }
+    }
   }
 </script>
 <style lang="scss">
   .topo-server.dao-select .dao-select-main .dao-select-switch {
     border: 0;
   }
+  .selector-topo-aside-box {
+    z-index: 101;
+    position: absolute;
+    display: flex;
+    > div:last-child {
+      margin-left: 10px;
+    }
+  }
 </style>