DatabaseInfrastructureSection.utils.ts90 lines · main
1import type { InfraMonitoringResponse } from '@/data/analytics/infra-monitoring-query'
2
3type NumericValue = string | number | undefined
4
5/**
6 * Parses a numeric value that can be a number, string, or undefined.
7 * Returns 0 for invalid or missing values.
8 */
9export function parseNumericValue(val: NumericValue): number {
10 if (typeof val === 'number') return val
11 if (typeof val === 'string') return parseFloat(val) || 0
12 return 0
13}
14
15type MetricData = {
16 current: number
17 max: number
18}
19
20type InfrastructureMetrics = {
21 cpu: MetricData
22 ram: MetricData
23 disk: MetricData
24 diskIo: MetricData
25}
26
27export function parseInfrastructureMetrics(
28 infraData: InfraMonitoringResponse | undefined
29): InfrastructureMetrics | null {
30 if (!infraData) {
31 return null
32 }
33
34 const series = 'series' in infraData ? infraData.series : {}
35
36 const cpuValue = parseNumericValue(series.avg_cpu_usage?.totalAverage)
37 const ramValue = parseNumericValue(series.ram_usage?.totalAverage)
38 const diskSystemValue = parseNumericValue(series.disk_fs_used_system?.totalAverage)
39 const diskWalValue = parseNumericValue(series.disk_fs_used_wal?.totalAverage)
40 const diskDatabaseValue = parseNumericValue(series.pg_database_size?.totalAverage)
41 const diskSizeValue = parseNumericValue(series.disk_fs_size?.totalAverage)
42 const diskUsedValue = diskSystemValue + diskWalValue + diskDatabaseValue
43 const diskUsageValue = diskSizeValue > 0 ? (diskUsedValue / diskSizeValue) * 100 : 0
44 const diskIoValue = parseNumericValue(series.disk_io_consumption?.totalAverage)
45
46 return {
47 cpu: {
48 current: cpuValue,
49 max: 100,
50 },
51 ram: {
52 current: ramValue,
53 max: 100,
54 },
55 disk: {
56 current: diskUsageValue,
57 max: 100,
58 },
59 diskIo: {
60 current: diskIoValue,
61 max: 100,
62 },
63 }
64}
65
66type ConnectionsData = {
67 current: number
68 max: number
69}
70
71type MaxConnectionsData = {
72 maxConnections?: number
73}
74
75export function parseConnectionsData(
76 infraData: InfraMonitoringResponse | undefined,
77 maxConnectionsData: MaxConnectionsData | undefined
78): ConnectionsData {
79 if (!infraData) {
80 return { current: 0, max: 0 }
81 }
82
83 const series = 'series' in infraData ? infraData.series : {}
84
85 const currentVal = series.pg_stat_database_num_backends?.totalAverage
86 const current = Math.round(parseNumericValue(currentVal))
87 const max = maxConnectionsData?.maxConnections || 0
88
89 return { current, max }
90}