Adapt the new trace v2 query protocol (#225)

diff --git a/CHANGES.md b/CHANGES.md
index 70bed05..4ae94b8 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -12,6 +12,9 @@
 * Add the sub-command `alarm autocomplete-keys` and `alarm auto-complete-values` for alarm query API by @mrproliu in https://github.com/apache/skywalking-cli/pull/210
 * Adapt the alarm message query API by @mrproliu in https://github.com/apache/skywalking-cli/pull/210
 * Add the owner field in the `metrics exec` query API by @mrproliu in https://github.com/apache/skywalking-cli/pull/210
+* Add the `trace-v2 list` command for adapt the new trace query API by @mrproliu in https://github.com/apache/skywalking-cli/pull/225
+* Add the duration field in the `trace list` command by @mrproliu in https://github.com/apache/skywalking-cli/pull/225
+* Remove the oldest `queryTraceFromColdStage` query call in the `trace list` command by @mrproliu in https://github.com/apache/skywalking-cli/pull/225
 
 ### Bug Fixes
 
diff --git a/assets/graphqls/trace/Trace.graphql b/assets/graphqls/trace/Trace.graphql
index 8f52c01..156352f 100644
--- a/assets/graphqls/trace/Trace.graphql
+++ b/assets/graphqls/trace/Trace.graphql
@@ -15,8 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
-query ($traceId: ID!) {
-    result: queryTrace(traceId: $traceId) {
+query ($traceId: ID!, $duration: Duration) {
+    result: queryTrace(traceId: $traceId, duration: $duration) {
         spans {
             traceId
             segmentId
diff --git a/assets/graphqls/trace/ColdTrace.graphql b/assets/graphqls/trace/TraceWithoutDuration.graphql
similarity index 93%
rename from assets/graphqls/trace/ColdTrace.graphql
rename to assets/graphqls/trace/TraceWithoutDuration.graphql
index eb53ef7..8f52c01 100644
--- a/assets/graphqls/trace/ColdTrace.graphql
+++ b/assets/graphqls/trace/TraceWithoutDuration.graphql
@@ -15,8 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
-query ($traceId: ID!, $duration: Duration!) {
-    result: queryTraceFromColdStage(traceId: $traceId, duration: $duration) {
+query ($traceId: ID!) {
+    result: queryTrace(traceId: $traceId) {
         spans {
             traceId
             segmentId
diff --git a/assets/graphqls/tracev2/Traces.graphql b/assets/graphqls/tracev2/Traces.graphql
new file mode 100644
index 0000000..058b795
--- /dev/null
+++ b/assets/graphqls/tracev2/Traces.graphql
@@ -0,0 +1,71 @@
+# Licensed to Apache Software Foundation (ASF) under one or more contributor
+# license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright
+# ownership. Apache Software Foundation (ASF) licenses this file to you under
+# the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+query ($condition: TraceQueryCondition){
+    result: queryTraces(condition: $condition){
+        traces {
+            spans {
+                traceId
+                segmentId
+                spanId
+                parentSpanId
+                refs {
+                    traceId
+                    parentSegmentId
+                    parentSpanId
+                    type
+                }
+                serviceCode
+                serviceInstanceName
+                startTime
+                endTime
+                endpointName
+                type
+                peer
+                component
+                isError
+                layer
+                tags {
+                    key value
+                }
+                logs {
+                    time data {
+                        key value
+                    }
+                }
+                attachedEvents {
+                    startTime {
+                        seconds nanos
+                    }
+                    event
+                    endTime {
+                        seconds nanos
+                    }
+                    tags {
+                        key value
+                    }
+                    summary {
+                        key value
+                    }
+                }
+            }
+        }
+        retrievedTimeRange {
+            startTime endTime
+        }
+    }
+}
\ No newline at end of file
diff --git a/cmd/swctl/main.go b/cmd/swctl/main.go
index 81914fa..6a29883 100644
--- a/cmd/swctl/main.go
+++ b/cmd/swctl/main.go
@@ -43,6 +43,7 @@
 	"github.com/apache/skywalking-cli/internal/commands/records"
 	"github.com/apache/skywalking-cli/internal/commands/service"
 	"github.com/apache/skywalking-cli/internal/commands/trace"
+	"github.com/apache/skywalking-cli/internal/commands/tracev2"
 	intutil "github.com/apache/skywalking-cli/internal/util"
 	"github.com/apache/skywalking-cli/pkg/logger"
 	"github.com/apache/skywalking-cli/pkg/util"
@@ -99,6 +100,7 @@
 		service.Command,
 		metrics.Command,
 		trace.Command,
+		tracev2.Command,
 		healthcheck.Command,
 		dashboard.Command,
 		install.Command,
diff --git a/dist/LICENSE b/dist/LICENSE
index 808954d..e88d41e 100644
--- a/dist/LICENSE
+++ b/dist/LICENSE
@@ -200,7 +200,7 @@
     github.com/spf13/afero v1.2.2 Apache-2.0
     gomodules.xyz/jsonpatch/v2 v2.5.0 Apache-2.0
     google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 Apache-2.0
-    google.golang.org/grpc v1.72.0 Apache-2.0
+    google.golang.org/grpc v1.73.0 Apache-2.0
     gopkg.in/ini.v1 v1.51.0 Apache-2.0
     gopkg.in/yaml.v2 v2.4.0 Apache-2.0
     k8s.io/api v0.33.1 Apache-2.0
@@ -213,7 +213,7 @@
     sigs.k8s.io/controller-runtime v0.20.4 Apache-2.0
     sigs.k8s.io/randfill v1.0.0 Apache-2.0
     sigs.k8s.io/structured-merge-diff/v4 v4.7.0 Apache-2.0
-    skywalking.apache.org/repo/goapi v0.0.0-20250516073621-c1d2fb980695 Apache-2.0
+    skywalking.apache.org/repo/goapi v0.0.0-20250918024206-7be91673cadc Apache-2.0
 
 ========================================================================
 Apache-2.0 and BSD-3-Clause licenses
diff --git a/go.mod b/go.mod
index 92d0738..6a22c66 100644
--- a/go.mod
+++ b/go.mod
@@ -14,11 +14,11 @@
 	github.com/spf13/viper v1.7.0
 	github.com/urfave/cli/v2 v2.3.0
 	golang.org/x/text v0.25.0
-	google.golang.org/grpc v1.72.0
+	google.golang.org/grpc v1.73.0
 	gopkg.in/yaml.v2 v2.4.0
 	k8s.io/apimachinery v0.33.1
 	sigs.k8s.io/controller-runtime v0.20.4
-	skywalking.apache.org/repo/goapi v0.0.0-20250516073621-c1d2fb980695
+	skywalking.apache.org/repo/goapi v0.0.0-20250918024206-7be91673cadc
 )
 
 require (
diff --git a/go.sum b/go.sum
index 77111d7..6587f3f 100644
--- a/go.sum
+++ b/go.sum
@@ -326,16 +326,16 @@
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
 go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
-go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
-go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
-go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
-go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
-go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
-go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
-go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
-go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
-go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
+go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
+go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
+go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
@@ -487,8 +487,8 @@
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM=
-google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
+google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
+google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
 google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
 google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
@@ -543,5 +543,5 @@
 sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
 sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
-skywalking.apache.org/repo/goapi v0.0.0-20250516073621-c1d2fb980695 h1:ED9fRO1rV5K3Kr5HQa1pQ87/xtXBmjYvT1EQfQ1VV3Y=
-skywalking.apache.org/repo/goapi v0.0.0-20250516073621-c1d2fb980695/go.mod h1:rTNGn2QrS+p1i2OaIBxlwQ/VrDSDc7OwRk/iWV+mU0k=
+skywalking.apache.org/repo/goapi v0.0.0-20250918024206-7be91673cadc h1:HhlLDl0aOIgiIdJl9p0a7PHHdZbs9epKEnewB7AWdZs=
+skywalking.apache.org/repo/goapi v0.0.0-20250918024206-7be91673cadc/go.mod h1:Vj9vINJYsTQASPsbQ1i81YgH8nFC/Xds4GjcXvmRYwM=
diff --git a/internal/commands/trace/list.go b/internal/commands/trace/list.go
index fe738cc..ac20ed5 100644
--- a/internal/commands/trace/list.go
+++ b/internal/commands/trace/list.go
@@ -102,14 +102,6 @@
 		traceID := ctx.String("trace-id")
 		tagStr := ctx.String("tags")
 
-		if coldStage && traceID != "" {
-			trace, err := trace.ColdTrace(ctx.Context, duration, traceID)
-			if err != nil {
-				return err
-			}
-			return display.Display(ctx.Context, &displayable.Displayable{Data: trace})
-		}
-
 		var tags []*api.SpanTag = nil
 		if tagStr != "" {
 			tagArr := strings.SplitSeq(tagStr, ",")
diff --git a/internal/commands/trace/trace.go b/internal/commands/trace/trace.go
index f7f31a0..25b7df5 100644
--- a/internal/commands/trace/trace.go
+++ b/internal/commands/trace/trace.go
@@ -22,6 +22,11 @@
 
 	"github.com/urfave/cli/v2"
 
+	api "skywalking.apache.org/repo/goapi/query"
+
+	"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/display"
 	"github.com/apache/skywalking-cli/pkg/display/displayable"
 	"github.com/apache/skywalking-cli/pkg/graphql/trace"
@@ -39,12 +44,33 @@
 Examples:
 1. Query the trace details (spans) of id "321661b1-9a31-4e12-ad64-c8f6711f108d":
 $ swctl trace "321661b1-9a31-4e12-ad64-c8f6711f108d"`,
+	Flags: flags.Flags(flags.DurationFlags),
 	Action: func(ctx *cli.Context) error {
 		if ctx.NArg() == 0 {
 			return fmt.Errorf("command trace without sub command requires 1 trace id as argument")
 		}
 
-		trace, err := trace.Trace(ctx.Context, ctx.Args().First())
+		// if the user has set start or end, then we use the duration
+		var duration *api.Duration
+		start := ctx.String("start")
+		end := ctx.String("end")
+		if start != "" || end != "" {
+			if err := interceptor.DurationInterceptor(ctx); err != nil {
+				return err
+			}
+			step := ctx.Generic("step")
+			coldStage := ctx.Bool("cold")
+			start = ctx.String("start")
+			end = ctx.String("end")
+			duration = &api.Duration{
+				Start:     start,
+				End:       end,
+				Step:      step.(*model.StepEnumValue).Selected,
+				ColdStage: &coldStage,
+			}
+		}
+
+		trace, err := trace.Trace(ctx.Context, duration, ctx.Args().First())
 		if err != nil {
 			return err
 		}
diff --git a/internal/commands/tracev2/list.go b/internal/commands/tracev2/list.go
new file mode 100644
index 0000000..0c1faf0
--- /dev/null
+++ b/internal/commands/tracev2/list.go
@@ -0,0 +1,150 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package tracev2
+
+import (
+	"fmt"
+	"strings"
+
+	api "skywalking.apache.org/repo/goapi/query"
+
+	"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/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/tracev2"
+)
+
+const DefaultPageSize = 15
+
+var ListCommand = &cli.Command{
+	Name:    "list",
+	Aliases: []string{"ls"},
+	Usage:   "Query the monitored traces",
+	UsageText: `Query the monitored traces.
+
+Examples:
+1. Query all monitored traces:
+$ swctl trace-v2 ls
+
+2. Query all monitored traces of service "business-zone::projectB":
+$ swctl trace-v2 ls --service-name "business-zone::projectB"
+
+3. Query all monitored traces of endpoint "/projectB/{value}" of service "business-zone::projectB":
+$ swctl trace-v2 ls --service-name "business-zone::projectB" --endpoint-name "/projectB/{value}"
+
+3. Query the monitored trace of id "321661b1-9a31-4e12-ad64-c8f6711f108d":
+$ swctl trace-v2 ls --trace-id "321661b1-9a31-4e12-ad64-c8f6711f108d"
+
+4. Query the monitored trace of id "321661b1-9a31-4e12-ad64-c8f6711f108d" from cold-stage storage:
+$ swctl trace-v2 ls --trace-id "321661b1-9a31-4e12-ad64-c8f6711f108d" --cold
+`,
+	Flags: flags.Flags(
+		flags.DurationFlags,
+		flags.InstanceFlags,
+		flags.EndpointFlags,
+		[]cli.Flag{
+			&cli.StringFlag{
+				Name:     "trace-id",
+				Usage:    "`id` of the trace",
+				Required: false,
+			},
+			&cli.StringFlag{
+				Name:     "tags",
+				Usage:    "`tags` of the trace, in form of `key=value,key=value`",
+				Required: false,
+			},
+			&cli.StringFlag{
+				Name:  "order",
+				Usage: "`order` of the returned traces, can be `duration` or `startTime`",
+				Value: "duration",
+			},
+		},
+	),
+	Before: interceptor.BeforeChain(
+		interceptor.DurationInterceptor,
+		interceptor.ParseInstance(false),
+		interceptor.ParseEndpoint(false),
+	),
+	Action: func(ctx *cli.Context) error {
+		start := ctx.String("start")
+		end := ctx.String("end")
+		step := ctx.Generic("step")
+		coldStage := ctx.Bool("cold")
+
+		duration := api.Duration{
+			Start:     start,
+			End:       end,
+			Step:      step.(*model.StepEnumValue).Selected,
+			ColdStage: &coldStage,
+		}
+		serviceID := ctx.String("service-id")
+		endpointID := ctx.String("endpoint-id")
+		serviceInstanceID := ctx.String("instance-id")
+		traceID := ctx.String("trace-id")
+		tagStr := ctx.String("tags")
+
+		var tags []*api.SpanTag = nil
+		if tagStr != "" {
+			tagArr := strings.SplitSeq(tagStr, ",")
+			for tag := range tagArr {
+				kv := strings.Split(tag, "=")
+				tags = append(tags, &api.SpanTag{Key: kv[0], Value: &kv[1]})
+			}
+		}
+		pageNum := 1
+
+		paging := api.Pagination{
+			PageNum:  &pageNum,
+			PageSize: DefaultPageSize,
+		}
+
+		var order api.QueryOrder
+		switch orderStr := ctx.String("order"); orderStr {
+		case "duration":
+			order = api.QueryOrderByDuration
+		case "startTime":
+			order = api.QueryOrderByStartTime
+		default:
+			return fmt.Errorf(`invalid order %v, must be one of "duration" or "startTime"`, orderStr)
+		}
+
+		condition := &api.TraceQueryCondition{
+			ServiceID:         &serviceID,
+			ServiceInstanceID: &serviceInstanceID,
+			TraceID:           &traceID,
+			EndpointID:        &endpointID,
+			QueryDuration:     &duration,
+			MinTraceDuration:  nil,
+			MaxTraceDuration:  nil,
+			TraceState:        api.TraceStateAll,
+			QueryOrder:        order,
+			Tags:              tags,
+			Paging:            &paging,
+		}
+		traces, err := tracev2.Traces(ctx.Context, condition)
+		if err != nil {
+			return err
+		}
+
+		return display.Display(ctx.Context, &displayable.Displayable{Data: traces, Condition: condition})
+	},
+}
diff --git a/internal/commands/tracev2/tracev2.go b/internal/commands/tracev2/tracev2.go
new file mode 100644
index 0000000..f826966
--- /dev/null
+++ b/internal/commands/tracev2/tracev2.go
@@ -0,0 +1,29 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package tracev2
+
+import "github.com/urfave/cli/v2"
+
+var Command = &cli.Command{
+	Name:    "trace-v2",
+	Aliases: []string{"tv2"},
+	Usage:   "Trace v2 related sub-command",
+	Subcommands: cli.Commands{
+		ListCommand,
+	},
+}
diff --git a/pkg/display/graph/tree/list.go b/pkg/display/graph/tree/list.go
index daf9dc1..7ff1208 100644
--- a/pkg/display/graph/tree/list.go
+++ b/pkg/display/graph/tree/list.go
@@ -93,7 +93,7 @@
 }
 
 func draw(ctx context.Context, list *widgets.List, tree *widgets.Tree, detail, help *widgets.Paragraph, data api.TraceBrief,
-	_ *api.TraceQueryCondition,
+	condition *api.TraceQueryCondition,
 ) {
 	x, y := ui.TerminalDimensions()
 
@@ -101,7 +101,7 @@
 		showIndex := list.SelectedRow
 		traceID := data.Traces[showIndex].TraceIds[0]
 		list.Title = fmt.Sprintf("[%s]", traceID)
-		nodes, serviceNames := getNodeData(ctx, traceID)
+		nodes, serviceNames := getNodeData(ctx, traceID, condition.QueryDuration)
 		tree.Title = fmt.Sprintf("[%s]", strings.Join(serviceNames, "->"))
 		tree.SetNodes(nodes)
 		list.Rows = rows(data, x/4)
@@ -202,8 +202,8 @@
 	return f
 }
 
-func getNodeData(ctx context.Context, traceID string) (nodes []*widgets.TreeNode, serviceNames []string) {
-	data, err := trace.Trace(ctx, traceID)
+func getNodeData(ctx context.Context, traceID string, duration *api.Duration) (nodes []*widgets.TreeNode, serviceNames []string) {
+	data, err := trace.Trace(ctx, duration, traceID)
 	if err != nil {
 		logger.Log.Fatalln(err)
 	}
diff --git a/pkg/graphql/trace/trace.go b/pkg/graphql/trace/trace.go
index fa6669e..49aac4f 100644
--- a/pkg/graphql/trace/trace.go
+++ b/pkg/graphql/trace/trace.go
@@ -28,28 +28,25 @@
 	"github.com/apache/skywalking-cli/pkg/graphql/client"
 )
 
-func Trace(ctx context.Context, traceID string) (api.Trace, error) {
+func Trace(ctx context.Context, duration *api.Duration, traceID string) (api.Trace, error) {
 	var response map[string]api.Trace
 
-	request := graphql.NewRequest(assets.Read("graphqls/trace/Trace.graphql"))
+	graphQLFile := "graphqls/trace/Trace.graphql"
+	if duration == nil {
+		graphQLFile = "graphqls/trace/TraceWithoutDuration.graphql"
+	}
+
+	request := graphql.NewRequest(assets.Read(graphQLFile))
 	request.Var("traceId", traceID)
+	if duration != nil {
+		request.Var("duration", duration)
+	}
 
 	err := client.ExecuteQuery(ctx, request, &response)
 
 	return response["result"], err
 }
 
-func ColdTrace(ctx context.Context, duration api.Duration, traceID string) (api.Trace, error) {
-	var response map[string]api.Trace
-
-	request := graphql.NewRequest(assets.Read("graphqls/trace/ColdTrace.graphql"))
-	request.Var("traceId", traceID)
-	request.Var("duration", duration)
-	err := client.ExecuteQuery(ctx, request, &response)
-
-	return response["result"], err
-}
-
 func Traces(ctx context.Context, condition *api.TraceQueryCondition) (api.TraceBrief, error) {
 	var response map[string]api.TraceBrief
 
diff --git a/pkg/graphql/tracev2/trace.go b/pkg/graphql/tracev2/trace.go
new file mode 100644
index 0000000..386f3f7
--- /dev/null
+++ b/pkg/graphql/tracev2/trace.go
@@ -0,0 +1,40 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package tracev2
+
+import (
+	"context"
+
+	"github.com/machinebox/graphql"
+
+	api "skywalking.apache.org/repo/goapi/query"
+
+	"github.com/apache/skywalking-cli/assets"
+	"github.com/apache/skywalking-cli/pkg/graphql/client"
+)
+
+func Traces(ctx context.Context, condition *api.TraceQueryCondition) (api.TraceList, error) {
+	var response map[string]api.TraceList
+
+	request := graphql.NewRequest(assets.Read("graphqls/tracev2/Traces.graphql"))
+	request.Var("condition", condition)
+
+	err := client.ExecuteQuery(ctx, request, &response)
+
+	return response["result"], err
+}