diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index a2f533558524..0e8515c67d4c 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -3989,13 +3989,13 @@ func (r *ClickHouseReader) GetTraceAttributeValues(ctx context.Context, req *v3. 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 err error var rows driver.Rows 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) if err != nil { diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index 94d465fd1099..4b74113726c9 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -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)) } } 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 { keys = traceFields } else { @@ -4345,7 +4345,7 @@ func (aH *APIHandler) getSpanKeysV3(ctx context.Context, queryRangeParams *v3.Qu data := map[string]v3.AttributeKey{} for _, query := range queryRangeParams.CompositeQuery.BuilderQueries { if query.DataSource == v3.DataSourceTraces { - spanKeys, err := aH.reader.GetSpanAttributeKeys(ctx) + spanKeys, err := aH.reader.GetSpanAttributeKeysByNames(ctx, logsv3.GetFieldNames(queryRangeParams.CompositeQuery)) if err != nil { return nil, err } @@ -4389,8 +4389,18 @@ func (aH *APIHandler) queryRangeV3(ctx context.Context, queryRangeParams *v3.Que var errQuriesByName map[string]error var spanKeys map[string]v3.AttributeKey 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 - if logsv3.EnrichmentRequired(queryRangeParams) { + if logsv3.EnrichmentRequired(queryRangeParams) && hasLogsQuery { logsFields, err := aH.reader.GetLogFieldsFromNames(ctx, logsv3.GetFieldNames(queryRangeParams.CompositeQuery)) if err != nil { apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err} @@ -4401,15 +4411,15 @@ func (aH *APIHandler) queryRangeV3(ctx context.Context, queryRangeParams *v3.Que fields := model.GetLogFieldsV3(ctx, queryRangeParams, logsFields) logsv3.Enrich(queryRangeParams, fields) } - - spanKeys, err = aH.getSpanKeysV3(ctx, queryRangeParams) - if err != nil { - apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err} - RespondError(w, apiErrObj, errQuriesByName) - return + if hasTracesQuery { + spanKeys, err = aH.getSpanKeysV3(ctx, queryRangeParams) + if err != nil { + apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err} + RespondError(w, apiErrObj, errQuriesByName) + return + } + tracesV4.Enrich(queryRangeParams, spanKeys) } - tracesV4.Enrich(queryRangeParams, spanKeys) - } // 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 spanKeys map[string]v3.AttributeKey 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 - if logsv3.EnrichmentRequired(queryRangeParams) { + if logsv3.EnrichmentRequired(queryRangeParams) && hasLogsQuery { // get the fields if any logs query is present logsFields, err := aH.reader.GetLogFieldsFromNames(r.Context(), logsv3.GetFieldNames(queryRangeParams.CompositeQuery)) if err != nil { @@ -4800,13 +4821,15 @@ func (aH *APIHandler) queryRangeV4(ctx context.Context, queryRangeParams *v3.Que logsv3.Enrich(queryRangeParams, fields) } - spanKeys, err = aH.getSpanKeysV3(ctx, queryRangeParams) - if err != nil { - apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err} - RespondError(w, apiErrObj, errQuriesByName) - return + if hasTracesQuery { + spanKeys, err = aH.getSpanKeysV3(ctx, queryRangeParams) + if err != nil { + apiErrObj := &model.ApiError{Typ: model.ErrorInternal, Err: err} + RespondError(w, apiErrObj, errQuriesByName) + return + } + tracesV4.Enrich(queryRangeParams, spanKeys) } - tracesV4.Enrich(queryRangeParams, spanKeys) } // WARN: Only works for AND operator in traces query diff --git a/pkg/query-service/app/logs/v3/enrich_query.go b/pkg/query-service/app/logs/v3/enrich_query.go index 34cb3131bafe..78f6b4928561 100644 --- a/pkg/query-service/app/logs/v3/enrich_query.go +++ b/pkg/query-service/app/logs/v3/enrich_query.go @@ -91,7 +91,7 @@ func GetFieldNames(compositeQuery *v3.CompositeQuery) []string { } for queryName, query := range compositeQuery.BuilderQueries { - if query.Expression != queryName && query.DataSource != v3.DataSourceLogs { + if query.Expression != queryName { continue } @@ -103,7 +103,8 @@ func GetFieldNames(compositeQuery *v3.CompositeQuery) []string { if query.Filters != nil && len(query.Filters.Items) != 0 { for i := 0; i < len(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.") if found { fieldNames[key] = struct{}{} diff --git a/pkg/query-service/app/logs/v3/enrich_query_test.go b/pkg/query-service/app/logs/v3/enrich_query_test.go index f73763e6b03b..22d4042add29 100644 --- a/pkg/query-service/app/logs/v3/enrich_query_test.go +++ b/pkg/query-service/app/logs/v3/enrich_query_test.go @@ -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", diff --git a/pkg/query-service/interfaces/interface.go b/pkg/query-service/interfaces/interface.go index 833368e53c21..d0a05fe979c1 100644 --- a/pkg/query-service/interfaces/interface.go +++ b/pkg/query-service/interfaces/interface.go @@ -32,7 +32,7 @@ type Reader interface { GetTraceAggregateAttributes(ctx context.Context, req *v3.AggregateAttributeRequest) (*v3.AggregateAttributeResponse, error) GetTraceAttributeKeys(ctx context.Context, req *v3.FilterAttributeKeyRequest) (*v3.FilterAttributeKeyResponse, 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) CountErrors(ctx context.Context, params *model.CountErrorsParams) (uint64, *model.ApiError) diff --git a/pkg/query-service/rules/threshold_rule.go b/pkg/query-service/rules/threshold_rule.go index b6e457bb99b1..a28c72040420 100644 --- a/pkg/query-service/rules/threshold_rule.go +++ b/pkg/query-service/rules/threshold_rule.go @@ -288,7 +288,7 @@ func (r *ThresholdRule) buildAndRunQuery(ctx context.Context, orgID valuer.UUID, } if hasTracesQuery { - spanKeys, err := r.reader.GetSpanAttributeKeys(ctx) + spanKeys, err := r.reader.GetSpanAttributeKeysByNames(ctx, logsv3.GetFieldNames(params.CompositeQuery)) if err != nil { return nil, err }