diff --git a/frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountActions.tsx b/frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountActions.tsx index b8e1791762..de2f83afb8 100644 --- a/frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountActions.tsx +++ b/frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountActions.tsx @@ -3,6 +3,7 @@ import './AccountActions.style.scss'; import { Color } from '@signozhq/design-tokens'; import { Button, Select, Skeleton } from 'antd'; import { SelectProps } from 'antd/lib'; +import logEvent from 'api/common/logEvent'; import { useAwsAccounts } from 'hooks/integration/aws/useAwsAccounts'; import useUrlQuery from 'hooks/useUrlQuery'; import { Check, ChevronDown } from 'lucide-react'; @@ -167,9 +168,31 @@ function AccountActions(): JSX.Element { }, [initialAccount]); const [isIntegrationModalOpen, setIsIntegrationModalOpen] = useState(false); + const startAccountConnectionAttempt = (): void => { + setIsIntegrationModalOpen(true); + logEvent('AWS Integration: Account connection attempt started', {}); + }; + const [isAccountSettingsModalOpen, setIsAccountSettingsModalOpen] = useState( false, ); + const openAccountSettings = (): void => { + setIsAccountSettingsModalOpen(true); + logEvent('AWS Integration: Account settings viewed', { + cloudAccountId: activeAccount?.cloud_account_id, + }); + }; + + // log telemetry event when an account is viewed. + useEffect(() => { + if (activeAccount) { + logEvent('AWS Integration: Account viewed', { + cloudAccountId: activeAccount?.cloud_account_id, + status: activeAccount?.status, + enabledRegions: activeAccount?.config?.regions, + }); + } + }, [activeAccount]); const selectOptions: SelectProps['options'] = useMemo( () => @@ -196,8 +219,8 @@ function AccountActions(): JSX.Element { navigate({ search: urlQuery.toString() }); } }} - onIntegrationModalOpen={(): void => setIsIntegrationModalOpen(true)} - onAccountSettingsModalOpen={(): void => setIsAccountSettingsModalOpen(true)} + onIntegrationModalOpen={startAccountConnectionAttempt} + onAccountSettingsModalOpen={openAccountSettings} /> {isIntegrationModalOpen && ( diff --git a/frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountSettingsModal.tsx b/frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountSettingsModal.tsx index 322281fa41..65396a90f4 100644 --- a/frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountSettingsModal.tsx +++ b/frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountSettingsModal.tsx @@ -12,6 +12,7 @@ import history from 'lib/history'; import { Dispatch, SetStateAction, useCallback } from 'react'; import { useQueryClient } from 'react-query'; +import logEvent from '../../../../api/common/logEvent'; import { CloudAccount } from '../../ServicesSection/types'; import { RegionSelector } from './RegionSelector'; import RemoveIntegrationAccount from './RemoveIntegrationAccount'; @@ -50,6 +51,11 @@ function AccountSettingsModal({ urlQuery.delete('cloudAccountId'); handleClose(); history.replace({ search: urlQuery.toString() }); + + logEvent('AWS Integration: Account removed', { + id: account?.id, + cloudAccountId: account?.cloud_account_id, + }); }; const renderRegionSelector = useCallback(() => { diff --git a/frontend/src/container/CloudIntegrationPage/HeroSection/components/CloudAccountSetupModal.tsx b/frontend/src/container/CloudIntegrationPage/HeroSection/components/CloudAccountSetupModal.tsx index e07d277f57..7ead19d221 100644 --- a/frontend/src/container/CloudIntegrationPage/HeroSection/components/CloudAccountSetupModal.tsx +++ b/frontend/src/container/CloudIntegrationPage/HeroSection/components/CloudAccountSetupModal.tsx @@ -106,7 +106,7 @@ function CloudAccountSetupModal({ // Handle success state first if (modalState === ModalStateEnum.SUCCESS) { return { - title: 'AWS Webservice Integration', + title: 'AWS Integration', okText: (
Continue diff --git a/frontend/src/container/CloudIntegrationPage/HeroSection/components/RegionForm.tsx b/frontend/src/container/CloudIntegrationPage/HeroSection/components/RegionForm.tsx index 12a188827e..d45383557d 100644 --- a/frontend/src/container/CloudIntegrationPage/HeroSection/components/RegionForm.tsx +++ b/frontend/src/container/CloudIntegrationPage/HeroSection/components/RegionForm.tsx @@ -5,6 +5,7 @@ import { useRef } from 'react'; import { AccountStatusResponse } from 'types/api/integrations/aws'; import { regions } from 'utils/regions'; +import logEvent from '../../../../api/common/logEvent'; import { ModalStateEnum, RegionFormProps } from '../types'; import AlertMessage from './AlertMessage'; import { @@ -41,7 +42,7 @@ export function RegionForm({ }: RegionFormProps): JSX.Element { const startTimeRef = useRef(Date.now()); const refetchInterval = 10 * 1000; - const errorTimeout = 5 * 60 * 1000; + const errorTimeout = 10 * 60 * 1000; const { isLoading: isAccountStatusLoading } = useAccountStatus(accountId, { refetchInterval, @@ -49,9 +50,15 @@ export function RegionForm({ onSuccess: (data: AccountStatusResponse) => { if (data.data.status.integration.last_heartbeat_ts_ms !== null) { setModalState(ModalStateEnum.SUCCESS); + logEvent('AWS Integration: Account connected', { + cloudAccountId: data?.data?.cloud_account_id, + status: data?.data?.status, + }); } else if (Date.now() - startTimeRef.current >= errorTimeout) { - // 5 minutes in milliseconds setModalState(ModalStateEnum.ERROR); + logEvent('AWS Integration: Account connection attempt timed out', { + id: accountId, + }); } }, onError: () => { diff --git a/frontend/src/container/CloudIntegrationPage/ServicesSection/ConfigureServiceModal.tsx b/frontend/src/container/CloudIntegrationPage/ServicesSection/ConfigureServiceModal.tsx index 3c134977af..9ad11137df 100644 --- a/frontend/src/container/CloudIntegrationPage/ServicesSection/ConfigureServiceModal.tsx +++ b/frontend/src/container/CloudIntegrationPage/ServicesSection/ConfigureServiceModal.tsx @@ -11,6 +11,8 @@ import { useUpdateServiceConfig } from 'hooks/integration/aws/useUpdateServiceCo import { useCallback, useMemo, useState } from 'react'; import { useQueryClient } from 'react-query'; +import logEvent from '../../../api/common/logEvent'; + interface IConfigureServiceModalProps { isOpen: boolean; onClose: () => void; @@ -82,6 +84,13 @@ function ConfigureServiceModal({ serviceId, ]); onClose(); + + logEvent('AWS Integration: Service settings saved', { + cloudAccountId, + serviceId, + logsEnabled: values?.logs, + metricsEnabled: values?.metrics, + }); }, onError: (error) => { console.error('Failed to update service config:', error); diff --git a/frontend/src/container/CloudIntegrationPage/ServicesSection/ServiceDetails.tsx b/frontend/src/container/CloudIntegrationPage/ServicesSection/ServiceDetails.tsx index 5d3ff7799b..56b9edc904 100644 --- a/frontend/src/container/CloudIntegrationPage/ServicesSection/ServiceDetails.tsx +++ b/frontend/src/container/CloudIntegrationPage/ServicesSection/ServiceDetails.tsx @@ -7,8 +7,9 @@ import { IServiceStatus } from 'container/CloudIntegrationPage/ServicesSection/t import dayjs from 'dayjs'; import { useServiceDetails } from 'hooks/integration/aws/useServiceDetails'; import useUrlQuery from 'hooks/useUrlQuery'; -import { useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; +import logEvent from '../../../api/common/logEvent'; import ConfigureServiceModal from './ConfigureServiceModal'; const getStatus = ( @@ -57,6 +58,13 @@ function ServiceDetails(): JSX.Element | null { const [isConfigureServiceModalOpen, setIsConfigureServiceModalOpen] = useState( false, ); + const openServiceConfigModal = (): void => { + setIsConfigureServiceModalOpen(true); + logEvent('AWS Integration: Service settings viewed', { + cloudAccountId, + serviceId, + }); + }; const { data: serviceDetailsData, isLoading } = useServiceDetails( serviceId || '', @@ -80,6 +88,16 @@ function ServiceDetails(): JSX.Element | null { [config], ); + // log telemetry event on visiting details of a service. + useEffect(() => { + if (serviceId) { + logEvent('AWS Integration: Service viewed', { + cloudAccountId, + serviceId, + }); + } + }, [cloudAccountId, serviceId]); + if (isLoading) { return ; } @@ -119,7 +137,7 @@ function ServiceDetails(): JSX.Element | null { (isAnySignalConfigured ? ( @@ -127,7 +145,7 @@ function ServiceDetails(): JSX.Element | null { diff --git a/frontend/src/hooks/integration/aws/useAccountSettingsModal.ts b/frontend/src/hooks/integration/aws/useAccountSettingsModal.ts index 457ba3ef93..5003e2f99c 100644 --- a/frontend/src/hooks/integration/aws/useAccountSettingsModal.ts +++ b/frontend/src/hooks/integration/aws/useAccountSettingsModal.ts @@ -14,6 +14,8 @@ import { import { AccountConfigPayload } from 'types/api/integrations/aws'; import { regions } from 'utils/regions'; +import logEvent from '../../../api/common/logEvent'; + interface UseAccountSettingsModalProps { onClose: () => void; account: CloudAccount; @@ -84,8 +86,14 @@ export function useAccountSettingsModal({ { accountId: account?.id, payload }, { onSuccess: (response) => { - setActiveAccount(response.data); + const newActiveAccount = response?.data; + setActiveAccount(newActiveAccount); onClose(); + + logEvent('AWS Integration: Account settings Updated', { + cloudAccountId: newActiveAccount?.cloud_account_id, + enabledRegions: newActiveAccount?.config?.regions, + }); }, }, ); diff --git a/frontend/src/hooks/integration/aws/useIntegrationModal.ts b/frontend/src/hooks/integration/aws/useIntegrationModal.ts index a312b0cee6..1c13927e8f 100644 --- a/frontend/src/hooks/integration/aws/useIntegrationModal.ts +++ b/frontend/src/hooks/integration/aws/useIntegrationModal.ts @@ -20,6 +20,7 @@ import { } from 'types/api/integrations/aws'; import { regions } from 'utils/regions'; +import logEvent from '../../../api/common/logEvent'; import { useConnectionParams } from './useConnectionParams'; import { useGenerateConnectionUrl } from './useGenerateConnectionUrl'; @@ -117,6 +118,9 @@ export function useIntegrationModal({ (payload: GenerateConnectionUrlPayload): void => { generateUrl(payload, { onSuccess: (data: ConnectionUrlResponse) => { + logEvent('AWS Integration: Account connection attempt redirected to AWS', { + id: data.account_id, + }); window.open(data.connection_url, '_blank'); setModalState(ModalStateEnum.WAITING); setAccountId(data.account_id); diff --git a/frontend/src/types/api/integrations/aws.ts b/frontend/src/types/api/integrations/aws.ts index fdb8548de3..7005e14649 100644 --- a/frontend/src/types/api/integrations/aws.ts +++ b/frontend/src/types/api/integrations/aws.ts @@ -26,6 +26,7 @@ export interface AccountStatusResponse { status: 'success'; data: { id: string; + cloud_account_id: string; status: { integration: { last_heartbeat_ts_ms: number | null;