diff --git a/apps/studio/components/interfaces/Database/Replication/ErroredTableDetails.tsx b/apps/studio/components/interfaces/Database/Replication/ErroredTableDetails.tsx
index c38c6c272c..ba0bdad5e4 100644
--- a/apps/studio/components/interfaces/Database/Replication/ErroredTableDetails.tsx
+++ b/apps/studio/components/interfaces/Database/Replication/ErroredTableDetails.tsx
@@ -1,7 +1,7 @@
import { useParams } from 'common'
import { InlineLink } from 'components/ui/InlineLink'
-import { TableState } from './ReplicationPipelineStatus.types'
-import { isValidRetryPolicy } from './ReplicationPipelineStatus.utils'
+import { TableState } from './ReplicationPipelineStatus/ReplicationPipelineStatus.types'
+import { isValidRetryPolicy } from './ReplicationPipelineStatus/ReplicationPipelineStatus.utils'
import { RetryCountdown } from './RetryCountdown'
import { RetryOptionsDropdown } from './RetryOptionsDropdown'
diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.tsx
similarity index 75%
rename from apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus.tsx
rename to apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.tsx
index 61197040cd..ec36254a3e 100644
--- a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus.tsx
+++ b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.tsx
@@ -4,10 +4,12 @@ import {
Ban,
ChevronLeft,
ExternalLink,
+ Info,
Pause,
Play,
RotateCcw,
Search,
+ WifiOff,
X,
} from 'lucide-react'
import Link from 'next/link'
@@ -31,17 +33,18 @@ import {
import { Badge, Button, cn } from 'ui'
import { GenericSkeletonLoader } from 'ui-patterns'
import { Input } from 'ui-patterns/DataInputs/Input'
-import { ErroredTableDetails } from './ErroredTableDetails'
+import { ErroredTableDetails } from '../ErroredTableDetails'
import {
PIPELINE_ACTIONABLE_STATES,
PIPELINE_ERROR_MESSAGES,
getStatusName,
-} from './Pipeline.utils'
-import { PipelineStatus, PipelineStatusName } from './PipelineStatus'
-import { STATUS_REFRESH_FREQUENCY_MS } from './Replication.constants'
-import { TableState } from './ReplicationPipelineStatus.types'
+} from '../Pipeline.utils'
+import { PipelineStatus, PipelineStatusName } from '../PipelineStatus'
+import { STATUS_REFRESH_FREQUENCY_MS } from '../Replication.constants'
+import { UpdateVersionModal } from '../UpdateVersionModal'
+import { SlotLagMetrics, TableState } from './ReplicationPipelineStatus.types'
import { getDisabledStateConfig, getStatusConfig } from './ReplicationPipelineStatus.utils'
-import { UpdateVersionModal } from './UpdateVersionModal'
+import { SlotLagMetricsInline, SlotLagMetricsList } from './SlotLagMetrics'
/**
* Component for displaying replication pipeline status and table replication details.
@@ -82,7 +85,6 @@ export const ReplicationPipelineStatus = () => {
const {
data: replicationStatusData,
- error: statusError,
isLoading: isStatusLoading,
isError: isStatusError,
} = useReplicationPipelineReplicationStatusQuery(
@@ -107,12 +109,14 @@ export const ReplicationPipelineStatus = () => {
const config = getDisabledStateConfig({ requestStatus, statusName })
const tableStatuses = replicationStatusData?.table_statuses || []
+ const applyLagMetrics = replicationStatusData?.apply_lag
const filteredTableStatuses =
filterString.length === 0
? tableStatuses
- : tableStatuses.filter((table: TableState) =>
+ : tableStatuses.filter((table) =>
table.table_name.toLowerCase().includes(filterString.toLowerCase())
)
+ const tablesWithLag = tableStatuses.filter((table) => Boolean(table.table_sync_lag))
const isPipelineRunning = statusName === 'started'
const hasTableData = tableStatuses.length > 0
@@ -121,6 +125,10 @@ export const ReplicationPipelineStatus = () => {
requestStatus === PipelineStatusRequestStatus.StopRequested ||
requestStatus === PipelineStatusRequestStatus.RestartRequested
const showDisabledState = !isPipelineRunning || isEnablingDisabling
+ const refreshIntervalLabel =
+ STATUS_REFRESH_FREQUENCY_MS >= 1000
+ ? `${Math.round(STATUS_REFRESH_FREQUENCY_MS / 1000)}s`
+ : `${STATUS_REFRESH_FREQUENCY_MS}ms`
const logsUrl = `/project/${projectRef}/logs/etl-replication-logs${
pipelineId ? `?f=${encodeURIComponent(JSON.stringify({ pipeline_id: pipelineId }))}` : ''
@@ -242,46 +250,105 @@ export const ReplicationPipelineStatus = () => {
-
- {(isPipelineLoading || isStatusLoading) &&
{config.message}
++ Snapshot of how far this pipeline is trailing behind right now. +
++ Updates every {refreshIntervalLabel} +
++ Unable to refresh data. Showing the last values we received. +
+ )} + +{config.message}
-