useServiceHealthMetrics.utils.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import dayjs from 'dayjs'
  2. import type { LogsBarChartDatum } from '../ProjectHome/ProjectUsage.metrics'
  3. import {
  4. computeSuccessAndNonSuccessRates,
  5. sumErrors,
  6. sumTotal,
  7. sumWarnings,
  8. } from '../ProjectHome/ProjectUsage.metrics'
  9. /**
  10. * Calculates the date range for fetching service health metrics
  11. * based on the selected interval
  12. */
  13. export const calculateDateRange = (
  14. interval: '1hr' | '1day' | '7day'
  15. ): { startDate: string; endDate: string } => {
  16. const now = dayjs()
  17. const end = now.toISOString()
  18. let start: string
  19. switch (interval) {
  20. case '1hr':
  21. start = now.subtract(1, 'hour').toISOString()
  22. break
  23. case '1day':
  24. start = now.subtract(1, 'day').toISOString()
  25. break
  26. case '7day':
  27. start = now.subtract(7, 'day').toISOString()
  28. break
  29. default:
  30. start = now.subtract(1, 'hour').toISOString()
  31. }
  32. return { startDate: start, endDate: end }
  33. }
  34. export type RawChartData = {
  35. timestamp: string | number
  36. ok_count?: number | null
  37. warning_count?: number | null
  38. error_count?: number | null
  39. [key: string]: string | number | null | undefined
  40. }
  41. /**
  42. * Transforms raw chart query results to LogsBarChartDatum format
  43. */
  44. export const transformToBarChartData = (data: RawChartData[]): LogsBarChartDatum[] => {
  45. return data.map((row) => ({
  46. timestamp: typeof row.timestamp === 'string' ? row.timestamp : String(row.timestamp),
  47. ok_count: row.ok_count ?? 0,
  48. warning_count: row.warning_count ?? 0,
  49. error_count: row.error_count ?? 0,
  50. }))
  51. }
  52. /**
  53. * Calculates health metrics from bar chart data
  54. */
  55. export const calculateHealthMetrics = (eventChartData: LogsBarChartDatum[]) => {
  56. const total = sumTotal(eventChartData)
  57. const errorCount = sumErrors(eventChartData)
  58. const warningCount = sumWarnings(eventChartData)
  59. const okCount = total - errorCount - warningCount
  60. const errorRate = total > 0 ? (errorCount / total) * 100 : 0
  61. const { successRate } = computeSuccessAndNonSuccessRates(total, warningCount, errorCount)
  62. return {
  63. total,
  64. errorRate,
  65. successRate,
  66. errorCount,
  67. warningCount,
  68. okCount,
  69. }
  70. }
  71. /**
  72. * Calculates aggregated metrics across all services
  73. */
  74. export const calculateAggregatedMetrics = (
  75. services: {
  76. total: number
  77. errorCount: number
  78. warningCount: number
  79. }[]
  80. ) => {
  81. const totalRequests = services.reduce((sum, s) => sum + s.total, 0)
  82. const totalErrors = services.reduce((sum, s) => sum + s.errorCount, 0)
  83. const totalWarnings = services.reduce((sum, s) => sum + s.warningCount, 0)
  84. const { successRate: overallSuccessRate, nonSuccessRate: overallErrorRate } =
  85. computeSuccessAndNonSuccessRates(totalRequests, totalWarnings, totalErrors)
  86. return {
  87. totalRequests,
  88. totalErrors,
  89. totalWarnings,
  90. overallErrorRate,
  91. overallSuccessRate,
  92. }
  93. }