You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by qi...@apache.org on 2023/05/08 03:02:38 UTC

[skywalking-grafana-plugins] 02/02: feat: add layer

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

qiuxiafan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-grafana-plugins.git

commit 5ee35b99d7e38c7cc8e95f0916d9436e055fd0a1
Author: Fine0830 <fa...@gmail.com>
AuthorDate: Mon May 8 11:02:12 2023 +0800

    feat: add layer
---
 src/components/QueryEditor.tsx |  8 +++++++-
 src/constant.ts                |  5 ++---
 src/datasource.ts              | 33 +++++++++++++++++----------------
 src/types.ts                   |  1 +
 4 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/src/components/QueryEditor.tsx b/src/components/QueryEditor.tsx
index 1f14503..e80c34c 100644
--- a/src/components/QueryEditor.tsx
+++ b/src/components/QueryEditor.tsx
@@ -7,6 +7,9 @@ import { MyDataSourceOptions, MyQuery } from '../types';
 type Props = QueryEditorProps<DataSource, MyQuery, MyDataSourceOptions>;
 
 export function QueryEditor({ query, onChange, onRunQuery }: Props) {
+  const onLayerChange = (event: ChangeEvent<HTMLInputElement>) => {
+    onChange({ ...query, layer: event.target.value });
+  };
   const onServiceChange = (event: ChangeEvent<HTMLInputElement>) => {
     onChange({ ...query, service: event.target.value });
   };
@@ -22,10 +25,13 @@ export function QueryEditor({ query, onChange, onRunQuery }: Props) {
   const onRunQueryText = () => {
     onRunQuery();
   };
-  const { service, nodeMetrics, edgeServerMetrics, edgeClientMetrics } = query;
+  const { service, nodeMetrics, edgeServerMetrics, edgeClientMetrics, layer } = query;
 
   return (
     <div className="gf-form-group">
+      <InlineField label="Layer"  tooltip="Not used yet" labelWidth={20}>
+        <Input onBlur={onRunQueryText} onChange={onLayerChange} value={layer || ''} width={40} />
+      </InlineField>
       <InlineField label="Service"  tooltip="Not used yet" labelWidth={20}>
         <Input onBlur={onRunQueryText} onChange={onServiceChange} value={service || ''} width={40} />
       </InlineField>
diff --git a/src/constant.ts b/src/constant.ts
index 51b2774..e26a3e1 100644
--- a/src/constant.ts
+++ b/src/constant.ts
@@ -1,7 +1,6 @@
 export const Fragments = {
-  serviceTopolgy: "query queryData($serviceId: ID!, $duration: Duration!) {\n  topology: getServiceTopology(serviceId: $serviceId, duration: $duration) {\n    nodes {\n      id\n      name\n      type\n      isReal\n    }\n    calls {\n      id\n      source\n      detectPoints\n      target\n    }\n  }}",
-  globalTopology: "query queryData($duration: Duration!) {\n  topology: getGlobalTopology(duration: $duration) {\n    nodes {\n      id\n      name\n      type\n      isReal\n    }\n    calls {\n      id\n      source\n      detectPoints\n      target\n    }\n  }}",
-  services: "query queryServices($duration: Duration!,$keyword: String!) {\n    services: getAllServices(duration: $duration, group: $keyword) {\n      id\n      name\n      group\n    }\n  }",
+  servicesTopolgy: "query queryData($serviceIds: [ID!]!, $duration: Duration!) {\n  topology: getServicesTopology(serviceIds: $serviceIds, duration: $duration) {\n    nodes {\n      id\n      name\n      type\n      isReal\n    }\n    calls {\n      id\n      source\n      detectPoints\n      target\n    }\n  }}",
+  services: "query queryServices($duration: Duration!,$keyword: String!) {\n    services: getAllServices(duration: $duration, group: $keyword) {\n      id\n      name\n      group\n      layers\n    }\n  }",
 };
 
 // proxy route
diff --git a/src/datasource.ts b/src/datasource.ts
index b6ed946..99ee36f 100644
--- a/src/datasource.ts
+++ b/src/datasource.ts
@@ -52,6 +52,10 @@ export class DataSource extends DataSourceApi<MyQuery, MyDataSourceOptions> {
     };
     const promises = options.targets.map(async (target) => {
       const query = defaults(target, DEFAULT_QUERY);
+      const layer = getTemplateSrv().replace(query.layer, options.scopedVars);
+      if (!layer) {
+        return [];
+      }
       const serviceName = getTemplateSrv().replace(query.service, options.scopedVars);
       const nodeMetricsStr = getTemplateSrv().replace(query.nodeMetrics, options.scopedVars);
       const nodeMetrics = nodeMetricsStr ? this.parseMetrics(nodeMetricsStr) : [];
@@ -60,14 +64,6 @@ export class DataSource extends DataSourceApi<MyQuery, MyDataSourceOptions> {
       const edgeClientMetricsStr = getTemplateSrv().replace(query.edgeClientMetrics, options.scopedVars);
       const edgeClientMetrics = edgeClientMetricsStr ? this.parseMetrics(edgeClientMetricsStr) : [];
       let services = [];
-      let t: {
-        query: string;
-        variables: Recordable;
-      } = {
-        query: Fragments.globalTopology,
-        variables: {duration},
-      };
-      let serviceObj;
       // fetch services from api
       const  s =  {
         query: Fragments.services,
@@ -75,16 +71,21 @@ export class DataSource extends DataSourceApi<MyQuery, MyDataSourceOptions> {
       };
       const resp = await this.doRequest(s);
       services = resp.data.services || [];
+
+      const t: {
+        query: string;
+        variables: Recordable;
+      } = {
+        query: Fragments.servicesTopolgy,
+        variables: {duration},
+      };
+      let serviceObj;
       if (serviceName) {
-        serviceObj = services.find((d: {name: string, id: string}) => d.name === serviceName);
-        if(serviceObj) {
-          t = {
-            query: Fragments.serviceTopolgy,
-            variables: {serviceId: serviceObj.id, duration},
-          };
-        }
+        serviceObj = services.filter((d: {name: string, id: string}) => d.name === serviceName);
+      } else {
+        serviceObj = services.filter((d: {layers: string[], id: string}) => d.layers.includes(layer));
       }
-
+      t.variables.serviceIds = serviceObj.map((d: {layers: string[], id: string}) => d.id);
       // fetch topology data from api
       const res = await this.doRequest(t);
       const {nodes, calls} = this.setTopologyData({nodes: res.data.topology.nodes || [],  calls: res.data.topology.calls || []});
diff --git a/src/types.ts b/src/types.ts
index de785b5..ea009ca 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -1,6 +1,7 @@
 import { DataQuery, DataSourceJsonData } from '@grafana/data';
 
 export interface MyQuery extends DataQuery {
+  layer?: string;
   service?: string;
   nodeMetrics?: string;
   edgeServerMetrics?: string;