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

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


The following commit(s) were added to refs/heads/master by this push:
     new dbff942  Refactor metrics linear to adopt v2 protocol (#69)
dbff942 is described below

commit dbff94243f58a866b08fd856c0427b9ebfd6c618
Author: Hoshea Jiang <fgk...@gmail.com>
AuthorDate: Wed Oct 21 08:53:06 2020 +0800

    Refactor metrics linear to adopt v2 protocol (#69)
    
    ### Enhancements
    
    - Refactor `metrics linear` and  `metrics multiple-linear` commands to 
adopt v2 protocol
    
    ### Bug Fixes
    
    - Replace invalid links of `OAL` in `README.md`
    - Delete duplicate sentence in `README.md`
---
 README.md                                          | 43 ++++++----------------
 .../{dashboard => metrics}/HeatMap.graphql         |  0
 .../LabeledMetricsValues.graphql                   |  0
 ...Thermodynamic.graphql => MetricsValues.graphql} | 12 +++---
 .../metrics/MultipleLinearIntValues.graphql        | 22 -----------
 commands/metrics/linear/linear-metrics.go          | 38 +++++++++----------
 commands/metrics/linear/multiple-linear-metrics.go | 41 +++++++++------------
 display/graph/graph.go                             | 17 +++++----
 display/graph/linear/linear.go                     | 12 +++---
 graphql/dashboard/global.go                        | 39 +++-----------------
 graphql/metrics/metrics.go                         | 20 +++++-----
 graphql/utils/adapter.go                           | 27 +++++++++++---
 graphql/utils/adapter_test.go                      | 30 ++++++++-------
 13 files changed, 124 insertions(+), 177 deletions(-)

diff --git a/README.md b/README.md
index 5debd1c..4f1623a 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@ git submodule update
 make
 ```
 
-and copy the `./bin/swctl-latest-(darwin|linux|windows)-amd64` to your `PATH` 
directory according to your OS,
+Then copy the `./bin/swctl-latest-(darwin|linux|windows)-amd64` to your `PATH` 
directory according to your OS,
 usually `/usr/bin/` or `/usr/local/bin`, or you can copy it to any directory 
you like,
 and add that directory to `PATH`, we recommend you to rename the 
`swctl-latest-(darwin|linux|windows)-amd64` to `swctl`.
 
@@ -160,12 +160,12 @@ Ascii Graph, like coloring in terminal, so please use 
`json`  or `yaml` instead.
 
 <details>
 
-<summary>metrics linear [--start=start-time] [--end=end-time] 
--name=metrics-name [--id=entity-id]</summary>
+<summary>metrics linear [--start=start-time] [--end=end-time] 
--name=metrics-name [--scope=scope-of-metrics]</summary>
 
 | option | description | default |
 | :--- | :--- | :--- |
-| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/official_analysis.oal),
 such as `all_p99`, etc. |
-| `--id` | the related id if the metrics requires one, e.g. for metrics 
`service_p99`, the service `id` is required, use `--id` to specify the service 
id, the same for `instance`, `endpoint`, etc. |
+| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/oal/core.oal),
 such as `all_p99`, etc. |
+| `--scope` | The scope of metrics, which is consistent with `--name`, such as 
`All`, `Service`, `ServiceInstance`, `Endpoint`, `ServiceRelation`, 
`ServiceInstanceRelation` and `EndpointRelation`. |`All`|
 | `--start` | See [Common options](#common-options) | See [Common 
options](#common-options) |
 | `--end` | See [Common options](#common-options) | See [Common 
options](#common-options) |
 
@@ -175,15 +175,14 @@ Ascii Graph, like coloring in terminal, so please use 
`json`  or `yaml` instead.
 
 <details>
 
-<summary>metrics multiple-linear [--start=start-time] [--end=end-time] 
--name=metrics-name [--id=entity-id] [--num=number-of-linear-metrics]</summary>
+<summary>metrics multiple-linear [--start=start-time] [--end=end-time] 
--name=metrics-name [--num=number-of-linear-metrics]</summary>
 
 | option | description | default |
 | :--- | :--- | :--- |
-| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/official_analysis.oal),
 such as `all_p99`, etc. |
-| `--id` | the related id if the metrics requires one, e.g. for metrics 
`service_p99`, the service `id` is required, use `--id` to specify the service 
id, the same for `instance`, `endpoint`, etc. |
+| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/oal/core.oal),
 such as `all_p99`, etc. |
+| `--num` | Number of the linear metrics to fetch | `5` |
 | `--start` | See [Common options](#common-options) | See [Common 
options](#common-options) |
 | `--end` | See [Common options](#common-options) | See [Common 
options](#common-options) |
-| `--num` | Number of the linear metrics to fetch | `5` |
 
 </details>
 
@@ -195,7 +194,7 @@ Ascii Graph, like coloring in terminal, so please use 
`json`  or `yaml` instead.
 
 | option | description | default |
 | :--- | :--- | :--- |
-| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/official_analysis.oal),
 such as `service_sla`, etc. |
+| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/oal/core.oal),
 such as `service_sla`, etc. |
 | `--ids` | IDs that are required by the metric type, such as service IDs for 
`service_sla` |
 | `--start` | See [Common options](#common-options) | See [Common 
options](#common-options) |
 | `--end` | See [Common options](#common-options) | See [Common 
options](#common-options) |
@@ -210,7 +209,7 @@ Ascii Graph, like coloring in terminal, so please use 
`json`  or `yaml` instead.
 
 | option | description | default |
 | :--- | :--- | :--- |
-| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/official_analysis.oal),
 such as `service_sla`, etc. |
+| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/oal/core.oal),
 such as `service_sla`, etc. |
 | `--service-id` | service ID that are required by the metric type, such as 
service IDs for `service_sla` |
 | `--start` | See [Common options](#common-options) | See [Common 
options](#common-options) |
 | `--end` | See [Common options](#common-options) | See [Common 
options](#common-options) |
@@ -226,24 +225,8 @@ Ascii Graph, like coloring in terminal, so please use 
`json`  or `yaml` instead.
 
 | option | description | default |
 | :--- | :--- | :--- |
-| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/official_analysis.oal),
 such as `service_sla`, etc. |
-| `--scope` | The scope of metrics, which is consistent with `--name`, such as 
`All`, `Service`, etc. |`All`|
-| `--start` | See [Common options](#common-options) | See [Common 
options](#common-options) |
-| `--end` | See [Common options](#common-options) | See [Common 
options](#common-options) |
-
-</details>
-
-<details>
-
-<summary>instance search [--start=start-time] [--end=end-time] 
[--regex=instance-name-regex] [--service-id=service-id] 
[--service-name=service-name]</summary>
-
-`instance search` filter the instance in the time range of `[start, end]` and 
given --regex --service-id or --service-name.
-
-| option | description | default |
-| :--- | :--- | :--- |
-| `--regex` | Query regex of instance name|  |
-| `--service-id` | Query by service id (priority over `--service-name`)|  |
-| `--service-name` | Query by service name if `service-id` is absent |  |
+| `--name` | Metrics name, defined in 
[OAL](https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/oal/core.oal),
 such as `service_sla`, etc. |
+| `--scope` | The scope of metrics, which is consistent with `--name`, such as 
`All`, `Service`, `ServiceInstance`, `Endpoint`, `ServiceRelation`, 
`ServiceInstanceRelation` and `EndpointRelation`. |`All`|
 | `--start` | See [Common options](#common-options) | See [Common 
options](#common-options) |
 | `--end` | See [Common options](#common-options) | See [Common 
options](#common-options) |
 
@@ -392,10 +375,8 @@ otherwise,
 
 <summary>Query a linear metrics graph for an instance</summary>
 
-If you have already got the `id` of the instance:
-
 ```shell
-$ ./bin/swctl --display=graph metrics linear --name=service_instance_resp_time 
--id 5
+$ ./bin/swctl --display=graph metrics linear --name=service_instance_resp_time 
--scope ServiceInstance
 
┌─────────────────────────────────────────────────────────────────────────────────Press
 q to 
quit──────────────────────────────────────────────────────────────────────────────────┐
 │                                                                              
                                                                                
                    │
 │                                                                              
                                                                                
                    │
diff --git a/assets/graphqls/dashboard/HeatMap.graphql 
b/assets/graphqls/metrics/HeatMap.graphql
similarity index 100%
rename from assets/graphqls/dashboard/HeatMap.graphql
rename to assets/graphqls/metrics/HeatMap.graphql
diff --git a/assets/graphqls/dashboard/LabeledMetricsValues.graphql 
b/assets/graphqls/metrics/LabeledMetricsValues.graphql
similarity index 100%
rename from assets/graphqls/dashboard/LabeledMetricsValues.graphql
rename to assets/graphqls/metrics/LabeledMetricsValues.graphql
diff --git a/assets/graphqls/metrics/Thermodynamic.graphql 
b/assets/graphqls/metrics/MetricsValues.graphql
similarity index 84%
rename from assets/graphqls/metrics/Thermodynamic.graphql
rename to assets/graphqls/metrics/MetricsValues.graphql
index ddbbe81..3d1c8a1 100644
--- a/assets/graphqls/metrics/Thermodynamic.graphql
+++ b/assets/graphqls/metrics/MetricsValues.graphql
@@ -16,14 +16,12 @@
 # under the License.
 
 query ($condition: MetricsCondition!, $duration: Duration!) {
-    result: readHeatMap(condition: $condition, duration: $duration) {
+    result: readMetricsValues(condition: $condition, duration: $duration) {
+        label
         values {
-            id
-            values
-        }
-        buckets {
-            min
-            max
+            values {
+                value
+            }
         }
     }
 }
diff --git a/assets/graphqls/metrics/MultipleLinearIntValues.graphql 
b/assets/graphqls/metrics/MultipleLinearIntValues.graphql
deleted file mode 100644
index 2450068..0000000
--- a/assets/graphqls/metrics/MultipleLinearIntValues.graphql
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed to 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. Apache Software Foundation (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.
-
-query ($metric: MetricCondition!, $numOfLinear: Int!, $duration: Duration!) {
-    result: getMultipleLinearIntValues(metric: $metric, numOfLinear: 
$numOfLinear, duration: $duration) {
-        values { value }
-    }
-}
diff --git a/commands/metrics/linear/linear-metrics.go 
b/commands/metrics/linear/linear-metrics.go
index c1aa19b..48cc830 100644
--- a/commands/metrics/linear/linear-metrics.go
+++ b/commands/metrics/linear/linear-metrics.go
@@ -18,18 +18,16 @@
 package linear
 
 import (
-       "github.com/urfave/cli"
-
-       "github.com/apache/skywalking-cli/display/displayable"
-
-       "github.com/apache/skywalking-cli/graphql/metrics"
-       "github.com/apache/skywalking-cli/graphql/utils"
-
        "github.com/apache/skywalking-cli/commands/flags"
        "github.com/apache/skywalking-cli/commands/interceptor"
        "github.com/apache/skywalking-cli/commands/model"
        "github.com/apache/skywalking-cli/display"
+       "github.com/apache/skywalking-cli/display/displayable"
+       "github.com/apache/skywalking-cli/graphql/metrics"
        "github.com/apache/skywalking-cli/graphql/schema"
+       "github.com/apache/skywalking-cli/graphql/utils"
+
+       "github.com/urfave/cli"
 )
 
 var Single = cli.Command{
@@ -43,9 +41,14 @@ var Single = cli.Command{
                                Usage:    "metrics `NAME`, such as `all_p99`",
                                Required: true,
                        },
-                       cli.StringFlag{
-                               Name:     "id",
-                               Usage:    "`ID`, the related id if the metrics 
requires one",
+                       cli.GenericFlag{
+                               Name:  "scope",
+                               Usage: "the scope of the query, which follows 
the metrics `name`",
+                               Value: &model.ScopeEnumValue{
+                                       Enum:     schema.AllScope,
+                                       Default:  schema.ScopeAll,
+                                       Selected: schema.ScopeAll,
+                               },
                                Required: false,
                        },
                },
@@ -59,12 +62,7 @@ var Single = cli.Command{
                start := ctx.String("start")
                step := ctx.Generic("step")
                metricsName := ctx.String("name")
-
-               var id *string = nil
-
-               if idString := ctx.String("id"); idString != "" {
-                       id = &idString
-               }
+               scope := ctx.Generic("scope").(*model.ScopeEnumValue).Selected
 
                duration := schema.Duration{
                        Start: start,
@@ -72,11 +70,13 @@ var Single = cli.Command{
                        Step:  step.(*model.StepEnumValue).Selected,
                }
 
-               metricsValues := metrics.LinearIntValues(ctx, 
schema.MetricCondition{
+               metricsValues := metrics.LinearIntValues(ctx, 
schema.MetricsCondition{
                        Name: metricsName,
-                       ID:   id,
+                       Entity: &schema.Entity{
+                               Scope: scope,
+                       },
                }, duration)
 
-               return display.Display(ctx, &displayable.Displayable{Data: 
utils.MetricsToMap(duration, metricsValues)})
+               return display.Display(ctx, &displayable.Displayable{Data: 
utils.MetricsValuesToMap(duration, metricsValues)})
        },
 }
diff --git a/commands/metrics/linear/multiple-linear-metrics.go 
b/commands/metrics/linear/multiple-linear-metrics.go
index fae3580..4036435 100644
--- a/commands/metrics/linear/multiple-linear-metrics.go
+++ b/commands/metrics/linear/multiple-linear-metrics.go
@@ -18,18 +18,18 @@
 package linear
 
 import (
-       "github.com/urfave/cli"
-
-       "github.com/apache/skywalking-cli/display/displayable"
-
-       "github.com/apache/skywalking-cli/graphql/metrics"
-       "github.com/apache/skywalking-cli/graphql/utils"
+       "fmt"
 
        "github.com/apache/skywalking-cli/commands/flags"
        "github.com/apache/skywalking-cli/commands/interceptor"
        "github.com/apache/skywalking-cli/commands/model"
        "github.com/apache/skywalking-cli/display"
+       "github.com/apache/skywalking-cli/display/displayable"
+       "github.com/apache/skywalking-cli/graphql/metrics"
        "github.com/apache/skywalking-cli/graphql/schema"
+       "github.com/apache/skywalking-cli/graphql/utils"
+
+       "github.com/urfave/cli"
 )
 
 var Multiple = cli.Command{
@@ -43,11 +43,6 @@ var Multiple = cli.Command{
                                Usage:    "metrics `NAME`, such as 
`all_percentile`",
                                Required: true,
                        },
-                       cli.StringFlag{
-                               Name:     "id",
-                               Usage:    "`ID`, the related id if the metrics 
requires one",
-                               Required: false,
-                       },
                        cli.IntFlag{
                                Name:     "num",
                                Usage:    "`num`, the number of linear metrics 
to query, (default: 5)",
@@ -67,10 +62,13 @@ var Multiple = cli.Command{
                metricsName := ctx.String("name")
                numOfLinear := ctx.Int("num")
 
-               var id *string = nil
+               if numOfLinear > 5 || numOfLinear < 1 {
+                       numOfLinear = 5
+               }
 
-               if idString := ctx.String("id"); idString != "" {
-                       id = &idString
+               var labels []string
+               for i := 0; i < numOfLinear; i++ {
+                       labels = append(labels, fmt.Sprintf("%d", i))
                }
 
                duration := schema.Duration{
@@ -79,17 +77,14 @@ var Multiple = cli.Command{
                        Step:  step.(*model.StepEnumValue).Selected,
                }
 
-               values := metrics.MultipleLinearIntValues(ctx, 
schema.MetricCondition{
+               metricsValuesArray := metrics.MultipleLinearIntValues(ctx, 
schema.MetricsCondition{
                        Name: metricsName,
-                       ID:   id,
-               }, numOfLinear, duration)
-
-               reshaped := make([]map[string]float64, len(values))
-
-               for index, value := range values {
-                       reshaped[index] = utils.MetricsToMap(duration, value)
-               }
+                       Entity: &schema.Entity{
+                               Scope: schema.ScopeAll,
+                       },
+               }, labels, duration)
 
+               reshaped := utils.MetricsValuesArrayToMap(duration, 
metricsValuesArray)
                return display.Display(ctx, &displayable.Displayable{Data: 
reshaped})
        },
 }
diff --git a/display/graph/graph.go b/display/graph/graph.go
index 73dd51e..22aad02 100644
--- a/display/graph/graph.go
+++ b/display/graph/graph.go
@@ -20,19 +20,18 @@ package graph
 import (
        "fmt"
        "reflect"
+       "strings"
 
        "github.com/urfave/cli"
 
+       d "github.com/apache/skywalking-cli/display/displayable"
        db "github.com/apache/skywalking-cli/display/graph/dashboard"
        "github.com/apache/skywalking-cli/display/graph/gauge"
+       "github.com/apache/skywalking-cli/display/graph/heatmap"
+       "github.com/apache/skywalking-cli/display/graph/linear"
        "github.com/apache/skywalking-cli/display/graph/tree"
        "github.com/apache/skywalking-cli/graphql/dashboard"
-
-       "github.com/apache/skywalking-cli/display/graph/heatmap"
        "github.com/apache/skywalking-cli/graphql/schema"
-
-       d "github.com/apache/skywalking-cli/display/displayable"
-       "github.com/apache/skywalking-cli/display/graph/linear"
 )
 
 type (
@@ -55,6 +54,8 @@ var (
        GlobalDataType         = reflect.TypeOf(&GlobalData{})
 )
 
+const multipleLinearTitles = "P50, P75, P90, P95, P99"
+
 func Display(ctx *cli.Context, displayable *d.Displayable) error {
        data := displayable.Data
 
@@ -63,10 +64,12 @@ func Display(ctx *cli.Context, displayable *d.Displayable) 
error {
                return heatmap.Display(displayable)
 
        case LinearMetricsType:
-               return linear.Display([]LinearMetrics{data.(LinearMetrics)})
+               return linear.Display(ctx, 
[]LinearMetrics{data.(LinearMetrics)}, nil)
 
        case MultiLinearMetricsType:
-               return linear.Display(data.(MultiLinearMetrics))
+               inputs := data.(MultiLinearMetrics)
+               titles := strings.Split(multipleLinearTitles, ", 
")[:len(inputs)]
+               return linear.Display(ctx, inputs, titles)
 
        case TraceType:
                return tree.Display(tree.Adapt(data.(Trace)))
diff --git a/display/graph/linear/linear.go b/display/graph/linear/linear.go
index bf0bc5c..37a4c7c 100644
--- a/display/graph/linear/linear.go
+++ b/display/graph/linear/linear.go
@@ -24,14 +24,15 @@ import (
        "sort"
        "strings"
 
-       "github.com/mum4k/termdash/linestyle"
-
        "github.com/mum4k/termdash"
        "github.com/mum4k/termdash/container"
        "github.com/mum4k/termdash/container/grid"
+       "github.com/mum4k/termdash/linestyle"
        "github.com/mum4k/termdash/terminal/termbox"
        "github.com/mum4k/termdash/terminal/terminalapi"
        "github.com/mum4k/termdash/widgets/linechart"
+
+       "github.com/urfave/cli"
 )
 
 const RootID = "root"
@@ -124,7 +125,7 @@ func layout(rows [][]grid.Element) ([]container.Option, 
error) {
        return builder.Build()
 }
 
-func Display(inputs []map[string]float64) error {
+func Display(cliCtx *cli.Context, inputs []map[string]float64, titles 
[]string) error {
        t, err := termbox.New()
        if err != nil {
                return err
@@ -149,7 +150,7 @@ func Display(inputs []map[string]float64) error {
                elements = append(elements, w)
        }
 
-       gridOpts, err := layout(LineChartElements(elements, nil))
+       gridOpts, err := layout(LineChartElements(elements, titles))
        if err != nil {
                return err
        }
@@ -157,7 +158,8 @@ func Display(inputs []map[string]float64) error {
        err = c.Update(RootID, append(
                gridOpts,
                container.Border(linestyle.Light),
-               container.BorderTitle("PRESS Q TO QUIT"))...,
+               container.BorderTitle(fmt.Sprintf("[%s]-PRESS Q TO QUIT", 
cliCtx.String("name"))),
+               container.BorderTitleAlignLeft())...,
        )
 
        if err != nil {
diff --git a/graphql/dashboard/global.go b/graphql/dashboard/global.go
index fc37f5a..2ea0872 100644
--- a/graphql/dashboard/global.go
+++ b/graphql/dashboard/global.go
@@ -20,20 +20,19 @@ package dashboard
 import (
        "bytes"
        "io/ioutil"
-       "strconv"
        "strings"
 
        "github.com/machinebox/graphql"
        "github.com/spf13/viper"
        "github.com/urfave/cli"
 
+       "gopkg.in/yaml.v2"
+
        "github.com/apache/skywalking-cli/assets"
        "github.com/apache/skywalking-cli/graphql/client"
+       "github.com/apache/skywalking-cli/graphql/metrics"
        "github.com/apache/skywalking-cli/graphql/schema"
        "github.com/apache/skywalking-cli/graphql/utils"
-       "github.com/apache/skywalking-cli/logger"
-
-       "gopkg.in/yaml.v2"
 )
 
 type ButtonTemplate struct {
@@ -167,8 +166,6 @@ func Metrics(ctx *cli.Context, duration schema.Duration) 
[][]*schema.SelectedRec
 }
 
 func responseLatency(ctx *cli.Context, duration schema.Duration) 
[]map[string]float64 {
-       var response map[string][]*schema.MetricsValues
-
        template, err := LoadTemplate(ctx.String("template"))
        if err != nil {
                return nil
@@ -183,31 +180,13 @@ func responseLatency(ctx *cli.Context, duration 
schema.Duration) []map[string]fl
        // need use ", " to split into string array for graphql query.
        labelsIndex := strings.Split(template.ResponseLatency.LabelsIndex, ", ")
 
-       request := 
graphql.NewRequest(assets.Read("graphqls/dashboard/LabeledMetricsValues.graphql"))
-       request.Var("duration", duration)
-       request.Var("condition", template.ResponseLatency.Condition)
-       request.Var("labels", labelsIndex)
-
-       client.ExecuteQueryOrFail(ctx, request, &response)
+       responseLatency := metrics.MultipleLinearIntValues(ctx, 
template.ResponseLatency.Condition, labelsIndex, duration)
 
        // Convert metrics values to map type data.
-       responseLatency := response["result"]
-       reshaped := make([]map[string]float64, len(responseLatency))
-       for _, mvs := range responseLatency {
-               index, err := strconv.Atoi(strings.TrimSpace(*mvs.Label))
-               if err != nil {
-                       logger.Log.Fatalln(err)
-                       return nil
-               }
-               reshaped[index] = utils.MetricsToMap(duration, *mvs.Values)
-       }
-
-       return reshaped
+       return utils.MetricsValuesArrayToMap(duration, responseLatency)
 }
 
 func heatMap(ctx *cli.Context, duration schema.Duration) schema.HeatMap {
-       var response map[string]schema.HeatMap
-
        template, err := LoadTemplate(ctx.String("template"))
        if err != nil {
                return schema.HeatMap{}
@@ -218,13 +197,7 @@ func heatMap(ctx *cli.Context, duration schema.Duration) 
schema.HeatMap {
                return schema.HeatMap{}
        }
 
-       request := 
graphql.NewRequest(assets.Read("graphqls/dashboard/HeatMap.graphql"))
-       request.Var("duration", duration)
-       request.Var("condition", template.HeatMap.Condition)
-
-       client.ExecuteQueryOrFail(ctx, request, &response)
-
-       return response["result"]
+       return metrics.Thermodynamic(ctx, template.HeatMap.Condition, duration)
 }
 
 func Global(ctx *cli.Context, duration schema.Duration) *GlobalData {
diff --git a/graphql/metrics/metrics.go b/graphql/metrics/metrics.go
index 0cf7099..022779d 100644
--- a/graphql/metrics/metrics.go
+++ b/graphql/metrics/metrics.go
@@ -41,12 +41,12 @@ func IntValues(ctx *cli.Context, condition 
schema.BatchMetricConditions, duratio
        return response["result"]
 }
 
-func LinearIntValues(ctx *cli.Context, condition schema.MetricCondition, 
duration schema.Duration) schema.IntValues {
-       var response map[string]schema.IntValues
+func LinearIntValues(ctx *cli.Context, condition schema.MetricsCondition, 
duration schema.Duration) schema.MetricsValues {
+       var response map[string]schema.MetricsValues
 
-       request := 
graphql.NewRequest(assets.Read("graphqls/metrics/LinearIntValues.graphql"))
+       request := 
graphql.NewRequest(assets.Read("graphqls/metrics/MetricsValues.graphql"))
 
-       request.Var("metric", condition)
+       request.Var("condition", condition)
        request.Var("duration", duration)
 
        client.ExecuteQueryOrFail(ctx, request, &response)
@@ -54,14 +54,14 @@ func LinearIntValues(ctx *cli.Context, condition 
schema.MetricCondition, duratio
        return response["result"]
 }
 
-func MultipleLinearIntValues(ctx *cli.Context, condition 
schema.MetricCondition, numOfLinear int, duration schema.Duration) 
[]schema.IntValues {
-       var response map[string][]schema.IntValues
+func MultipleLinearIntValues(ctx *cli.Context, condition 
schema.MetricsCondition, labels []string, duration schema.Duration) 
[]schema.MetricsValues {
+       var response map[string][]schema.MetricsValues
 
-       request := 
graphql.NewRequest(assets.Read("graphqls/metrics/MultipleLinearIntValues.graphql"))
+       request := 
graphql.NewRequest(assets.Read("graphqls/metrics/LabeledMetricsValues.graphql"))
 
-       request.Var("metric", condition)
-       request.Var("numOfLinear", numOfLinear)
        request.Var("duration", duration)
+       request.Var("condition", condition)
+       request.Var("labels", labels)
 
        client.ExecuteQueryOrFail(ctx, request, &response)
 
@@ -71,7 +71,7 @@ func MultipleLinearIntValues(ctx *cli.Context, condition 
schema.MetricCondition,
 func Thermodynamic(ctx *cli.Context, condition schema.MetricsCondition, 
duration schema.Duration) schema.HeatMap {
        var response map[string]schema.HeatMap
 
-       request := 
graphql.NewRequest(assets.Read("graphqls/metrics/Thermodynamic.graphql"))
+       request := 
graphql.NewRequest(assets.Read("graphqls/metrics/HeatMap.graphql"))
 
        request.Var("condition", condition)
        request.Var("duration", duration)
diff --git a/graphql/utils/adapter.go b/graphql/utils/adapter.go
index cabf7cb..1f5918f 100644
--- a/graphql/utils/adapter.go
+++ b/graphql/utils/adapter.go
@@ -18,17 +18,32 @@
 package utils
 
 import (
+       "strconv"
+       "strings"
        "time"
 
        "github.com/apache/skywalking-cli/graphql/schema"
        "github.com/apache/skywalking-cli/logger"
 )
 
-type IntValues schema.IntValues
+// MetricsValuesArrayToMap converts Array of MetricsValues into a map that 
uses time as key.
+func MetricsValuesArrayToMap(duration schema.Duration, mvArray 
[]schema.MetricsValues) []map[string]float64 {
+       ret := make([]map[string]float64, len(mvArray))
+       for _, mvs := range mvArray {
+               index, err := strconv.Atoi(strings.TrimSpace(*mvs.Label))
+               if err != nil {
+                       logger.Log.Fatalln(err)
+                       return nil
+               }
+               ret[index] = MetricsValuesToMap(duration, mvs)
+       }
+       return ret
+}
 
-func MetricsToMap(duration schema.Duration, intValues schema.IntValues) 
map[string]float64 {
-       kvInts := intValues.Values
-       values := map[string]float64{}
+// MetricsValuesToMap converts MetricsValues into a map that uses time as key.
+func MetricsValuesToMap(duration schema.Duration, metricsValues 
schema.MetricsValues) map[string]float64 {
+       kvInts := metricsValues.Values.Values
+       ret := map[string]float64{}
        format := StepFormats[duration.Step]
        startTime, err := time.Parse(format, duration.Start)
 
@@ -38,10 +53,10 @@ func MetricsToMap(duration schema.Duration, intValues 
schema.IntValues) map[stri
 
        step := StepDuration[duration.Step]
        for idx, value := range kvInts {
-               values[startTime.Add(time.Duration(idx)*step).Format(format)] = 
float64(value.Value)
+               ret[startTime.Add(time.Duration(idx)*step).Format(format)] = 
float64(value.Value)
        }
 
-       return values
+       return ret
 }
 
 // HeatMapToMap converts a HeatMap into a map that uses time as key.
diff --git a/graphql/utils/adapter_test.go b/graphql/utils/adapter_test.go
index ff3b64c..1d8270d 100644
--- a/graphql/utils/adapter_test.go
+++ b/graphql/utils/adapter_test.go
@@ -26,8 +26,8 @@ import (
 
 func TestMetricsToMap(t *testing.T) {
        type args struct {
-               duration  schema.Duration
-               intValues schema.IntValues
+               duration      schema.Duration
+               metricsValues schema.MetricsValues
        }
        tests := []struct {
                name string
@@ -42,16 +42,18 @@ func TestMetricsToMap(t *testing.T) {
                                        End:   "2020-01-01 0007",
                                        Step:  schema.StepMinute,
                                },
-                               intValues: schema.IntValues{
-                                       Values: []*schema.KVInt{
-                                               {Value: 0},
-                                               {Value: 1},
-                                               {Value: 2},
-                                               {Value: 3},
-                                               {Value: 4},
-                                               {Value: 5},
-                                               {Value: 6},
-                                               {Value: 7},
+                               metricsValues: schema.MetricsValues{
+                                       Values: &schema.IntValues{
+                                               Values: []*schema.KVInt{
+                                                       {Value: 0},
+                                                       {Value: 1},
+                                                       {Value: 2},
+                                                       {Value: 3},
+                                                       {Value: 4},
+                                                       {Value: 5},
+                                                       {Value: 6},
+                                                       {Value: 7},
+                                               },
                                        },
                                },
                        },
@@ -69,8 +71,8 @@ func TestMetricsToMap(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       if got := MetricsToMap(tt.args.duration, 
tt.args.intValues); !reflect.DeepEqual(got, tt.want) {
-                               t.Errorf("MetricsToMap() = %v, want %v", got, 
tt.want)
+                       if got := MetricsValuesToMap(tt.args.duration, 
tt.args.metricsValues); !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("MetricsValuesToMap() = %v, want %v", 
got, tt.want)
                        }
                })
        }

Reply via email to