diff --git a/frontend/public/Logos/android-java-monitoring.svg b/frontend/public/Logos/android-java-monitoring.svg new file mode 100644 index 0000000000..b2eb976ea4 --- /dev/null +++ b/frontend/public/Logos/android-java-monitoring.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/frontend/public/Logos/android-kotlin-monitoring.svg b/frontend/public/Logos/android-kotlin-monitoring.svg new file mode 100644 index 0000000000..3480717db7 --- /dev/null +++ b/frontend/public/Logos/android-kotlin-monitoring.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/Logos/angular.svg b/frontend/public/Logos/angular.svg new file mode 100644 index 0000000000..09c59e99fa --- /dev/null +++ b/frontend/public/Logos/angular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/application-logs.svg b/frontend/public/Logos/application-logs.svg new file mode 100644 index 0000000000..60bf068531 --- /dev/null +++ b/frontend/public/Logos/application-logs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/cloudwatch-logs.svg b/frontend/public/Logos/cloudwatch-logs.svg new file mode 100644 index 0000000000..46e787df15 --- /dev/null +++ b/frontend/public/Logos/cloudwatch-logs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/django.svg b/frontend/public/Logos/django.svg new file mode 100644 index 0000000000..80cbe71c82 --- /dev/null +++ b/frontend/public/Logos/django.svg @@ -0,0 +1,41 @@ + + + + +]> + + + + + + + + + + + + + diff --git a/frontend/public/Logos/dotnet.svg b/frontend/public/Logos/dotnet.svg new file mode 100644 index 0000000000..d204a09042 --- /dev/null +++ b/frontend/public/Logos/dotnet.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frontend/public/Logos/elb.svg b/frontend/public/Logos/elb.svg new file mode 100644 index 0000000000..2ac7bed278 --- /dev/null +++ b/frontend/public/Logos/elb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/elixir.svg b/frontend/public/Logos/elixir.svg new file mode 100644 index 0000000000..63f8541228 --- /dev/null +++ b/frontend/public/Logos/elixir.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/express.svg b/frontend/public/Logos/express.svg new file mode 100644 index 0000000000..4dc0362ab8 --- /dev/null +++ b/frontend/public/Logos/express.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/falcon.svg b/frontend/public/Logos/falcon.svg new file mode 100644 index 0000000000..22deec6694 --- /dev/null +++ b/frontend/public/Logos/falcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/fastapi.svg b/frontend/public/Logos/fastapi.svg new file mode 100644 index 0000000000..85f2d13372 --- /dev/null +++ b/frontend/public/Logos/fastapi.svg @@ -0,0 +1 @@ + diff --git a/frontend/public/Logos/flask.svg b/frontend/public/Logos/flask.svg new file mode 100644 index 0000000000..257941467a --- /dev/null +++ b/frontend/public/Logos/flask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/fluentbit.svg b/frontend/public/Logos/fluentbit.svg new file mode 100644 index 0000000000..34f7d1c6d7 --- /dev/null +++ b/frontend/public/Logos/fluentbit.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/fluentd.svg b/frontend/public/Logos/fluentd.svg new file mode 100644 index 0000000000..05ccd00206 --- /dev/null +++ b/frontend/public/Logos/fluentd.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/Logos/flutter-monitoring.svg b/frontend/public/Logos/flutter-monitoring.svg new file mode 100644 index 0000000000..313b30ff76 --- /dev/null +++ b/frontend/public/Logos/flutter-monitoring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/from-log-file.svg b/frontend/public/Logos/from-log-file.svg new file mode 100644 index 0000000000..61560fd4cf --- /dev/null +++ b/frontend/public/Logos/from-log-file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/gcp-app-engine.svg b/frontend/public/Logos/gcp-app-engine.svg new file mode 100644 index 0000000000..046144123d --- /dev/null +++ b/frontend/public/Logos/gcp-app-engine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/gcp-cloud-functions.svg b/frontend/public/Logos/gcp-cloud-functions.svg new file mode 100644 index 0000000000..2d10189401 --- /dev/null +++ b/frontend/public/Logos/gcp-cloud-functions.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/gcp-cloud-load-balancer.svg b/frontend/public/Logos/gcp-cloud-load-balancer.svg new file mode 100644 index 0000000000..2b02982241 --- /dev/null +++ b/frontend/public/Logos/gcp-cloud-load-balancer.svg @@ -0,0 +1,28 @@ + + + + + + + Icon_24px_LoadBalancing_Color + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/gcp-cloud-monitoring.svg b/frontend/public/Logos/gcp-cloud-monitoring.svg new file mode 100644 index 0000000000..ab3111db6d --- /dev/null +++ b/frontend/public/Logos/gcp-cloud-monitoring.svg @@ -0,0 +1 @@ +Icon_24px_Monitoring_Color \ No newline at end of file diff --git a/frontend/public/Logos/gcp-cloud-run.svg b/frontend/public/Logos/gcp-cloud-run.svg new file mode 100644 index 0000000000..e2e3b7d316 --- /dev/null +++ b/frontend/public/Logos/gcp-cloud-run.svg @@ -0,0 +1 @@ +Icon_24px_CloudRun_Color \ No newline at end of file diff --git a/frontend/public/Logos/gcp-cloud-sql.svg b/frontend/public/Logos/gcp-cloud-sql.svg new file mode 100644 index 0000000000..b6910a6d7c --- /dev/null +++ b/frontend/public/Logos/gcp-cloud-sql.svg @@ -0,0 +1,20 @@ + + + + + + + Icon_24px_SQL_Color + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/gcp-cloud-storage.svg b/frontend/public/Logos/gcp-cloud-storage.svg new file mode 100644 index 0000000000..d30e003085 --- /dev/null +++ b/frontend/public/Logos/gcp-cloud-storage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/gcp-compute-engine.svg b/frontend/public/Logos/gcp-compute-engine.svg new file mode 100644 index 0000000000..9ed632fae3 --- /dev/null +++ b/frontend/public/Logos/gcp-compute-engine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/gcp-gke.svg b/frontend/public/Logos/gcp-gke.svg new file mode 100644 index 0000000000..9cbabc50fd --- /dev/null +++ b/frontend/public/Logos/gcp-gke.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/gcp-vpc.svg b/frontend/public/Logos/gcp-vpc.svg new file mode 100644 index 0000000000..295b0ee2ab --- /dev/null +++ b/frontend/public/Logos/gcp-vpc.svg @@ -0,0 +1 @@ +Icon_24px_VirtualPrivateCloud_Color \ No newline at end of file diff --git a/frontend/public/Logos/go.svg b/frontend/public/Logos/go.svg new file mode 100644 index 0000000000..64e9620777 --- /dev/null +++ b/frontend/public/Logos/go.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/Logos/heroku.svg b/frontend/public/Logos/heroku.svg new file mode 100644 index 0000000000..91f1f98ff1 --- /dev/null +++ b/frontend/public/Logos/heroku.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/hostmetrics.svg b/frontend/public/Logos/hostmetrics.svg new file mode 100644 index 0000000000..60bf068531 --- /dev/null +++ b/frontend/public/Logos/hostmetrics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/http.svg b/frontend/public/Logos/http.svg new file mode 100644 index 0000000000..f09e4eee20 --- /dev/null +++ b/frontend/public/Logos/http.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/java-others.svg b/frontend/public/Logos/java-others.svg new file mode 100644 index 0000000000..7e9c623de6 --- /dev/null +++ b/frontend/public/Logos/java-others.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/java.svg b/frontend/public/Logos/java.svg new file mode 100644 index 0000000000..7e9c623de6 --- /dev/null +++ b/frontend/public/Logos/java.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/javascript.svg b/frontend/public/Logos/javascript.svg new file mode 100644 index 0000000000..9650ca78ef --- /dev/null +++ b/frontend/public/Logos/javascript.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/public/Logos/jboss.svg b/frontend/public/Logos/jboss.svg new file mode 100644 index 0000000000..cf72755260 --- /dev/null +++ b/frontend/public/Logos/jboss.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/Logos/lambda.svg b/frontend/public/Logos/lambda.svg new file mode 100644 index 0000000000..0975f058ff --- /dev/null +++ b/frontend/public/Logos/lambda.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/llm-monitoring.svg b/frontend/public/Logos/llm-monitoring.svg new file mode 100644 index 0000000000..7b8cb6b9a0 --- /dev/null +++ b/frontend/public/Logos/llm-monitoring.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/frontend/public/Logos/nestjs.svg b/frontend/public/Logos/nestjs.svg new file mode 100644 index 0000000000..69830240c2 --- /dev/null +++ b/frontend/public/Logos/nestjs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/nextjs.svg b/frontend/public/Logos/nextjs.svg new file mode 100644 index 0000000000..50ccbbd18e --- /dev/null +++ b/frontend/public/Logos/nextjs.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/nodejs.svg b/frontend/public/Logos/nodejs.svg new file mode 100644 index 0000000000..0481f9f80e --- /dev/null +++ b/frontend/public/Logos/nodejs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/other-metrics.svg b/frontend/public/Logos/other-metrics.svg new file mode 100644 index 0000000000..9eb82fbb25 --- /dev/null +++ b/frontend/public/Logos/other-metrics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/php.svg b/frontend/public/Logos/php.svg new file mode 100644 index 0000000000..37a5e6fe7e --- /dev/null +++ b/frontend/public/Logos/php.svg @@ -0,0 +1,96 @@ + + + Official PHP Logo + + + + image/svg+xml + + Official PHP Logo + + + Colin Viebrock + + + + + + + + + + + + Copyright Colin Viebrock 1997 - All rights reserved. + + + 1997 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/python-others.svg b/frontend/public/Logos/python-others.svg new file mode 100644 index 0000000000..e771ee2541 --- /dev/null +++ b/frontend/public/Logos/python-others.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/frontend/public/Logos/python.svg b/frontend/public/Logos/python.svg new file mode 100644 index 0000000000..e771ee2541 --- /dev/null +++ b/frontend/public/Logos/python.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/frontend/public/Logos/rds.svg b/frontend/public/Logos/rds.svg new file mode 100644 index 0000000000..245d23725a --- /dev/null +++ b/frontend/public/Logos/rds.svg @@ -0,0 +1,18 @@ + + + + Icon-Architecture/64/Arch_Amazon-RDS_64 + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/ruby-on-rails.svg b/frontend/public/Logos/ruby-on-rails.svg new file mode 100644 index 0000000000..3c2c7472da --- /dev/null +++ b/frontend/public/Logos/ruby-on-rails.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/Logos/rust.svg b/frontend/public/Logos/rust.svg new file mode 100644 index 0000000000..0091b5a8c8 --- /dev/null +++ b/frontend/public/Logos/rust.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/Logos/springboot.svg b/frontend/public/Logos/springboot.svg new file mode 100644 index 0000000000..740097b559 --- /dev/null +++ b/frontend/public/Logos/springboot.svg @@ -0,0 +1 @@ +spring-icon \ No newline at end of file diff --git a/frontend/public/Logos/swift-monitoring.svg b/frontend/public/Logos/swift-monitoring.svg new file mode 100644 index 0000000000..9fd1efc698 --- /dev/null +++ b/frontend/public/Logos/swift-monitoring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/swift.svg b/frontend/public/Logos/swift.svg new file mode 100644 index 0000000000..9fd1efc698 --- /dev/null +++ b/frontend/public/Logos/swift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/tomcat-logs.svg b/frontend/public/Logos/tomcat-logs.svg new file mode 100644 index 0000000000..487a0d7094 --- /dev/null +++ b/frontend/public/Logos/tomcat-logs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/tomcat.svg b/frontend/public/Logos/tomcat.svg new file mode 100644 index 0000000000..487a0d7094 --- /dev/null +++ b/frontend/public/Logos/tomcat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/vector.svg b/frontend/public/Logos/vector.svg new file mode 100644 index 0000000000..b045c75543 --- /dev/null +++ b/frontend/public/Logos/vector.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/Logos/vercel.svg b/frontend/public/Logos/vercel.svg new file mode 100644 index 0000000000..5f54fdea95 --- /dev/null +++ b/frontend/public/Logos/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/vm.svg b/frontend/public/Logos/vm.svg new file mode 100644 index 0000000000..eb27e293a7 --- /dev/null +++ b/frontend/public/Logos/vm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/vpc.svg b/frontend/public/Logos/vpc.svg new file mode 100644 index 0000000000..289a01df5f --- /dev/null +++ b/frontend/public/Logos/vpc.svg @@ -0,0 +1 @@ +aws-vpc \ No newline at end of file diff --git a/frontend/public/Logos/windows-events-logs.svg b/frontend/public/Logos/windows-events-logs.svg new file mode 100644 index 0000000000..b2ffa2c456 --- /dev/null +++ b/frontend/public/Logos/windows-events-logs.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/frontend/public/Logos/windows.svg b/frontend/public/Logos/windows.svg new file mode 100644 index 0000000000..b2ffa2c456 --- /dev/null +++ b/frontend/public/Logos/windows.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/frontend/public/locales/en/titles.json b/frontend/public/locales/en/titles.json index a75e02b274..1e2b8f0b4a 100644 --- a/frontend/public/locales/en/titles.json +++ b/frontend/public/locales/en/titles.json @@ -3,13 +3,15 @@ "LOGIN": "SigNoz | Login", "SERVICE_METRICS": "SigNoz | Service Metrics", "SERVICE_MAP": "SigNoz | Service Map", - "GET_STARTED": "SigNoz | Get Started", + "GET_STARTED_OLD": "SigNoz | Get Started", "ONBOARDING": "SigNoz | Get Started", "GET_STARTED_APPLICATION_MONITORING": "SigNoz | Get Started | APM", "GET_STARTED_LOGS_MANAGEMENT": "SigNoz | Get Started | Logs", "GET_STARTED_INFRASTRUCTURE_MONITORING": "SigNoz | Get Started | Infrastructure", "GET_STARTED_AWS_MONITORING": "SigNoz | Get Started | AWS", "GET_STARTED_AZURE_MONITORING": "SigNoz | Get Started | AZURE", + "GET_STARTED": "SigNoz | Get Started with SigNoz Cloud", + "GET_STARTED_WITH_CLOUD": "SigNoz | Get Started with SigNoz Cloud", "TRACE": "SigNoz | Trace", "TRACE_DETAIL": "SigNoz | Trace Detail", "TRACES_EXPLORER": "SigNoz | Traces Explorer", diff --git a/frontend/src/AppRoutes/Private.tsx b/frontend/src/AppRoutes/Private.tsx index 87ad2bcc3a..c348f38a63 100644 --- a/frontend/src/AppRoutes/Private.tsx +++ b/frontend/src/AppRoutes/Private.tsx @@ -1,6 +1,7 @@ import getLocalStorageApi from 'api/browser/localstorage/get'; import setLocalStorageApi from 'api/browser/localstorage/set'; import getOrgUser from 'api/user/getOrgUser'; +import { FeatureKeys } from 'constants/features'; import { LOCALSTORAGE } from 'constants/localStorage'; import ROUTES from 'constants/routes'; import history from 'lib/history'; @@ -36,6 +37,7 @@ function PrivateRoute({ children }: PrivateRouteProps): JSX.Element { isFetchingLicenses, activeLicenseV3, isFetchingActiveLicenseV3, + featureFlags, } = useAppContext(); const isAdmin = user.role === USER_ROLES.ADMIN; @@ -170,6 +172,16 @@ function PrivateRoute({ children }: PrivateRouteProps): JSX.Element { } }, [org]); + // if the feature flag is enabled and the current route is /get-started then redirect to /get-started-with-signoz-cloud + useEffect(() => { + if ( + currentRoute?.path === ROUTES.GET_STARTED && + featureFlags?.find((e) => e.name === FeatureKeys.ONBOARDING_V3)?.active + ) { + history.push(ROUTES.GET_STARTED_WITH_CLOUD); + } + }, [currentRoute, featureFlags]); + // eslint-disable-next-line sonarjs/cognitive-complexity useEffect(() => { // if it is an old route navigate to the new route diff --git a/frontend/src/AppRoutes/pageComponents.ts b/frontend/src/AppRoutes/pageComponents.ts index c1385e8bdf..bf84f6c804 100644 --- a/frontend/src/AppRoutes/pageComponents.ts +++ b/frontend/src/AppRoutes/pageComponents.ts @@ -73,6 +73,10 @@ export const OrgOnboarding = Loadable( () => import(/* webpackChunkName: "OrgOnboarding" */ 'pages/OrgOnboarding'), ); +export const OnboardingV2 = Loadable( + () => import(/* webpackChunkName: "Onboarding V2" */ 'pages/OnboardingPageV2'), +); + export const DashboardPage = Loadable( () => import(/* webpackChunkName: "DashboardPage" */ 'pages/DashboardsListPage'), diff --git a/frontend/src/AppRoutes/routes.ts b/frontend/src/AppRoutes/routes.ts index ace656085c..90e7858ba7 100644 --- a/frontend/src/AppRoutes/routes.ts +++ b/frontend/src/AppRoutes/routes.ts @@ -33,6 +33,7 @@ import { NewDashboardPage, OldLogsExplorer, Onboarding, + OnboardingV2, OrganizationSettings, OrgOnboarding, PasswordReset, @@ -72,6 +73,13 @@ const routes: AppRoutes[] = [ isPrivate: true, key: 'GET_STARTED', }, + { + path: ROUTES.GET_STARTED_WITH_CLOUD, + exact: false, + component: OnboardingV2, + isPrivate: true, + key: 'GET_STARTED_WITH_CLOUD', + }, { path: ROUTES.ONBOARDING, exact: false, diff --git a/frontend/src/constants/features.ts b/frontend/src/constants/features.ts index 9a2550ec0b..db64d7923f 100644 --- a/frontend/src/constants/features.ts +++ b/frontend/src/constants/features.ts @@ -23,4 +23,6 @@ export enum FeatureKeys { PREMIUM_SUPPORT = 'PREMIUM_SUPPORT', QUERY_BUILDER_SEARCH_V2 = 'QUERY_BUILDER_SEARCH_V2', ANOMALY_DETECTION = 'ANOMALY_DETECTION', + AWS_INTEGRATION = 'AWS_INTEGRATION', + ONBOARDING_V3 = 'ONBOARDING_V3', } diff --git a/frontend/src/constants/routes.ts b/frontend/src/constants/routes.ts index 5c40f1ddd4..aca2ce5e33 100644 --- a/frontend/src/constants/routes.ts +++ b/frontend/src/constants/routes.ts @@ -7,8 +7,9 @@ const ROUTES = { TRACE: '/trace', TRACE_DETAIL: '/trace/:id', TRACES_EXPLORER: '/traces-explorer', - GET_STARTED: '/get-started', ONBOARDING: '/onboarding', + GET_STARTED: '/get-started', + GET_STARTED_WITH_CLOUD: '/get-started-with-signoz-cloud', GET_STARTED_APPLICATION_MONITORING: '/get-started/application-monitoring', GET_STARTED_LOGS_MANAGEMENT: '/get-started/logs-management', GET_STARTED_INFRASTRUCTURE_MONITORING: diff --git a/frontend/src/container/AppLayout/AppLayout.styles.scss b/frontend/src/container/AppLayout/AppLayout.styles.scss index 569e96f388..f5900c45b2 100644 --- a/frontend/src/container/AppLayout/AppLayout.styles.scss +++ b/frontend/src/container/AppLayout/AppLayout.styles.scss @@ -4,7 +4,7 @@ width: 100%; .app-content { - width: calc(100% - 64px); + width: 100%; z-index: 0; margin: 0 auto; diff --git a/frontend/src/container/AppLayout/index.tsx b/frontend/src/container/AppLayout/index.tsx index 4e0fe0a1c0..feb354245c 100644 --- a/frontend/src/container/AppLayout/index.tsx +++ b/frontend/src/container/AppLayout/index.tsx @@ -242,6 +242,7 @@ function AppLayout(props: AppLayoutProps): JSX.Element { const renderFullScreen = pathname === ROUTES.GET_STARTED || pathname === ROUTES.ONBOARDING || + pathname === ROUTES.GET_STARTED_WITH_CLOUD || pathname === ROUTES.GET_STARTED_APPLICATION_MONITORING || pathname === ROUTES.GET_STARTED_INFRASTRUCTURE_MONITORING || pathname === ROUTES.GET_STARTED_LOGS_MANAGEMENT || diff --git a/frontend/src/container/IngestionSettings/IngestionSettings.styles.scss b/frontend/src/container/IngestionSettings/IngestionSettings.styles.scss index acf7b238f4..3d1b795ab8 100644 --- a/frontend/src/container/IngestionSettings/IngestionSettings.styles.scss +++ b/frontend/src/container/IngestionSettings/IngestionSettings.styles.scss @@ -978,14 +978,70 @@ .ingestion-setup-details-links { display: flex; - align-items: center; + flex-direction: column; gap: 8px; - margin-bottom: 24px; + margin-top: 12px; padding: 12px; border-radius: 4px; background: rgba(113, 144, 249, 0.1); color: var(--bg-robin-300, #95acfb); + .ingestion-key-url-container { + display: flex; + gap: 8px; + justify-content: space-between; + align-items: center; + + .ingestion-key-url-label { + font-size: 13px; + font-weight: 500; + color: var(--bg-robin-300, #95acfb); + } + + .ingestion-key-url-value { + display: flex; + gap: 8px; + align-items: center; + font-size: 13px; + font-weight: 500; + color: var(--bg-robin-300, #95acfb); + + .copy-key-btn { + cursor: pointer; + } + } + } + + .ingestion-data-region-container { + display: flex; + gap: 8px; + align-items: center; + justify-content: space-between; + + .ingestion-data-region-label { + font-size: 13px; + font-weight: 500; + color: var(--bg-robin-300, #95acfb); + } + + .ingestion-data-region-value { + display: flex; + gap: 8px; + align-items: center; + font-size: 13px; + font-weight: 500; + color: var(--bg-robin-300, #95acfb); + + .ingestion-data-region-value-text { + color: var(--bg-robin-300, #95acfb); + } + + .copy-key-btn { + cursor: pointer; + } + } + } + .learn-more { display: inline-flex; justify-content: center; diff --git a/frontend/src/container/IngestionSettings/MultiIngestionSettings.tsx b/frontend/src/container/IngestionSettings/MultiIngestionSettings.tsx index ca8ce7251d..cc472ad09b 100644 --- a/frontend/src/container/IngestionSettings/MultiIngestionSettings.tsx +++ b/frontend/src/container/IngestionSettings/MultiIngestionSettings.tsx @@ -1,3 +1,5 @@ +/* eslint-disable jsx-a11y/no-static-element-interactions */ +/* eslint-disable jsx-a11y/click-events-have-key-events */ import './IngestionSettings.styles.scss'; import { Color } from '@signozhq/design-tokens'; @@ -33,6 +35,7 @@ import Tags from 'components/Tags/Tags'; import { SOMETHING_WENT_WRONG } from 'constants/api'; import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats'; import dayjs from 'dayjs'; +import { useGetDeploymentsData } from 'hooks/CustomDomain/useGetDeploymentsData'; import { useGetAllIngestionsKeys } from 'hooks/IngestionKeys/useGetAllIngestionKeys'; import useDebouncedFn from 'hooks/useDebouncedFunction'; import { useNotifications } from 'hooks/useNotifications'; @@ -43,7 +46,6 @@ import { Check, Copy, Infinity, - Info, Minus, PenLine, Plus, @@ -285,6 +287,13 @@ function MultiIngestionSettings(): JSX.Element { setSearchValue(''); }; + const { + data: deploymentsData, + isLoading: isLoadingDeploymentsData, + isFetching: isFetchingDeploymentsData, + isError: isErrorDeploymentsData, + } = useGetDeploymentsData(); + const { mutate: createIngestionKey, isLoading: isLoadingCreateAPIKey, @@ -1253,22 +1262,6 @@ function MultiIngestionSettings(): JSX.Element { return (
-
- - - - Find your ingestion URL and learn more about sending data to SigNoz{' '} - - here - - -
-
Ingestion Keys @@ -1284,6 +1277,46 @@ function MultiIngestionSettings(): JSX.Element {
+ {!isErrorDeploymentsData && + !isLoadingDeploymentsData && + !isFetchingDeploymentsData && ( +
+
+
Ingestion URL
+
{ + e.stopPropagation(); + e.preventDefault(); + handleCopyKey( + `ingest.${deploymentsData?.data.data.cluster.region.dns}`, + ); + }} + > + ingest.{deploymentsData?.data.data.cluster.region.dns} + +
+
+ +
+
Region
+
{ + e.stopPropagation(); + e.preventDefault(); + handleCopyKey(deploymentsData?.data.data.cluster.region.name || ''); + }} + > + + {deploymentsData?.data.data.cluster.region.name} + + +
+
+
+ )} +
{ }); it('renders MultiIngestionSettings page without crashing', () => { - expect( - screen.getByText( - 'Find your ingestion URL and learn more about sending data to SigNoz', - ), - ).toBeInTheDocument(); - expect(screen.getByText('Ingestion Keys')).toBeInTheDocument(); expect( screen.getByText('Create and manage ingestion keys for the SigNoz Cloud'), ).toBeInTheDocument(); - const overviewLink = screen.getByRole('link', { name: /here/i }); - expect(overviewLink).toHaveAttribute( - 'href', - 'https://signoz.io/docs/ingestion/signoz-cloud/overview/', - ); - expect(overviewLink).toHaveAttribute('target', '_blank'); - expect(overviewLink).toHaveClass('learn-more'); - expect(overviewLink).toHaveAttribute('rel', 'noreferrer'); - const aboutKeyslink = screen.getByRole('link', { name: /Learn more/i }); expect(aboutKeyslink).toHaveAttribute( 'href', diff --git a/frontend/src/container/OnboardingContainer/OnboardingContainer.tsx b/frontend/src/container/OnboardingContainer/OnboardingContainer.tsx index 861786f2aa..ea120ec4f3 100644 --- a/frontend/src/container/OnboardingContainer/OnboardingContainer.tsx +++ b/frontend/src/container/OnboardingContainer/OnboardingContainer.tsx @@ -7,12 +7,14 @@ import { Button, Card, Form, Typography } from 'antd'; import logEvent from 'api/common/logEvent'; import getIngestionData from 'api/settings/getIngestionData'; import cx from 'classnames'; +import { FeatureKeys } from 'constants/features'; import ROUTES from 'constants/routes'; import FullScreenHeader from 'container/FullScreenHeader/FullScreenHeader'; import InviteUserModal from 'container/OrganizationSettings/InviteUserModal/InviteUserModal'; import { InviteMemberFormValues } from 'container/OrganizationSettings/PendingInvitesContainer'; import history from 'lib/history'; import { UserPlus } from 'lucide-react'; +import { useAppContext } from 'providers/App/App'; import { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useQuery } from 'react-query'; @@ -106,6 +108,11 @@ export default function Onboarding(): JSX.Element { const { location } = history; const { t } = useTranslation(['onboarding']); + const { featureFlags } = useAppContext(); + const isOnboardingV3Enabled = featureFlags?.find( + (flag) => flag.name === FeatureKeys.ONBOARDING_V3, + )?.active; + const { selectedDataSource, selectedEnvironment, @@ -384,7 +391,12 @@ export default function Onboarding(): JSX.Element { setActiveStep(activeStep - 1); setSelectedModule(useCases.APM); resetProgress(); - history.push(ROUTES.GET_STARTED); + + if (isOnboardingV3Enabled) { + history.push(ROUTES.GET_STARTED_WITH_CLOUD); + } else { + history.push(ROUTES.GET_STARTED); + } }} selectedModule={selectedModule} selectedModuleSteps={selectedModuleSteps} diff --git a/frontend/src/container/OnboardingQuestionaire/index.tsx b/frontend/src/container/OnboardingQuestionaire/index.tsx index 1d7975d6c5..e383a487dd 100644 --- a/frontend/src/container/OnboardingQuestionaire/index.tsx +++ b/frontend/src/container/OnboardingQuestionaire/index.tsx @@ -7,6 +7,7 @@ import getAllOrgPreferences from 'api/preferences/getAllOrgPreferences'; import updateOrgPreferenceAPI from 'api/preferences/updateOrgPreference'; import { AxiosError } from 'axios'; import { SOMETHING_WENT_WRONG } from 'constants/api'; +import { FeatureKeys } from 'constants/features'; import ROUTES from 'constants/routes'; import { InviteTeamMembersProps } from 'container/OrganizationSettings/PendingInvitesContainer'; import { useNotifications } from 'hooks/useNotifications'; @@ -62,7 +63,10 @@ const ONBOARDING_COMPLETE_EVENT_NAME = 'Org Onboarding: Complete'; function OnboardingQuestionaire(): JSX.Element { const { notifications } = useNotifications(); - const { org, updateOrgPreferences } = useAppContext(); + const { org, updateOrgPreferences, featureFlags } = useAppContext(); + const isOnboardingV3Enabled = featureFlags?.find( + (flag) => flag.name === FeatureKeys.ONBOARDING_V3, + )?.active; const [currentStep, setCurrentStep] = useState(1); const [orgDetails, setOrgDetails] = useState(INITIAL_ORG_DETAILS); const [signozDetails, setSignozDetails] = useState( @@ -117,7 +121,11 @@ function OnboardingQuestionaire(): JSX.Element { logEvent('Org Onboarding: Redirecting to Get Started', {}); - history.push(ROUTES.GET_STARTED); + if (isOnboardingV3Enabled) { + history.push(ROUTES.GET_STARTED_WITH_CLOUD); + } else { + history.push(ROUTES.GET_STARTED); + } }, onError: () => { setUpdatingOrgOnboardingStatus(false); diff --git a/frontend/src/container/OnboardingV2Container/AddDataSource/AddDataSource.tsx b/frontend/src/container/OnboardingV2Container/AddDataSource/AddDataSource.tsx new file mode 100644 index 0000000000..da98bf26c6 --- /dev/null +++ b/frontend/src/container/OnboardingV2Container/AddDataSource/AddDataSource.tsx @@ -0,0 +1,813 @@ +import '../OnboardingV2.styles.scss'; + +import { SearchOutlined } from '@ant-design/icons'; +import { + Button, + Flex, + Input, + Layout, + Modal, + Skeleton, + Space, + Steps, + Typography, +} from 'antd'; +import logEvent from 'api/common/logEvent'; +import LaunchChatSupport from 'components/LaunchChatSupport/LaunchChatSupport'; +import ROUTES from 'constants/routes'; +import history from 'lib/history'; +import { isEmpty } from 'lodash-es'; +import { ArrowRight, X } from 'lucide-react'; +import { useAppContext } from 'providers/App/App'; +import React, { useEffect, useRef, useState } from 'react'; + +import OnboardingIngestionDetails from '../IngestionDetails/IngestionDetails'; +import InviteTeamMembers from '../InviteTeamMembers/InviteTeamMembers'; +import onboardingConfigWithLinks from '../onboarding-configs/onboarding-config-with-links.json'; + +const { Header } = Layout; + +interface OptionGroup { + id: string; + category: string; + items: string[]; +} + +export interface Question { + id: string; + title: string; + description: string; + options: OptionGroup[]; + uiConfig?: { + showSearch?: boolean; + filterByCategory?: boolean; + }; +} + +interface Option { + imgUrl?: string; + label: string; + link?: string; + entityID?: string; +} + +interface Entity { + imgUrl?: string; + label: string; + dataSource: string; + entityID: string; + module: string; + question?: { + desc: string; + options: Option[]; + entityID: string; + question?: { + desc: string; + options: Option[]; + entityID: string; + }; + }; + tags: string[]; + link?: string; +} + +const setupStepItemsBase = [ + { + title: 'Org Setup', + description:  , + }, + { + title: 'Add your first data source', + description: ' ', + }, + { + title: 'Configure Your Product', + description: ' ', + }, +]; + +const ONBOARDING_V3_ANALYTICS_EVENTS_MAP = { + BASE: 'Onboarding V3', + STARTED: 'Started', + DATA_SOURCE_SELECTED: 'Datasource selected', + FRAMEWORK_SELECTED: 'Framework selected', + ENVIRONMENT_SELECTED: 'Environment selected', + CONFIGURED_PRODUCT: 'Configure clicked', + BACK_BUTTON_CLICKED: 'Back clicked', + CONTINUE_BUTTON_CLICKED: 'Continue clicked', + GET_HELP_BUTTON_CLICKED: 'Get help clicked', + GET_EXPERT_ASSISTANCE_BUTTON_CLICKED: 'Get expert assistance clicked', + INVITE_TEAM_MEMBER_BUTTON_CLICKED: 'Invite team member clicked', + CLOSE_ONBOARDING_CLICKED: 'Close onboarding clicked', +}; + +function OnboardingAddDataSource(): JSX.Element { + const [groupedDataSources, setGroupedDataSources] = useState<{ + [tag: string]: Entity[]; + }>({}); + + const { org } = useAppContext(); + + const [setupStepItems, setSetupStepItems] = useState(setupStepItemsBase); + + const question2Ref = useRef(null); + const question3Ref = useRef(null); + const configureProdRef = useRef(null); + + const [showConfigureProduct, setShowConfigureProduct] = useState( + false, + ); + + const [currentStep, setCurrentStep] = useState(1); + + const [hasMoreQuestions, setHasMoreQuestions] = useState(true); + + const [ + showInviteTeamMembersModal, + setShowInviteTeamMembersModal, + ] = useState(false); + + const [docsUrl, setDocsUrl] = useState( + 'https://signoz.io/docs/instrumentation/', + ); + + const [selectedDataSource, setSelectedDataSource] = useState( + null, + ); + + const [selectedFramework, setSelectedFramework] = useState( + null, + ); + + const [selectedEnvironment, setSelectedEnvironment] = useState( + null, + ); + + const [selectedCategory, setSelectedCategory] = useState('All'); + + const handleScrollToStep = (ref: React.RefObject): void => { + setTimeout(() => { + ref.current?.scrollIntoView({ + behavior: 'smooth', + block: 'start', + inline: 'nearest', + }); + }, 100); + }; + + useEffect(() => { + logEvent( + `${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.BASE}: ${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.STARTED}`, + {}, + ); + }, []); + + const updateUrl = (url: string, selectedEnvironment: string | null): void => { + if (!url || url === '') { + return; + } + + // Step 1: Parse the URL + const urlObj = new URL(url); + + // Step 2: Update or add the 'source' parameter + urlObj.searchParams.set('source', 'onboarding'); + + if (selectedEnvironment) { + urlObj.searchParams.set('environment', selectedEnvironment); + } + + // Step 3: Return the updated URL as a string + const updatedUrl = urlObj.toString(); + + setDocsUrl(updatedUrl); + }; + + const handleSelectDataSource = (dataSource: Entity): void => { + setSelectedDataSource(dataSource); + setSelectedFramework(null); + setSelectedEnvironment(null); + + logEvent( + `${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.BASE}: ${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.DATA_SOURCE_SELECTED}`, + { + dataSource: dataSource.label, + }, + ); + + if (dataSource.question) { + setHasMoreQuestions(true); + + setTimeout(() => { + handleScrollToStep(question2Ref); + }, 100); + } else { + setHasMoreQuestions(false); + + updateUrl(dataSource?.link || '', null); + + setShowConfigureProduct(true); + } + }; + + const handleSelectFramework = (option: any): void => { + setSelectedFramework(option); + + logEvent( + `${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.BASE}: ${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.FRAMEWORK_SELECTED}`, + { + dataSource: selectedDataSource?.label, + framework: option.label, + }, + ); + + if (option.question) { + setHasMoreQuestions(true); + + updateUrl(option?.link, null); + + setTimeout(() => { + handleScrollToStep(question3Ref); + }, 100); + } else { + updateUrl(option.link, null); + setHasMoreQuestions(false); + + setShowConfigureProduct(true); + } + }; + + const handleSelectEnvironment = (selectedEnvironment: any): void => { + setSelectedEnvironment(selectedEnvironment); + setHasMoreQuestions(false); + + logEvent( + `${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.BASE}: ${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.ENVIRONMENT_SELECTED}`, + { + dataSource: selectedDataSource?.label, + framework: selectedFramework?.label, + environment: selectedEnvironment?.label, + }, + ); + + updateUrl(docsUrl, selectedEnvironment?.key); + + setShowConfigureProduct(true); + }; + + const groupDataSourcesByTags = ( + dataSources: Entity[], + ): { [tag: string]: Entity[] } => { + const groupedDataSources: { [tag: string]: Entity[] } = {}; + + dataSources.forEach((dataSource) => { + dataSource.tags.forEach((tag) => { + if (!groupedDataSources[tag]) { + groupedDataSources[tag] = []; + } + groupedDataSources[tag].push(dataSource); + }); + }); + + return groupedDataSources; + }; + + useEffect(() => { + const groupedDataSources = groupDataSourcesByTags( + onboardingConfigWithLinks as Entity[], + ); + + setGroupedDataSources(groupedDataSources); + }, []); + + const handleSearch = (e: React.ChangeEvent): void => { + const query = e.target.value.toLowerCase(); + + if (query === '') { + setGroupedDataSources( + groupDataSourcesByTags(onboardingConfigWithLinks as Entity[]), + ); + return; + } + + const filteredDataSources = onboardingConfigWithLinks.filter( + (dataSource) => + dataSource.label.toLowerCase().includes(query) || + dataSource.tags.some((tag) => tag.toLowerCase().includes(query)), + ); + + setGroupedDataSources( + groupDataSourcesByTags(filteredDataSources as Entity[]), + ); + }; + + const handleFilterByCategory = (category: string): void => { + setSelectedDataSource(null); + setSelectedFramework(null); + setSelectedEnvironment(null); + + if (category === 'All') { + setGroupedDataSources( + groupDataSourcesByTags(onboardingConfigWithLinks as Entity[]), + ); + + setSelectedCategory('All'); + return; + } + + const filteredDataSources = onboardingConfigWithLinks.filter( + (dataSource) => + dataSource.tags.includes(category) || + dataSource.tags.some((tag) => tag.toLowerCase().includes(category)), + ); + + setSelectedCategory(category); + + setGroupedDataSources( + groupDataSourcesByTags(filteredDataSources as Entity[]), + ); + }; + + useEffect(() => { + setSetupStepItems([ + { + ...setupStepItemsBase[0], + description: org?.[0]?.name || '', + }, + ...setupStepItemsBase.slice(1), + ]); + }, [org]); + + const handleUpdateCurrentStep = (step: number): void => { + setCurrentStep(step); + + if (step === 1) { + setSetupStepItems([ + { + ...setupStepItemsBase[0], + description: org?.[0]?.name || '', + }, + { + ...setupStepItemsBase[1], + description: '', + }, + ...setupStepItemsBase.slice(2), + ]); + } else if (step === 2) { + setSetupStepItems([ + { + ...setupStepItemsBase[0], + description: org?.[0]?.name || '', + }, + { + ...setupStepItemsBase[1], + description: `${selectedDataSource?.label} ${ + selectedFramework?.label ? `- ${selectedFramework?.label}` : '' + }`, + }, + ...setupStepItemsBase.slice(2), + ]); + } else if (step === 3) { + switch (selectedDataSource?.module) { + case 'apm': + history.push(ROUTES.APPLICATION); + break; + case 'logs': + history.push(ROUTES.LOGS); + break; + case 'metrics': + history.push(ROUTES.ALL_DASHBOARD); + break; + default: + history.push(ROUTES.APPLICATION); + } + } + }; + + const handleShowInviteTeamMembersModal = (): void => { + logEvent( + `${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.BASE}: ${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.INVITE_TEAM_MEMBER_BUTTON_CLICKED}`, + { + dataSource: selectedDataSource?.label, + framework: selectedFramework?.label, + environment: selectedEnvironment?.label, + currentPage: setupStepItems[currentStep]?.title || '', + }, + ); + setShowInviteTeamMembersModal(true); + }; + + return ( +
+ +
+
+
+ { + logEvent( + `${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.BASE}: ${ONBOARDING_V3_ANALYTICS_EVENTS_MAP?.CLOSE_ONBOARDING_CLICKED}`, + { + currentPage: setupStepItems[currentStep]?.title || '', + }, + ); + + history.push(ROUTES.APPLICATION); + }} + /> + Get Started (2/4) +
+ +
+ +
+
+
+
+ +
+ +
+
+
+ + {currentStep === 1 && ( +
+
+
+
+ + Select your data source + + + Select from a host of services to start sending data to SigNoz + +
+
+ +
+
+
+
+ } + /> +
+ + {Object.keys(groupedDataSources).map((tag) => ( +
+ + {tag} ({groupedDataSources[tag].length}) + +
+ {groupedDataSources[tag].map((dataSource) => ( + + ))} +
+
+ ))} +
+ +
+
+ + {' '} + Filters{' '} + + + handleFilterByCategory('All')} + > + All ({onboardingConfigWithLinks.length}) + + + {Object.keys(groupedDataSources).map((tag) => ( +
+ handleFilterByCategory(tag)} + > + {tag} ({groupedDataSources[tag].length}) + +
+ ))} +
+
+
+ + {selectedDataSource && + selectedDataSource?.question && + !isEmpty(selectedDataSource?.question) && ( +
+ {selectedDataSource?.question?.desc && ( + <> +
+ + {selectedDataSource?.question?.desc} + +
+ +
+ {selectedDataSource?.question?.options.map((option) => ( + + ))} +
+ + )} +
+ )} + + {selectedFramework && + selectedFramework?.question && + !isEmpty(selectedFramework?.question) && ( +
+ {selectedFramework?.question?.desc && ( + <> +
+ + {selectedFramework?.question?.desc} + +
+ +
+ {selectedFramework?.question?.options.map((option) => ( + + ))} +
+ + )} +
+ )} + + {!hasMoreQuestions && showConfigureProduct && ( +
+ +
+ )} +
+
+
+ )} + + {currentStep === 2 && ( +
+
+
+ + + + + + + + + + + + + +
+