From 73e60f298d2baaee51b4b23897b3e6a4116e3e0f Mon Sep 17 00:00:00 2001 From: Shivanshu Raj Shrivastava Date: Mon, 5 May 2025 03:45:28 +0530 Subject: [PATCH] fix: backend fixes Signed-off-by: Shivanshu Raj Shrivastava --- pkg/modules/tracefunnel/query.go | 63 ++++++++++++++++++++++++--- pkg/query-service/app/http_handler.go | 31 +++++++++++++ pkg/web/config.go | 2 +- 3 files changed, 89 insertions(+), 7 deletions(-) diff --git a/pkg/modules/tracefunnel/query.go b/pkg/modules/tracefunnel/query.go index a731cd1963e7..4027cea0c65c 100644 --- a/pkg/modules/tracefunnel/query.go +++ b/pkg/modules/tracefunnel/query.go @@ -16,13 +16,13 @@ func ValidateTraces(funnel *tracefunnel.Funnel, timeRange tracefunnel.TimeRange) // (todo) prepare funnel step wise whereclause - if len(funnel.Steps) == 2 && funnelSteps[0].HasErrors { + if funnelSteps[0].HasErrors { containsErrorT1 = 1 } - if len(funnel.Steps) == 2 && funnelSteps[1].HasErrors { + if funnelSteps[1].HasErrors { containsErrorT2 = 1 } - if len(funnel.Steps) > 2 && funnelSteps[2].HasErrors { + if funnelSteps[2].HasErrors { containsErrorT3 = 1 } @@ -82,9 +82,10 @@ func GetFunnelAnalytics(funnel *tracefunnel.Funnel, timeRange tracefunnel.TimeRa if funnelSteps[1].HasErrors { containsErrorT2 = 1 } - if len(funnel.Steps) > 2 && funnelSteps[2].HasErrors { + if funnelSteps[2].HasErrors { containsErrorT3 = 1 } + if funnelSteps[0].LatencyPointer != "" { latencyPointerT1 = "end" } @@ -147,6 +148,56 @@ func GetFunnelAnalytics(funnel *tracefunnel.Funnel, timeRange tracefunnel.TimeRa return &v3.ClickHouseQuery{Query: query}, nil } +func GetFunnelStepAnalytics(funnel *tracefunnel.Funnel, timeRange tracefunnel.TimeRange, stepStart, stepEnd int64) (*v3.ClickHouseQuery, error) { + var query string + + funnelSteps := funnel.Steps + containsErrorT1 := 0 + containsErrorT2 := 0 + latencyPointerT1 := "start" + latencyPointerT2 := "start" + stepStartOrder := 0 + stepEndOrder := 1 + + if stepStart != stepEnd { + stepStartOrder = int(stepStart) - 1 + stepEndOrder = int(stepEnd) - 1 + if funnelSteps[stepStartOrder].HasErrors { + containsErrorT1 = 1 + } + if funnelSteps[stepEndOrder].HasErrors { + containsErrorT2 = 1 + } + if funnelSteps[stepStartOrder].HasErrors { + containsErrorT1 = 1 + } + if funnelSteps[stepEndOrder].HasErrors { + containsErrorT2 = 1 + } + if funnelSteps[stepStartOrder].LatencyPointer != "" { + latencyPointerT1 = "end" + } + if funnelSteps[stepEndOrder].LatencyPointer != "" { + latencyPointerT1 = "end" + } + } + query = BuildTwoStepFunnelOverviewQuery( + containsErrorT1, // containsErrorT1 + containsErrorT2, // containsErrorT2 + latencyPointerT1, + latencyPointerT2, + timeRange.StartTime, // startTs + timeRange.EndTime, // endTs + funnelSteps[stepStartOrder].ServiceName, // serviceNameT1 + funnelSteps[stepStartOrder].SpanName, // spanNameT1 + funnelSteps[stepEndOrder].ServiceName, // serviceNameT1 + funnelSteps[stepEndOrder].SpanName, // spanNameT2 + "", + "", + ) + return &v3.ClickHouseQuery{Query: query}, nil +} + func GetStepAnalytics(funnel *tracefunnel.Funnel, timeRange tracefunnel.TimeRange) (*v3.ClickHouseQuery, error) { var query string @@ -156,10 +207,10 @@ func GetStepAnalytics(funnel *tracefunnel.Funnel, timeRange tracefunnel.TimeRang containsErrorT2 := 0 containsErrorT3 := 0 - if len(funnel.Steps) == 2 && funnelSteps[0].HasErrors { + if funnelSteps[0].HasErrors { containsErrorT1 = 1 } - if len(funnel.Steps) == 2 && funnelSteps[1].HasErrors { + if funnelSteps[1].HasErrors { containsErrorT2 = 1 } if len(funnel.Steps) > 2 && funnelSteps[2].HasErrors { diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index 6a720fa61505..f921665d3204 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -5160,6 +5160,7 @@ func (aH *APIHandler) RegisterTraceFunnelsRoutes(router *mux.Router, am *middlew traceFunnelsRouter.HandleFunc("/{funnel_id}/analytics/validate", aH.handleValidateTraces).Methods("POST") traceFunnelsRouter.HandleFunc("/{funnel_id}/analytics/overview", aH.handleFunnelAnalytics).Methods("POST") traceFunnelsRouter.HandleFunc("/{funnel_id}/analytics/steps", aH.handleStepAnalytics).Methods("POST") + traceFunnelsRouter.HandleFunc("/{funnel_id}/analytics/steps/overview", aH.handleFunnelStepAnalytics).Methods("POST") traceFunnelsRouter.HandleFunc("/{funnel_id}/analytics/slow-traces", aH.handleFunnelSlowTraces).Methods("POST") traceFunnelsRouter.HandleFunc("/{funnel_id}/analytics/error-traces", aH.handleFunnelErrorTraces).Methods("POST") @@ -5230,6 +5231,36 @@ func (aH *APIHandler) handleFunnelAnalytics(w http.ResponseWriter, r *http.Reque aH.Respond(w, results) } +func (aH *APIHandler) handleFunnelStepAnalytics(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + funnelID := vars["funnel_id"] + + funnel, err := aH.Signoz.Modules.TraceFunnel.Get(r.Context(), funnelID) + if err != nil { + RespondError(w, &model.ApiError{Typ: model.ErrorNotFound, Err: fmt.Errorf("funnel not found: %v", err)}, nil) + return + } + + var stepTransition traceFunnels.StepTransitionRequest + if err := json.NewDecoder(r.Body).Decode(&stepTransition); err != nil { + RespondError(w, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("error decoding time range: %v", err)}, nil) + return + } + + chq, err := tracefunnels.GetFunnelStepAnalytics(funnel, stepTransition.TimeRange, stepTransition.StepAOrder, stepTransition.StepBOrder) + if err != nil { + RespondError(w, &model.ApiError{Typ: model.ErrorInternal, Err: fmt.Errorf("error building clickhouse query: %v", err)}, nil) + return + } + + results, err := aH.reader.GetListResultV3(r.Context(), chq.Query) + if err != nil { + RespondError(w, &model.ApiError{Typ: model.ErrorInternal, Err: fmt.Errorf("error converting clickhouse results to list: %v", err)}, nil) + return + } + aH.Respond(w, results) +} + func (aH *APIHandler) handleStepAnalytics(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) funnelID := vars["funnel_id"] diff --git a/pkg/web/config.go b/pkg/web/config.go index 4feb54835c5e..240dacdc7e12 100644 --- a/pkg/web/config.go +++ b/pkg/web/config.go @@ -23,7 +23,7 @@ func newConfig() factory.Config { return &Config{ Enabled: true, Prefix: "/", - Directory: "/etc/signoz/web", + Directory: "/Users/s/oss/sig/signoz/frontend/build", } }