diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index 25b2792939..d8c902055b 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -1924,6 +1924,7 @@ func (r *ClickHouseReader) SearchTraces(ctx context.Context, params *model.Searc telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_TRACE_DETAIL_API, data, userEmail, true, false) } + var startTime, endTime, durationNano uint64 var searchScanResponses []model.SearchSpanDBResponseItem query := fmt.Sprintf("SELECT timestamp, traceID, model FROM %s.%s WHERE traceID=$1", r.TraceDB, r.SpansTable) @@ -1954,6 +1955,15 @@ func (r *ClickHouseReader) SearchTraces(ctx context.Context, params *model.Searc easyjson.Unmarshal([]byte(item.Model), &jsonItem) jsonItem.TimeUnixNano = uint64(item.Timestamp.UnixNano() / 1000000) searchSpanResponses = append(searchSpanResponses, jsonItem) + if startTime == 0 || jsonItem.TimeUnixNano < startTime { + startTime = jsonItem.TimeUnixNano + } + if endTime == 0 || jsonItem.TimeUnixNano > endTime { + endTime = jsonItem.TimeUnixNano + } + if durationNano == 0 || uint64(jsonItem.DurationNano) > durationNano { + durationNano = uint64(jsonItem.DurationNano) + } } end = time.Now() zap.L().Debug("getTraceSQLQuery unmarshal took: ", zap.Duration("duration", end.Sub(start))) @@ -1983,6 +1993,9 @@ func (r *ClickHouseReader) SearchTraces(ctx context.Context, params *model.Searc } } + searchSpansResult[0].StartTimestampMillis = startTime - durationNano + searchSpansResult[0].EndTimestampMillis = endTime + durationNano + return &searchSpansResult, nil } diff --git a/pkg/query-service/model/response.go b/pkg/query-service/model/response.go index 7a3d948ebb..5ad5ea54ef 100644 --- a/pkg/query-service/model/response.go +++ b/pkg/query-service/model/response.go @@ -212,9 +212,11 @@ type ServiceOverviewItem struct { } type SearchSpansResult struct { - Columns []string `json:"columns"` - Events [][]interface{} `json:"events"` - IsSubTree bool `json:"isSubTree"` + StartTimestampMillis uint64 `json:"startTimestampMillis"` + EndTimestampMillis uint64 `json:"endTimestampMillis"` + Columns []string `json:"columns"` + Events [][]interface{} `json:"events"` + IsSubTree bool `json:"isSubTree"` } type GetFilterSpansResponseItem struct {