import { useParams } from 'common' import { BarChart2 } from 'lucide-react' import { useMemo } from 'react' import { AWS_REGIONS } from 'shared-data' import { Card, CardContent, CardHeader, CardTitle } from 'ui' import { Chart, ChartCard, ChartContent, ChartEmptyState, ChartHeader, ChartLine, ChartLoadingState, ChartMetric, GenericSkeletonLoader, } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { REPORT_DATERANGE_HELPER_LABELS } from '@/components/interfaces/Reports/Reports.constants' import { REPLICA_STATUS } from '@/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' import { ScaffoldContainer, ScaffoldSection } from '@/components/layouts/Scaffold' import { useInfraMonitoringAttributesQuery } from '@/data/analytics/infra-monitoring-query' import { useLoadBalancersQuery } from '@/data/read-replicas/load-balancers-query' import { useReplicationLagQuery } from '@/data/read-replicas/replica-lag-query' import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' import { useReadReplicasStatusesQuery } from '@/data/read-replicas/replicas-status-query' import { useReportDateRange } from '@/hooks/misc/useReportDateRange' import { BASE_PATH } from '@/lib/constants' const attribute = 'physical_replication_lag_physical_replication_lag_seconds' export const ReadReplicaDetails = () => { const { ref: projectRef, replicaId } = useParams() const { data = [], isPending: isLoadingDatabases } = useReadReplicasQuery({ projectRef }) const replica = data.find((x) => x.identifier === replicaId) const { identifier, connectionString, status: baseStatus, restUrl, region, size } = replica ?? {} const regionLabel = Object.values(AWS_REGIONS).find((x) => x.code === region)?.displayName const { data: statuses = [] } = useReadReplicasStatusesQuery({ projectRef }) const replicaStatus = statuses.find((x) => x.identifier === identifier) const status = replicaStatus?.status ?? baseStatus const { data: loadBalancers = [] } = useLoadBalancersQuery({ projectRef }) const loadBalancer = loadBalancers.find((x) => x.databases.some((x) => x.identifier === identifier) ) const { data: lagDuration, isPending: isLoadingLag } = useReplicationLagQuery( { id: identifier ?? '', projectRef, connectionString, }, { enabled: status === REPLICA_STATUS.ACTIVE_HEALTHY } ) const { selectedDateRange } = useReportDateRange(REPORT_DATERANGE_HELPER_LABELS.LAST_60_MINUTES) // [Joshen] This is unused but intentional to scaffold the usage for now, refer to comment below const { data: infraMonitoringData, isPending: isFetchingInfraMonitoring } = useInfraMonitoringAttributesQuery( { projectRef, attributes: [attribute], databaseIdentifier: identifier, startDate: selectedDateRange.period_start.date, endDate: selectedDateRange.period_end.date, interval: selectedDateRange.interval, }, { enabled: !!replica } ) const chartData = useMemo( () => infraMonitoringData?.data.map((x) => ({ timestamp: x.period_start, [attribute]: (x as Record)[attribute], })) ?? [], [infraMonitoringData?.data] ) return ( <> } title="No data to show" description="It may take up to 24 hours for data to refresh" /> } loadingState={} >
`${value}s`, width: 80, }} config={{ [attribute]: { label: 'Replication lag' }, }} />
Replica Information {isLoadingDatabases ? ( ) : ( <> } /> )} ) }