You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2025/03/24 04:04:36 UTC

(skywalking-cli) branch refactor created (now 77c9792)

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

kezhenxu94 pushed a change to branch refactor
in repository https://gitbox.apache.org/repos/asf/skywalking-cli.git


      at 77c9792  Remove cli module from pkg module

This branch includes the following new commits:

     new 77c9792  Remove cli module from pkg module

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(skywalking-cli) 01/01: Remove cli module from pkg module

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 77c9792b216bcc3c78f34a6f6bacd9cd11f1a7c7
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Mon Mar 24 12:04:24 2025 +0800

    Remove cli module from pkg module
---
 .golangci.yml                                      | 13 +++--
 Makefile                                           |  2 +-
 cmd/swctl/main.go                                  |  9 ++--
 internal/commands/alarm/autopleteKeys.go           |  5 +-
 internal/commands/alarm/autopleteValues.go         |  4 +-
 internal/commands/alarm/list.go                    |  8 +--
 internal/commands/browser/logs/list.go             |  4 +-
 internal/commands/browser/page/list.go             |  5 +-
 internal/commands/browser/service/list.go          |  6 +--
 internal/commands/browser/version/list.go          |  5 +-
 internal/commands/dashboard/global/global.go       | 15 ++++--
 internal/commands/dashboard/global/metrics.go      | 20 +++++---
 internal/commands/dependency/endpoint.go           |  5 +-
 internal/commands/dependency/global.go             |  8 +--
 internal/commands/dependency/instance.go           |  5 +-
 internal/commands/dependency/process.go            |  4 +-
 internal/commands/dependency/service.go            |  5 +-
 internal/commands/endpoint/get.go                  |  4 +-
 internal/commands/endpoint/list.go                 |  4 +-
 internal/commands/event/list.go                    | 11 ++--
 internal/commands/event/report.go                  |  2 +-
 internal/commands/healthcheck/healthcheck.go       |  3 +-
 internal/commands/hierarchy/instance.go            |  4 +-
 internal/commands/hierarchy/layers.go              |  4 +-
 internal/commands/hierarchy/service.go             |  4 +-
 internal/commands/instance/get.go                  |  4 +-
 internal/commands/instance/list.go                 |  5 +-
 internal/commands/instance/search.go               |  5 +-
 internal/commands/interceptor/duration.go          | 28 +++++++----
 internal/commands/interceptor/interceptor.go       | 17 +++++--
 internal/commands/interceptor/service.go           |  4 +-
 internal/commands/interceptor/timezone.go          |  3 +-
 internal/commands/layer/list.go                    |  4 +-
 internal/commands/logs/list.go                     |  9 ++--
 internal/commands/menu/get.go                      |  4 +-
 internal/commands/metrics/aggregation/metrics.go   |  4 +-
 .../commands/metrics/aggregation/sampled-record.go | 10 ++--
 internal/commands/metrics/aggregation/topn.go      |  4 +-
 internal/commands/metrics/expression/exec.go       |  4 +-
 internal/commands/metrics/linear/linear-metrics.go |  5 +-
 .../metrics/linear/multiple-linear-metrics.go      |  7 ++-
 internal/commands/metrics/list/list-metrics.go     |  5 +-
 .../commands/metrics/single/nullable-metrics.go    |  5 +-
 internal/commands/metrics/single/single-metrics.go |  5 +-
 .../metrics/thermodynamic/thermodynamic.go         |  5 +-
 internal/commands/process/estimate/scale.go        |  5 +-
 internal/commands/process/get.go                   |  4 +-
 internal/commands/process/list.go                  |  4 +-
 .../commands/profiling/asyncprofiler/create.go     |  4 +-
 .../commands/profiling/asyncprofiler/getAnalyze.go |  5 +-
 .../profiling/asyncprofiler/getTaskList.go         |  5 +-
 .../profiling/asyncprofiler/getTaskProgress.go     |  5 +-
 internal/commands/profiling/continuous/list.go     |  4 +-
 .../commands/profiling/continuous/monitoring.go    |  4 +-
 internal/commands/profiling/continuous/set.go      |  4 +-
 internal/commands/profiling/ebpf/analysis.go       |  8 +--
 .../profiling/ebpf/create/createByFixedTime.go     |  5 +-
 internal/commands/profiling/ebpf/create/network.go |  7 ++-
 .../profiling/ebpf/create/prepareCreate.go         |  4 +-
 internal/commands/profiling/ebpf/keep/network.go   |  4 +-
 internal/commands/profiling/ebpf/list.go           |  6 ++-
 internal/commands/profiling/ebpf/schedules.go      |  4 +-
 internal/commands/profiling/trace/create.go        |  5 +-
 .../commands/profiling/trace/getProfileAnalyze.go  |  9 ++--
 internal/commands/profiling/trace/getTaskList.go   |  5 +-
 internal/commands/profiling/trace/getTaskLogs.go   |  5 +-
 .../commands/profiling/trace/getTaskSegmentList.go |  5 +-
 internal/commands/service/layer.go                 |  4 +-
 internal/commands/service/list.go                  |  6 +--
 internal/commands/trace/list.go                    |  9 ++--
 internal/commands/trace/trace.go                   |  5 +-
 internal/display/display.go                        | 58 ++++++++++++++++++++++
 {pkg => internal}/util/commandNotFound.go          |  0
 {pkg => internal}/util/commandNotFound_test.go     |  0
 pkg/contextkey/contextkey.go                       | 21 ++++++++
 pkg/display/display.go                             | 44 ++--------------
 pkg/display/graph/dashboard/global.go              | 45 +++++++++--------
 pkg/display/graph/flamegraph/adapter.go            |  4 +-
 pkg/display/graph/flamegraph/flamegraph.go         | 16 +++---
 pkg/display/graph/gauge/gauge.go                   | 12 ++---
 pkg/display/graph/graph.go                         |  5 +-
 pkg/display/graph/linear/linear.go                 | 12 ++---
 pkg/display/graph/tree/list.go                     | 35 +++++++------
 pkg/graphql/alarm/alarm.go                         | 10 ++--
 pkg/graphql/client/client.go                       | 17 +++----
 pkg/graphql/common/common.go                       |  6 +--
 pkg/graphql/dashboard/global.go                    | 30 +++++------
 pkg/graphql/dependency/dependency.go               | 15 +++---
 pkg/graphql/event/event.go                         |  6 +--
 pkg/graphql/healthcheck/healthcheck.go             |  5 +-
 pkg/graphql/hierarchy/hierarchy.go                 | 10 ++--
 pkg/graphql/log/log.go                             |  8 +--
 pkg/graphql/menu/menu.go                           |  6 +--
 pkg/graphql/metadata/metadata.go                   | 42 ++++++++--------
 pkg/graphql/metrics/metrics.go                     | 28 +++++++----
 pkg/graphql/profiling/asyncprofiler.go             | 11 ++--
 pkg/graphql/profiling/continuous.go                | 13 ++---
 pkg/graphql/profiling/ebpf.go                      | 26 ++++++----
 pkg/graphql/profiling/trace.go                     | 14 +++---
 pkg/graphql/trace/trace.go                         |  7 +--
 pkg/heatmap/heatmap.go                             |  2 +-
 101 files changed, 507 insertions(+), 432 deletions(-)

diff --git a/.golangci.yml b/.golangci.yml
index 82a287f..93a77e9 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -46,6 +46,13 @@ linters-settings:
   whitespace:
     multi-if: false
     multi-func: false
+  depguard:
+    rules:
+      prevent_cli_in_pkg:
+        files: ["**/pkg/**/*.go"]
+        deny:
+          - pkg: "github.com/urfave/cli/v2"
+            desc: "github.com/urfave/cli/v2 is not allowed in pkg module"
 
 linters:
   enable:
@@ -74,8 +81,4 @@ linters:
     - unparam
     - unused
     - whitespace
-
-service:
-  golangci-lint-version: 1.20.x
-  prepare:
-    - echo "here I can run custom commands, but no preparation needed for this repo"
+    - depguard
diff --git a/Makefile b/Makefile
index 0cbf198..6c036b0 100644
--- a/Makefile
+++ b/Makefile
@@ -55,7 +55,7 @@ build: $(BUILDS)
 
 .PHONY: deps
 deps:
-	@$(GO_GET) -v -t -d ./...
+	@$(GO_GET) -v -t ./...
 
 $(GO_LINT):
 	@$(GO_LINT) version > /dev/null 2>&1 || go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.0
diff --git a/cmd/swctl/main.go b/cmd/swctl/main.go
index 1023861..1fd6d38 100644
--- a/cmd/swctl/main.go
+++ b/cmd/swctl/main.go
@@ -44,6 +44,7 @@ import (
 	"github.com/apache/skywalking-cli/internal/commands/service"
 	"github.com/apache/skywalking-cli/internal/commands/trace"
 	"github.com/apache/skywalking-cli/internal/logger"
+	intutil "github.com/apache/skywalking-cli/internal/util"
 	"github.com/apache/skywalking-cli/pkg/util"
 
 	"github.com/sirupsen/logrus"
@@ -51,8 +52,10 @@ import (
 	"github.com/urfave/cli/v2/altsrc"
 )
 
-var log *logrus.Logger
-var version string // Will be initialized when building
+var (
+	log     *logrus.Logger
+	version string // Will be initialized when building
+)
 
 func init() {
 	log = logger.Log
@@ -119,7 +122,7 @@ services, service instances, etc.`
 	)
 
 	app.Flags = flags
-	app.CommandNotFound = util.CommandNotFound
+	app.CommandNotFound = intutil.CommandNotFound
 
 	// Enable auto-completion.
 	app.EnableBashCompletion = true
diff --git a/internal/commands/alarm/autopleteKeys.go b/internal/commands/alarm/autopleteKeys.go
index 6a9b081..44f8777 100644
--- a/internal/commands/alarm/autopleteKeys.go
+++ b/internal/commands/alarm/autopleteKeys.go
@@ -57,11 +57,12 @@ $ swctl alarm autocomplete-keys
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		autocompleteKeys, err := alarm.TagAutocompleteKeys(ctx, duration)
+		autocompleteKeys, err := alarm.TagAutocompleteKeys(ctx.Context, duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: autocompleteKeys, Condition: duration})
+		ctx.Lineage()
+		return display.Display(ctx.Context, &displayable.Displayable{Data: autocompleteKeys, Condition: duration})
 	},
 }
diff --git a/internal/commands/alarm/autopleteValues.go b/internal/commands/alarm/autopleteValues.go
index 8876e41..583d0bf 100644
--- a/internal/commands/alarm/autopleteValues.go
+++ b/internal/commands/alarm/autopleteValues.go
@@ -66,11 +66,11 @@ $ swctl alarm autocomplete-values --key=tagKey
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		autocompleteValues, err := alarm.TagAutocompleteValues(ctx, duration, tagKey)
+		autocompleteValues, err := alarm.TagAutocompleteValues(ctx.Context, duration, tagKey)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: autocompleteValues, Condition: tagKey})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: autocompleteValues, Condition: tagKey})
 	},
 }
diff --git a/internal/commands/alarm/list.go b/internal/commands/alarm/list.go
index 7137bff..03682b7 100644
--- a/internal/commands/alarm/list.go
+++ b/internal/commands/alarm/list.go
@@ -89,8 +89,8 @@ $ swctl alarm list
 
 		var tags []*api.AlarmTag
 		if tagStr != "" {
-			tagArr := strings.Split(tagStr, ",")
-			for _, tag := range tagArr {
+			tagArr := strings.SplitSeq(tagStr, ",")
+			for tag := range tagArr {
 				kv := strings.SplitN(tag, "=", 2)
 				if len(kv) != 2 {
 					return fmt.Errorf("invalid tag, cannot be splitted into 2 parts. %s", tag)
@@ -112,11 +112,11 @@ $ swctl alarm list
 			Tags:     tags,
 			Paging:   &paging,
 		}
-		alarms, err := alarm.Alarms(ctx, condition)
+		alarms, err := alarm.Alarms(ctx.Context, condition)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: alarms, Condition: condition})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: alarms, Condition: condition})
 	},
 }
diff --git a/internal/commands/browser/logs/list.go b/internal/commands/browser/logs/list.go
index c1adbce..9989b9a 100644
--- a/internal/commands/browser/logs/list.go
+++ b/internal/commands/browser/logs/list.go
@@ -80,11 +80,11 @@ $ swctl browser logs list`,
 			Paging:           &paging,
 		}
 
-		logs, err := log.BrowserLogs(ctx, condition)
+		logs, err := log.BrowserLogs(ctx.Context, condition)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: logs, Condition: condition})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: logs, Condition: condition})
 	},
 }
diff --git a/internal/commands/browser/page/list.go b/internal/commands/browser/page/list.go
index 757f400..f7c5877 100644
--- a/internal/commands/browser/page/list.go
+++ b/internal/commands/browser/page/list.go
@@ -58,12 +58,11 @@ $ swctl browser page ls --service-id dGVzdC11aQ==.1`,
 		serviceID := ctx.String("service-id")
 		limit := ctx.Int("limit")
 
-		endpoints, err := metadata.SearchEndpoints(ctx, serviceID, "", limit, nil)
-
+		endpoints, err := metadata.SearchEndpoints(ctx.Context, serviceID, "", limit, nil)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: endpoints})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: endpoints})
 	},
 }
diff --git a/internal/commands/browser/service/list.go b/internal/commands/browser/service/list.go
index 6fe2e38..d676c36 100644
--- a/internal/commands/browser/service/list.go
+++ b/internal/commands/browser/service/list.go
@@ -56,7 +56,7 @@ $ swctl browser svc ls test-ui`,
 		var err error
 
 		if args := ctx.Args(); args.Len() == 0 {
-			services, err = metadata.AllBrowserServices(ctx, api.Duration{
+			services, err = metadata.AllBrowserServices(ctx.Context, api.Duration{
 				Start: start,
 				End:   end,
 				Step:  step.(*model.StepEnumValue).Selected,
@@ -65,13 +65,13 @@ $ swctl browser svc ls test-ui`,
 				return err
 			}
 		} else {
-			service, err := metadata.SearchBrowserService(ctx, args.First())
+			service, err := metadata.SearchBrowserService(ctx.Context, args.First())
 			if err != nil {
 				return err
 			}
 			services = []api.Service{service}
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: services})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: services})
 	},
 }
diff --git a/internal/commands/browser/version/list.go b/internal/commands/browser/version/list.go
index 9fb0978..aa47ae0 100644
--- a/internal/commands/browser/version/list.go
+++ b/internal/commands/browser/version/list.go
@@ -56,16 +56,15 @@ $ swctl browser version ls --service-id dGVzdC11aQ==.1`,
 		step := ctx.Generic("step")
 		serviceID := ctx.String("service-id")
 
-		instances, err := metadata.Instances(ctx, serviceID, api.Duration{
+		instances, err := metadata.Instances(ctx.Context, serviceID, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		})
-
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: instances})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: instances})
 	},
 }
diff --git a/internal/commands/dashboard/global/global.go b/internal/commands/dashboard/global/global.go
index 2bfaf0d..4e941d0 100644
--- a/internal/commands/dashboard/global/global.go
+++ b/internal/commands/dashboard/global/global.go
@@ -18,6 +18,8 @@
 package global
 
 import (
+	"context"
+
 	"github.com/urfave/cli/v2"
 
 	api "skywalking.apache.org/repo/goapi/query"
@@ -25,6 +27,7 @@ import (
 	"github.com/apache/skywalking-cli/internal/commands/interceptor"
 	"github.com/apache/skywalking-cli/internal/flags"
 	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 	"github.com/apache/skywalking-cli/pkg/display"
 	"github.com/apache/skywalking-cli/pkg/display/displayable"
 	"github.com/apache/skywalking-cli/pkg/graphql/dashboard"
@@ -62,22 +65,28 @@ $ swctl dashboard global --template my-global-template.yml
 	),
 	Before: interceptor.BeforeChain(
 		interceptor.DurationInterceptor,
+		func(cliCtx *cli.Context) error {
+			ctx := cliCtx.Context
+			ctx = context.WithValue(ctx, contextkey.DashboardTemplate{}, cliCtx.String("template"))
+			ctx = context.WithValue(ctx, contextkey.DashboardRefreshInterval{}, cliCtx.Int("refresh"))
+			cliCtx.Context = ctx
+			return nil
+		},
 	),
 	Action: func(ctx *cli.Context) error {
 		end := ctx.String("end")
 		start := ctx.String("start")
 		step := ctx.Generic("step")
 
-		globalData, err := dashboard.Global(ctx, api.Duration{
+		globalData, err := dashboard.Global(ctx.Context, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		})
-
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: globalData})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: globalData})
 	},
 }
