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) } }) }