diff --git a/frontend/src/container/MetricsApplication/Tabs/External.tsx b/frontend/src/container/MetricsApplication/Tabs/External.tsx index 1d7e69831c..4fd039e979 100644 --- a/frontend/src/container/MetricsApplication/Tabs/External.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/External.tsx @@ -14,7 +14,7 @@ function External({ getWidget }: ExternalProps): JSX.Element { const { resourceAttributePromQLQuery } = useSelector( (state) => state.metrics, ); - const legend = '{{http_url}}'; + const legend = '{{address}}'; return ( <> @@ -28,7 +28,7 @@ function External({ getWidget }: ExternalProps): JSX.Element { fullViewOptions={false} widget={getWidget([ { - query: `max((sum(rate(signoz_external_call_latency_count{service_name="${servicename}", status_code="STATUS_CODE_ERROR"${resourceAttributePromQLQuery}}[5m]) OR rate(signoz_external_call_latency_count{service_name="${servicename}", http_status_code=~"5.."${resourceAttributePromQLQuery}}[5m]) OR vector(0)) by (http_url))*100/sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (http_url)) < 1000 OR vector(0)`, + query: `max((sum(rate(signoz_external_call_latency_count{service_name="${servicename}", status_code="STATUS_CODE_ERROR"${resourceAttributePromQLQuery}}[5m]) OR vector(0)) by (address))*100/sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (address)) < 1000 OR vector(0)`, legend: 'External Call Error Percentage', }, ])} @@ -68,7 +68,7 @@ function External({ getWidget }: ExternalProps): JSX.Element { fullViewOptions={false} widget={getWidget([ { - query: `sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (http_url)`, + query: `sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (address)`, legend, }, ])} @@ -87,7 +87,7 @@ function External({ getWidget }: ExternalProps): JSX.Element { fullViewOptions={false} widget={getWidget([ { - query: `(sum(rate(signoz_external_call_latency_sum{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (http_url))/(sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (http_url))`, + query: `(sum(rate(signoz_external_call_latency_sum{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (address))/(sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (address))`, legend, }, ])} diff --git a/frontend/src/container/Trace/Filters/index.tsx b/frontend/src/container/Trace/Filters/index.tsx index 276b69b227..95f73f4ed9 100644 --- a/frontend/src/container/Trace/Filters/index.tsx +++ b/frontend/src/container/Trace/Filters/index.tsx @@ -9,7 +9,9 @@ export const AllTraceFilterEnum: TraceFilterEnum[] = [ 'serviceName', 'operation', 'component', - 'httpCode', + 'rpcMethod', + 'responseStatusCode', + // 'httpCode', 'httpHost', 'httpMethod', 'httpRoute', diff --git a/frontend/src/container/Trace/TraceGraphFilter/config.ts b/frontend/src/container/Trace/TraceGraphFilter/config.ts index 882ccc2e96..357f22a3ee 100644 --- a/frontend/src/container/Trace/TraceGraphFilter/config.ts +++ b/frontend/src/container/Trace/TraceGraphFilter/config.ts @@ -38,6 +38,14 @@ export const groupBy: Dropdown[] = [ displayValue: 'HTTP status code', key: 'httpCode', }, + { + displayValue: 'RPC Method', + key: 'rpcMethod', + }, + { + displayValue: 'Status Code', + key: 'responseStatusCode', + }, { displayValue: 'Database name', key: 'dbName', diff --git a/frontend/src/store/reducers/trace.ts b/frontend/src/store/reducers/trace.ts index 3f7672cdd5..9b2b837478 100644 --- a/frontend/src/store/reducers/trace.ts +++ b/frontend/src/store/reducers/trace.ts @@ -64,6 +64,8 @@ const initialValue: TraceReducer = { ['httpMethod', INITIAL_FILTER_VALUE], ['httpUrl', INITIAL_FILTER_VALUE], ['operation', INITIAL_FILTER_VALUE], + ['rpcMethod', INITIAL_FILTER_VALUE], + ['responseStatusCode', INITIAL_FILTER_VALUE], ['serviceName', INITIAL_FILTER_VALUE], ['status', INITIAL_FILTER_VALUE], ]), diff --git a/frontend/src/types/reducer/trace.ts b/frontend/src/types/reducer/trace.ts index fc1c08f4fc..fed82dd0be 100644 --- a/frontend/src/types/reducer/trace.ts +++ b/frontend/src/types/reducer/trace.ts @@ -69,7 +69,9 @@ export type TraceFilterEnum = | 'httpUrl' | 'operation' | 'serviceName' - | 'status'; + | 'status' + | 'responseStatusCode' + | 'rpcMethod'; export const AllPanelHeading: { key: TraceFilterEnum; @@ -107,6 +109,14 @@ export const AllPanelHeading: { key: 'operation', displayValue: 'Operation', }, + { + key: 'responseStatusCode', + displayValue: 'Status Code', + }, + { + key: 'rpcMethod', + displayValue: 'RPC Method', + }, { key: 'serviceName', displayValue: 'Service Name', diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index 264dc489f8..fc98f4c250 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -1348,6 +1348,12 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode if len(queryParams.Operation) > 0 { args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args) } + if len(queryParams.RPCMethod) > 0 { + args = buildFilterArrayQuery(ctx, excludeMap, queryParams.RPCMethod, constants.RPCMethod, &query, args) + } + if len(queryParams.ResponseStatusCode) > 0 { + args = buildFilterArrayQuery(ctx, excludeMap, queryParams.ResponseStatusCode, constants.ResponseStatusCode, &query, args) + } if len(queryParams.MinDuration) != 0 { query = query + " AND durationNano >= @durationNanoMin" @@ -1361,16 +1367,18 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode query = getStatusFilters(query, queryParams.Status, excludeMap) traceFilterReponse := model.SpanFiltersResponse{ - Status: map[string]uint64{}, - Duration: map[string]uint64{}, - ServiceName: map[string]uint64{}, - Operation: map[string]uint64{}, - HttpCode: map[string]uint64{}, - HttpMethod: map[string]uint64{}, - HttpUrl: map[string]uint64{}, - HttpRoute: map[string]uint64{}, - HttpHost: map[string]uint64{}, - Component: map[string]uint64{}, + Status: map[string]uint64{}, + Duration: map[string]uint64{}, + ServiceName: map[string]uint64{}, + Operation: map[string]uint64{}, + ResponseStatusCode: map[string]uint64{}, + RPCMethod: map[string]uint64{}, + HttpCode: map[string]uint64{}, + HttpMethod: map[string]uint64{}, + HttpUrl: map[string]uint64{}, + HttpRoute: map[string]uint64{}, + HttpHost: map[string]uint64{}, + Component: map[string]uint64{}, } for _, e := range queryParams.GetFilters { @@ -1571,6 +1579,42 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode if len(dBResponse2) > 0 { traceFilterReponse.Duration["maxDuration"] = dBResponse2[0].NumTotal } + case constants.RPCMethod: + finalQuery := fmt.Sprintf("SELECT rpcMethod, count() as count FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", r.traceDB, r.indexTable) + finalQuery += query + finalQuery += " GROUP BY rpcMethod" + var dBResponse []model.DBResponseRPCMethod + err := r.db.Select(ctx, &dBResponse, finalQuery, args...) + zap.S().Info(finalQuery) + + if err != nil { + zap.S().Debug("Error in processing sql query: ", err) + return nil, &model.ApiError{Typ: model.ErrorExec, Err: fmt.Errorf("error in processing sql query: %s", err)} + } + for _, service := range dBResponse { + if service.RPCMethod != "" { + traceFilterReponse.RPCMethod[service.RPCMethod] = service.Count + } + } + + case constants.ResponseStatusCode: + finalQuery := fmt.Sprintf("SELECT responseStatusCode, count() as count FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", r.traceDB, r.indexTable) + finalQuery += query + finalQuery += " GROUP BY responseStatusCode" + var dBResponse []model.DBResponseStatusCodeMethod + err := r.db.Select(ctx, &dBResponse, finalQuery, args...) + zap.S().Info(finalQuery) + + if err != nil { + zap.S().Debug("Error in processing sql query: ", err) + return nil, &model.ApiError{Typ: model.ErrorExec, Err: fmt.Errorf("error in processing sql query: %s", err)} + } + for _, service := range dBResponse { + if service.ResponseStatusCode != "" { + traceFilterReponse.ResponseStatusCode[service.ResponseStatusCode] = service.Count + } + } + default: return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("filter type: %s not supported", e)} } @@ -1639,6 +1683,14 @@ func (r *ClickHouseReader) GetFilteredSpans(ctx context.Context, queryParams *mo if len(queryParams.Operation) > 0 { args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args) } + if len(queryParams.RPCMethod) > 0 { + args = buildFilterArrayQuery(ctx, excludeMap, queryParams.RPCMethod, constants.RPCMethod, &query, args) + } + + if len(queryParams.ResponseStatusCode) > 0 { + args = buildFilterArrayQuery(ctx, excludeMap, queryParams.ResponseStatusCode, constants.ResponseStatusCode, &query, args) + } + if len(queryParams.MinDuration) != 0 { query = query + " AND durationNano >= @durationNanoMin" args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration)) @@ -1698,17 +1750,17 @@ func (r *ClickHouseReader) GetFilteredSpans(ctx context.Context, queryParams *mo var getFilterSpansResponseItems []model.GetFilterSpansResponseItem - baseQuery := fmt.Sprintf("SELECT timestamp, spanID, traceID, serviceName, name, durationNano, httpCode, gRPCCode, gRPCMethod, httpMethod FROM %s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryTable) + baseQuery := fmt.Sprintf("SELECT timestamp, spanID, traceID, serviceName, name, durationNano, httpCode, gRPCCode, gRPCMethod, httpMethod, rpcMethod, responseStatusCode FROM %s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryTable) baseQuery += query err := r.db.Select(ctx, &getFilterSpansResponseItems, baseQuery, args...) // Fill status and method for i, e := range getFilterSpansResponseItems { - if e.HttpCode == "" { + if e.GRPCode != "" { getFilterSpansResponseItems[i].StatusCode = e.GRPCode } else { getFilterSpansResponseItems[i].StatusCode = e.HttpCode } - if e.HttpMethod == "" { + if e.GRPMethod != "" { getFilterSpansResponseItems[i].Method = e.GRPMethod } else { getFilterSpansResponseItems[i].Method = e.HttpMethod @@ -1821,6 +1873,12 @@ func (r *ClickHouseReader) GetTagFilters(ctx context.Context, queryParams *model if len(queryParams.Operation) > 0 { args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args) } + if len(queryParams.RPCMethod) > 0 { + args = buildFilterArrayQuery(ctx, excludeMap, queryParams.RPCMethod, constants.RPCMethod, &query, args) + } + if len(queryParams.ResponseStatusCode) > 0 { + args = buildFilterArrayQuery(ctx, excludeMap, queryParams.ResponseStatusCode, constants.ResponseStatusCode, &query, args) + } if len(queryParams.MinDuration) != 0 { query = query + " AND durationNano >= @durationNanoMin" args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration)) @@ -2158,6 +2216,11 @@ func (r *ClickHouseReader) GetFilteredSpansAggregates(ctx context.Context, query query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, dbSystem as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable) case constants.Component: query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, component as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable) + case constants.RPCMethod: + query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, rpcMethod as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable) + case constants.ResponseStatusCode: + query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, responseStatusCode as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable) + default: return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("groupBy type: %s not supported", queryParams.GroupBy)} } @@ -2189,6 +2252,12 @@ func (r *ClickHouseReader) GetFilteredSpansAggregates(ctx context.Context, query if len(queryParams.Operation) > 0 { args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args) } + if len(queryParams.RPCMethod) > 0 { + args = buildFilterArrayQuery(ctx, excludeMap, queryParams.RPCMethod, constants.RPCMethod, &query, args) + } + if len(queryParams.ResponseStatusCode) > 0 { + args = buildFilterArrayQuery(ctx, excludeMap, queryParams.ResponseStatusCode, constants.ResponseStatusCode, &query, args) + } if len(queryParams.MinDuration) != 0 { query = query + " AND durationNano >= @durationNanoMin" args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration)) @@ -2237,6 +2306,11 @@ func (r *ClickHouseReader) GetFilteredSpansAggregates(ctx context.Context, query query = query + " GROUP BY time, dbSystem as groupBy ORDER BY time" case constants.Component: query = query + " GROUP BY time, component as groupBy ORDER BY time" + case constants.RPCMethod: + query = query + " GROUP BY time, rpcMethod as groupBy ORDER BY time" + case constants.ResponseStatusCode: + query = query + " GROUP BY time, responseStatusCode as groupBy ORDER BY time" + default: return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("groupBy type: %s not supported", queryParams.GroupBy)} } diff --git a/pkg/query-service/constants/constants.go b/pkg/query-service/constants/constants.go index f74a63c7ff..a04e0f6f8b 100644 --- a/pkg/query-service/constants/constants.go +++ b/pkg/query-service/constants/constants.go @@ -38,33 +38,35 @@ var AmChannelApiPath = GetOrDefaultEnv("ALERTMANAGER_API_CHANNEL_PATH", "v1/rout var RELATIONAL_DATASOURCE_PATH = GetOrDefaultEnv("SIGNOZ_LOCAL_DB_PATH", "/var/lib/signoz/signoz.db") const ( - ServiceName = "serviceName" - HttpRoute = "httpRoute" - HttpCode = "httpCode" - HttpHost = "httpHost" - HttpUrl = "httpUrl" - HttpMethod = "httpMethod" - Component = "component" - OperationDB = "name" - OperationRequest = "operation" - Status = "status" - Duration = "duration" - DBName = "dbName" - DBOperation = "dbOperation" - DBSystem = "dbSystem" - MsgSystem = "msgSystem" - MsgOperation = "msgOperation" - Timestamp = "timestamp" - Descending = "descending" - Ascending = "ascending" - ContextTimeout = 60 // seconds - StatusPending = "pending" - StatusFailed = "failed" - StatusSuccess = "success" - ExceptionType = "exceptionType" - ExceptionCount = "exceptionCount" - LastSeen = "lastSeen" - FirstSeen = "firstSeen" + ServiceName = "serviceName" + HttpRoute = "httpRoute" + HttpCode = "httpCode" + HttpHost = "httpHost" + HttpUrl = "httpUrl" + HttpMethod = "httpMethod" + Component = "component" + OperationDB = "name" + OperationRequest = "operation" + Status = "status" + Duration = "duration" + DBName = "dbName" + DBOperation = "dbOperation" + DBSystem = "dbSystem" + MsgSystem = "msgSystem" + MsgOperation = "msgOperation" + Timestamp = "timestamp" + RPCMethod = "rpcMethod" + ResponseStatusCode = "responseStatusCode" + Descending = "descending" + Ascending = "ascending" + ContextTimeout = 60 // seconds + StatusPending = "pending" + StatusFailed = "failed" + StatusSuccess = "success" + ExceptionType = "exceptionType" + ExceptionCount = "exceptionCount" + LastSeen = "lastSeen" + FirstSeen = "firstSeen" ) const ( SIGNOZ_METRIC_DBNAME = "signoz_metrics" diff --git a/pkg/query-service/model/queryParams.go b/pkg/query-service/model/queryParams.go index 813b62d17f..2b964597ab 100644 --- a/pkg/query-service/model/queryParams.go +++ b/pkg/query-service/model/queryParams.go @@ -181,94 +181,102 @@ type TagQuery struct { } type GetFilteredSpansParams struct { - ServiceName []string `json:"serviceName"` - Operation []string `json:"operation"` - Kind string `json:"kind"` - Status []string `json:"status"` - HttpRoute []string `json:"httpRoute"` - HttpCode []string `json:"httpCode"` - HttpUrl []string `json:"httpUrl"` - HttpHost []string `json:"httpHost"` - HttpMethod []string `json:"httpMethod"` - Component []string `json:"component"` - StartStr string `json:"start"` - EndStr string `json:"end"` - MinDuration string `json:"minDuration"` - MaxDuration string `json:"maxDuration"` - Limit int64 `json:"limit"` - OrderParam string `json:"orderParam"` - Order string `json:"order"` - Offset int64 `json:"offset"` - Tags []TagQuery `json:"tags"` - Exclude []string `json:"exclude"` - Start *time.Time - End *time.Time + ServiceName []string `json:"serviceName"` + Operation []string `json:"operation"` + Kind string `json:"kind"` + Status []string `json:"status"` + HttpRoute []string `json:"httpRoute"` + HttpCode []string `json:"httpCode"` + HttpUrl []string `json:"httpUrl"` + HttpHost []string `json:"httpHost"` + HttpMethod []string `json:"httpMethod"` + Component []string `json:"component"` + RPCMethod []string `json:"rpcMethod"` + ResponseStatusCode []string `json:"responseStatusCode"` + StartStr string `json:"start"` + EndStr string `json:"end"` + MinDuration string `json:"minDuration"` + MaxDuration string `json:"maxDuration"` + Limit int64 `json:"limit"` + OrderParam string `json:"orderParam"` + Order string `json:"order"` + Offset int64 `json:"offset"` + Tags []TagQuery `json:"tags"` + Exclude []string `json:"exclude"` + Start *time.Time + End *time.Time } type GetFilteredSpanAggregatesParams struct { - ServiceName []string `json:"serviceName"` - Operation []string `json:"operation"` - Kind string `json:"kind"` - Status []string `json:"status"` - HttpRoute []string `json:"httpRoute"` - HttpCode []string `json:"httpCode"` - HttpUrl []string `json:"httpUrl"` - HttpHost []string `json:"httpHost"` - HttpMethod []string `json:"httpMethod"` - Component []string `json:"component"` - MinDuration string `json:"minDuration"` - MaxDuration string `json:"maxDuration"` - Tags []TagQuery `json:"tags"` - StartStr string `json:"start"` - EndStr string `json:"end"` - StepSeconds int `json:"step"` - Dimension string `json:"dimension"` - AggregationOption string `json:"aggregationOption"` - GroupBy string `json:"groupBy"` - Function string `json:"function"` - Exclude []string `json:"exclude"` - Start *time.Time - End *time.Time + ServiceName []string `json:"serviceName"` + Operation []string `json:"operation"` + Kind string `json:"kind"` + Status []string `json:"status"` + HttpRoute []string `json:"httpRoute"` + HttpCode []string `json:"httpCode"` + HttpUrl []string `json:"httpUrl"` + HttpHost []string `json:"httpHost"` + HttpMethod []string `json:"httpMethod"` + Component []string `json:"component"` + RPCMethod []string `json:"rpcMethod"` + ResponseStatusCode []string `json:"responseStatusCode"` + MinDuration string `json:"minDuration"` + MaxDuration string `json:"maxDuration"` + Tags []TagQuery `json:"tags"` + StartStr string `json:"start"` + EndStr string `json:"end"` + StepSeconds int `json:"step"` + Dimension string `json:"dimension"` + AggregationOption string `json:"aggregationOption"` + GroupBy string `json:"groupBy"` + Function string `json:"function"` + Exclude []string `json:"exclude"` + Start *time.Time + End *time.Time } type SpanFilterParams struct { - Status []string `json:"status"` - ServiceName []string `json:"serviceName"` - HttpRoute []string `json:"httpRoute"` - HttpCode []string `json:"httpCode"` - HttpUrl []string `json:"httpUrl"` - HttpHost []string `json:"httpHost"` - HttpMethod []string `json:"httpMethod"` - Component []string `json:"component"` - Operation []string `json:"operation"` - GetFilters []string `json:"getFilters"` - Exclude []string `json:"exclude"` - MinDuration string `json:"minDuration"` - MaxDuration string `json:"maxDuration"` - StartStr string `json:"start"` - EndStr string `json:"end"` - Start *time.Time - End *time.Time + Status []string `json:"status"` + ServiceName []string `json:"serviceName"` + HttpRoute []string `json:"httpRoute"` + HttpCode []string `json:"httpCode"` + HttpUrl []string `json:"httpUrl"` + HttpHost []string `json:"httpHost"` + HttpMethod []string `json:"httpMethod"` + Component []string `json:"component"` + Operation []string `json:"operation"` + RPCMethod []string `json:"rpcMethod"` + ResponseStatusCode []string `json:"responseStatusCode"` + GetFilters []string `json:"getFilters"` + Exclude []string `json:"exclude"` + MinDuration string `json:"minDuration"` + MaxDuration string `json:"maxDuration"` + StartStr string `json:"start"` + EndStr string `json:"end"` + Start *time.Time + End *time.Time } type TagFilterParams struct { - Status []string `json:"status"` - ServiceName []string `json:"serviceName"` - HttpRoute []string `json:"httpRoute"` - HttpCode []string `json:"httpCode"` - HttpUrl []string `json:"httpUrl"` - HttpHost []string `json:"httpHost"` - HttpMethod []string `json:"httpMethod"` - Component []string `json:"component"` - Operation []string `json:"operation"` - Exclude []string `json:"exclude"` - MinDuration string `json:"minDuration"` - MaxDuration string `json:"maxDuration"` - StartStr string `json:"start"` - EndStr string `json:"end"` - TagKey string `json:"tagKey"` - Start *time.Time - End *time.Time + Status []string `json:"status"` + ServiceName []string `json:"serviceName"` + HttpRoute []string `json:"httpRoute"` + HttpCode []string `json:"httpCode"` + HttpUrl []string `json:"httpUrl"` + HttpHost []string `json:"httpHost"` + HttpMethod []string `json:"httpMethod"` + Component []string `json:"component"` + Operation []string `json:"operation"` + RPCMethod []string `json:"rpcMethod"` + ResponseStatusCode []string `json:"responseStatusCode"` + Exclude []string `json:"exclude"` + MinDuration string `json:"minDuration"` + MaxDuration string `json:"maxDuration"` + StartStr string `json:"start"` + EndStr string `json:"end"` + TagKey string `json:"tagKey"` + Start *time.Time + End *time.Time } type TTLParams struct { diff --git a/pkg/query-service/model/response.go b/pkg/query-service/model/response.go index 8c9dfad572..0bdaf02dc7 100644 --- a/pkg/query-service/model/response.go +++ b/pkg/query-service/model/response.go @@ -118,18 +118,20 @@ type SearchSpansResult struct { } type GetFilterSpansResponseItem struct { - Timestamp time.Time `ch:"timestamp" json:"timestamp"` - SpanID string `ch:"spanID" json:"spanID"` - TraceID string `ch:"traceID" json:"traceID"` - ServiceName string `ch:"serviceName" json:"serviceName"` - Operation string `ch:"name" json:"operation"` - DurationNano uint64 `ch:"durationNano" json:"durationNano"` - HttpCode string `ch:"httpCode"` - HttpMethod string `ch:"httpMethod"` - GRPCode string `ch:"gRPCCode"` - GRPMethod string `ch:"gRPCMethod"` - StatusCode string `json:"statusCode"` - Method string `json:"method"` + Timestamp time.Time `ch:"timestamp" json:"timestamp"` + SpanID string `ch:"spanID" json:"spanID"` + TraceID string `ch:"traceID" json:"traceID"` + ServiceName string `ch:"serviceName" json:"serviceName"` + Operation string `ch:"name" json:"operation"` + DurationNano uint64 `ch:"durationNano" json:"durationNano"` + HttpCode string `ch:"httpCode"` + HttpMethod string `ch:"httpMethod"` + GRPCode string `ch:"gRPCCode"` + GRPMethod string `ch:"gRPCMethod"` + StatusCode string `json:"statusCode"` + Method string `json:"method"` + ResponseStatusCode string `ch:"responseStatusCode"` + RPCMethod string `ch:"rpcMethod"` } type GetFilterSpansResponse struct { @@ -303,6 +305,16 @@ type DBResponseHttpMethod struct { Count uint64 `ch:"count"` } +type DBResponseStatusCodeMethod struct { + ResponseStatusCode string `ch:"responseStatusCode"` + Count uint64 `ch:"count"` +} + +type DBResponseRPCMethod struct { + RPCMethod string `ch:"rpcMethod"` + Count uint64 `ch:"count"` +} + type DBResponseHttpHost struct { HttpHost string `ch:"httpHost"` Count uint64 `ch:"count"` @@ -323,16 +335,18 @@ type DBResponseTotal struct { } type SpanFiltersResponse struct { - ServiceName map[string]uint64 `json:"serviceName"` - Status map[string]uint64 `json:"status"` - Duration map[string]uint64 `json:"duration"` - Operation map[string]uint64 `json:"operation"` - HttpCode map[string]uint64 `json:"httpCode"` - HttpUrl map[string]uint64 `json:"httpUrl"` - HttpMethod map[string]uint64 `json:"httpMethod"` - HttpRoute map[string]uint64 `json:"httpRoute"` - HttpHost map[string]uint64 `json:"httpHost"` - Component map[string]uint64 `json:"component"` + ServiceName map[string]uint64 `json:"serviceName"` + Status map[string]uint64 `json:"status"` + Duration map[string]uint64 `json:"duration"` + Operation map[string]uint64 `json:"operation"` + HttpCode map[string]uint64 `json:"httpCode"` + ResponseStatusCode map[string]uint64 `json:"responseStatusCode"` + RPCMethod map[string]uint64 `json:"rpcMethod"` + HttpUrl map[string]uint64 `json:"httpUrl"` + HttpMethod map[string]uint64 `json:"httpMethod"` + HttpRoute map[string]uint64 `json:"httpRoute"` + HttpHost map[string]uint64 `json:"httpHost"` + Component map[string]uint64 `json:"component"` } type Error struct { ExceptionType string `json:"exceptionType" ch:"exceptionType"`