diff --git a/internal/commands/dashboard/global/metrics.go b/internal/commands/dashboard/global/metrics.go
index 37c9a9a..7653c54 100644
--- a/internal/commands/dashboard/global/metrics.go
+++ b/internal/commands/dashboard/global/metrics.go
@@ -18,11 +18,14 @@
 package global
 
 import (
+	"context"
+
 	"github.com/urfave/cli/v2"
 
 	"github.com/apache/skywalking-cli/internal/commands/interceptor"
 	"github.com/apache/skywalking-cli/internal/flags"
 	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 	"github.com/apache/skywalking-cli/pkg/display"
 	"github.com/apache/skywalking-cli/pkg/display/displayable"
 	"github.com/apache/skywalking-cli/pkg/graphql/dashboard"
@@ -47,21 +50,24 @@ var Metrics = &cli.Command{
 	Before: interceptor.BeforeChain(
 		interceptor.DurationInterceptor,
 	),
-	Action: func(ctx *cli.Context) error {
-		end := ctx.String("end")
-		start := ctx.String("start")
-		step := ctx.Generic("step")
+	Action: func(cliCtx *cli.Context) error {
+		end := cliCtx.String("end")
+		start := cliCtx.String("start")
+		step := cliCtx.Generic("step")
+
+		ctx := cliCtx.Context
+		ctx = context.WithValue(ctx, contextkey.DashboardTemplate{}, cliCtx.String("template"))
+		cliCtx.Context = ctx
 
-		globalMetrics, err := dashboard.Metrics(ctx, api.Duration{
+		globalMetrics, err := dashboard.Metrics(cliCtx.Context, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		})
-
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: globalMetrics})
+		return display.Display(cliCtx.Context, &displayable.Displayable{Data: globalMetrics})
 	},
 }
diff --git a/internal/commands/dependency/endpoint.go b/internal/commands/dependency/endpoint.go
index 8901028..9203996 100644
--- a/internal/commands/dependency/endpoint.go
+++ b/internal/commands/dependency/endpoint.go
@@ -57,12 +57,11 @@ var EndpointCommand = &cli.Command{
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		dependency, err := dependency.EndpointDependency(ctx, endpointID, duration)
-
+		dependency, err := dependency.EndpointDependency(ctx.Context, endpointID, duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: dependency})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: dependency})
 	},
 }
diff --git a/internal/commands/dependency/global.go b/internal/commands/dependency/global.go
index c0ad798..ae1d240 100644
--- a/internal/commands/dependency/global.go
+++ b/internal/commands/dependency/global.go
@@ -62,25 +62,25 @@ var GlobalCommand = &cli.Command{
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		major, _, err := metadata.BackendVersion(ctx)
+		major, _, err := metadata.BackendVersion(ctx.Context)
 		if err != nil {
 			return err
 		}
 
 		var topology api.Topology
 		if major >= 10 {
-			topology, err = dependency.GlobalTopology(ctx, layer, duration)
+			topology, err = dependency.GlobalTopology(ctx.Context, layer, duration)
 		} else {
 			if layer != "" {
 				return fmt.Errorf("the layer parameter only available when OAP version >= 10.0.0")
 			}
-			topology, err = dependency.GlobalTopologyWithoutLayer(ctx, duration)
+			topology, err = dependency.GlobalTopologyWithoutLayer(ctx.Context, duration)
 		}
 
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: topology})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: topology})
 	},
 }
diff --git a/internal/commands/dependency/instance.go b/internal/commands/dependency/instance.go
index c272601..f17d1e9 100644
--- a/internal/commands/dependency/instance.go
+++ b/internal/commands/dependency/instance.go
@@ -59,12 +59,11 @@ var InstanceCommand = &cli.Command{
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		dependency, err := dependency.InstanceTopology(ctx, srcSvcID, dstSvcID, duration)
-
+		dependency, err := dependency.InstanceTopology(ctx.Context, srcSvcID, dstSvcID, duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: dependency})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: dependency})
 	},
 }
diff --git a/internal/commands/dependency/process.go b/internal/commands/dependency/process.go
index 8a89679..fc2a21e 100644
--- a/internal/commands/dependency/process.go
+++ b/internal/commands/dependency/process.go
@@ -57,11 +57,11 @@ var ProcessCommand = &cli.Command{
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		dependency, err := dependency.ProcessTopology(ctx, instanceID, duration)
+		dependency, err := dependency.ProcessTopology(ctx.Context, instanceID, duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: dependency})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: dependency})
 	},
 }
diff --git a/internal/commands/dependency/service.go b/internal/commands/dependency/service.go
index bf176fd..1823162 100644
--- a/internal/commands/dependency/service.go
+++ b/internal/commands/dependency/service.go
@@ -57,12 +57,11 @@ var ServiceCommand = &cli.Command{
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		dependency, err := dependency.ServiceTopology(ctx, serviceID, duration)
-
+		dependency, err := dependency.ServiceTopology(ctx.Context, serviceID, duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: dependency})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: dependency})
 	},
 }
diff --git a/internal/commands/endpoint/get.go b/internal/commands/endpoint/get.go
index ec6a09c..e14b37c 100644
--- a/internal/commands/endpoint/get.go
+++ b/internal/commands/endpoint/get.go
@@ -40,11 +40,11 @@ $ swctl endpoint get cHJvdmlkZXI=.1_L3VzZXJz`,
 			return fmt.Errorf("endpoint-id must be provide")
 		}
 
-		endpointInfo, err := metadata.GetEndpointInfo(ctx, ctx.Args().First())
+		endpointInfo, err := metadata.GetEndpointInfo(ctx.Context, ctx.Args().First())
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: endpointInfo})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: endpointInfo})
 	},
 }
diff --git a/internal/commands/endpoint/list.go b/internal/commands/endpoint/list.go
index 2249b12..a24344a 100644
--- a/internal/commands/endpoint/list.go
+++ b/internal/commands/endpoint/list.go
@@ -90,11 +90,11 @@ $ swctl endpoint ls --service-name business-zone::projectC --keyword projectC`,
 			}
 		}
 
-		endpoints, err := metadata.SearchEndpoints(ctx, serviceID, keyword, limit, duration)
+		endpoints, err := metadata.SearchEndpoints(ctx.Context, serviceID, keyword, limit, duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: endpoints})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: endpoints})
 	},
 }
diff --git a/internal/commands/event/list.go b/internal/commands/event/list.go
index 63ff72b..c0dd5a5 100644
--- a/internal/commands/event/list.go
+++ b/internal/commands/event/list.go
@@ -33,8 +33,10 @@ import (
 	"github.com/urfave/cli/v2"
 )
 
-const DefaultPageSize = 15
-const EventTypeAll event.Type = -1
+const (
+	DefaultPageSize            = 15
+	EventTypeAll    event.Type = -1
+)
 
 func init() {
 	event.Type_name[-1] = "All"
@@ -122,12 +124,11 @@ $ swctl event list
 			condition.Type = &t
 		}
 
-		events, err := eventQl.Events(ctx, condition)
-
+		events, err := eventQl.Events(ctx.Context, condition)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: events, Condition: condition})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: events, Condition: condition})
 	},
 }
diff --git a/internal/commands/event/report.go b/internal/commands/event/report.go
index 4c7b193..395d0cf 100644
--- a/internal/commands/event/report.go
+++ b/internal/commands/event/report.go
@@ -112,6 +112,6 @@ one for starting of the event (--start-time is required) and the other one for e
 		}
 
 		logger.Log.Printf("Report the event successfully, whose uuid is %s\n", ctx.String("uuid"))
-		return display.Display(ctx, &displayable.Displayable{Data: reply})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: reply})
 	},
 }
diff --git a/internal/commands/healthcheck/healthcheck.go b/internal/commands/healthcheck/healthcheck.go
index b4cb9e2..f67efc1 100644
--- a/internal/commands/healthcheck/healthcheck.go
+++ b/internal/commands/healthcheck/healthcheck.go
@@ -59,8 +59,7 @@ $ swctl health --grpc=false
 		},
 	},
 	Action: func(ctx *cli.Context) error {
-		healthStatus, err := hc.CheckHealth(ctx)
-
+		healthStatus, err := hc.CheckHealth(ctx.Context)
 		if err != nil {
 			return err
 		}
diff --git a/internal/commands/hierarchy/instance.go b/internal/commands/hierarchy/instance.go
index 7ff865f..6d49c01 100644
--- a/internal/commands/hierarchy/instance.go
+++ b/internal/commands/hierarchy/instance.go
@@ -49,10 +49,10 @@ var instanceCommand = &cli.Command{
 		instanceID := ctx.String("instance-id")
 		layer := ctx.String("layer")
 
-		hierarchy, err := hierarchy.InstanceHierarchy(ctx, instanceID, layer)
+		hierarchy, err := hierarchy.InstanceHierarchy(ctx.Context, instanceID, layer)
 		if err != nil {
 			return err
 		}
-		return display.Display(ctx, &displayable.Displayable{Data: hierarchy, Condition: instanceID})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: hierarchy, Condition: instanceID})
 	},
 }
diff --git a/internal/commands/hierarchy/layers.go b/internal/commands/hierarchy/layers.go
index ffbdb20..5f734c8 100644
--- a/internal/commands/hierarchy/layers.go
+++ b/internal/commands/hierarchy/layers.go
@@ -34,10 +34,10 @@ var layerCommand = &cli.Command{
 	Flags:   flags.Flags(),
 	Before:  interceptor.BeforeChain(),
 	Action: func(ctx *cli.Context) error {
-		levels, err := hierarchy.ListLayerLevels(ctx)
+		levels, err := hierarchy.ListLayerLevels(ctx.Context)
 		if err != nil {
 			return err
 		}
-		return display.Display(ctx, &displayable.Displayable{Data: levels})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: levels})
 	},
 }
diff --git a/internal/commands/hierarchy/service.go b/internal/commands/hierarchy/service.go
index 8d8beb7..aaccfe4 100644
--- a/internal/commands/hierarchy/service.go
+++ b/internal/commands/hierarchy/service.go
@@ -48,10 +48,10 @@ var serviceCommand = &cli.Command{
 		serviceID := ctx.String("service-id")
 		layer := ctx.String("layer")
 
-		hierarchy, err := hierarchy.ServiceHierarchy(ctx, serviceID, layer)
+		hierarchy, err := hierarchy.ServiceHierarchy(ctx.Context, serviceID, layer)
 		if err != nil {
 			return err
 		}
-		return display.Display(ctx, &displayable.Displayable{Data: hierarchy, Condition: serviceID})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: hierarchy, Condition: serviceID})
 	},
 }
diff --git a/internal/commands/instance/get.go b/internal/commands/instance/get.go
index 766c2c9..c0b57bf 100644
--- a/internal/commands/instance/get.go
+++ b/internal/commands/instance/get.go
@@ -40,11 +40,11 @@ $ swctl instance get cHJvdmlkZXI=.1_cHJvdmlkZXIx`,
 			return fmt.Errorf("instance-id must be provide")
 		}
 
-		instance, err := metadata.GetInstance(ctx, ctx.Args().First())
+		instance, err := metadata.GetInstance(ctx.Context, ctx.Args().First())
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: instance})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: instance})
 	},
 }
diff --git a/internal/commands/instance/list.go b/internal/commands/instance/list.go
index 11ba23b..13f304e 100644
--- a/internal/commands/instance/list.go
+++ b/internal/commands/instance/list.go
@@ -56,16 +56,15 @@ $ swctl instance ls --service-id YnVzaW5lc3Mtem9uZTo6cHJvamVjdEM=.1`,
 		step := ctx.Generic("step")
 		serviceID := ctx.String("service-id")
 
-		instances, err := metadata.Instances(ctx, serviceID, api.Duration{
+		instances, err := metadata.Instances(ctx.Context, serviceID, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		})
-
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: instances})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: instances})
 	},
 }
diff --git a/internal/commands/instance/search.go b/internal/commands/instance/search.go
index a7bee0f..3064021 100644
--- a/internal/commands/instance/search.go
+++ b/internal/commands/instance/search.go
@@ -51,12 +51,11 @@ var SearchCommand = &cli.Command{
 		step := ctx.Generic("step")
 		regex := ctx.String("regex")
 
-		instances, err := metadata.Instances(ctx, serviceID, api.Duration{
+		instances, err := metadata.Instances(ctx.Context, serviceID, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		})
-
 		if err != nil {
 			return err
 		}
@@ -69,6 +68,6 @@ var SearchCommand = &cli.Command{
 				}
 			}
 		}
-		return display.Display(ctx, &displayable.Displayable{Data: result})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: result})
 	},
 }
diff --git a/internal/commands/interceptor/duration.go b/internal/commands/interceptor/duration.go
index 5d93c89..0d08f17 100644
--- a/internal/commands/interceptor/duration.go
+++ b/internal/commands/interceptor/duration.go
@@ -18,12 +18,14 @@
 package interceptor
 
 import (
+	"context"
 	"fmt"
 	"strconv"
 	"time"
 
 	api "skywalking.apache.org/repo/goapi/query"
 
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 	"github.com/apache/skywalking-cli/pkg/graphql/utils"
 
 	"github.com/urfave/cli/v2"
@@ -50,11 +52,11 @@ func TryParseTime(unparsed string, userStep api.Step) (api.Step, time.Time, erro
 
 // DurationInterceptor sets the duration if absent, and formats it accordingly,
 // see ParseDuration
-func DurationInterceptor(ctx *cli.Context) error {
-	start := ctx.String("start")
-	end := ctx.String("end")
-	userStep := ctx.Generic("step")
-	if timezone := ctx.String("timezone"); timezone != "" {
+func DurationInterceptor(cliCtx *cli.Context) error {
+	start := cliCtx.String("start")
+	end := cliCtx.String("end")
+	userStep := cliCtx.Generic("step")
+	if timezone := cliCtx.String("timezone"); timezone != "" {
 		if offset, err := strconv.Atoi(timezone); err == nil {
 			// `offset` is in form of "+1300", while `time.FixedZone` takes offset in seconds
 			time.Local = time.FixedZone("", offset/100*60*60)
@@ -68,15 +70,23 @@ func DurationInterceptor(ctx *cli.Context) error {
 
 	startTime, endTime, step, dt := ParseDuration(start, end, s)
 
-	if err := ctx.Set("start", startTime.Format(utils.StepFormats[step])); err != nil {
+	if err := cliCtx.Set("start", startTime.Format(utils.StepFormats[step])); err != nil {
 		return err
-	} else if err := ctx.Set("end", endTime.Format(utils.StepFormats[step])); err != nil {
+	} else if err := cliCtx.Set("end", endTime.Format(utils.StepFormats[step])); err != nil {
 		return err
-	} else if err := ctx.Set("step", step.String()); err != nil {
+	} else if err := cliCtx.Set("step", step.String()); err != nil {
 		return err
-	} else if err := ctx.Set("duration-type", dt.String()); err != nil {
+	} else if err := cliCtx.Set("duration-type", dt.String()); err != nil {
 		return err
 	}
+
+	ctx := cliCtx.Context
+	ctx = context.WithValue(ctx, contextkey.DurationStart{}, startTime.Format(utils.StepFormats[step]))
+	ctx = context.WithValue(ctx, contextkey.DurationEnd{}, endTime.Format(utils.StepFormats[step]))
+	ctx = context.WithValue(ctx, contextkey.DurationStep{}, step)
+	ctx = context.WithValue(ctx, contextkey.DurationType{}, utils.DurationType(dt.String()))
+	cliCtx.Context = ctx
+
 	return nil
 }
 
diff --git a/internal/commands/interceptor/interceptor.go b/internal/commands/interceptor/interceptor.go
index 572d11c..7973b57 100644
--- a/internal/commands/interceptor/interceptor.go
+++ b/internal/commands/interceptor/interceptor.go
@@ -18,18 +18,29 @@
 package interceptor
 
 import (
+	"context"
+
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 	"github.com/urfave/cli/v2"
 )
 
 // BeforeChain is a convenient function to chain up multiple cli.BeforeFunc
 func BeforeChain(beforeFunctions ...cli.BeforeFunc) cli.BeforeFunc {
-	return func(ctx *cli.Context) error {
+	return func(cliCtx *cli.Context) error {
+		ctx := cliCtx.Context
+		ctx = context.WithValue(ctx, contextkey.BaseURL{}, cliCtx.String("base-url"))
+		ctx = context.WithValue(ctx, contextkey.Username{}, cliCtx.String("username"))
+		ctx = context.WithValue(ctx, contextkey.Password{}, cliCtx.String("password"))
+		ctx = context.WithValue(ctx, contextkey.Authorization{}, cliCtx.String("authorization"))
+		ctx = context.WithValue(ctx, contextkey.Display{}, cliCtx.String("display"))
+		cliCtx.Context = ctx
+
 		// --timezone is global option, it should be applied always.
-		if err := TimezoneInterceptor(ctx); err != nil {
+		if err := TimezoneInterceptor(cliCtx); err != nil {
 			return err
 		}
 		for _, beforeFunc := range beforeFunctions {
-			if err := beforeFunc(ctx); err != nil {
+			if err := beforeFunc(cliCtx); err != nil {
 				return err
 			}
 		}
diff --git a/internal/commands/interceptor/service.go b/internal/commands/interceptor/service.go
index 72b5fbf..e770c15 100644
--- a/internal/commands/interceptor/service.go
+++ b/internal/commands/interceptor/service.go
@@ -94,9 +94,9 @@ func parseService(required bool, idFlagName, nameFlagName string, nodeType nodeT
 			var err error
 			switch nodeType {
 			case normal:
-				service, err = metadata.SearchService(ctx, name)
+				service, err = metadata.SearchService(ctx.Context, name)
 			case browser:
-				service, err = metadata.SearchBrowserService(ctx, name)
+				service, err = metadata.SearchBrowserService(ctx.Context, name)
 			}
 			if err != nil {
 				return err
diff --git a/internal/commands/interceptor/timezone.go b/internal/commands/interceptor/timezone.go
index 83fa904..425d8dd 100644
--- a/internal/commands/interceptor/timezone.go
+++ b/internal/commands/interceptor/timezone.go
@@ -35,8 +35,7 @@ func TimezoneInterceptor(ctx *cli.Context) error {
 		return nil
 	}
 
-	serverTimeInfo, err := metadata.ServerTimeInfo(ctx)
-
+	serverTimeInfo, err := metadata.ServerTimeInfo(ctx.Context)
 	if err != nil {
 		logger.Log.Debugf("Failed to get server time info: %v\n", err)
 		return nil
diff --git a/internal/commands/layer/list.go b/internal/commands/layer/list.go
index fb9d500..dee4079 100644
--- a/internal/commands/layer/list.go
+++ b/internal/commands/layer/list.go
@@ -36,11 +36,11 @@ Examples:
 $ swctl layer list
 `,
 	Action: func(ctx *cli.Context) error {
-		layers, err := metadata.ListLayers(ctx)
+		layers, err := metadata.ListLayers(ctx.Context)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: layers})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: layers})
 	},
 }
diff --git a/internal/commands/logs/list.go b/internal/commands/logs/list.go
index 10a33fc..4f6c42c 100644
--- a/internal/commands/logs/list.go
+++ b/internal/commands/logs/list.go
@@ -87,8 +87,8 @@ $ swctl logs list --trace-id 3d56f33f-bcd3-4e40-9e4f-5dc547998ef5`,
 		tagStr := ctx.String("tags")
 		var tags []*api.LogTag = nil
 		if tagStr != "" {
-			tagArr := strings.Split(tagStr, ",")
-			for _, tag := range tagArr {
+			tagArr := strings.SplitSeq(tagStr, ",")
+			for tag := range tagArr {
 				kv := strings.Split(tag, "=")
 				tags = append(tags, &api.LogTag{Key: kv[0], Value: &kv[1]})
 			}
@@ -108,12 +108,11 @@ $ swctl logs list --trace-id 3d56f33f-bcd3-4e40-9e4f-5dc547998ef5`,
 			QueryDuration:     &duration,
 			Paging:            &paging,
 		}
-		logs, err := log.Logs(ctx, condition)
-
+		logs, err := log.Logs(ctx.Context, condition)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: logs, Condition: condition})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: logs, Condition: condition})
 	},
 }
diff --git a/internal/commands/menu/get.go b/internal/commands/menu/get.go
index 151b2b0..c7b9aac 100644
--- a/internal/commands/menu/get.go
+++ b/internal/commands/menu/get.go
@@ -34,10 +34,10 @@ Examples:
 1. Get the UI menu items:
 $swctl menu get`,
 	Action: func(ctx *cli.Context) error {
-		menuItems, err := menu.GetItems(ctx)
+		menuItems, err := menu.GetItems(ctx.Context)
 		if err != nil {
 			return err
 		}
-		return display.Display(ctx, &displayable.Displayable{Data: menuItems})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: menuItems})
 	},
 }
diff --git a/internal/commands/metrics/aggregation/metrics.go b/internal/commands/metrics/aggregation/metrics.go
index 4e1e8d1..6f4c72d 100644
--- a/internal/commands/metrics/aggregation/metrics.go
+++ b/internal/commands/metrics/aggregation/metrics.go
@@ -74,11 +74,11 @@ $ swctl metrics sorted --name service_instance_sla --service-name boutique::adse
 		}
 
 		logger.Log.Debugln(condition.Name, condition.Scope, condition.TopN)
-		metricsValues, err := metrics.SortMetrics(ctx, *condition, *duration)
+		metricsValues, err := metrics.SortMetrics(ctx.Context, *condition, *duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: metricsValues})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: metricsValues})
 	},
 }
diff --git a/internal/commands/metrics/aggregation/sampled-record.go b/internal/commands/metrics/aggregation/sampled-record.go
index 4f26881..16fddae 100644
--- a/internal/commands/metrics/aggregation/sampled-record.go
+++ b/internal/commands/metrics/aggregation/sampled-record.go
@@ -70,7 +70,7 @@ $ swctl metrics sampled-record --name top_n_database_statement 5
 	),
 	Action: func(ctx *cli.Context) error {
 		// read OAP version
-		major, minor, err := metadata.BackendVersion(ctx)
+		major, minor, err := metadata.BackendVersion(ctx.Context)
 		if err != nil {
 			return fmt.Errorf("read backend version failure: %v", err)
 		}
@@ -83,12 +83,12 @@ $ swctl metrics sampled-record --name top_n_database_statement 5
 			}
 			logger.Log.Debugln(condition.Name, condition.TopN)
 
-			records, err1 := metrics.ReadRecords(ctx, *condition, *duration)
+			records, err1 := metrics.ReadRecords(ctx.Context, *condition, *duration)
 			if err1 != nil {
 				return err1
 			}
 
-			return display.Display(ctx, &displayable.Displayable{Data: records})
+			return display.Display(ctx.Context, &displayable.Displayable{Data: records})
 		}
 
 		condition, duration, err := buildSortedCondition(ctx, false)
@@ -97,11 +97,11 @@ $ swctl metrics sampled-record --name top_n_database_statement 5
 		}
 
 		logger.Log.Debugln(condition.Name, condition.Scope, condition.TopN)
-		sampledRecords, err := metrics.SampledRecords(ctx, *condition, *duration)
+		sampledRecords, err := metrics.SampledRecords(ctx.Context, *condition, *duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: sampledRecords})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: sampledRecords})
 	},
 }
diff --git a/internal/commands/metrics/aggregation/topn.go b/internal/commands/metrics/aggregation/topn.go
index 7a537b7..134a31c 100644
--- a/internal/commands/metrics/aggregation/topn.go
+++ b/internal/commands/metrics/aggregation/topn.go
@@ -74,11 +74,11 @@ $ swctl metrics top --name service_instance_sla --service-name boutique::adservi
 		}
 
 		logger.Log.Debugln(condition.Name, condition.Scope, condition.TopN)
