diff --git a/ee/query-service/app/server.go b/ee/query-service/app/server.go index 469632ac7f..11ef8dffe0 100644 --- a/ee/query-service/app/server.go +++ b/ee/query-service/app/server.go @@ -419,30 +419,33 @@ func extractQueryRangeV3Data(path string, r *http.Request) (map[string]interface signozMetricsUsed := false signozLogsUsed := false - dataSources := []string{} + signozTracesUsed := false if postData != nil { if postData.CompositeQuery != nil { data["queryType"] = postData.CompositeQuery.QueryType data["panelType"] = postData.CompositeQuery.PanelType - signozLogsUsed, signozMetricsUsed, _ = telemetry.GetInstance().CheckSigNozSignals(postData) + signozLogsUsed, signozMetricsUsed, signozTracesUsed = telemetry.GetInstance().CheckSigNozSignals(postData) } } - if signozMetricsUsed || signozLogsUsed { + if signozMetricsUsed || signozLogsUsed || signozTracesUsed { if signozMetricsUsed { - dataSources = append(dataSources, "metrics") telemetry.GetInstance().AddActiveMetricsUser() } if signozLogsUsed { - dataSources = append(dataSources, "logs") telemetry.GetInstance().AddActiveLogsUser() } - data["dataSources"] = dataSources + if signozTracesUsed { + telemetry.GetInstance().AddActiveTracesUser() + } + data["metricsUsed"] = signozMetricsUsed + data["logsUsed"] = signozLogsUsed + data["tracesUsed"] = signozTracesUsed userEmail, err := baseauth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_QUERY_RANGE_V3, data, userEmail, true) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_QUERY_RANGE_API, data, userEmail) } } return data, true diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index 56a901a7fb..00f3ca1ba6 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -44,6 +44,7 @@ import ( "go.uber.org/zap" "go.signoz.io/signoz/pkg/query-service/app/dashboards" + "go.signoz.io/signoz/pkg/query-service/app/explorer" "go.signoz.io/signoz/pkg/query-service/app/logs" "go.signoz.io/signoz/pkg/query-service/app/services" "go.signoz.io/signoz/pkg/query-service/auth" @@ -3623,6 +3624,24 @@ func (r *ClickHouseReader) GetAlertsInfo(ctx context.Context) (*model.AlertsInfo return &alertsInfo, nil } +func (r *ClickHouseReader) GetSavedViewsInfo(ctx context.Context) (*model.SavedViewsInfo, error) { + savedViewsInfo := model.SavedViewsInfo{} + savedViews, err := explorer.GetViews() + if err != nil { + zap.S().Debug("Error in fetching saved views info: ", err) + return &savedViewsInfo, err + } + savedViewsInfo.TotalSavedViews = len(savedViews) + for _, view := range savedViews { + if view.SourcePage == "traces" { + savedViewsInfo.TracesSavedViews += 1 + } else if view.SourcePage == "logs" { + savedViewsInfo.LogsSavedViews += 1 + } + } + return &savedViewsInfo, nil +} + func (r *ClickHouseReader) GetLogFields(ctx context.Context) (*model.GetFieldsResponse, *model.ApiError) { // response will contain top level fields from the otel log model response := model.GetFieldsResponse{ diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index 676abc1070..16b741e572 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -3479,11 +3479,11 @@ func sendQueryResultEvents(r *http.Request, result []*v3.Result, queryRangeParam dashboardMatched, err := regexp.MatchString(`/dashboard/[a-zA-Z0-9\-]+/(new|edit)(?:\?.*)?$`, referrer) if err != nil { - zap.S().Errorf("error while matching the referrer: %v", err) + zap.S().Errorf("error while matching the dashboard: %v", err) } alertMatched, err := regexp.MatchString(`/alerts/(new|edit)(?:\?.*)?$`, referrer) if err != nil { - zap.S().Errorf("error while matching the referrer: %v", err) + zap.S().Errorf("error while matching the alert: %v", err) } if alertMatched || dashboardMatched { @@ -3494,22 +3494,60 @@ func sendQueryResultEvents(r *http.Request, result []*v3.Result, queryRangeParam if err == nil { signozLogsUsed, signozMetricsUsed, signozTracesUsed := telemetry.GetInstance().CheckSigNozSignals(queryRangeParams) if signozLogsUsed || signozMetricsUsed || signozTracesUsed { + if dashboardMatched { + var dashboardID, widgetID string + var dashboardIDMatch, widgetIDMatch []string + dashboardIDRegex, err := regexp.Compile(`/dashboard/([a-f0-9\-]+)/`) + if err == nil { + dashboardIDMatch = dashboardIDRegex.FindStringSubmatch(referrer) + } else { + zap.S().Errorf("error while matching the dashboardIDRegex: %v", err) + } + widgetIDRegex, err := regexp.Compile(`widgetId=([a-f0-9\-]+)`) + if err == nil { + widgetIDMatch = widgetIDRegex.FindStringSubmatch(referrer) + } else { + zap.S().Errorf("error while matching the widgetIDRegex: %v", err) + } + + if len(dashboardIDMatch) > 1 { + dashboardID = dashboardIDMatch[1] + } + + if len(widgetIDMatch) > 1 { + widgetID = widgetIDMatch[1] + } telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_SUCCESSFUL_DASHBOARD_PANEL_QUERY, map[string]interface{}{ "queryType": queryRangeParams.CompositeQuery.QueryType, "panelType": queryRangeParams.CompositeQuery.PanelType, "tracesUsed": signozTracesUsed, "logsUsed": signozLogsUsed, "metricsUsed": signozMetricsUsed, + "dashboardId": dashboardID, + "widgetId": widgetID, }, userEmail) } if alertMatched { + var alertID string + var alertIDMatch []string + alertIDRegex, err := regexp.Compile(`ruleId=(\d+)`) + if err != nil { + zap.S().Errorf("error while matching the alertIDRegex: %v", err) + } else { + alertIDMatch = alertIDRegex.FindStringSubmatch(referrer) + } + + if len(alertIDMatch) > 1 { + alertID = alertIDMatch[1] + } telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_SUCCESSFUL_ALERT_QUERY, map[string]interface{}{ "queryType": queryRangeParams.CompositeQuery.QueryType, "panelType": queryRangeParams.CompositeQuery.PanelType, "tracesUsed": signozTracesUsed, "logsUsed": signozLogsUsed, "metricsUsed": signozMetricsUsed, + "alertId": alertID, }, userEmail) } } diff --git a/pkg/query-service/app/server.go b/pkg/query-service/app/server.go index e9c80c2507..81ef4e9c13 100644 --- a/pkg/query-service/app/server.go +++ b/pkg/query-service/app/server.go @@ -426,30 +426,33 @@ func extractQueryRangeV3Data(path string, r *http.Request) (map[string]interface signozMetricsUsed := false signozLogsUsed := false - dataSources := []string{} + signozTracesUsed := false if postData != nil { if postData.CompositeQuery != nil { data["queryType"] = postData.CompositeQuery.QueryType data["panelType"] = postData.CompositeQuery.PanelType - signozLogsUsed, signozMetricsUsed, _ = telemetry.GetInstance().CheckSigNozSignals(postData) + signozLogsUsed, signozMetricsUsed, signozTracesUsed = telemetry.GetInstance().CheckSigNozSignals(postData) } } - if signozMetricsUsed || signozLogsUsed { + if signozMetricsUsed || signozLogsUsed || signozTracesUsed { if signozMetricsUsed { - dataSources = append(dataSources, "metrics") telemetry.GetInstance().AddActiveMetricsUser() } if signozLogsUsed { - dataSources = append(dataSources, "logs") telemetry.GetInstance().AddActiveLogsUser() } - data["dataSources"] = dataSources + if signozTracesUsed { + telemetry.GetInstance().AddActiveTracesUser() + } + data["metricsUsed"] = signozMetricsUsed + data["logsUsed"] = signozLogsUsed + data["tracesUsed"] = signozTracesUsed userEmail, err := auth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_QUERY_RANGE_V3, data, userEmail, true) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_QUERY_RANGE_API, data, userEmail) } } return data, true diff --git a/pkg/query-service/interfaces/interface.go b/pkg/query-service/interfaces/interface.go index eefb10a0c0..dfe24c9064 100644 --- a/pkg/query-service/interfaces/interface.go +++ b/pkg/query-service/interfaces/interface.go @@ -77,6 +77,7 @@ type Reader interface { GetDashboardsInfo(ctx context.Context) (*model.DashboardsInfo, error) GetAlertsInfo(ctx context.Context) (*model.AlertsInfo, error) + GetSavedViewsInfo(ctx context.Context) (*model.SavedViewsInfo, error) GetTotalSpans(ctx context.Context) (uint64, error) GetTotalLogs(ctx context.Context) (uint64, error) GetTotalSamples(ctx context.Context) (uint64, error) diff --git a/pkg/query-service/model/response.go b/pkg/query-service/model/response.go index aad137714c..a8e09b9d6e 100644 --- a/pkg/query-service/model/response.go +++ b/pkg/query-service/model/response.go @@ -634,6 +634,12 @@ type AlertsInfo struct { TracesBasedAlerts int `json:"tracesBasedAlerts"` } +type SavedViewsInfo struct { + TotalSavedViews int `json:"totalSavedViews"` + TracesSavedViews int `json:"tracesSavedViews"` + LogsSavedViews int `json:"logsSavedViews"` +} + type DashboardsInfo struct { TotalDashboards int `json:"totalDashboards"` TotalDashboardsWithPanelAndName int `json:"totalDashboardsWithPanelAndName"` // dashboards with panel and name without sample title diff --git a/pkg/query-service/telemetry/telemetry.go b/pkg/query-service/telemetry/telemetry.go index ff2ed9aa1a..9202a32168 100644 --- a/pkg/query-service/telemetry/telemetry.go +++ b/pkg/query-service/telemetry/telemetry.go @@ -38,7 +38,7 @@ const ( TELEMETRY_EVENT_SERVICE = "ServiceName" TELEMETRY_EVENT_LOGS_FILTERS = "Logs Filters" TELEMETRY_EVENT_DISTRIBUTED = "Distributed" - TELEMETRY_EVENT_QUERY_RANGE_V3 = "Query Range V3 Metadata" + TELEMETRY_EVENT_QUERY_RANGE_API = "Query Range API" TELEMETRY_EVENT_DASHBOARDS_ALERTS = "Dashboards/Alerts Info" TELEMETRY_EVENT_ACTIVE_USER = "Active User" TELEMETRY_EVENT_ACTIVE_USER_PH = "Active User V2" @@ -61,6 +61,7 @@ var SAAS_EVENTS_LIST = map[string]struct{}{ TELEMETRY_EVENT_DASHBOARDS_ALERTS: {}, TELEMETRY_EVENT_SUCCESSFUL_DASHBOARD_PANEL_QUERY: {}, TELEMETRY_EVENT_SUCCESSFUL_ALERT_QUERY: {}, + // TELEMETRY_EVENT_QUERY_RANGE_API: {}, // this event is not part of SAAS_EVENTS_LIST as it may cause too many events to be sent } const api_key = "4Gmoa4ixJAUHx2BpJxsjwA1bEfnwEeRz" @@ -282,30 +283,39 @@ func createTelemetry() { telemetry.SendEvent(TELEMETRY_EVENT_HEART_BEAT, data, "") alertsInfo, err := telemetry.reader.GetAlertsInfo(context.Background()) - if err != nil { - telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, map[string]interface{}{"error": err.Error()}, "") - } else { + if err == nil { dashboardsInfo, err := telemetry.reader.GetDashboardsInfo(context.Background()) if err == nil { - dashboardsAlertsData := map[string]interface{}{ - "totalDashboards": dashboardsInfo.TotalDashboards, - "totalDashboardsWithPanelAndName": dashboardsInfo.TotalDashboardsWithPanelAndName, - "logsBasedPanels": dashboardsInfo.LogsBasedPanels, - "metricBasedPanels": dashboardsInfo.MetricBasedPanels, - "tracesBasedPanels": dashboardsInfo.TracesBasedPanels, - "totalAlerts": alertsInfo.TotalAlerts, - "logsBasedAlerts": alertsInfo.LogsBasedAlerts, - "metricBasedAlerts": alertsInfo.MetricBasedAlerts, - "tracesBasedAlerts": alertsInfo.TracesBasedAlerts, + channels, err := telemetry.reader.GetChannels() + if err == nil { + savedViewsInfo, err := telemetry.reader.GetSavedViewsInfo(context.Background()) + if err == nil { + dashboardsAlertsData := map[string]interface{}{ + "totalDashboards": dashboardsInfo.TotalDashboards, + "totalDashboardsWithPanelAndName": dashboardsInfo.TotalDashboardsWithPanelAndName, + "logsBasedPanels": dashboardsInfo.LogsBasedPanels, + "metricBasedPanels": dashboardsInfo.MetricBasedPanels, + "tracesBasedPanels": dashboardsInfo.TracesBasedPanels, + "totalAlerts": alertsInfo.TotalAlerts, + "logsBasedAlerts": alertsInfo.LogsBasedAlerts, + "metricBasedAlerts": alertsInfo.MetricBasedAlerts, + "tracesBasedAlerts": alertsInfo.TracesBasedAlerts, + "totalChannels": len(*channels), + "totalSavedViews": savedViewsInfo.TotalSavedViews, + "logsSavedViews": savedViewsInfo.LogsSavedViews, + "tracesSavedViews": savedViewsInfo.TracesSavedViews, + } + // send event only if there are dashboards or alerts or channels + if dashboardsInfo.TotalDashboards > 0 || alertsInfo.TotalAlerts > 0 || len(*channels) > 0 || savedViewsInfo.TotalSavedViews > 0 { + telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, dashboardsAlertsData, "") + } + } } - // send event only if there are dashboards or alerts - if dashboardsInfo.TotalDashboards > 0 || alertsInfo.TotalAlerts > 0 { - telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, dashboardsAlertsData, "") - } - } else { - telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, map[string]interface{}{"error": err.Error()}, "") } } + if err != nil { + telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, map[string]interface{}{"error": err.Error()}, "") + } getDistributedInfoInLastHeartBeatInterval, _ := telemetry.reader.GetDistributedInfoInLastHeartBeatInterval(context.Background()) telemetry.SendEvent(TELEMETRY_EVENT_DISTRIBUTED, getDistributedInfoInLastHeartBeatInterval, "") @@ -419,7 +429,7 @@ func (a *Telemetry) checkEvents(event string) bool { func (a *Telemetry) SendEvent(event string, data map[string]interface{}, userEmail string, opts ...bool) { // ignore telemetry for default user - if userEmail == DEFAULT_CLOUD_EMAIL { + if userEmail == DEFAULT_CLOUD_EMAIL || a.GetUserEmail() == DEFAULT_CLOUD_EMAIL { return }