DatabaseInfrastructureSection.utils.ts 2.4 KB

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