-		metricsValues, err := metrics.SortMetrics(ctx, *condition, *duration)
+		metricsValues, err := metrics.SortMetrics(ctx.Context, *condition, *duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: metricsValues})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: metricsValues})
 	},
 }
diff --git a/internal/commands/metrics/expression/exec.go b/internal/commands/metrics/expression/exec.go
index 25c414e..a40724e 100644
--- a/internal/commands/metrics/expression/exec.go
+++ b/internal/commands/metrics/expression/exec.go
@@ -77,11 +77,11 @@ $ swctl metrics execute --expression="service_resp_time" --service-name business
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		result, err := metrics.Execute(ctx, expression, entity, duration)
+		result, err := metrics.Execute(ctx.Context, expression, entity, duration)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: result})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: result})
 	},
 }
diff --git a/internal/commands/metrics/linear/linear-metrics.go b/internal/commands/metrics/linear/linear-metrics.go
index d6c4d9a..359866e 100644
--- a/internal/commands/metrics/linear/linear-metrics.go
+++ b/internal/commands/metrics/linear/linear-metrics.go
@@ -77,15 +77,14 @@ $ swctl metrics linear --name=service_relation_client_cpm --service-name consume
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValues, err := metrics.LinearIntValues(ctx, api.MetricsCondition{
+		metricsValues, err := metrics.LinearIntValues(ctx.Context, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: entity,
 		}, duration)
-
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: utils.MetricsValuesToMap(duration, metricsValues)})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: utils.MetricsValuesToMap(duration, metricsValues)})
 	},
 }
diff --git a/internal/commands/metrics/linear/multiple-linear-metrics.go b/internal/commands/metrics/linear/multiple-linear-metrics.go
index c94c1b8..966af2b 100644
--- a/internal/commands/metrics/linear/multiple-linear-metrics.go
+++ b/internal/commands/metrics/linear/multiple-linear-metrics.go
@@ -93,7 +93,7 @@ $ swctl metrics multiple-linear --name all_percentile --labels=0,1,2,3,4 --relab
 		case labelsString != "" && relabelsString != "" && len(labels) != len(relabels):
 			return fmt.Errorf(`"--labels" and "--relabels" must be in same size if both specified, but was %v != %v`, len(labels), len(relabels))
 		case relabelsString != "":
-			for i := 0; i < len(labels); i++ {
+			for i := range labels {
 				labelMapping[labels[i]] = relabels[i]
 			}
 		}
@@ -113,16 +113,15 @@ $ swctl metrics multiple-linear --name all_percentile --labels=0,1,2,3,4 --relab
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValuesArray, err := metrics.MultipleLinearIntValues(ctx, api.MetricsCondition{
+		metricsValuesArray, err := metrics.MultipleLinearIntValues(ctx.Context, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: entity,
 		}, labels, duration)
-
 		if err != nil {
 			return err
 		}
 
 		reshaped := utils.MetricsValuesArrayToMap(duration, metricsValuesArray, labelMapping)
-		return display.Display(ctx, &displayable.Displayable{Data: reshaped})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: reshaped})
 	},
 }
diff --git a/internal/commands/metrics/list/list-metrics.go b/internal/commands/metrics/list/list-metrics.go
index cdc15e7..7d5e46c 100644
--- a/internal/commands/metrics/list/list-metrics.go
+++ b/internal/commands/metrics/list/list-metrics.go
@@ -45,12 +45,11 @@ $ swctl metrics list --regex "service_.*"`,
 	Action: func(ctx *cli.Context) error {
 		regex := ctx.String("regex")
 
-		metricsValue, err := metrics.ListMetrics(ctx, regex)
-
+		metricsValue, err := metrics.ListMetrics(ctx.Context, regex)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: metricsValue})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: metricsValue})
 	},
 }
diff --git a/internal/commands/metrics/single/nullable-metrics.go b/internal/commands/metrics/single/nullable-metrics.go
index 58ebd3c..6d74ef3 100644
--- a/internal/commands/metrics/single/nullable-metrics.go
+++ b/internal/commands/metrics/single/nullable-metrics.go
@@ -71,15 +71,14 @@ $ swctl metrics nullable --name endpoint_cpm --service-name business-zone::proje
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValue, err := metrics.NullableIntValue(ctx, api.MetricsCondition{
+		metricsValue, err := metrics.NullableIntValue(ctx.Context, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: entity,
 		}, duration)
-
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: metricsValue})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: metricsValue})
 	},
 }
diff --git a/internal/commands/metrics/single/single-metrics.go b/internal/commands/metrics/single/single-metrics.go
index f10dac5..3650cca 100644
--- a/internal/commands/metrics/single/single-metrics.go
+++ b/internal/commands/metrics/single/single-metrics.go
@@ -71,15 +71,14 @@ $ swctl metrics single --name endpoint_cpm --service-name business-zone::project
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValue, err := metrics.IntValues(ctx, api.MetricsCondition{
+		metricsValue, err := metrics.IntValues(ctx.Context, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: entity,
 		}, duration)
-
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: metricsValue})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: metricsValue})
 	},
 }
diff --git a/internal/commands/metrics/thermodynamic/thermodynamic.go b/internal/commands/metrics/thermodynamic/thermodynamic.go
index dbc8303..b01b550 100644
--- a/internal/commands/metrics/thermodynamic/thermodynamic.go
+++ b/internal/commands/metrics/thermodynamic/thermodynamic.go
@@ -70,16 +70,15 @@ $ swctl metrics thermodynamic --scope all --name all_heatmap
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValues, err := metrics.Thermodynamic(ctx, api.MetricsCondition{
+		metricsValues, err := metrics.Thermodynamic(ctx.Context, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: entity,
 		}, duration)
-
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{
+		return display.Display(ctx.Context, &displayable.Displayable{
 			Data:     metricsValues,
 			Duration: duration,
 			Title:    metricsName,
diff --git a/internal/commands/process/estimate/scale.go b/internal/commands/process/estimate/scale.go
index 77d5509..5324741 100644
--- a/internal/commands/process/estimate/scale.go
+++ b/internal/commands/process/estimate/scale.go
@@ -57,12 +57,11 @@ $ swctl process estimate scale --service-name abc --labels t1,t2`,
 			labels = strings.Split(labelString, ",")
 		}
 
-		scale, err := metadata.EstimateProcessScale(ctx, serviceID, labels)
-
+		scale, err := metadata.EstimateProcessScale(ctx.Context, serviceID, labels)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: scale})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: scale})
 	},
 }
diff --git a/internal/commands/process/get.go b/internal/commands/process/get.go
index e7a035a..85e4db3 100644
--- a/internal/commands/process/get.go
+++ b/internal/commands/process/get.go
@@ -40,11 +40,11 @@ $ swctl process get 2b9e46c13c91803695a4364257415e523af7cbf17bf4058e025c16b944a6
 			return fmt.Errorf("process-id must be provided")
 		}
 
-		instance, err := metadata.GetProcess(ctx, ctx.Args().First())
+		instance, err := metadata.GetProcess(ctx.Context, ctx.Args().First())
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: instance})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: instance})
 	},
 }
diff --git a/internal/commands/process/list.go b/internal/commands/process/list.go
index 3fea5e0..866118e 100644
--- a/internal/commands/process/list.go
+++ b/internal/commands/process/list.go
@@ -57,7 +57,7 @@ $ swctl process ls --instance-id cHJvdmlkZXI=.1_cHJvdmlkZXIx`,
 		start := ctx.String("start")
 		step := ctx.Generic("step")
 
-		processes, err := metadata.Processes(ctx, instanceID, api.Duration{
+		processes, err := metadata.Processes(ctx.Context, instanceID, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
@@ -66,6 +66,6 @@ $ swctl process ls --instance-id cHJvdmlkZXI=.1_cHJvdmlkZXIx`,
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: processes})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: processes})
 	},
 }
diff --git a/internal/commands/profiling/asyncprofiler/create.go b/internal/commands/profiling/asyncprofiler/create.go
index 5df4327..0113a7a 100644
--- a/internal/commands/profiling/asyncprofiler/create.go
+++ b/internal/commands/profiling/asyncprofiler/create.go
@@ -85,11 +85,11 @@ $ swctl profiling async create --service-name=service-name --duration=60 --event
 			Events:             eventTypes,
 			ExecArgs:           execArgs,
 		}
-		task, err := profiling.CreateAsyncProfilerTask(ctx, request)
+		task, err := profiling.CreateAsyncProfilerTask(ctx.Context, request)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: task, Condition: request})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: task, Condition: request})
 	},
 }
diff --git a/internal/commands/profiling/asyncprofiler/getAnalyze.go b/internal/commands/profiling/asyncprofiler/getAnalyze.go
index c1b0387..6bd7146 100644
--- a/internal/commands/profiling/asyncprofiler/getAnalyze.go
+++ b/internal/commands/profiling/asyncprofiler/getAnalyze.go
@@ -74,12 +74,11 @@ $ swctl profiling async analysis --service-name=service-name --task-id=task-id \
 			EventType:   eventType,
 		}
 
-		analyze, err := profiling.GetAsyncProfilerAnalyze(ctx, request)
-
+		analyze, err := profiling.GetAsyncProfilerAnalyze(ctx.Context, request)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: analyze, Condition: request})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: analyze, Condition: request})
 	},
 }
diff --git a/internal/commands/profiling/asyncprofiler/getTaskList.go b/internal/commands/profiling/asyncprofiler/getTaskList.go
index 554fac8..157b7ed 100644
--- a/internal/commands/profiling/asyncprofiler/getTaskList.go
+++ b/internal/commands/profiling/asyncprofiler/getTaskList.go
@@ -73,12 +73,11 @@ $ swctl profiling async list --service-name=service-name`,
 			Limit:         limit,
 		}
 
-		tasks, err := profiling.GetAsyncProfilerTaskList(ctx, request)
-
+		tasks, err := profiling.GetAsyncProfilerTaskList(ctx.Context, request)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: tasks, Condition: request})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: tasks, Condition: request})
 	},
 }
diff --git a/internal/commands/profiling/asyncprofiler/getTaskProgress.go b/internal/commands/profiling/asyncprofiler/getTaskProgress.go
index 3943e84..9bfa933 100644
--- a/internal/commands/profiling/asyncprofiler/getTaskProgress.go
+++ b/internal/commands/profiling/asyncprofiler/getTaskProgress.go
@@ -44,12 +44,11 @@ $ swctl profiling async progress --task-id=task-id`,
 	Action: func(ctx *cli.Context) error {
 		taskID := ctx.String("task-id")
 
-		data, err := profiling.GetAsyncProfilerTaskProgress(ctx, taskID)
-
+		data, err := profiling.GetAsyncProfilerTaskProgress(ctx.Context, taskID)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: data, Condition: taskID})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: data, Condition: taskID})
 	},
 }
diff --git a/internal/commands/profiling/continuous/list.go b/internal/commands/profiling/continuous/list.go
index 7790638..cc06ca5 100644
--- a/internal/commands/profiling/continuous/list.go
+++ b/internal/commands/profiling/continuous/list.go
@@ -46,11 +46,11 @@ $ swctl profiling continuous list --service-name=business-zone::projectC
 	Action: func(ctx *cli.Context) error {
 		serviceID := ctx.String("service-id")
 
-		result, err := profiling.QueryContinuousProfilingServiceTargets(ctx, serviceID)
+		result, err := profiling.QueryContinuousProfilingServiceTargets(ctx.Context, serviceID)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: result})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: result})
 	},
 }
diff --git a/internal/commands/profiling/continuous/monitoring.go b/internal/commands/profiling/continuous/monitoring.go
index d8d8126..fc79613 100644
--- a/internal/commands/profiling/continuous/monitoring.go
+++ b/internal/commands/profiling/continuous/monitoring.go
@@ -71,11 +71,11 @@ $ swctl profiling continuous monitoring --service-name=business-zone::projectC -
 			return fmt.Errorf("unknown target type: %s", targetString)
 		}
 
-		instances, err := profiling.QueryContinuousProfilingMonitoringInstances(ctx, serviceID, target)
+		instances, err := profiling.QueryContinuousProfilingMonitoringInstances(ctx.Context, serviceID, target)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: instances})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: instances})
 	},
 }
