This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/skywalking-cli.git
The following commit(s) were added to refs/heads/master by this push: new f3eed66 Support sub-commands for the cross-thread trace profiling (#178) f3eed66 is described below commit f3eed66ee2ff330e3218fdc995b6f9952901e37c Author: mrproliu <741550...@qq.com> AuthorDate: Wed Mar 15 12:58:33 2023 +0800 Support sub-commands for the cross-thread trace profiling (#178) --- CHANGES.md | 1 + ...t.graphql => GetSegmentsProfileAnalyze.graphql} | 18 ++++---- ...Analyze.graphql => GetTaskSegmentsList.graphql} | 44 +++++++++++++----- .../commands/profiling/trace/getProfileAnalyze.go | 24 +++++++--- .../commands/profiling/trace/getProfiledSegment.go | 53 ---------------------- .../commands/profiling/trace/getTaskSegmentList.go | 6 +-- internal/commands/profiling/trace/trace.go | 1 - pkg/graphql/profiling/trace.go | 24 +++------- 8 files changed, 69 insertions(+), 102 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3b39d1d..2d6cf7d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -38,6 +38,7 @@ Release Notes. * Adapt the sub-command `metrics` for deprecate scope fron entity by @mrproliu in https://github.com/apache/skywalking-cli/pull/173 * Add components in topology related sub-commands. @mrproliu in https://github.com/apache/skywalking-cli/pull/175 * Add the sub-command `metrics nullable` for query the nullable metrics value. @mrproliu in https://github.com/apache/skywalking-cli/pull/176 +* Adapt the sub-command `profiling trace` for adapt the new trace profiling protocol. @mrproliu in https://github.com/apache/skywalking-cli/pull/177 0.10.0 ------------------ diff --git a/assets/graphqls/profiling/trace/GetTaskSegmentList.graphql b/assets/graphqls/profiling/trace/GetSegmentsProfileAnalyze.graphql similarity index 75% rename from assets/graphqls/profiling/trace/GetTaskSegmentList.graphql rename to assets/graphqls/profiling/trace/GetSegmentsProfileAnalyze.graphql index 9d4e474..b25adb4 100644 --- a/assets/graphqls/profiling/trace/GetTaskSegmentList.graphql +++ b/assets/graphqls/profiling/trace/GetSegmentsProfileAnalyze.graphql @@ -15,13 +15,13 @@ # specific language governing permissions and limitations # under the License. -query ($taskId: String!) { - result: getProfileTaskSegmentList(taskID: $taskId) { - segmentId - endpointNames - duration - start - isError - traceIds +query ($queries: [SegmentProfileAnalyzeQuery!]!) { + result: getSegmentsProfileAnalyze(queries: $queries) { + tip + trees { + elements { + id parentId codeSignature duration durationChildExcluded count + } + } } -} \ No newline at end of file +} diff --git a/assets/graphqls/profiling/trace/GetProfileAnalyze.graphql b/assets/graphqls/profiling/trace/GetTaskSegmentsList.graphql similarity index 53% rename from assets/graphqls/profiling/trace/GetProfileAnalyze.graphql rename to assets/graphqls/profiling/trace/GetTaskSegmentsList.graphql index a89d410..a0120e1 100644 --- a/assets/graphqls/profiling/trace/GetProfileAnalyze.graphql +++ b/assets/graphqls/profiling/trace/GetTaskSegmentsList.graphql @@ -15,17 +15,39 @@ # specific language governing permissions and limitations # under the License. -query ($segmentId: String!, $timeRanges: [ProfileAnalyzeTimeRange!]!) { - result: getProfileAnalyze(segmentId: $segmentId, timeRanges: $timeRanges) { - trees { - elements { - id - parentId - codeSignature - duration - durationChildExcluded - count +query ($taskId: ID!) { + result: getProfileTaskSegments(taskID: $taskId) { + traceId + instanceId + instanceName + endpointNames + duration + start + spans { + spanId + parentSpanId + segmentId + refs { + traceId parentSegmentId parentSpanId type } + serviceCode + serviceInstanceName + startTime + endTime + endpointName + type + peer + component + isError + layer + tags { + key value + } + logs { + time + data { key value } + } + profiled } } -} +} \ No newline at end of file diff --git a/internal/commands/profiling/trace/getProfileAnalyze.go b/internal/commands/profiling/trace/getProfileAnalyze.go index cff937a..676e59e 100644 --- a/internal/commands/profiling/trace/getProfileAnalyze.go +++ b/internal/commands/profiling/trace/getProfileAnalyze.go @@ -37,8 +37,8 @@ var getProfiledAnalyzeCommand = &cli.Command{ ArgsUsage: "[parameters...]", Flags: []cli.Flag{ &cli.StringFlag{ - Name: "segment-id", - Usage: "profiled segment id.", + Name: "segment-ids", + Usage: "profiled segment ids, multiple id split by ',': s1,s2", }, &cli.StringFlag{ Name: "time-ranges", @@ -46,10 +46,11 @@ var getProfiledAnalyzeCommand = &cli.Command{ }, }, Action: func(ctx *cli.Context) error { - segmentID := ctx.String("segment-id") + segmentIDs := ctx.String("segment-ids") + segmentIDList := strings.Split(segmentIDs, ",") tagStr := ctx.String("time-ranges") - var timeRanges []*api.ProfileAnalyzeTimeRange = nil + var queries []*api.SegmentProfileAnalyzeQuery = nil if tagStr != "" { tagArr := strings.Split(tagStr, ",") for _, tag := range tagArr { @@ -62,16 +63,25 @@ var getProfiledAnalyzeCommand = &cli.Command{ if err != nil { return err } - timeRanges = append(timeRanges, &api.ProfileAnalyzeTimeRange{Start: start, End: end}) + + // adding time range to each segments + for _, segmentID := range segmentIDList { + queries = append(queries, &api.SegmentProfileAnalyzeQuery{ + SegmentID: segmentID, + TimeRange: &api.ProfileAnalyzeTimeRange{ + Start: start, End: end, + }, + }) + } } } - analysis, err := profiling.GetTraceProfilingAnalyze(ctx, segmentID, timeRanges) + analysis, err := profiling.GetTraceProfilingAnalyze(ctx, queries) if err != nil { return err } - return display.Display(ctx, &displayable.Displayable{Data: analysis, Condition: segmentID}) + return display.Display(ctx, &displayable.Displayable{Data: analysis, Condition: segmentIDs}) }, } diff --git a/internal/commands/profiling/trace/getProfiledSegment.go b/internal/commands/profiling/trace/getProfiledSegment.go deleted file mode 100644 index b6a363a..0000000 --- a/internal/commands/profiling/trace/getProfiledSegment.go +++ /dev/null @@ -1,53 +0,0 @@ -// Licensed to Apache Software Foundation (ASF) under one or more contributor -// license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright -// ownership. Apache Software Foundation (ASF) licenses this file to you under -// the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package trace - -import ( - "github.com/apache/skywalking-cli/pkg/display" - "github.com/apache/skywalking-cli/pkg/display/displayable" - "github.com/apache/skywalking-cli/pkg/graphql/profiling" - - "github.com/urfave/cli/v2" -) - -var getProfiledSegmentCommand = &cli.Command{ - Name: "profiled-segment", - Aliases: []string{"ps"}, - Usage: "Analyze profiled segment with time ranges", - UsageText: `Analyze profiled segment with time ranges. - -Examples: -1. Analyze profiled segment with time ranges. -$ swctl profiling trace profiled-segment --segment-id=<segment-id>`, - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "segment-id", - Usage: "profiled segment id.", - }, - }, - Action: func(ctx *cli.Context) error { - segmentID := ctx.String("segment-id") - segment, err := profiling.GetTraceProfilingSegment(ctx, segmentID) - - if err != nil { - return err - } - - return display.Display(ctx, &displayable.Displayable{Data: segment, Condition: segmentID}) - }, -} diff --git a/internal/commands/profiling/trace/getTaskSegmentList.go b/internal/commands/profiling/trace/getTaskSegmentList.go index b0ce7e1..58b78dd 100644 --- a/internal/commands/profiling/trace/getTaskSegmentList.go +++ b/internal/commands/profiling/trace/getTaskSegmentList.go @@ -28,11 +28,11 @@ import ( var getTaskSegmentListCommand = &cli.Command{ Name: "segment-list", Aliases: []string{"sl"}, - Usage: "Query profiling trace task segment list", - UsageText: `Query profiling trace task segment list + Usage: "Query profiling trace task segments list", + UsageText: `Query profiling trace task segments list Examples: -1. Query profiled segment list +1. Query profiled segments list $ swctl profiling trace segment-list --service-name=service-name --endpoint-name=endpoint`, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/internal/commands/profiling/trace/trace.go b/internal/commands/profiling/trace/trace.go index e26b308..5c0df87 100644 --- a/internal/commands/profiling/trace/trace.go +++ b/internal/commands/profiling/trace/trace.go @@ -33,7 +33,6 @@ on https://github.com/apache/skywalking/blob/master/docs/en/guides/backend-profi getTaskListCommand, getTaskLogListCommand, getTaskSegmentListCommand, - getProfiledSegmentCommand, getProfiledAnalyzeCommand, }, } diff --git a/pkg/graphql/profiling/trace.go b/pkg/graphql/profiling/trace.go index 6e78ce5..a1e0b47 100644 --- a/pkg/graphql/profiling/trace.go +++ b/pkg/graphql/profiling/trace.go @@ -62,10 +62,10 @@ func GetTraceProfilingTaskLogList(ctx *cli.Context, taskID string) ([]*api.Profi return response["result"], err } -func GetTraceProfilingTaskSegmentList(ctx *cli.Context, taskID string) ([]*api.BasicTrace, error) { - var response map[string][]*api.BasicTrace +func GetTraceProfilingTaskSegmentList(ctx *cli.Context, taskID string) ([]*api.ProfiledTraceSegments, error) { + var response map[string][]*api.ProfiledTraceSegments - request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetTaskSegmentList.graphql")) + request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetTaskSegmentsList.graphql")) request.Var("taskId", taskID) err := client.ExecuteQuery(ctx, request, &response) @@ -73,23 +73,11 @@ func GetTraceProfilingTaskSegmentList(ctx *cli.Context, taskID string) ([]*api.B return response["result"], err } -func GetTraceProfilingSegment(ctx *cli.Context, segmentID string) (api.ProfiledSegment, error) { - var response map[string]api.ProfiledSegment - - request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetProfiledSegment.graphql")) - request.Var("segmentId", segmentID) - - err := client.ExecuteQuery(ctx, request, &response) - - return response["result"], err -} - -func GetTraceProfilingAnalyze(ctx *cli.Context, segmentID string, timeRanges []*api.ProfileAnalyzeTimeRange) (api.ProfileAnalyzation, error) { +func GetTraceProfilingAnalyze(ctx *cli.Context, queries []*api.SegmentProfileAnalyzeQuery) (api.ProfileAnalyzation, error) { var response map[string]api.ProfileAnalyzation - request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetProfileAnalyze.graphql")) - request.Var("segmentId", segmentID) - request.Var("timeRanges", timeRanges) + request := graphql.NewRequest(assets.Read("graphqls/profiling/trace/GetSegmentsProfileAnalyze.graphql")) + request.Var("queries", queries) err := client.ExecuteQuery(ctx, request, &response)