import { useParams } from 'common'
import Link from 'next/link'
import { Tooltip, TooltipContent, TooltipTrigger } from 'ui'
import { metricColor } from './InstanceNode.utils'
import { useComputeMetrics } from '@/hooks/analytics/useComputeMetrics'
/**
* Compute metrics row at the bottom of a primary database node card, linking
* to the database report. Metrics are project-scoped, which reports the
* primary on both standard and High Availability projects.
*/
export const ComputeMetricsFooter = ({
isConnectionsAvailable = true,
}: {
isConnectionsAvailable?: boolean
}) => {
const { ref } = useParams()
const {
cpu,
disk,
memory,
connections,
isLoading: isMetricsLoading,
isError: isMetricsError,
} = useComputeMetrics({
projectRef: ref,
})
const observabilityUrl = `/project/${ref}/observability/database`
const hasConnectionMetrics = isConnectionsAvailable && connections !== null && connections.max > 0
return (
{/* Stable live region: announces loading/unavailability, never the polled values */}
{isMetricsLoading && 'Loading metrics'}
{!isMetricsLoading && isMetricsError && 'Metrics unavailable'}
{!isMetricsLoading && !isMetricsError && (
<>
{cpu === null && 'CPU unavailable. '}
{disk === null && 'Disk unavailable. '}
{memory === null && 'RAM unavailable. '}
{!hasConnectionMetrics && 'Connection metrics unavailable.'}
>
)}
{/* h-4 matches the text-xs line height so the card doesn't shift when metrics load */}
{isMetricsLoading && (
)}
{!isMetricsLoading && isMetricsError && (
Metrics unavailable
)}
{!isMetricsLoading && !isMetricsError && (
<>
CPU
·
Disk
·
RAM
·
{hasConnectionMetrics ? (
<>
{connections.peak}/{connections.max} conns
>
) : (
<>
Conns Unavailable
>
)}
>
)}
Go to Database Report
)
}
function MetricValue({ value }: { value: number | null }) {
if (value === null) {
return Unavailable
}
return {value.toFixed(0)}%
}