fix: exclude added for status field (#681)

* fix: exclude added for status field

* chore: extracted status filtering to a function
This commit is contained in:
Ankit Nayan 2022-02-08 13:28:56 +05:30 committed by GitHub
parent cd04a39d3d
commit c1d4dc2ad6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1394,14 +1394,7 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode
args = append(args, queryParams.MaxDuration) args = append(args, queryParams.MaxDuration)
} }
// status can only be two and if both are selected than they are equivalent to none selected query = getStatusFilters(query, queryParams.Status, excludeMap)
if len(queryParams.Status) == 1 {
if queryParams.Status[0] == "error" {
query += " AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))"
} else if queryParams.Status[0] == "ok" {
query += " AND ((NOT ( has(tags, 'error:true')) AND statusCode<500 AND statusCode!=2))"
}
}
traceFilterReponse := model.SpanFiltersResponse{ traceFilterReponse := model.SpanFiltersResponse{
Status: map[string]int{}, Status: map[string]int{},
@ -1579,6 +1572,27 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode
return &traceFilterReponse, nil return &traceFilterReponse, nil
} }
func getStatusFilters(query string, statusParams []string, excludeMap map[string]struct{}) string {
// status can only be two and if both are selected than they are equivalent to none selected
if _, ok := excludeMap["status"]; ok {
if len(statusParams) == 1 {
if statusParams[0] == "error" {
query += " AND ((NOT ( has(tags, 'error:true')) AND statusCode<500 AND statusCode!=2))"
} else if statusParams[0] == "ok" {
query += " AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))"
}
}
} else if len(statusParams) == 1 {
if statusParams[0] == "error" {
query += " AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))"
} else if statusParams[0] == "ok" {
query += " AND ((NOT ( has(tags, 'error:true')) AND statusCode<500 AND statusCode!=2))"
}
}
return query
}
func (r *ClickHouseReader) GetFilteredSpans(ctx context.Context, queryParams *model.GetFilteredSpansParams) (*model.GetFilterSpansResponse, *model.ApiError) { func (r *ClickHouseReader) GetFilteredSpans(ctx context.Context, queryParams *model.GetFilteredSpansParams) (*model.GetFilterSpansResponse, *model.ApiError) {
baseQuery := fmt.Sprintf("SELECT timestamp, spanID, traceID, serviceName, name, durationNano, httpCode, httpMethod FROM %s WHERE timestamp >= ? AND timestamp <= ?", r.indexTable) baseQuery := fmt.Sprintf("SELECT timestamp, spanID, traceID, serviceName, name, durationNano, httpCode, httpMethod FROM %s WHERE timestamp >= ? AND timestamp <= ?", r.indexTable)
@ -1622,14 +1636,8 @@ func (r *ClickHouseReader) GetFilteredSpans(ctx context.Context, queryParams *mo
query = query + " AND durationNano <= ?" query = query + " AND durationNano <= ?"
args = append(args, queryParams.MaxDuration) args = append(args, queryParams.MaxDuration)
} }
// status can only be two and if both are selected than they are equivalent to none selected query = getStatusFilters(query, queryParams.Status, excludeMap)
if len(queryParams.Status) == 1 {
if queryParams.Status[0] == "error" {
query += " AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))"
} else if queryParams.Status[0] == "ok" {
query += " AND ((NOT ( has(tags, 'error:true')) AND statusCode<500 AND statusCode!=2))"
}
}
if len(queryParams.Kind) != 0 { if len(queryParams.Kind) != 0 {
query = query + " AND kind = ?" query = query + " AND kind = ?"
args = append(args, queryParams.Kind) args = append(args, queryParams.Kind)
@ -1775,14 +1783,9 @@ func (r *ClickHouseReader) GetTagFilters(ctx context.Context, queryParams *model
query = query + " AND durationNano <= ?" query = query + " AND durationNano <= ?"
args = append(args, queryParams.MaxDuration) args = append(args, queryParams.MaxDuration)
} }
// status can only be two and if both are selected than they are equivalent to none selected
if len(queryParams.Status) == 1 { query = getStatusFilters(query, queryParams.Status, excludeMap)
if queryParams.Status[0] == "error" {
query += " AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))"
} else if queryParams.Status[0] == "ok" {
query += " AND ((NOT ( has(tags, 'error:true')) AND statusCode<500 AND statusCode!=2))"
}
}
tagFilters := []model.TagFilters{} tagFilters := []model.TagFilters{}
finalQuery := fmt.Sprintf(`SELECT DISTINCT arrayJoin(tagsKeys) as tagKeys FROM %s WHERE timestamp >= ? AND timestamp <= ?`, r.indexTable) finalQuery := fmt.Sprintf(`SELECT DISTINCT arrayJoin(tagsKeys) as tagKeys FROM %s WHERE timestamp >= ? AND timestamp <= ?`, r.indexTable)
@ -2359,14 +2362,7 @@ func (r *ClickHouseReader) GetFilteredSpansAggregates(ctx context.Context, query
query = query + " AND durationNano <= ?" query = query + " AND durationNano <= ?"
args = append(args, queryParams.MaxDuration) args = append(args, queryParams.MaxDuration)
} }
// status can only be two and if both are selected than they are equivalent to none selected query = getStatusFilters(query, queryParams.Status, excludeMap)
if len(queryParams.Status) == 1 {
if queryParams.Status[0] == "error" {
query += " AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))"
} else if queryParams.Status[0] == "ok" {
query += " AND ((NOT ( has(tags, 'error:true')) AND statusCode<500 AND statusCode!=2))"
}
}
if len(queryParams.Kind) != 0 { if len(queryParams.Kind) != 0 {
query = query + " AND kind = ?" query = query + " AND kind = ?"
args = append(args, queryParams.Kind) args = append(args, queryParams.Kind)