diff --git a/internal/commands/profiling/continuous/set.go b/internal/commands/profiling/continuous/set.go
index 7299130..f4aff4a 100644
--- a/internal/commands/profiling/continuous/set.go
+++ b/internal/commands/profiling/continuous/set.go
@@ -101,12 +101,12 @@ $ swctl profiling continuous set --service-name=abc --config=/path/to/config.yam
 			Targets:   targets,
 		}
 
-		result, err := profiling.SetContinuousProfilingPolicy(ctx, request)
+		result, err := profiling.SetContinuousProfilingPolicy(ctx.Context, request)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: result, Condition: request})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: result, Condition: request})
 	},
 }
 
diff --git a/internal/commands/profiling/ebpf/analysis.go b/internal/commands/profiling/ebpf/analysis.go
index 6698ff4..d560f88 100644
--- a/internal/commands/profiling/ebpf/analysis.go
+++ b/internal/commands/profiling/ebpf/analysis.go
@@ -72,8 +72,8 @@ $ swctl profiling ebpf analysis --schedule-id=abc --time-ranges=1648020042869-16
 		timeRangeStr := ctx.String("time-ranges")
 		var timeRanges []*api.EBPFProfilingAnalyzeTimeRange = nil
 		if timeRangeStr != "" {
-			tagArr := strings.Split(timeRangeStr, ",")
-			for _, tag := range tagArr {
+			tagArr := strings.SplitSeq(timeRangeStr, ",")
+			for tag := range tagArr {
 				kv := strings.Split(tag, "-")
 				start, err := strconv.ParseInt(kv[0], 10, 64)
 				if err != nil {
@@ -88,11 +88,11 @@ $ swctl profiling ebpf analysis --schedule-id=abc --time-ranges=1648020042869-16
 		}
 
 		aggregateType := ctx.Generic("aggregate").(*ebpf.ProfilingAnalyzeAggregateTypeEnumValue).Selected
-		analyzation, err := profiling.AnalysisEBPFProfilingResult(ctx, scheduleIDList, timeRanges, aggregateType)
+		analyzation, err := profiling.AnalysisEBPFProfilingResult(ctx.Context, scheduleIDList, timeRanges, aggregateType)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: analyzation})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: analyzation})
 	},
 }
diff --git a/internal/commands/profiling/ebpf/create/createByFixedTime.go b/internal/commands/profiling/ebpf/create/createByFixedTime.go
index 436719c..9b7c348 100644
--- a/internal/commands/profiling/ebpf/create/createByFixedTime.go
+++ b/internal/commands/profiling/ebpf/create/createByFixedTime.go
@@ -89,12 +89,11 @@ $ swctl profiling ebpf fixed --service-id=abc --process-id=abc --duration=1m --t
 			TargetType:    ctx.Generic("target-type").(*ebpf.ProfilingTargetTypeEnumValue).Selected,
 		}
 
-		task, err := profiling.CreateEBPFProfilingFixedTimeTask(ctx, request)
-
+		task, err := profiling.CreateEBPFProfilingFixedTimeTask(ctx.Context, request)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: task, Condition: request})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: task, Condition: request})
 	},
 }
diff --git a/internal/commands/profiling/ebpf/create/network.go b/internal/commands/profiling/ebpf/create/network.go
index b30c86b..541c7cf 100644
--- a/internal/commands/profiling/ebpf/create/network.go
+++ b/internal/commands/profiling/ebpf/create/network.go
@@ -82,7 +82,7 @@ $ swctl profiling ebpf create network --service-instance-id=abc`,
 		samplingConfigFile := ctx.String("sampling-config")
 
 		// convert the sampling rule
-		var samplings = make([]*api.EBPFNetworkSamplingRule, 0)
+		samplings := make([]*api.EBPFNetworkSamplingRule, 0)
 		if samplingConfigFile != "" {
 			config, err := os.ReadFile(samplingConfigFile)
 			if err != nil {
@@ -104,13 +104,12 @@ $ swctl profiling ebpf create network --service-instance-id=abc`,
 			Samplings:  samplings,
 		}
 
-		task, err := profiling.CreateEBPFNetworkProfilingTask(ctx, request)
-
+		task, err := profiling.CreateEBPFNetworkProfilingTask(ctx.Context, request)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: task, Condition: request})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: task, Condition: request})
 	},
 }
 
diff --git a/internal/commands/profiling/ebpf/create/prepareCreate.go b/internal/commands/profiling/ebpf/create/prepareCreate.go
index f8067f4..d5342d2 100644
--- a/internal/commands/profiling/ebpf/create/prepareCreate.go
+++ b/internal/commands/profiling/ebpf/create/prepareCreate.go
@@ -45,11 +45,11 @@ $ swctl profiling ebpf create prepare --service-id=abc`,
 	Action: func(ctx *cli.Context) error {
 		serviceID := ctx.String("service-id")
 
-		prepare, err := profiling.QueryPrepareCreateEBPFProfilingTaskData(ctx, serviceID)
+		prepare, err := profiling.QueryPrepareCreateEBPFProfilingTaskData(ctx.Context, serviceID)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: prepare, Condition: serviceID})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: prepare, Condition: serviceID})
 	},
 }
diff --git a/internal/commands/profiling/ebpf/keep/network.go b/internal/commands/profiling/ebpf/keep/network.go
index 8d86f6d..7225e44 100644
--- a/internal/commands/profiling/ebpf/keep/network.go
+++ b/internal/commands/profiling/ebpf/keep/network.go
@@ -47,11 +47,11 @@ $ swctl profiling ebpf keep network --task-id=abc`,
 	Action: func(ctx *cli.Context) error {
 		taskID := ctx.String("task-id")
 
-		keepResult, err := profiling.KeepNetworkProfilingTask(ctx, taskID)
+		keepResult, err := profiling.KeepNetworkProfilingTask(ctx.Context, taskID)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: keepResult})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: keepResult})
 	},
 }
diff --git a/internal/commands/profiling/ebpf/list.go b/internal/commands/profiling/ebpf/list.go
index 35dcd4f..429e7a7 100644
--- a/internal/commands/profiling/ebpf/list.go
+++ b/internal/commands/profiling/ebpf/list.go
@@ -60,11 +60,13 @@ $ swctl profiling ebpf list --service-name=service-name
 	Action: func(ctx *cli.Context) error {
 		serviceID := ctx.String("service-id")
 
-		processes, err := profiling.QueryEBPFProfilingTaskList(ctx, serviceID, ctx.Generic("trigger").(*ebpf.ProfilingTriggerTypeEnumValue).Selected)
+		processes, err := profiling.QueryEBPFProfilingTaskList(
+			ctx.Context, serviceID,
+			ctx.Generic("trigger").(*ebpf.ProfilingTriggerTypeEnumValue).Selected)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: processes})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: processes})
 	},
 }
diff --git a/internal/commands/profiling/ebpf/schedules.go b/internal/commands/profiling/ebpf/schedules.go
index 976b3bc..7b6fa87 100644
--- a/internal/commands/profiling/ebpf/schedules.go
+++ b/internal/commands/profiling/ebpf/schedules.go
@@ -48,11 +48,11 @@ $ swctl profiling ebpf schedules --task-id=abc
 	Action: func(ctx *cli.Context) error {
 		taskID := ctx.String("task-id")
 
-		schedules, err := profiling.QueryEBPFProfilingScheduleList(ctx, taskID)
+		schedules, err := profiling.QueryEBPFProfilingScheduleList(ctx.Context, taskID)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: schedules})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: schedules})
 	},
 }
diff --git a/internal/commands/profiling/trace/create.go b/internal/commands/profiling/trace/create.go
index 75ec402..9466392 100644
--- a/internal/commands/profiling/trace/create.go
+++ b/internal/commands/profiling/trace/create.go
@@ -81,12 +81,11 @@ $ swctl profiling trace create --service-name=service-name --endpoint=endpoint -
 			MaxSamplingCount:     ctx.Int("max-sampling-count"),
 		}
 
-		task, err := profiling.CreateTraceTask(ctx, request)
-
+		task, err := profiling.CreateTraceTask(ctx.Context, request)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: task, Condition: request})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: task, Condition: request})
 	},
 }
diff --git a/internal/commands/profiling/trace/getProfileAnalyze.go b/internal/commands/profiling/trace/getProfileAnalyze.go
index 676e59e..24b7411 100644
--- a/internal/commands/profiling/trace/getProfileAnalyze.go
+++ b/internal/commands/profiling/trace/getProfileAnalyze.go
@@ -52,8 +52,8 @@ var getProfiledAnalyzeCommand = &cli.Command{
 		tagStr := ctx.String("time-ranges")
 		var queries []*api.SegmentProfileAnalyzeQuery = nil
 		if tagStr != "" {
-			tagArr := strings.Split(tagStr, ",")
-			for _, tag := range tagArr {
+			tagArr := strings.SplitSeq(tagStr, ",")
+			for tag := range tagArr {
 				kv := strings.Split(tag, "-")
 				start, err := strconv.ParseInt(kv[0], 10, 64)
 				if err != nil {
@@ -76,12 +76,11 @@ var getProfiledAnalyzeCommand = &cli.Command{
 			}
 		}
 
-		analysis, err := profiling.GetTraceProfilingAnalyze(ctx, queries)
-
+		analysis, err := profiling.GetTraceProfilingAnalyze(ctx.Context, queries)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: analysis, Condition: segmentIDs})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: analysis, Condition: segmentIDs})
 	},
 }
diff --git a/internal/commands/profiling/trace/getTaskList.go b/internal/commands/profiling/trace/getTaskList.go
index 840be06..9235a06 100644
--- a/internal/commands/profiling/trace/getTaskList.go
+++ b/internal/commands/profiling/trace/getTaskList.go
@@ -49,12 +49,11 @@ $ swctl profiling trace list --service-name=business-zone::projectC --endpoint-n
 		serviceID := ctx.String("service-id")
 		endpoint := ctx.String("endpoint-name")
 
-		task, err := profiling.GetTraceProfilingTaskList(ctx, serviceID, endpoint)
-
+		task, err := profiling.GetTraceProfilingTaskList(ctx.Context, serviceID, endpoint)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: task, Condition: serviceID})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: task, Condition: serviceID})
 	},
 }
diff --git a/internal/commands/profiling/trace/getTaskLogs.go b/internal/commands/profiling/trace/getTaskLogs.go
index 2c23219..8c115b3 100644
--- a/internal/commands/profiling/trace/getTaskLogs.go
+++ b/internal/commands/profiling/trace/getTaskLogs.go
@@ -43,12 +43,11 @@ $ swctl profiling trace logs --task-id=task-id`,
 	Action: func(ctx *cli.Context) error {
 		taskID := ctx.String("task-id")
 
-		task, err := profiling.GetTraceProfilingTaskLogList(ctx, taskID)
-
+		task, err := profiling.GetTraceProfilingTaskLogList(ctx.Context, taskID)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: task, Condition: taskID})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: task, Condition: taskID})
 	},
 }
diff --git a/internal/commands/profiling/trace/getTaskSegmentList.go b/internal/commands/profiling/trace/getTaskSegmentList.go
index 58b78dd..e622eae 100644
--- a/internal/commands/profiling/trace/getTaskSegmentList.go
+++ b/internal/commands/profiling/trace/getTaskSegmentList.go
@@ -42,12 +42,11 @@ $ swctl profiling trace segment-list --service-name=service-name --endpoint-name
 	},
 	Action: func(ctx *cli.Context) error {
 		taskID := ctx.String("task-id")
-		segmentList, err := profiling.GetTraceProfilingTaskSegmentList(ctx, taskID)
-
+		segmentList, err := profiling.GetTraceProfilingTaskSegmentList(ctx.Context, taskID)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: segmentList, Condition: taskID})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: segmentList, Condition: taskID})
 	},
 }
diff --git a/internal/commands/service/layer.go b/internal/commands/service/layer.go
index ec5ce3e..7213d2b 100644
--- a/internal/commands/service/layer.go
+++ b/internal/commands/service/layer.go
@@ -45,11 +45,11 @@ $ swctl svc ly GENERAL`,
 		if args := ctx.Args(); args.Len() == 0 {
 			return fmt.Errorf("layer must be provide")
 		}
-		services, err := metadata.ListLayerService(ctx, ctx.Args().First())
+		services, err := metadata.ListLayerService(ctx.Context, ctx.Args().First())
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: services})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: services})
 	},
 }
diff --git a/internal/commands/service/list.go b/internal/commands/service/list.go
index 516a6a7..4c3caf0 100644
--- a/internal/commands/service/list.go
+++ b/internal/commands/service/list.go
@@ -57,7 +57,7 @@ $ swctl svc ls projectC`,
 		var err error
 
 		if args := ctx.Args(); args.Len() == 0 {
-			services, err = metadata.AllServices(ctx, api.Duration{
+			services, err = metadata.AllServices(ctx.Context, api.Duration{
 				Start: start,
 				End:   end,
 				Step:  step.(*model.StepEnumValue).Selected,
@@ -66,13 +66,13 @@ $ swctl svc ls projectC`,
 				return err
 			}
 		} else {
-			service, err := metadata.SearchService(ctx, args.First())
+			service, err := metadata.SearchService(ctx.Context, args.First())
 			if err != nil {
 				return err
 			}
 			services = []api.Service{service}
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: services})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: services})
 	},
 }
diff --git a/internal/commands/trace/list.go b/internal/commands/trace/list.go
index b480ee7..6160bb2 100644
--- a/internal/commands/trace/list.go
+++ b/internal/commands/trace/list.go
@@ -98,8 +98,8 @@ $ swctl trace ls --trace-id "321661b1-9a31-4e12-ad64-c8f6711f108d"
 		tagStr := ctx.String("tags")
 		var tags []*api.SpanTag = nil
 		if tagStr != "" {
-			tagArr := strings.Split(tagStr, ",")
-			for _, tag := range tagArr {
+			tagArr := strings.SplitSeq(tagStr, ",")
+			for tag := range tagArr {
 				kv := strings.Split(tag, "=")
 				tags = append(tags, &api.SpanTag{Key: kv[0], Value: &kv[1]})
 			}
@@ -134,12 +134,11 @@ $ swctl trace ls --trace-id "321661b1-9a31-4e12-ad64-c8f6711f108d"
 			Tags:              tags,
 			Paging:            &paging,
 		}
-		traces, err := trace.Traces(ctx, condition)
-
+		traces, err := trace.Traces(ctx.Context, condition)
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: traces, Condition: condition})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: traces, Condition: condition})
 	},
 }
