Merge pull request #756 from SigNoz/feat/addHasErrorColumn

feat: add hasError tag in searchTraces response
This commit is contained in:
Ankit Nayan 2022-02-25 14:07:47 +05:30 committed by GitHub
commit 61fb11a232
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 8 deletions

View File

@ -1537,7 +1537,7 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode
} }
} }
case "status": case "status":
finalQuery := fmt.Sprintf("SELECT COUNT(*) as numErrors FROM %s WHERE timestamp >= ? AND timestamp <= ? AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))", r.indexTable) finalQuery := fmt.Sprintf("SELECT COUNT(*) as numErrors FROM %s WHERE timestamp >= ? AND timestamp <= ? AND hasError = 1", r.indexTable)
finalQuery += query finalQuery += query
var dBResponse []model.DBResponseErrors var dBResponse []model.DBResponseErrors
err := r.db.Select(&dBResponse, finalQuery, args...) err := r.db.Select(&dBResponse, finalQuery, args...)
@ -1582,16 +1582,16 @@ func getStatusFilters(query string, statusParams []string, excludeMap map[string
if _, ok := excludeMap["status"]; ok { if _, ok := excludeMap["status"]; ok {
if len(statusParams) == 1 { if len(statusParams) == 1 {
if statusParams[0] == "error" { if statusParams[0] == "error" {
query += " AND ((NOT ( has(tags, 'error:true')) AND statusCode<500 AND statusCode!=2))" query += " AND hasError = 0"
} else if statusParams[0] == "ok" { } else if statusParams[0] == "ok" {
query += " AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))" query += " AND hasError = 1"
} }
} }
} else if len(statusParams) == 1 { } else if len(statusParams) == 1 {
if statusParams[0] == "error" { if statusParams[0] == "error" {
query += " AND ( ( has(tags, 'error:true') OR statusCode>=500 OR statusCode=2))" query += " AND hasError = 1"
} else if statusParams[0] == "ok" { } else if statusParams[0] == "ok" {
query += " AND ((NOT ( has(tags, 'error:true')) AND statusCode<500 AND statusCode!=2))" query += " AND hasError = 0"
} }
} }
return query return query
@ -2093,7 +2093,7 @@ func (r *ClickHouseReader) SearchTraces(ctx context.Context, traceId string) (*[
var searchScanReponses []model.SearchSpanReponseItem var searchScanReponses []model.SearchSpanReponseItem
query := fmt.Sprintf("SELECT timestamp, spanID, traceID, serviceName, name, kind, durationNano, tagsKeys, tagsValues, references, events FROM %s WHERE traceID=?", r.indexTable) query := fmt.Sprintf("SELECT timestamp, spanID, traceID, serviceName, name, kind, durationNano, tagsKeys, tagsValues, references, events, hasError FROM %s WHERE traceID=?", r.indexTable)
err := r.db.Select(&searchScanReponses, query, traceId) err := r.db.Select(&searchScanReponses, query, traceId)
@ -2106,7 +2106,7 @@ func (r *ClickHouseReader) SearchTraces(ctx context.Context, traceId string) (*[
searchSpansResult := []model.SearchSpansResult{ searchSpansResult := []model.SearchSpansResult{
model.SearchSpansResult{ model.SearchSpansResult{
Columns: []string{"__time", "SpanId", "TraceId", "ServiceName", "Name", "Kind", "DurationNano", "TagsKeys", "TagsValues", "References", "Events"}, Columns: []string{"__time", "SpanId", "TraceId", "ServiceName", "Name", "Kind", "DurationNano", "TagsKeys", "TagsValues", "References", "Events", "HasError"},
Events: make([][]interface{}, len(searchScanReponses)), Events: make([][]interface{}, len(searchScanReponses)),
}, },
} }

View File

@ -179,6 +179,7 @@ type SearchSpanReponseItem struct {
TagsKeys []string `db:"tagsKeys"` TagsKeys []string `db:"tagsKeys"`
TagsValues []string `db:"tagsValues"` TagsValues []string `db:"tagsValues"`
Events []string `db:"events"` Events []string `db:"events"`
HasError int32 `db:"hasError"`
} }
type OtelSpanRef struct { type OtelSpanRef struct {
@ -214,7 +215,7 @@ func (item *SearchSpanReponseItem) GetValues() []interface{} {
} }
} }
returnArray := []interface{}{int64(timeObj.UnixNano() / 1000000), item.SpanID, item.TraceID, item.ServiceName, item.Name, strconv.Itoa(int(item.Kind)), strconv.FormatInt(item.DurationNano, 10), item.TagsKeys, item.TagsValues, referencesStringArray, errorEvent} returnArray := []interface{}{int64(timeObj.UnixNano() / 1000000), item.SpanID, item.TraceID, item.ServiceName, item.Name, strconv.Itoa(int(item.Kind)), strconv.FormatInt(item.DurationNano, 10), item.TagsKeys, item.TagsValues, referencesStringArray, errorEvent, item.HasError}
return returnArray return returnArray
} }