mirror of
https://github.com/SigNoz/signoz.git
synced 2025-12-18 16:07:10 +00:00
fix: fetch only required traces fields (#8351)
* fix: fetch only required traces fields * fix: remove only logs case in field name * fix: add extra if condition for logs json field names * fix: tests
This commit is contained in:
parent
a4b852bb99
commit
899a6ab70a
@ -3989,13 +3989,13 @@ func (r *ClickHouseReader) GetTraceAttributeValues(ctx context.Context, req *v3.
|
|||||||
return &attributeValues, nil
|
return &attributeValues, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ClickHouseReader) GetSpanAttributeKeys(ctx context.Context) (map[string]v3.AttributeKey, error) {
|
func (r *ClickHouseReader) GetSpanAttributeKeysByNames(ctx context.Context, names []string) (map[string]v3.AttributeKey, error) {
|
||||||
var query string
|
var query string
|
||||||
var err error
|
var err error
|
||||||
var rows driver.Rows
|
var rows driver.Rows
|
||||||
response := map[string]v3.AttributeKey{}
|
response := map[string]v3.AttributeKey{}
|
||||||
|
|
||||||
query = fmt.Sprintf("SELECT DISTINCT(tagKey), tagType, dataType FROM %s.%s", r.TraceDB, r.spanAttributesKeysTable)
|
query = fmt.Sprintf("SELECT DISTINCT(tagKey), tagType, dataType FROM %s.%s where tagKey in ('%s')", r.TraceDB, r.spanAttributesKeysTable, strings.Join(names, "','"))
|
||||||
|
|
||||||
rows, err = r.db.Query(ctx, query)
|
rows, err = r.db.Query(ctx, query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@ -966,7 +966,7 @@ func (aH *APIHandler) metaForLinks(ctx context.Context, rule *ruletypes.Gettable
|
|||||||
zap.L().Error("failed to get log fields using empty keys; the link might not work as expected", zap.Error(err))
|
zap.L().Error("failed to get log fields using empty keys; the link might not work as expected", zap.Error(err))
|
||||||
}
|
}
|
||||||
} else if rule.AlertType == ruletypes.AlertTypeTraces {
|
} else if rule.AlertType == ruletypes.AlertTypeTraces {
|
||||||
traceFields, err := aH.reader.GetSpanAttributeKeys(ctx)
|
traceFields, err := aH.reader.GetSpanAttributeKeysByNames(ctx, logsv3.GetFieldNames(rule.PostableRule.RuleCondition.CompositeQuery))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
keys = traceFields
|
keys = traceFields
|
||||||
} else {
|
} else {
|
||||||
@ -4345,7 +4345,7 @@ func (aH *APIHandler) getSpanKeysV3(ctx context.Context, queryRangeParams *v3.Qu
|
|||||||
data := map[string]v3.AttributeKey{}
|
data := map[string]v3.AttributeKey{}
|
||||||
for _, query := range queryRangeParams.CompositeQuery.BuilderQueries {
|
for _, query := range queryRangeParams.CompositeQuery.BuilderQueries {
|
||||||
if query.DataSource == v3.DataSourceTraces {
|
if query.DataSource == v3.DataSourceTraces {
|
||||||
spanKeys, err := aH.reader.GetSpanAttributeKeys(ctx)
|
spanKeys, err := aH.reader.GetSpanAttributeKeysByNames(ctx, logsv3.GetFieldNames(queryRangeParams.CompositeQuery))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -4389,8 +4389,18 @@ func (aH *APIHandler) queryRangeV3(ctx context.Context, queryRangeParams *v3.Que
|
|||||||
var errQuriesByName map[string]error
|
var errQuriesByName map[string]error
|
||||||
var spanKeys map[string]v3.AttributeKey
|
var spanKeys map[string]v3.AttributeKey
|
||||||
if queryRangeParams.CompositeQuery.QueryType == v3.QueryTypeBuilder {
|
if queryRangeParams.CompositeQuery.QueryType == v3.QueryTypeBuilder {
|
||||||
|
hasLogsQuery := false
|
||||||
|
hasTracesQuery := false
|
||||||
|
for _, query := range queryRangeParams.CompositeQuery.BuilderQueries {
|
||||||
|
if query.DataSource == v3.DataSourceLogs {
|
||||||
|
hasLogsQuery = true
|
||||||
|
}
|
||||||
|
if query.DataSource == v3.DataSourceTraces {
|
||||||
|
hasTracesQuery = true
|
||||||
|
}
|
||||||
|
}
|
||||||
// check if any enrichment is required for logs if yes then enrich them
|
// check if any enrichment is required for logs if yes then enrich them
|
||||||
if logsv3.EnrichmentRequired(queryRangeParams) {
|
if logsv3.EnrichmentRequired(queryRangeParams) && hasLogsQuery {
|
||||||
logsFields, err := aH.reader.GetLogFieldsFromNames(ctx, logsv3.GetFieldNames(queryRangeParams.CompositeQuery))
|
logsFields, err := aH.reader.GetLogFieldsFromNames(ctx, logsv3.GetFieldNames(queryRangeParams.CompositeQuery))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err}
|
apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err}
|
||||||
@ -4401,7 +4411,7 @@ func (aH *APIHandler) queryRangeV3(ctx context.Context, queryRangeParams *v3.Que
|
|||||||
fields := model.GetLogFieldsV3(ctx, queryRangeParams, logsFields)
|
fields := model.GetLogFieldsV3(ctx, queryRangeParams, logsFields)
|
||||||
logsv3.Enrich(queryRangeParams, fields)
|
logsv3.Enrich(queryRangeParams, fields)
|
||||||
}
|
}
|
||||||
|
if hasTracesQuery {
|
||||||
spanKeys, err = aH.getSpanKeysV3(ctx, queryRangeParams)
|
spanKeys, err = aH.getSpanKeysV3(ctx, queryRangeParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err}
|
apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err}
|
||||||
@ -4409,7 +4419,7 @@ func (aH *APIHandler) queryRangeV3(ctx context.Context, queryRangeParams *v3.Que
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
tracesV4.Enrich(queryRangeParams, spanKeys)
|
tracesV4.Enrich(queryRangeParams, spanKeys)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WARN: Only works for AND operator in traces query
|
// WARN: Only works for AND operator in traces query
|
||||||
@ -4787,8 +4797,19 @@ func (aH *APIHandler) queryRangeV4(ctx context.Context, queryRangeParams *v3.Que
|
|||||||
var errQuriesByName map[string]error
|
var errQuriesByName map[string]error
|
||||||
var spanKeys map[string]v3.AttributeKey
|
var spanKeys map[string]v3.AttributeKey
|
||||||
if queryRangeParams.CompositeQuery.QueryType == v3.QueryTypeBuilder {
|
if queryRangeParams.CompositeQuery.QueryType == v3.QueryTypeBuilder {
|
||||||
|
hasLogsQuery := false
|
||||||
|
hasTracesQuery := false
|
||||||
|
for _, query := range queryRangeParams.CompositeQuery.BuilderQueries {
|
||||||
|
if query.DataSource == v3.DataSourceLogs {
|
||||||
|
hasLogsQuery = true
|
||||||
|
}
|
||||||
|
if query.DataSource == v3.DataSourceTraces {
|
||||||
|
hasTracesQuery = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// check if any enrichment is required for logs if yes then enrich them
|
// check if any enrichment is required for logs if yes then enrich them
|
||||||
if logsv3.EnrichmentRequired(queryRangeParams) {
|
if logsv3.EnrichmentRequired(queryRangeParams) && hasLogsQuery {
|
||||||
// get the fields if any logs query is present
|
// get the fields if any logs query is present
|
||||||
logsFields, err := aH.reader.GetLogFieldsFromNames(r.Context(), logsv3.GetFieldNames(queryRangeParams.CompositeQuery))
|
logsFields, err := aH.reader.GetLogFieldsFromNames(r.Context(), logsv3.GetFieldNames(queryRangeParams.CompositeQuery))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -4800,6 +4821,7 @@ func (aH *APIHandler) queryRangeV4(ctx context.Context, queryRangeParams *v3.Que
|
|||||||
logsv3.Enrich(queryRangeParams, fields)
|
logsv3.Enrich(queryRangeParams, fields)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if hasTracesQuery {
|
||||||
spanKeys, err = aH.getSpanKeysV3(ctx, queryRangeParams)
|
spanKeys, err = aH.getSpanKeysV3(ctx, queryRangeParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err}
|
apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err}
|
||||||
@ -4808,6 +4830,7 @@ func (aH *APIHandler) queryRangeV4(ctx context.Context, queryRangeParams *v3.Que
|
|||||||
}
|
}
|
||||||
tracesV4.Enrich(queryRangeParams, spanKeys)
|
tracesV4.Enrich(queryRangeParams, spanKeys)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// WARN: Only works for AND operator in traces query
|
// WARN: Only works for AND operator in traces query
|
||||||
if queryRangeParams.CompositeQuery.QueryType == v3.QueryTypeBuilder {
|
if queryRangeParams.CompositeQuery.QueryType == v3.QueryTypeBuilder {
|
||||||
|
|||||||
@ -91,7 +91,7 @@ func GetFieldNames(compositeQuery *v3.CompositeQuery) []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for queryName, query := range compositeQuery.BuilderQueries {
|
for queryName, query := range compositeQuery.BuilderQueries {
|
||||||
if query.Expression != queryName && query.DataSource != v3.DataSourceLogs {
|
if query.Expression != queryName {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +103,8 @@ func GetFieldNames(compositeQuery *v3.CompositeQuery) []string {
|
|||||||
if query.Filters != nil && len(query.Filters.Items) != 0 {
|
if query.Filters != nil && len(query.Filters.Items) != 0 {
|
||||||
for i := 0; i < len(query.Filters.Items); i++ {
|
for i := 0; i < len(query.Filters.Items); i++ {
|
||||||
tempItem := jsonFilterEnrich(query.Filters.Items[i])
|
tempItem := jsonFilterEnrich(query.Filters.Items[i])
|
||||||
if tempItem.Key.IsJSON {
|
// since json query is only for logs
|
||||||
|
if query.DataSource == v3.DataSourceLogs && tempItem.Key.IsJSON {
|
||||||
key, found := strings.CutPrefix(tempItem.Key.Key, "body.")
|
key, found := strings.CutPrefix(tempItem.Key.Key, "body.")
|
||||||
if found {
|
if found {
|
||||||
fieldNames[key] = struct{}{}
|
fieldNames[key] = struct{}{}
|
||||||
|
|||||||
@ -1005,7 +1005,7 @@ func TestGetFieldNames(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
want: []string{"field1", "field2", "field3"},
|
want: []string{"field1", "field2"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "empty aggregate attribute key and filters",
|
name: "empty aggregate attribute key and filters",
|
||||||
|
|||||||
@ -32,7 +32,7 @@ type Reader interface {
|
|||||||
GetTraceAggregateAttributes(ctx context.Context, req *v3.AggregateAttributeRequest) (*v3.AggregateAttributeResponse, error)
|
GetTraceAggregateAttributes(ctx context.Context, req *v3.AggregateAttributeRequest) (*v3.AggregateAttributeResponse, error)
|
||||||
GetTraceAttributeKeys(ctx context.Context, req *v3.FilterAttributeKeyRequest) (*v3.FilterAttributeKeyResponse, error)
|
GetTraceAttributeKeys(ctx context.Context, req *v3.FilterAttributeKeyRequest) (*v3.FilterAttributeKeyResponse, error)
|
||||||
GetTraceAttributeValues(ctx context.Context, req *v3.FilterAttributeValueRequest) (*v3.FilterAttributeValueResponse, error)
|
GetTraceAttributeValues(ctx context.Context, req *v3.FilterAttributeValueRequest) (*v3.FilterAttributeValueResponse, error)
|
||||||
GetSpanAttributeKeys(ctx context.Context) (map[string]v3.AttributeKey, error)
|
GetSpanAttributeKeysByNames(ctx context.Context, names []string) (map[string]v3.AttributeKey, error)
|
||||||
|
|
||||||
ListErrors(ctx context.Context, params *model.ListErrorsParams) (*[]model.Error, *model.ApiError)
|
ListErrors(ctx context.Context, params *model.ListErrorsParams) (*[]model.Error, *model.ApiError)
|
||||||
CountErrors(ctx context.Context, params *model.CountErrorsParams) (uint64, *model.ApiError)
|
CountErrors(ctx context.Context, params *model.CountErrorsParams) (uint64, *model.ApiError)
|
||||||
|
|||||||
@ -288,7 +288,7 @@ func (r *ThresholdRule) buildAndRunQuery(ctx context.Context, orgID valuer.UUID,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if hasTracesQuery {
|
if hasTracesQuery {
|
||||||
spanKeys, err := r.reader.GetSpanAttributeKeys(ctx)
|
spanKeys, err := r.reader.GetSpanAttributeKeysByNames(ctx, logsv3.GetFieldNames(params.CompositeQuery))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user