diff --git a/internal/commands/trace/trace.go b/internal/commands/trace/trace.go
index a6614c8..f7f31a0 100644
--- a/internal/commands/trace/trace.go
+++ b/internal/commands/trace/trace.go
@@ -44,13 +44,12 @@ $ swctl trace "321661b1-9a31-4e12-ad64-c8f6711f108d"`,
 			return fmt.Errorf("command trace without sub command requires 1 trace id as argument")
 		}
 
-		trace, err := trace.Trace(ctx, ctx.Args().First())
-
+		trace, err := trace.Trace(ctx.Context, ctx.Args().First())
 		if err != nil {
 			return err
 		}
 
-		return display.Display(ctx, &displayable.Displayable{Data: trace})
+		return display.Display(ctx.Context, &displayable.Displayable{Data: trace})
 	},
 	Subcommands: cli.Commands{
 		ListCommand,
diff --git a/internal/display/display.go b/internal/display/display.go
new file mode 100644
index 0000000..6e6e2da
--- /dev/null
+++ b/internal/display/display.go
@@ -0,0 +1,58 @@
+package display
+
+import (
+	"context"
+
+	"github.com/apache/skywalking-cli/pkg/contextkey"
+	"github.com/apache/skywalking-cli/pkg/display"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
+
+	"github.com/urfave/cli/v2"
+)
+
+// The variable style sets the output style for the command.
+var style = map[string]string{
+	"dashboard global":         "graph",
+	"dashboard global-metrics": "graph",
+	"metrics top":              "table",
+	"metrics sorted":           "table",
+	"metrics linear":           "graph",
+	"metrics list":             "table",
+	"service list":             "table",
+	"t":                        "graph",
+	"trace":                    "graph",
+	"ebpf analysis":            "graph",
+	"trace analysis":           "graph",
+}
+
+// Display the object in the style specified in flag --display
+func Display(cliCtx *cli.Context, displayable *d.Displayable) error {
+	displayStyle := cliCtx.String("display")
+	if displayStyle == "" {
+		commandFullName := cliCtx.Command.FullName()
+		if commandFullName != "" {
+			displayStyle = getDisplayStyle(commandFullName)
+		} else {
+			for _, c := range cliCtx.Lineage() {
+				if s := getDisplayStyle(c.Args().First()); s != "" {
+					displayStyle = s
+					break
+				}
+			}
+		}
+	}
+	if displayStyle == "" {
+		displayStyle = "json"
+	}
+	ctx := cliCtx.Context
+	ctx = context.WithValue(ctx, contextkey.Display{}, displayStyle)
+	return display.Display(ctx, displayable)
+}
+
+// getDisplayStyle gets the default display settings.
+func getDisplayStyle(fullName string) string {
+	if command, ok := style[fullName]; ok {
+		return command
+	}
+	return ""
+}
diff --git a/pkg/util/commandNotFound.go b/internal/util/commandNotFound.go
similarity index 100%
rename from pkg/util/commandNotFound.go
rename to internal/util/commandNotFound.go
diff --git a/pkg/util/commandNotFound_test.go b/internal/util/commandNotFound_test.go
similarity index 100%
rename from pkg/util/commandNotFound_test.go
rename to internal/util/commandNotFound_test.go
diff --git a/pkg/contextkey/contextkey.go b/pkg/contextkey/contextkey.go
new file mode 100644
index 0000000..3ad221a
--- /dev/null
+++ b/pkg/contextkey/contextkey.go
@@ -0,0 +1,21 @@
+package contextkey
+
+type (
+	BaseURL       struct{}
+	Username      struct{}
+	Password      struct{}
+	Authorization struct{}
+)
+
+type (
+	DurationStart struct{}
+	DurationEnd   struct{}
+	DurationStep  struct{}
+	DurationType  struct{}
+)
+
+type (
+	Display                  struct{}
+	DashboardTemplate        struct{}
+	DashboardRefreshInterval struct{}
+)
diff --git a/pkg/display/display.go b/pkg/display/display.go
index 6e3f822..8ac7f16 100644
--- a/pkg/display/display.go
+++ b/pkg/display/display.go
@@ -18,16 +18,15 @@
 package display
 
 import (
+	"context"
 	"fmt"
-
 	"strings"
 
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 	d "github.com/apache/skywalking-cli/pkg/display/displayable"
 
 	"github.com/apache/skywalking-cli/pkg/display/graph"
 
-	"github.com/urfave/cli/v2"
-
 	"github.com/apache/skywalking-cli/pkg/display/json"
 	"github.com/apache/skywalking-cli/pkg/display/table"
 	"github.com/apache/skywalking-cli/pkg/display/yaml"
@@ -40,36 +39,9 @@ const (
 	GRAPH = "graph"
 )
 
-// The variable style sets the output style for the command.
-var style = map[string]string{"dashboard global": "graph",
-	"dashboard global-metrics": "graph",
-	"metrics top":              "table",
-	"metrics sorted":           "table",
-	"metrics linear":           "graph",
-	"metrics list":             "table",
-	"service list":             "table",
-	"t":                        "graph",
-	"trace":                    "graph",
-	"ebpf analysis":            "graph",
-	"trace analysis":           "graph",
-}
-
 // Display the object in the style specified in flag --display
-func Display(ctx *cli.Context, displayable *d.Displayable) error {
-	displayStyle := ctx.String("display")
-	if displayStyle == "" {
-		commandFullName := ctx.Command.FullName()
-		if commandFullName != "" {
-			displayStyle = getDisplayStyle(commandFullName)
-		} else {
-			for _, c := range ctx.Lineage() {
-				if s := getDisplayStyle(c.Args().First()); s != "" {
-					displayStyle = s
-					break
-				}
-			}
-		}
-	}
+func Display(ctx context.Context, displayable *d.Displayable) error {
+	displayStyle := ctx.Value(contextkey.Display{}).(string)
 	if displayStyle == "" {
 		displayStyle = "json"
 	}
@@ -86,11 +58,3 @@ func Display(ctx *cli.Context, displayable *d.Displayable) error {
 		return fmt.Errorf("unsupported display style: %s", displayStyle)
 	}
 }
-
-// getDisplayStyle gets the default display settings.
-func getDisplayStyle(fullName string) string {
-	if command, ok := style[fullName]; ok {
-		return command
-	}
-	return ""
-}
diff --git a/pkg/display/graph/dashboard/global.go b/pkg/display/graph/dashboard/global.go
index b7f8682..1a5a10b 100644
--- a/pkg/display/graph/dashboard/global.go
+++ b/pkg/display/graph/dashboard/global.go
@@ -27,6 +27,7 @@ import (
 	api "skywalking.apache.org/repo/goapi/query"
 
 	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 	"github.com/apache/skywalking-cli/pkg/graphql/utils"
 	lib "github.com/apache/skywalking-cli/pkg/heatmap"
 
@@ -36,9 +37,7 @@ import (
 	"github.com/mum4k/termdash/linestyle"
 	"github.com/mum4k/termdash/terminal/termbox"
 	"github.com/mum4k/termdash/terminal/terminalapi"
-	"github.com/urfave/cli/v2"
 
-	"github.com/apache/skywalking-cli/internal/model"
 	"github.com/apache/skywalking-cli/pkg/display/graph/gauge"
 	"github.com/apache/skywalking-cli/pkg/display/graph/heatmap"
 	"github.com/apache/skywalking-cli/pkg/display/graph/linear"
@@ -88,12 +87,16 @@ var template *dashboard.GlobalTemplate
 
 var allWidgets *widgets
 
-var initStartStr string
-var initStep = api.StepMinute
-var initEndStr string
+var (
+	initStartStr string
+	initStep     = api.StepMinute
+	initEndStr   string
+)
 
-var curStartTime time.Time
-var curEndTime time.Time
+var (
+	curStartTime time.Time
+	curEndTime   time.Time
+)
 
 // setLayout sets the specified layout.
 func setLayout(c *container.Container, lt layoutType) error {
@@ -231,7 +234,7 @@ func newWidgets(data *dashboard.GlobalData) error {
 	return nil
 }
 
-func Display(ctx *cli.Context, data *dashboard.GlobalData) error {
+func Display(ctx context.Context, data *dashboard.GlobalData) error {
 	t, err := termbox.New(termbox.ColorMode(terminalapi.ColorMode256))
 	if err != nil {
 		return err
@@ -247,7 +250,7 @@ func Display(ctx *cli.Context, data *dashboard.GlobalData) error {
 		return err
 	}
 
-	te, err := dashboard.LoadTemplate(ctx.String("template"))
+	te, err := dashboard.LoadTemplate(ctx.Value(contextkey.DashboardTemplate{}).(string))
 	if err != nil {
 		return err
 	}
@@ -279,22 +282,23 @@ func Display(ctx *cli.Context, data *dashboard.GlobalData) error {
 		return e
 	}
 
-	con, cancel := context.WithCancel(context.Background())
+	var cancel context.CancelFunc
+	ctx, cancel = context.WithCancel(ctx)
 	quitter := func(keyboard *terminalapi.Keyboard) {
 		if strings.EqualFold(keyboard.Key.String(), "q") {
 			cancel()
 		}
 	}
 
-	refreshInterval := time.Duration(ctx.Int("refresh")) * time.Second
-	dt := utils.DurationType(ctx.String("duration-type"))
+	refreshInterval := time.Duration(ctx.Value(contextkey.DashboardRefreshInterval{}).(int)) * time.Second
+	dt := ctx.Value(contextkey.DurationType{}).(utils.DurationType)
 
 	// Only when users use the relative time, the duration will be adjusted to refresh.
 	if dt != utils.BothPresent {
-		go refresh(con, ctx, refreshInterval)
+		go refresh(ctx, refreshInterval)
 	}
 
-	err = termdash.Run(con, t, c, termdash.KeyboardSubscriber(quitter), termdash.RedrawInterval(refreshInterval))
+	err = termdash.Run(ctx, t, c, termdash.KeyboardSubscriber(quitter), termdash.RedrawInterval(refreshInterval))
 
 	return err
 }
@@ -312,16 +316,13 @@ func longestString(strs []string) (ret string) {
 }
 
 // refresh updates the duration and query the new data to update all of widgets, once every delay.
-func refresh(con context.Context, ctx *cli.Context, interval time.Duration) {
+func refresh(ctx context.Context, interval time.Duration) {
 	ticker := time.NewTicker(interval)
 	defer ticker.Stop()
 
-	initStartStr = ctx.String("start")
-	initEndStr = ctx.String("end")
-
-	if s := ctx.Generic("step"); s != nil {
-		initStep = s.(*model.StepEnumValue).Selected
-	}
+	initStartStr = ctx.Value(contextkey.DurationStart{}).(string)
+	initEndStr = ctx.Value(contextkey.DurationEnd{}).(string)
+	initStep = ctx.Value(contextkey.DurationStep{}).(api.Step)
 
 	_, start, err := interceptor.TryParseTime(initStartStr, initStep)
 	if err != nil {
@@ -351,7 +352,7 @@ func refresh(con context.Context, ctx *cli.Context, interval time.Duration) {
 			if err := updateAllWidgets(data); err != nil {
 				continue
 			}
-		case <-con.Done():
+		case <-ctx.Done():
 			return
 		}
 	}
diff --git a/pkg/display/graph/flamegraph/adapter.go b/pkg/display/graph/flamegraph/adapter.go
index d12cd64..a71c545 100644
--- a/pkg/display/graph/flamegraph/adapter.go
+++ b/pkg/display/graph/flamegraph/adapter.go
@@ -63,11 +63,11 @@ func (e *traceStackElementAdapter) ParentID() string {
 }
 
 func (e *traceStackElementAdapter) DumpCount() int64 {
-	return int64(e.ProfileStackElement.Count)
+	return int64(e.Count)
 }
 
 func (e *traceStackElementAdapter) Symbol() string {
-	return e.ProfileStackElement.CodeSignature
+	return e.CodeSignature
 }
 
 func (e *traceStackElementAdapter) StackType() StackType {
diff --git a/pkg/display/graph/flamegraph/flamegraph.go b/pkg/display/graph/flamegraph/flamegraph.go
index b4afddf..4eb1c8d 100644
--- a/pkg/display/graph/flamegraph/flamegraph.go
+++ b/pkg/display/graph/flamegraph/flamegraph.go
@@ -19,6 +19,7 @@ package flamegraph
 
 import (
 	"bytes"
+	"context"
 	"fmt"
 	"html/template"
 	"os"
@@ -28,11 +29,9 @@ import (
 	"github.com/apache/skywalking-cli/internal/logger"
 
 	api "skywalking.apache.org/repo/goapi/query"
-
-	"github.com/urfave/cli/v2"
 )
 
-func DisplayByTrace(ctx *cli.Context, analysis api.ProfileAnalyzation) error {
+func DisplayByTrace(ctx context.Context, analysis api.ProfileAnalyzation) error {
 	trees := make([]*ProfilingDataTree, 0)
 	for _, tree := range analysis.Trees {
 		elements := make([]ProfilingDataStackElement, 0)
@@ -45,7 +44,7 @@ func DisplayByTrace(ctx *cli.Context, analysis api.ProfileAnalyzation) error {
 	return display(ctx, trees)
 }
 
-func DisplayByEBPF(ctx *cli.Context, analysis *api.EBPFProfilingAnalyzation) error {
+func DisplayByEBPF(ctx context.Context, analysis *api.EBPFProfilingAnalyzation) error {
 	trees := make([]*ProfilingDataTree, 0)
 	for _, tree := range analysis.Trees {
 		elements := make([]ProfilingDataStackElement, 0)
@@ -58,7 +57,7 @@ func DisplayByEBPF(ctx *cli.Context, analysis *api.EBPFProfilingAnalyzation) err
 	return display(ctx, trees)
 }
 
-func display(_ *cli.Context, trees []*ProfilingDataTree) error {
+func display(_ context.Context, trees []*ProfilingDataTree) error {
 	if len(trees) == 0 {
 		return fmt.Errorf("could not find the analysis data")
 	}
@@ -70,7 +69,7 @@ func display(_ *cli.Context, trees []*ProfilingDataTree) error {
 	}
 
 	// build data
-	data := make(map[string]interface{})
+	data := make(map[string]any)
 	elements, maxDepth := buildFlameGraphElements(trees)
 	data["elements"] = elements
 	data["maxDepth"] = maxDepth + 1
@@ -80,7 +79,7 @@ func display(_ *cli.Context, trees []*ProfilingDataTree) error {
 	return renderFlameGraphAndWrite(flameGraphPath, data)
 }
 
-func renderFlameGraphAndWrite(path string, data map[string]interface{}) error {
+func renderFlameGraphAndWrite(path string, data map[string]any) error {
 	// render template
 	var b bytes.Buffer
 	tmpl, err := template.New("flameGraphTemplate").Parse(flameGraphHTML)
@@ -141,7 +140,8 @@ func buildFlameGraphElements(trees []*ProfilingDataTree) (result []*StackElement
 }
 
 func buildFlameGraphChildElements(renderElements []*StackElement, dataElements []ProfilingDataStackElement,
-	parent *StackElement, relativeLeft int64) (result []*StackElement, left int64) {
+	parent *StackElement, relativeLeft int64,
+) (result []*StackElement, left int64) {
 	parentID := "0"
 	var depth int64 = 1
 	left = relativeLeft
diff --git a/pkg/display/graph/gauge/gauge.go b/pkg/display/graph/gauge/gauge.go
index e0ac696..3e91e72 100644
--- a/pkg/display/graph/gauge/gauge.go
+++ b/pkg/display/graph/gauge/gauge.go
@@ -26,8 +26,7 @@ import (
 
 	api "skywalking.apache.org/repo/goapi/query"
 
-	"github.com/urfave/cli/v2"
-
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 	"github.com/apache/skywalking-cli/pkg/graphql/dashboard"
 	"github.com/apache/skywalking-cli/pkg/util"
 
@@ -162,7 +161,7 @@ func MetricColumnsElement(columns []*MetricColumn) []grid.Element {
 		columnWidthPerc = 99
 	}
 
-	for i := 0; i < columnNum; i++ {
+	for i := range columnNum {
 		var column []grid.Element
 		column = append(column, grid.RowHeightPerc(TitleHeight, grid.Widget(columns[i].title)))
 
@@ -171,7 +170,7 @@ func MetricColumnsElement(columns []*MetricColumn) []grid.Element {
 		gaugeNum := int(math.Min(MaxGaugeNum, float64(len(columns[i].gauges))))
 		gaugeHeight := int(math.Floor(float64(99-TitleHeight) / float64(gaugeNum)))
 
-		for j := 0; j < gaugeNum; j++ {
+		for j := range gaugeNum {
 			column = append(column, grid.RowHeightPerc(gaugeHeight, grid.Widget(columns[i].gauges[j])))
 		}
 		metricColumns = append(metricColumns, grid.ColWidthPerc(columnWidthPerc, column...))
@@ -194,7 +193,7 @@ func layout(columns []grid.Element) ([]container.Option, error) {
 	return gridOpts, nil
 }
 
-func Display(ctx *cli.Context, metrics [][]*api.SelectedRecord) error {
+func Display(ctx context.Context, metrics [][]*api.SelectedRecord) error {
 	t, err := termbox.New()
 	if err != nil {
 		return err
@@ -211,7 +210,7 @@ func Display(ctx *cli.Context, metrics [][]*api.SelectedRecord) error {
 
 	var columns []*MetricColumn
 
-	configs, err := dashboard.LoadTemplate(ctx.String("template"))
+	configs, err := dashboard.LoadTemplate(ctx.Value(contextkey.DashboardTemplate{}).(string))
 	if err != nil {
 		return nil
 	}
@@ -234,7 +233,6 @@ func Display(ctx *cli.Context, metrics [][]*api.SelectedRecord) error {
 		container.Border(linestyle.Light),
 		container.BorderTitle("[Global Metrics]-PRESS Q TO QUIT"))...,
 	)
-
 	if err != nil {
 		return err
 	}
diff --git a/pkg/display/graph/graph.go b/pkg/display/graph/graph.go
index 64c850c..09efb47 100644
--- a/pkg/display/graph/graph.go
+++ b/pkg/display/graph/graph.go
@@ -18,6 +18,7 @@
 package graph
 
 import (
+	"context"
 	"fmt"
 	"reflect"
 
@@ -25,8 +26,6 @@ import (
 
 	api "skywalking.apache.org/repo/goapi/query"
 
-	"github.com/urfave/cli/v2"
-
 	d "github.com/apache/skywalking-cli/pkg/display/displayable"
 	db "github.com/apache/skywalking-cli/pkg/display/graph/dashboard"
 	"github.com/apache/skywalking-cli/pkg/display/graph/gauge"
@@ -60,7 +59,7 @@ var (
 	TraceProfilingAnalysisDataType = reflect.TypeOf(TraceProfilingAnalysis{})
 )
 
-func Display(ctx *cli.Context, displayable *d.Displayable) error {
+func Display(ctx context.Context, displayable *d.Displayable) error {
 	data := displayable.Data
 
 	switch reflect.TypeOf(data) {
diff --git a/pkg/display/graph/linear/linear.go b/pkg/display/graph/linear/linear.go
index ce4a29d..78ee639 100644
--- a/pkg/display/graph/linear/linear.go
+++ b/pkg/display/graph/linear/linear.go
@@ -33,8 +33,6 @@ import (
 	"github.com/mum4k/termdash/terminal/termbox"
 	"github.com/mum4k/termdash/terminal/terminalapi"
 	"github.com/mum4k/termdash/widgets/linechart"
-
-	"github.com/urfave/cli/v2"
 )
 
 const RootID = "root"
@@ -95,7 +93,7 @@ func LineChartElements(lineCharts map[string]*linechart.LineChart) [][]grid.Elem
 		charts = append(charts, lineCharts[title])
 	}
 
-	for r := 0; r < len(rows); r++ {
+	for r := range rows {
 		var row []grid.Element
 		for c := 0; c < cols && r*cols+c < len(lineCharts); c++ {
 			percentage := int(math.Floor(float64(100) / float64(cols)))
@@ -133,7 +131,7 @@ func layout(rows [][]grid.Element) ([]container.Option, error) {
 	return builder.Build()
 }
 
-func Display(cliCtx *cli.Context, inputs map[string]map[string]*displayable.MetricValue) error {
+func Display(ctx context.Context, inputs map[string]map[string]*displayable.MetricValue) error {
 	t, err := termbox.New()
 	if err != nil {
 		return err
@@ -166,15 +164,15 @@ func Display(cliCtx *cli.Context, inputs map[string]map[string]*displayable.Metr
 	err = c.Update(RootID, append(
 		gridOpts,
 		container.Border(linestyle.Light),
-		container.BorderTitle(fmt.Sprintf("[%s]-PRESS Q TO QUIT", cliCtx.String("name"))),
+		container.BorderTitle(fmt.Sprintf("[%s]-PRESS Q TO QUIT", ctx.Value("name").(string))),
 		container.BorderTitleAlignLeft())...,
 	)
-
 	if err != nil {
 		return err
 	}
 
-	ctx, cancel := context.WithCancel(context.Background())
+	var cancel context.CancelFunc
+	ctx, cancel = context.WithCancel(ctx)
 	quitter := func(keyboard *terminalapi.Keyboard) {
 		if strings.EqualFold(keyboard.Key.String(), "q") {
 			cancel()
diff --git a/pkg/display/graph/tree/list.go b/pkg/display/graph/tree/list.go
index 84e2060..89cd4c8 100644
--- a/pkg/display/graph/tree/list.go
+++ b/pkg/display/graph/tree/list.go
@@ -18,6 +18,7 @@
 package tree
 
 import (
+	"context"
 	"fmt"
 	"strings"
 
@@ -28,17 +29,18 @@ import (
 
 	ui "github.com/gizak/termui/v3"
 	"github.com/gizak/termui/v3/widgets"
-	"github.com/urfave/cli/v2"
 
 	"github.com/apache/skywalking-cli/internal/logger"
 )
 
-const DefaultPageSize = 15
-const KeyMap = " Keymap "
-const Detail = " Detail "
-const Quit = "<C-c>"
+const (
+	DefaultPageSize = 15
+	KeyMap          = " Keymap "
+	Detail          = " Detail "
+	Quit            = "<C-c>"
+)
 
-func DisplayList(ctx *cli.Context, displayable *d.Displayable) error {
+func DisplayList(ctx context.Context, displayable *d.Displayable) error {
 	data := displayable.Data.(api.TraceBrief)
 	condition := displayable.Condition.(*api.TraceQueryCondition)
 	if err := ui.Init(); err != nil {
@@ -84,19 +86,20 @@ func DisplayList(ctx *cli.Context, displayable *d.Displayable) error {
 	detail.Title = Detail
 	detail.WrapText = false
 
-	draw(list, tree, detail, help, data, ctx, condition)
-	listenTracesKeyboard(list, tree, data, ctx, detail, help, condition)
+	draw(ctx, list, tree, detail, help, data, condition)
+	listenTracesKeyboard(ctx, list, tree, data, detail, help, condition)
 
 	return nil
 }
 
-func draw(list *widgets.List, tree *widgets.Tree, detail, help *widgets.Paragraph, data api.TraceBrief,
-	ctx *cli.Context, _ *api.TraceQueryCondition) {
+func draw(ctx context.Context, list *widgets.List, tree *widgets.Tree, detail, help *widgets.Paragraph, data api.TraceBrief,
+	_ *api.TraceQueryCondition,
+) {
 	x, y := ui.TerminalDimensions()
 
 	if len(data.Traces) != 0 {
 		showIndex := list.SelectedRow
-		var traceID = data.Traces[showIndex].TraceIds[0]
+		traceID := data.Traces[showIndex].TraceIds[0]
 		list.Title = fmt.Sprintf("[%s]", traceID)
 		nodes, serviceNames := getNodeData(ctx, traceID)
 		tree.Title = fmt.Sprintf("[%s]", strings.Join(serviceNames, "->"))
@@ -119,8 +122,9 @@ func draw(list *widgets.List, tree *widgets.Tree, detail, help *widgets.Paragrap
 	ui.Render(list, tree, detail, help)
 }
 
-func listenTracesKeyboard(list *widgets.List, tree *widgets.Tree, data api.TraceBrief, ctx *cli.Context,
-	detail, help *widgets.Paragraph, condition *api.TraceQueryCondition) {
+func listenTracesKeyboard(ctx context.Context, list *widgets.List, tree *widgets.Tree, data api.TraceBrief,
+	detail, help *widgets.Paragraph, condition *api.TraceQueryCondition,
+) {
 	uiEvents := ui.PollEvents()
 	listActive := true
 	var err error
@@ -160,7 +164,7 @@ func listenTracesKeyboard(list *widgets.List, tree *widgets.Tree, data api.Trace
 			}
 		}
 
-		draw(list, tree, detail, help, data, ctx, condition)
+		draw(ctx, list, tree, detail, help, data, condition)
 	}
 }
 
@@ -198,9 +202,8 @@ func listActions(key string, list *widgets.List, tree *widgets.Tree, listActive
 	return f
 }
 
-func getNodeData(ctx *cli.Context, traceID string) (nodes []*widgets.TreeNode, serviceNames []string) {
+func getNodeData(ctx context.Context, traceID string) (nodes []*widgets.TreeNode, serviceNames []string) {
 	data, err := trace.Trace(ctx, traceID)
-
 	if err != nil {
 		logger.Log.Fatalln(err)
 	}
diff --git a/pkg/graphql/alarm/alarm.go b/pkg/graphql/alarm/alarm.go
index 87d6ad3..1e3a93a 100644
--- a/pkg/graphql/alarm/alarm.go
+++ b/pkg/graphql/alarm/alarm.go
@@ -18,13 +18,13 @@
 package alarm
 
 import (
+	"context"
+
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 
 	"github.com/machinebox/graphql"
 
-	"github.com/urfave/cli/v2"
-
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
@@ -36,7 +36,7 @@ type ListAlarmCondition struct {
 	Paging   *api.Pagination
 }
 
-func Alarms(ctx *cli.Context, condition *ListAlarmCondition) (api.Alarms, error) {
+func Alarms(ctx context.Context, condition *ListAlarmCondition) (api.Alarms, error) {
 	var response map[string]api.Alarms
 
 	request := graphql.NewRequest(assets.Read("graphqls/alarm/alarms.graphql"))
@@ -53,7 +53,7 @@ func Alarms(ctx *cli.Context, condition *ListAlarmCondition) (api.Alarms, error)
 	return response["result"], err
 }
 
-func TagAutocompleteKeys(ctx *cli.Context, duration api.Duration) ([]string, error) {
+func TagAutocompleteKeys(ctx context.Context, duration api.Duration) ([]string, error) {
 	var response map[string][]string
 
 	request := graphql.NewRequest(assets.Read("graphqls/alarm/tagAutocompleteKeys.graphql"))
@@ -64,7 +64,7 @@ func TagAutocompleteKeys(ctx *cli.Context, duration api.Duration) ([]string, err
 	return response["result"], err
 }
 
-func TagAutocompleteValues(ctx *cli.Context, duration api.Duration, key string) ([]string, error) {
+func TagAutocompleteValues(ctx context.Context, duration api.Duration, key string) ([]string, error) {
 	var response map[string][]string
 
 	request := graphql.NewRequest(assets.Read("graphqls/alarm/tagAutocompleteValues.graphql"))
diff --git a/pkg/graphql/client/client.go b/pkg/graphql/client/client.go
index f265fbc..40b4947 100644
--- a/pkg/graphql/client/client.go
+++ b/pkg/graphql/client/client.go
@@ -22,13 +22,13 @@ import (
 	"encoding/base64"
 
 	"github.com/machinebox/graphql"
-	"github.com/urfave/cli/v2"
 
 	"github.com/apache/skywalking-cli/internal/logger"
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 )
 
-func newClient(cliCtx *cli.Context) (client *graphql.Client) {
-	client = graphql.NewClient(cliCtx.String("base-url"))
+func newClient(ctx context.Context) (client *graphql.Client) {
+	client = graphql.NewClient(ctx.Value(contextkey.BaseURL{}).(string))
 	client.Log = func(msg string) {
 		logger.Log.Debugln(msg)
 	}
@@ -36,10 +36,10 @@ func newClient(cliCtx *cli.Context) (client *graphql.Client) {
 }
 
 // ExecuteQuery executes the `request` and parse to the `response`, returning `error` if there is any.
-func ExecuteQuery(cliCtx *cli.Context, request *graphql.Request, response interface{}) error {
-	username := cliCtx.String("username")
-	password := cliCtx.String("password")
-	authorization := cliCtx.String("authorization")
+func ExecuteQuery(ctx context.Context, request *graphql.Request, response any) error {
+	username := ctx.Value(contextkey.Username{}).(string)
+	password := ctx.Value(contextkey.Password{}).(string)
+	authorization := ctx.Value(contextkey.Authorization{}).(string)
 	if authorization == "" && username != "" && password != "" {
 		authorization = "Basic " + base64.StdEncoding.EncodeToString([]byte(username+":"+password))
 	}
@@ -47,8 +47,7 @@ func ExecuteQuery(cliCtx *cli.Context, request *graphql.Request, response interf
 		request.Header.Set("Authorization", authorization)
 	}
 
-	client := newClient(cliCtx)
-	ctx := context.Background()
+	client := newClient(ctx)
 	err := client.Run(ctx, request, response)
 	return err
 }
diff --git a/pkg/graphql/common/common.go b/pkg/graphql/common/common.go
index 4a17d19..1cd4606 100644
--- a/pkg/graphql/common/common.go
+++ b/pkg/graphql/common/common.go
@@ -18,15 +18,15 @@
 package common
 
 import (
-	"github.com/machinebox/graphql"
+	"context"
 
-	"github.com/urfave/cli/v2"
+	"github.com/machinebox/graphql"
 
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 )
 
-func Version(ctx *cli.Context) (string, error) {
+func Version(ctx context.Context) (string, error) {
 	var response map[string]string
 
 	request := graphql.NewRequest(assets.Read("graphqls/common/version.graphql"))
diff --git a/pkg/graphql/dashboard/global.go b/pkg/graphql/dashboard/global.go
index 5b5adc5..3c9c1d1 100644
--- a/pkg/graphql/dashboard/global.go
+++ b/pkg/graphql/dashboard/global.go
@@ -19,10 +19,12 @@ package dashboard
 
 import (
 	"bytes"
+	"context"
 	"os"
 	"strings"
 	"sync"
 
+	"github.com/apache/skywalking-cli/pkg/contextkey"
 	"github.com/apache/skywalking-cli/pkg/display/displayable"
 
 	"golang.org/x/text/cases"
@@ -30,7 +32,6 @@ import (
 	api "skywalking.apache.org/repo/goapi/query"
 
 	"github.com/spf13/viper"
-	"github.com/urfave/cli/v2"
 
 	"gopkg.in/yaml.v2"
 
@@ -77,8 +78,10 @@ type GlobalData struct {
 // Use singleton pattern to make sure to load template only once.
 var globalTemplate *GlobalTemplate
 
-const templateType = "yml"
-const DefaultTemplatePath = "templates/dashboard/global.yml"
+const (
+	templateType        = "yml"
+	DefaultTemplatePath = "templates/dashboard/global.yml"
+)
 
 // newGlobalTemplate create a new GlobalTemplate and set default values for buttons' template.
 func newGlobalTemplate() GlobalTemplate {
@@ -131,7 +134,7 @@ func LoadTemplate(filename string) (*GlobalTemplate, error) {
 func getButtonTexts(byteValue []byte) ([]string, error) {
 	var ret []string
 
-	c := make(map[string]interface{})
+	c := make(map[string]any)
 	if err := yaml.Unmarshal(byteValue, &c); err != nil {
 		return nil, err
 	}
@@ -144,10 +147,10 @@ func getButtonTexts(byteValue []byte) ([]string, error) {
 	return ret, nil
 }
 
-func Metrics(ctx *cli.Context, duration api.Duration) ([][]*api.SelectedRecord, error) {
+func Metrics(ctx context.Context, duration api.Duration) ([][]*api.SelectedRecord, error) {
 	var ret [][]*api.SelectedRecord
 
-	template, err := LoadTemplate(ctx.String("template"))
+	template, err := LoadTemplate(ctx.Value(contextkey.DashboardTemplate{}).(string))
 	if err != nil {
 		return nil, nil
 	}
@@ -168,8 +171,8 @@ func Metrics(ctx *cli.Context, duration api.Duration) ([][]*api.SelectedRecord,
 	return ret, nil
 }
 
-func responseLatency(ctx *cli.Context, duration api.Duration) map[string]map[string]*displayable.MetricValue {
-	template, err := LoadTemplate(ctx.String("template"))
+func responseLatency(ctx context.Context, duration api.Duration) map[string]map[string]*displayable.MetricValue {
+	template, err := LoadTemplate(ctx.Value(contextkey.DashboardTemplate{}).(string))
 	if err != nil {
 		return nil
 	}
@@ -185,13 +188,12 @@ func responseLatency(ctx *cli.Context, duration api.Duration) map[string]map[str
 	relabels := strings.Split(template.ResponseLatency.Relabels, ",")
 
 	responseLatency, err := metrics.MultipleLinearIntValues(ctx, template.ResponseLatency.Condition, labels, duration)
-
 	if err != nil {
 		logger.Log.Fatalln(err)
 	}
 
 	mapping := make(map[string]string, len(labels))
-	for i := 0; i < len(labels); i++ {
+	for i := range labels {
 		mapping[labels[i]] = relabels[i]
 	}
 
@@ -199,8 +201,8 @@ func responseLatency(ctx *cli.Context, duration api.Duration) map[string]map[str
 	return utils.MetricsValuesArrayToMap(duration, responseLatency, mapping)
 }
 
-func heatMap(ctx *cli.Context, duration api.Duration) (api.HeatMap, error) {
-	template, err := LoadTemplate(ctx.String("template"))
+func heatMap(ctx context.Context, duration api.Duration) (api.HeatMap, error) {
+	template, err := LoadTemplate(ctx.Value(contextkey.DashboardTemplate{}).(string))
 	if err != nil {
 		return api.HeatMap{}, nil
 	}
@@ -213,9 +215,9 @@ func heatMap(ctx *cli.Context, duration api.Duration) (api.HeatMap, error) {
 	return metrics.Thermodynamic(ctx, template.HeatMap.Condition, duration)
 }
 
-func Global(ctx *cli.Context, duration api.Duration) (*GlobalData, error) {
+func Global(ctx context.Context, duration api.Duration) (*GlobalData, error) {
 	// Load template to `globalTemplate`, so the subsequent three calls can ues it directly.
-	_, err := LoadTemplate(ctx.String("template"))
+	_, err := LoadTemplate(ctx.Value(contextkey.DashboardTemplate{}).(string))
 	if err != nil {
 		return nil, nil
 	}
diff --git a/pkg/graphql/dependency/dependency.go b/pkg/graphql/dependency/dependency.go
index 958835e..be3dff2 100644
--- a/pkg/graphql/dependency/dependency.go
+++ b/pkg/graphql/dependency/dependency.go
@@ -18,8 +18,9 @@
 package dependency
 
 import (
+	"context"
+
 	"github.com/machinebox/graphql"
-	"github.com/urfave/cli/v2"
 
 	api "skywalking.apache.org/repo/goapi/query"
 
@@ -27,7 +28,7 @@ import (
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 )
 
-func EndpointDependency(ctx *cli.Context, endpointID string, duration api.Duration) (api.EndpointTopology, error) {
+func EndpointDependency(ctx context.Context, endpointID string, duration api.Duration) (api.EndpointTopology, error) {
 	var response map[string]api.EndpointTopology
 
 	request := graphql.NewRequest(assets.Read("graphqls/dependency/EndpointDependency.graphql"))
@@ -39,7 +40,7 @@ func EndpointDependency(ctx *cli.Context, endpointID string, duration api.Durati
 	return response["result"], err
 }
 
-func GlobalTopology(ctx *cli.Context, layer string, duration api.Duration) (api.Topology, error) {
+func GlobalTopology(ctx context.Context, layer string, duration api.Duration) (api.Topology, error) {
 	var response map[string]api.Topology
 
 	request := graphql.NewRequest(assets.Read("graphqls/dependency/GlobalTopology.graphql"))
@@ -51,7 +52,7 @@ func GlobalTopology(ctx *cli.Context, layer string, duration api.Duration) (api.
 	return response["result"], err
 }
 
-func GlobalTopologyWithoutLayer(ctx *cli.Context, duration api.Duration) (api.Topology, error) {
+func GlobalTopologyWithoutLayer(ctx context.Context, duration api.Duration) (api.Topology, error) {
 	var response map[string]api.Topology
 
 	request := graphql.NewRequest(assets.Read("graphqls/dependency/GlobalTopologyWithoutLayer.graphql"))
@@ -62,7 +63,7 @@ func GlobalTopologyWithoutLayer(ctx *cli.Context, duration api.Duration) (api.To
 	return response["result"], err
 }
 
-func ServiceTopology(ctx *cli.Context, serviceID string, duration api.Duration) (api.Topology, error) {
+func ServiceTopology(ctx context.Context, serviceID string, duration api.Duration) (api.Topology, error) {
 	var response map[string]api.Topology
 
 	request := graphql.NewRequest(assets.Read("graphqls/dependency/ServiceTopology.graphql"))
@@ -74,7 +75,7 @@ func ServiceTopology(ctx *cli.Context, serviceID string, duration api.Duration)
 	return response["result"], err
 }
 
-func InstanceTopology(ctx *cli.Context, clientServiceID, serverServiceID string, duration api.Duration) (api.ServiceInstanceTopology, error) {
+func InstanceTopology(ctx context.Context, clientServiceID, serverServiceID string, duration api.Duration) (api.ServiceInstanceTopology, error) {
 	var response map[string]api.ServiceInstanceTopology
 
 	request := graphql.NewRequest(assets.Read("graphqls/dependency/InstanceTopology.graphql"))
@@ -87,7 +88,7 @@ func InstanceTopology(ctx *cli.Context, clientServiceID, serverServiceID string,
 	return response["result"], err
 }
 
-func ProcessTopology(ctx *cli.Context, instanceID string, duration api.Duration) (api.ProcessTopology, error) {
+func ProcessTopology(ctx context.Context, instanceID string, duration api.Duration) (api.ProcessTopology, error) {
 	var response map[string]api.ProcessTopology
 
 	request := graphql.NewRequest(assets.Read("graphqls/dependency/ProcessTopology.graphql"))
diff --git a/pkg/graphql/event/event.go b/pkg/graphql/event/event.go
index d46b035..04106ce 100644
--- a/pkg/graphql/event/event.go
+++ b/pkg/graphql/event/event.go
@@ -18,17 +18,17 @@
 package event
 
 import (
+	"context"
+
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 
 	"github.com/machinebox/graphql"
 
-	"github.com/urfave/cli/v2"
-
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
-func Events(ctx *cli.Context, condition *api.EventQueryCondition) (api.Events, error) {
+func Events(ctx context.Context, condition *api.EventQueryCondition) (api.Events, error) {
 	var response map[string]api.Events
 
 	request := graphql.NewRequest(assets.Read("graphqls/event/events.graphql"))
diff --git a/pkg/graphql/healthcheck/healthcheck.go b/pkg/graphql/healthcheck/healthcheck.go
index a16b9e3..35f9213 100644
--- a/pkg/graphql/healthcheck/healthcheck.go
+++ b/pkg/graphql/healthcheck/healthcheck.go
@@ -18,8 +18,9 @@
 package healthcheck
 
 import (
+	"context"
+
 	"github.com/machinebox/graphql"
-	"github.com/urfave/cli/v2"
 
 	api "skywalking.apache.org/repo/goapi/query"
 
@@ -28,7 +29,7 @@ import (
 )
 
 // CheckHealth intends to query the health status of OAP server
-func CheckHealth(ctx *cli.Context) (api.HealthStatus, error) {
+func CheckHealth(ctx context.Context) (api.HealthStatus, error) {
 	var response map[string]api.HealthStatus
 
 	request := graphql.NewRequest(assets.Read("graphqls/healthcheck/healthcheck.graphql"))
diff --git a/pkg/graphql/hierarchy/hierarchy.go b/pkg/graphql/hierarchy/hierarchy.go
index 52803b9..bf64ff7 100644
--- a/pkg/graphql/hierarchy/hierarchy.go
+++ b/pkg/graphql/hierarchy/hierarchy.go
@@ -18,17 +18,17 @@
 package hierarchy
 
 import (
+	"context"
+
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 
 	"github.com/machinebox/graphql"
 
-	"github.com/urfave/cli/v2"
-
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
-func ServiceHierarchy(ctx *cli.Context, serviceID, layer string) (api.ServiceHierarchy, error) {
+func ServiceHierarchy(ctx context.Context, serviceID, layer string) (api.ServiceHierarchy, error) {
 	var response map[string]api.ServiceHierarchy
 
 	request := graphql.NewRequest(assets.Read("graphqls/hierarchy/ServiceHierarchy.graphql"))
@@ -40,7 +40,7 @@ func ServiceHierarchy(ctx *cli.Context, serviceID, layer string) (api.ServiceHie
 	return response["result"], err
 }
 
-func InstanceHierarchy(ctx *cli.Context, instanceID, layer string) (api.InstanceHierarchy, error) {
+func InstanceHierarchy(ctx context.Context, instanceID, layer string) (api.InstanceHierarchy, error) {
 	var response map[string]api.InstanceHierarchy
 
 	request := graphql.NewRequest(assets.Read("graphqls/hierarchy/InstanceHierarchy.graphql"))
@@ -52,7 +52,7 @@ func InstanceHierarchy(ctx *cli.Context, instanceID, layer string) (api.Instance
 	return response["result"], err
 }
 
-func ListLayerLevels(ctx *cli.Context) ([]api.LayerLevel, error) {
+func ListLayerLevels(ctx context.Context) ([]api.LayerLevel, error) {
 	var response map[string][]api.LayerLevel
 
 	request := graphql.NewRequest(assets.Read("graphqls/hierarchy/ListLayerLevels.graphql"))
diff --git a/pkg/graphql/log/log.go b/pkg/graphql/log/log.go
index 76613d5..18be0b7 100644
--- a/pkg/graphql/log/log.go
+++ b/pkg/graphql/log/log.go
@@ -18,17 +18,17 @@
 package log
 
 import (
+	"context"
+
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 
 	"github.com/machinebox/graphql"
 
-	"github.com/urfave/cli/v2"
-
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
-func Logs(ctx *cli.Context, condition *api.LogQueryCondition) (api.Logs, error) {
+func Logs(ctx context.Context, condition *api.LogQueryCondition) (api.Logs, error) {
 	var response map[string]api.Logs
 
 	request := graphql.NewRequest(assets.Read("graphqls/logs/Logs.graphql"))
@@ -39,7 +39,7 @@ func Logs(ctx *cli.Context, condition *api.LogQueryCondition) (api.Logs, error)
 	return response["result"], err
 }
 
-func BrowserLogs(ctx *cli.Context, condition *api.BrowserErrorLogQueryCondition) (api.BrowserErrorLogs, error) {
+func BrowserLogs(ctx context.Context, condition *api.BrowserErrorLogQueryCondition) (api.BrowserErrorLogs, error) {
 	var response map[string]api.BrowserErrorLogs
 
 	request := graphql.NewRequest(assets.Read("graphqls/logs/BrowserLogs.graphql"))
diff --git a/pkg/graphql/menu/menu.go b/pkg/graphql/menu/menu.go
index 614174e..b46815c 100644
--- a/pkg/graphql/menu/menu.go
+++ b/pkg/graphql/menu/menu.go
@@ -18,17 +18,17 @@
 package menu
 
 import (
+	"context"
+
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 
 	"github.com/machinebox/graphql"
 
-	"github.com/urfave/cli/v2"
-
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
-func GetItems(ctx *cli.Context) ([]*api.MenuItem, error) {
+func GetItems(ctx context.Context) ([]*api.MenuItem, error) {
 	var response map[string][]*api.MenuItem
 
 	request := graphql.NewRequest(assets.Read("graphqls/menu/GetItems.graphql"))
diff --git a/pkg/graphql/metadata/metadata.go b/pkg/graphql/metadata/metadata.go
index 85823d0..73b9b26 100644
--- a/pkg/graphql/metadata/metadata.go
+++ b/pkg/graphql/metadata/metadata.go
@@ -18,6 +18,7 @@
 package metadata
 
 import (
+	"context"
 	"fmt"
 	"regexp"
 	"strconv"
@@ -25,7 +26,6 @@ import (
 	api "skywalking.apache.org/repo/goapi/query"
 
 	"github.com/machinebox/graphql"
-	"github.com/urfave/cli/v2"
 
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
@@ -34,7 +34,7 @@ import (
 
 var backendVersion = regexp.MustCompile(`^(?P<Major>\d+)\.(?P<Minor>\d+)`)
 
-func AllServices(cliCtx *cli.Context, duration api.Duration) ([]api.Service, error) {
+func AllServices(cliCtx context.Context, duration api.Duration) ([]api.Service, error) {
 	var response map[string][]api.Service
 
 	version, err := protocolVersion(cliCtx)
@@ -49,10 +49,10 @@ func AllServices(cliCtx *cli.Context, duration api.Duration) ([]api.Service, err
 	return response["result"], err
 }
 
-func SearchService(cliCtx *cli.Context, serviceCode string) (service api.Service, err error) {
+func SearchService(ctx context.Context, serviceCode string) (service api.Service, err error) {
 	var response map[string]api.Service
 
-	majorVersion, _, err := BackendVersion(cliCtx)
+	majorVersion, _, err := BackendVersion(ctx)
 	if err != nil {
 		return api.Service{}, err
 	}
@@ -65,7 +65,7 @@ func SearchService(cliCtx *cli.Context, serviceCode string) (service api.Service
 		request.Var("serviceCode", serviceCode)
 	}
 
-	err = client.ExecuteQuery(cliCtx, request, &response)
+	err = client.ExecuteQuery(ctx, request, &response)
 
 	service = response["result"]
 
@@ -76,7 +76,7 @@ func SearchService(cliCtx *cli.Context, serviceCode string) (service api.Service
 	return service, err
 }
 
-func AllBrowserServices(cliCtx *cli.Context, duration api.Duration) ([]api.Service, error) {
+func AllBrowserServices(cliCtx context.Context, duration api.Duration) ([]api.Service, error) {
 	var response map[string][]api.Service
 
 	version, err := protocolVersion(cliCtx)
@@ -91,7 +91,7 @@ func AllBrowserServices(cliCtx *cli.Context, duration api.Duration) ([]api.Servi
 	return response["result"], err
 }
 
-func SearchBrowserService(cliCtx *cli.Context, serviceCode string) (service api.Service, err error) {
+func SearchBrowserService(cliCtx context.Context, serviceCode string) (service api.Service, err error) {
 	var response map[string]api.Service
 
 	version, err := protocolVersion(cliCtx)
@@ -112,7 +112,7 @@ func SearchBrowserService(cliCtx *cli.Context, serviceCode string) (service api.
 	return service, err
 }
 
-func SearchEndpoints(cliCtx *cli.Context, serviceID, keyword string, limit int, duration *api.Duration) ([]api.Endpoint, error) {
+func SearchEndpoints(cliCtx context.Context, serviceID, keyword string, limit int, duration *api.Duration) ([]api.Endpoint, error) {
 	var response map[string][]api.Endpoint
 
 	majorVersion, minorVersion, err := BackendVersion(cliCtx)
@@ -142,7 +142,7 @@ func SearchEndpoints(cliCtx *cli.Context, serviceID, keyword string, limit int,
 	return response["result"], err
 }
 
-func Instances(cliCtx *cli.Context, serviceID string, duration api.Duration) ([]api.ServiceInstance, error) {
+func Instances(cliCtx context.Context, serviceID string, duration api.Duration) ([]api.ServiceInstance, error) {
 	var response map[string][]api.ServiceInstance
 
 	version, err := protocolVersion(cliCtx)
@@ -158,7 +158,7 @@ func Instances(cliCtx *cli.Context, serviceID string, duration api.Duration) ([]
 	return response["result"], err
 }
 
-func GetInstance(cliCtx *cli.Context, instanceID string) (api.ServiceInstance, error) {
+func GetInstance(cliCtx context.Context, instanceID string) (api.ServiceInstance, error) {
 	var response map[string]api.ServiceInstance
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/v2/GetInstance.graphql"))
@@ -169,7 +169,7 @@ func GetInstance(cliCtx *cli.Context, instanceID string) (api.ServiceInstance, e
 	return response["result"], err
 }
 
-func GetEndpointInfo(cliCtx *cli.Context, endpointID string) (api.EndpointInfo, error) {
+func GetEndpointInfo(cliCtx context.Context, endpointID string) (api.EndpointInfo, error) {
 	var response map[string]api.EndpointInfo
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/v2/GetEndpointInfo.graphql"))
@@ -180,7 +180,7 @@ func GetEndpointInfo(cliCtx *cli.Context, endpointID string) (api.EndpointInfo,
 	return response["result"], err
 }
 
-func Processes(cliCtx *cli.Context, instanceID string, duration api.Duration) ([]api.Process, error) {
+func Processes(cliCtx context.Context, instanceID string, duration api.Duration) ([]api.Process, error) {
 	var response map[string][]api.Process
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/v2/Processes.graphql"))
@@ -192,7 +192,7 @@ func Processes(cliCtx *cli.Context, instanceID string, duration api.Duration) ([
 	return response["result"], err
 }
 
-func GetProcess(cliCtx *cli.Context, processID string) (api.Process, error) {
+func GetProcess(cliCtx context.Context, processID string) (api.Process, error) {
 	var response map[string]api.Process
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/v2/GetProcess.graphql"))
@@ -203,7 +203,7 @@ func GetProcess(cliCtx *cli.Context, processID string) (api.Process, error) {
 	return response["result"], err
 }
 
-func EstimateProcessScale(cliCtx *cli.Context, serviceID string, labels []string) (int64, error) {
+func EstimateProcessScale(cliCtx context.Context, serviceID string, labels []string) (int64, error) {
 	var response map[string]int64
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/v2/EstimateProcessScale.graphql"))
@@ -215,7 +215,7 @@ func EstimateProcessScale(cliCtx *cli.Context, serviceID string, labels []string
 	return response["result"], err
 }
 
-func ServerTimeInfo(cliCtx *cli.Context) (api.TimeInfo, error) {
+func ServerTimeInfo(cliCtx context.Context) (api.TimeInfo, error) {
 	var response map[string]api.TimeInfo
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/v2/ServerTimeInfo.graphql"))
@@ -227,7 +227,7 @@ func ServerTimeInfo(cliCtx *cli.Context) (api.TimeInfo, error) {
 	return response["result"], nil
 }
 
-func ListLayers(cliCtx *cli.Context) ([]string, error) {
+func ListLayers(cliCtx context.Context) ([]string, error) {
 	var response map[string][]string
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/v2/ListLayers.graphql"))
@@ -239,7 +239,7 @@ func ListLayers(cliCtx *cli.Context) ([]string, error) {
 	return response["result"], nil
 }
 
-func ListLayerService(cliCtx *cli.Context, layer string) ([]api.Service, error) {
+func ListLayerService(cliCtx context.Context, layer string) ([]api.Service, error) {
 	var response map[string][]api.Service
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/v2/ListService.graphql"))
@@ -250,8 +250,8 @@ func ListLayerService(cliCtx *cli.Context, layer string) ([]api.Service, error)
 	return response["result"], err
 }
 
-func BackendVersion(cliCtx *cli.Context) (major, minor int, err error) {
-	version, err := common.Version(cliCtx)
+func BackendVersion(ctx context.Context) (major, minor int, err error) {
+	version, err := common.Version(ctx)
 	if err != nil {
 		return 0, 0, err
 	}
@@ -274,8 +274,8 @@ func BackendVersion(cliCtx *cli.Context) (major, minor int, err error) {
 	return major, minor, nil
 }
 
-func protocolVersion(cliCtx *cli.Context) (string, error) {
-	if majorVersion, _, err := BackendVersion(cliCtx); err != nil {
+func protocolVersion(ctx context.Context) (string, error) {
+	if majorVersion, _, err := BackendVersion(ctx); err != nil {
 		return "", err
 	} else if majorVersion >= 9 {
 		return "v2", nil
diff --git a/pkg/graphql/metrics/metrics.go b/pkg/graphql/metrics/metrics.go
index 9fcae90..3d25ef4 100644
--- a/pkg/graphql/metrics/metrics.go
+++ b/pkg/graphql/metrics/metrics.go
@@ -18,8 +18,9 @@
 package metrics
 
 import (
+	"context"
+
 	"github.com/machinebox/graphql"
-	"github.com/urfave/cli/v2"
 
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
@@ -27,7 +28,7 @@ import (
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
-func IntValues(ctx *cli.Context, condition api.MetricsCondition, duration api.Duration) (int, error) {
+func IntValues(ctx context.Context, condition api.MetricsCondition, duration api.Duration) (int, error) {
 	var response map[string]int
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/MetricsValue.graphql"))
@@ -40,7 +41,7 @@ func IntValues(ctx *cli.Context, condition api.MetricsCondition, duration api.Du
 	return response["result"], err
 }
 
-func NullableIntValue(ctx *cli.Context, condition api.MetricsCondition, duration api.Duration) (api.NullableValue, error) {
+func NullableIntValue(ctx context.Context, condition api.MetricsCondition, duration api.Duration) (api.NullableValue, error) {
 	var response map[string]api.NullableValue
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/NullableMetricsValue.graphql"))
@@ -53,7 +54,7 @@ func NullableIntValue(ctx *cli.Context, condition api.MetricsCondition, duration
 	return response["result"], err
 }
 
-func LinearIntValues(ctx *cli.Context, condition api.MetricsCondition, duration api.Duration) (api.MetricsValues, error) {
+func LinearIntValues(ctx context.Context, condition api.MetricsCondition, duration api.Duration) (api.MetricsValues, error) {
 	var response map[string]api.MetricsValues
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/MetricsValues.graphql"))
@@ -66,7 +67,12 @@ func LinearIntValues(ctx *cli.Context, condition api.MetricsCondition, duration
 	return response["result"], err
 }
 
-func MultipleLinearIntValues(ctx *cli.Context, condition api.MetricsCondition, labels []string, duration api.Duration) ([]api.MetricsValues, error) {
+func MultipleLinearIntValues(
+	ctx context.Context,
+	condition api.MetricsCondition,
+	labels []string,
+	duration api.Duration,
+) ([]api.MetricsValues, error) {
 	var response map[string][]api.MetricsValues
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/LabeledMetricsValues.graphql"))
@@ -80,7 +86,7 @@ func MultipleLinearIntValues(ctx *cli.Context, condition api.MetricsCondition, l
 	return response["result"], err
 }
 
-func Thermodynamic(ctx *cli.Context, condition api.MetricsCondition, duration api.Duration) (api.HeatMap, error) {
+func Thermodynamic(ctx context.Context, condition api.MetricsCondition, duration api.Duration) (api.HeatMap, error) {
 	var response map[string]api.HeatMap
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/HeatMap.graphql"))
@@ -93,7 +99,7 @@ func Thermodynamic(ctx *cli.Context, condition api.MetricsCondition, duration ap
 	return response["result"], err
 }
 
-func SortMetrics(ctx *cli.Context, condition api.TopNCondition, duration api.Duration) ([]*api.SelectedRecord, error) {
+func SortMetrics(ctx context.Context, condition api.TopNCondition, duration api.Duration) ([]*api.SelectedRecord, error) {
 	var response map[string][]*api.SelectedRecord
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/SortMetrics.graphql"))
@@ -105,7 +111,7 @@ func SortMetrics(ctx *cli.Context, condition api.TopNCondition, duration api.Dur
 	return response["result"], err
 }
 
-func SampledRecords(ctx *cli.Context, condition api.TopNCondition, duration api.Duration) ([]*api.SelectedRecord, error) {
+func SampledRecords(ctx context.Context, condition api.TopNCondition, duration api.Duration) ([]*api.SelectedRecord, error) {
 	var response map[string][]*api.SelectedRecord
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/SampledRecords.graphql"))
@@ -117,7 +123,7 @@ func SampledRecords(ctx *cli.Context, condition api.TopNCondition, duration api.
 	return response["result"], err
 }
 
-func ReadRecords(ctx *cli.Context, condition api.RecordCondition, duration api.Duration) ([]*api.Record, error) {
+func ReadRecords(ctx context.Context, condition api.RecordCondition, duration api.Duration) ([]*api.Record, error) {
 	var response map[string][]*api.Record
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/ReadRecords.graphql"))
@@ -129,7 +135,7 @@ func ReadRecords(ctx *cli.Context, condition api.RecordCondition, duration api.D
 	return response["result"], err
 }
 
-func ListMetrics(ctx *cli.Context, regex string) ([]*api.MetricDefinition, error) {
+func ListMetrics(ctx context.Context, regex string) ([]*api.MetricDefinition, error) {
 	var response map[string][]*api.MetricDefinition
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/ListMetrics.graphql"))
 	request.Var("regex", regex)
@@ -139,7 +145,7 @@ func ListMetrics(ctx *cli.Context, regex string) ([]*api.MetricDefinition, error
 	return response["result"], err
 }
 
-func Execute(ctx *cli.Context, expression string, entity *api.Entity, duration api.Duration) (api.ExpressionResult, error) {
+func Execute(ctx context.Context, expression string, entity *api.Entity, duration api.Duration) (api.ExpressionResult, error) {
 	var response map[string]api.ExpressionResult
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/ExecuteExpression.graphql"))
diff --git a/pkg/graphql/profiling/asyncprofiler.go b/pkg/graphql/profiling/asyncprofiler.go
index 5db697f..34b1857 100644
--- a/pkg/graphql/profiling/asyncprofiler.go
+++ b/pkg/graphql/profiling/asyncprofiler.go
@@ -18,15 +18,16 @@
 package profiling
 
 import (
+	"context"
+
 	"github.com/machinebox/graphql"
-	"github.com/urfave/cli/v2"
 	api "skywalking.apache.org/repo/goapi/query"
 
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 )
 
-func CreateAsyncProfilerTask(ctx *cli.Context, condition *api.AsyncProfilerTaskCreationRequest) (api.AsyncProfilerTaskCreationResult, error) {
+func CreateAsyncProfilerTask(ctx context.Context, condition *api.AsyncProfilerTaskCreationRequest) (api.AsyncProfilerTaskCreationResult, error) {
 	var response map[string]api.AsyncProfilerTaskCreationResult
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/asyncprofiler/CreateTask.graphql"))
@@ -37,7 +38,7 @@ func CreateAsyncProfilerTask(ctx *cli.Context, condition *api.AsyncProfilerTaskC
 	return response["result"], err
 }
 
-func GetAsyncProfilerTaskList(ctx *cli.Context, condition *api.AsyncProfilerTaskListRequest) (api.AsyncProfilerTaskListResult, error) {
+func GetAsyncProfilerTaskList(ctx context.Context, condition *api.AsyncProfilerTaskListRequest) (api.AsyncProfilerTaskListResult, error) {
 	var response map[string]api.AsyncProfilerTaskListResult
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/asyncprofiler/GetTaskList.graphql"))
@@ -48,7 +49,7 @@ func GetAsyncProfilerTaskList(ctx *cli.Context, condition *api.AsyncProfilerTask
 	return response["result"], err
 }
 
-func GetAsyncProfilerTaskProgress(ctx *cli.Context, taskID string) (api.AsyncProfilerTaskProgress, error) {
+func GetAsyncProfilerTaskProgress(ctx context.Context, taskID string) (api.AsyncProfilerTaskProgress, error) {
 	var response map[string]api.AsyncProfilerTaskProgress
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/asyncprofiler/GetTaskProgress.graphql"))
@@ -59,7 +60,7 @@ func GetAsyncProfilerTaskProgress(ctx *cli.Context, taskID string) (api.AsyncPro
 	return response["result"], err
 }
 
-func GetAsyncProfilerAnalyze(ctx *cli.Context, condition *api.AsyncProfilerAnalyzationRequest) (api.AsyncProfilerAnalyzation, error) {
+func GetAsyncProfilerAnalyze(ctx context.Context, condition *api.AsyncProfilerAnalyzationRequest) (api.AsyncProfilerAnalyzation, error) {
 	var response map[string]api.AsyncProfilerAnalyzation
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/asyncprofiler/GetAnalysis.graphql"))
diff --git a/pkg/graphql/profiling/continuous.go b/pkg/graphql/profiling/continuous.go
index 7d590ea..e31f4ee 100644
--- a/pkg/graphql/profiling/continuous.go
+++ b/pkg/graphql/profiling/continuous.go
@@ -18,17 +18,17 @@
 package profiling
 
 import (
+	"context"
+
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 
 	"github.com/machinebox/graphql"
 
-	"github.com/urfave/cli/v2"
-
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
-func SetContinuousProfilingPolicy(ctx *cli.Context, creation *api.ContinuousProfilingPolicyCreation) (api.ContinuousProfilingSetResult, error) {
+func SetContinuousProfilingPolicy(ctx context.Context, creation *api.ContinuousProfilingPolicyCreation) (api.ContinuousProfilingSetResult, error) {
 	var response map[string]api.ContinuousProfilingSetResult
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/continuous/SetContinuousProfilingPolicy.graphql"))
@@ -39,7 +39,7 @@ func SetContinuousProfilingPolicy(ctx *cli.Context, creation *api.ContinuousProf
 	return response["result"], err
 }
 
-func QueryContinuousProfilingServiceTargets(ctx *cli.Context, serviceID string) ([]*api.ContinuousProfilingPolicyTarget, error) {
+func QueryContinuousProfilingServiceTargets(ctx context.Context, serviceID string) ([]*api.ContinuousProfilingPolicyTarget, error) {
 	var response map[string][]*api.ContinuousProfilingPolicyTarget
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/continuous/QueryContinuousProfilingServiceTargets.graphql"))
@@ -50,8 +50,9 @@ func QueryContinuousProfilingServiceTargets(ctx *cli.Context, serviceID string)
 	return response["result"], err
 }
 
-func QueryContinuousProfilingMonitoringInstances(ctx *cli.Context, serviceID string,
-	target api.ContinuousProfilingTargetType) ([]api.ContinuousProfilingMonitoringInstance, error) {
+func QueryContinuousProfilingMonitoringInstances(ctx context.Context, serviceID string,
+	target api.ContinuousProfilingTargetType,
+) ([]api.ContinuousProfilingMonitoringInstance, error) {
 	var response map[string][]api.ContinuousProfilingMonitoringInstance
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/continuous/QueryContinuousProfilingMonitoringInstances.graphql"))
diff --git a/pkg/graphql/profiling/ebpf.go b/pkg/graphql/profiling/ebpf.go
index 0cdf3d4..a788e5d 100644
--- a/pkg/graphql/profiling/ebpf.go
+++ b/pkg/graphql/profiling/ebpf.go
@@ -18,18 +18,19 @@
 package profiling
 
 import (
+	"context"
+
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 
 	"github.com/machinebox/graphql"
 
-	"github.com/urfave/cli/v2"
-
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
-func CreateEBPFProfilingFixedTimeTask(ctx *cli.Context,
-	condition *api.EBPFProfilingTaskFixedTimeCreationRequest) (api.EBPFProfilingTaskCreationResult, error) {
+func CreateEBPFProfilingFixedTimeTask(ctx context.Context,
+	condition *api.EBPFProfilingTaskFixedTimeCreationRequest,
+) (api.EBPFProfilingTaskCreationResult, error) {
 	var response map[string]api.EBPFProfilingTaskCreationResult
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/ebpf/CreateEBPFProfilingFixedTimeTask.graphql"))
@@ -40,7 +41,9 @@ func CreateEBPFProfilingFixedTimeTask(ctx *cli.Context,
 	return response["result"], err
 }
 
-func CreateEBPFNetworkProfilingTask(ctx *cli.Context, condition *api.EBPFProfilingNetworkTaskRequest) (api.EBPFProfilingTaskCreationResult, error) {
+func CreateEBPFNetworkProfilingTask(ctx context.Context,
+	condition *api.EBPFProfilingNetworkTaskRequest,
+) (api.EBPFProfilingTaskCreationResult, error) {
 	var response map[string]api.EBPFProfilingTaskCreationResult
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/ebpf/CreateEBPFNetworkProfilingTask.graphql"))
@@ -51,7 +54,7 @@ func CreateEBPFNetworkProfilingTask(ctx *cli.Context, condition *api.EBPFProfili
 	return response["result"], err
 }
 
-func QueryPrepareCreateEBPFProfilingTaskData(ctx *cli.Context, serviceID string) (*api.EBPFProfilingTaskPrepare, error) {
+func QueryPrepareCreateEBPFProfilingTaskData(ctx context.Context, serviceID string) (*api.EBPFProfilingTaskPrepare, error) {
 	var response map[string]*api.EBPFProfilingTaskPrepare
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/ebpf/QueryPrepareCreateEBPFProfilingTaskData.graphql"))
@@ -62,7 +65,7 @@ func QueryPrepareCreateEBPFProfilingTaskData(ctx *cli.Context, serviceID string)
 	return response["result"], err
 }
 
-func QueryEBPFProfilingTaskList(ctx *cli.Context, serviceID string, triggerType api.EBPFProfilingTriggerType) ([]*api.EBPFProfilingTask, error) {
+func QueryEBPFProfilingTaskList(ctx context.Context, serviceID string, triggerType api.EBPFProfilingTriggerType) ([]*api.EBPFProfilingTask, error) {
 	var response map[string][]*api.EBPFProfilingTask
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/ebpf/QueryEBPFProfilingTaskList.graphql"))
@@ -74,7 +77,7 @@ func QueryEBPFProfilingTaskList(ctx *cli.Context, serviceID string, triggerType
 	return response["result"], err
 }
 
-func QueryEBPFProfilingScheduleList(ctx *cli.Context, taskID string) ([]*api.EBPFProfilingSchedule, error) {
+func QueryEBPFProfilingScheduleList(ctx context.Context, taskID string) ([]*api.EBPFProfilingSchedule, error) {
 	var response map[string][]*api.EBPFProfilingSchedule
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/ebpf/QueryEBPFProfilingScheduleList.graphql"))
@@ -85,8 +88,9 @@ func QueryEBPFProfilingScheduleList(ctx *cli.Context, taskID string) ([]*api.EBP
 	return response["result"], err
 }
 
-func AnalysisEBPFProfilingResult(ctx *cli.Context, scheduleIDList []string,
-	timeRanges []*api.EBPFProfilingAnalyzeTimeRange, aggregateType api.EBPFProfilingAnalyzeAggregateType) (*api.EBPFProfilingAnalyzation, error) {
+func AnalysisEBPFProfilingResult(ctx context.Context, scheduleIDList []string,
+	timeRanges []*api.EBPFProfilingAnalyzeTimeRange, aggregateType api.EBPFProfilingAnalyzeAggregateType,
+) (*api.EBPFProfilingAnalyzation, error) {
 	var response map[string]*api.EBPFProfilingAnalyzation
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/ebpf/AnalysisEBPFProfilingResult.graphql"))
@@ -99,7 +103,7 @@ func AnalysisEBPFProfilingResult(ctx *cli.Context, scheduleIDList []string,
 	return response["result"], err
 }
 
-func KeepNetworkProfilingTask(ctx *cli.Context, taskID string) (*api.EBPFNetworkKeepProfilingResult, error) {
+func KeepNetworkProfilingTask(ctx context.Context, taskID string) (*api.EBPFNetworkKeepProfilingResult, error) {
 	var response map[string]*api.EBPFNetworkKeepProfilingResult
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/ebpf/KeepNetworkProfilingTask.graphql"))
diff --git a/pkg/graphql/profiling/trace.go b/pkg/graphql/profiling/trace.go
index a1e0b47..6d9aa0d 100644
--- a/pkg/graphql/profiling/trace.go
+++ b/pkg/graphql/profiling/trace.go
@@ -18,17 +18,17 @@
 package profiling
 
 import (
+	"context"
+
 	"github.com/apache/skywalking-cli/assets"
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 
 	"github.com/machinebox/graphql"
 
-	"github.com/urfave/cli/v2"
-
 	api "skywalking.apache.org/repo/goapi/query"
 )
 
-func CreateTraceTask(ctx *cli.Context, condition *api.ProfileTaskCreationRequest) (api.ProfileTaskCreationResult, error) {
+func CreateTraceTask(ctx context.Context, condition *api.ProfileTaskCreationRequest) (api.ProfileTaskCreationResult, error) {
 	var response map[string]api.ProfileTaskCreationResult
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/CreateTask.graphql"))
@@ -39,7 +39,7 @@ func CreateTraceTask(ctx *cli.Context, condition *api.ProfileTaskCreationRequest
 	return response["result"], err
 }
 
-func GetTraceProfilingTaskList(ctx *cli.Context, serviceID, endpointName string) ([]*api.ProfileTask, error) {
+func GetTraceProfilingTaskList(ctx context.Context, serviceID, endpointName string) ([]*api.ProfileTask, error) {
 	var response map[string][]*api.ProfileTask
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetTaskList.graphql"))
@@ -51,7 +51,7 @@ func GetTraceProfilingTaskList(ctx *cli.Context, serviceID, endpointName string)
 	return response["result"], err
 }
 
-func GetTraceProfilingTaskLogList(ctx *cli.Context, taskID string) ([]*api.ProfileTaskLog, error) {
+func GetTraceProfilingTaskLogList(ctx context.Context, taskID string) ([]*api.ProfileTaskLog, error) {
 	var response map[string][]*api.ProfileTaskLog
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetProfileTaskLogs.graphql"))
@@ -62,7 +62,7 @@ func GetTraceProfilingTaskLogList(ctx *cli.Context, taskID string) ([]*api.Profi
 	return response["result"], err
 }
 
-func GetTraceProfilingTaskSegmentList(ctx *cli.Context, taskID string) ([]*api.ProfiledTraceSegments, error) {
+func GetTraceProfilingTaskSegmentList(ctx context.Context, taskID string) ([]*api.ProfiledTraceSegments, error) {
 	var response map[string][]*api.ProfiledTraceSegments
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetTaskSegmentsList.graphql"))
@@ -73,7 +73,7 @@ func GetTraceProfilingTaskSegmentList(ctx *cli.Context, taskID string) ([]*api.P
 	return response["result"], err
 }
 
-func GetTraceProfilingAnalyze(ctx *cli.Context, queries []*api.SegmentProfileAnalyzeQuery) (api.ProfileAnalyzation, error) {
+func GetTraceProfilingAnalyze(ctx context.Context, queries []*api.SegmentProfileAnalyzeQuery) (api.ProfileAnalyzation, error) {
 	var response map[string]api.ProfileAnalyzation
 
 	request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetSegmentsProfileAnalyze.graphql"))
diff --git a/pkg/graphql/trace/trace.go b/pkg/graphql/trace/trace.go
index 6071846..1a44060 100644
--- a/pkg/graphql/trace/trace.go
+++ b/pkg/graphql/trace/trace.go
@@ -18,8 +18,9 @@
 package trace
 
 import (
+	"context"
+
 	"github.com/machinebox/graphql"
-	"github.com/urfave/cli/v2"
 
 	api "skywalking.apache.org/repo/goapi/query"
 
@@ -27,7 +28,7 @@ import (
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 )
 
-func Trace(ctx *cli.Context, traceID string) (api.Trace, error) {
+func Trace(ctx context.Context, traceID string) (api.Trace, error) {
 	var response map[string]api.Trace
 
 	request := graphql.NewRequest(assets.Read("graphqls/trace/Trace.graphql"))
@@ -38,7 +39,7 @@ func Trace(ctx *cli.Context, traceID string) (api.Trace, error) {
 	return response["result"], err
 }
 
-func Traces(ctx *cli.Context, condition *api.TraceQueryCondition) (api.TraceBrief, error) {
+func Traces(ctx context.Context, condition *api.TraceQueryCondition) (api.TraceBrief, error) {
 	var response map[string]api.TraceBrief
 
 	request := graphql.NewRequest(assets.Read("graphqls/trace/Traces.graphql"))
diff --git a/pkg/heatmap/heatmap.go b/pkg/heatmap/heatmap.go
index 74c9ff0..a66d2d6 100644
--- a/pkg/heatmap/heatmap.go
+++ b/pkg/heatmap/heatmap.go
@@ -193,7 +193,7 @@ func (hp *HeatMap) drawColumns(cvs *canvas.Canvas, xd *axes.XDetails, yd *axes.Y
 	for i, xl := range hp.XLabels {
 		cv := hp.columns[xl]
 
-		for j := 0; j < len(cv.values); j++ {
+		for j := range cv.values {
 			v := cv.values[j]
 
 			startX := xd.Start.X + 1 + i*hp.opts.cellWidth