QueryInsightsHealth.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types'
  2. import { useQueryInsightsIssues } from '../hooks/useQueryInsightsIssues'
  3. import { useQueryInsightsMetrics } from '../hooks/useQueryInsightsMetrics'
  4. import { useQueryInsightsScore } from '../hooks/useQueryInsightsScore'
  5. import { HEALTH_COLORS, HEALTH_LEVELS } from './QueryInsightsHealth.constants'
  6. import { QueryInsightsHealthMetric } from './QueryInsightsHealthMetric'
  7. import { QueryInsightsHealthScore } from './QueryInsightsHealthScore'
  8. import { QueryInsightsHealthScoreSkeleton } from './QueryInsightsHealthScoreSkeleton'
  9. interface QueryInsightsHealthProps {
  10. data: QueryPerformanceRow[]
  11. isLoading: boolean
  12. }
  13. export const QueryInsightsHealth = ({ data, isLoading }: QueryInsightsHealthProps) => {
  14. const { errors, indexIssues, slowQueries } = useQueryInsightsIssues(data)
  15. const { score, level } = useQueryInsightsScore({ errors, indexIssues, slowQueries })
  16. const { avgP95, totalCalls, totalRowsRead, cacheHitRate } = useQueryInsightsMetrics(data)
  17. const color = HEALTH_COLORS[level]
  18. const label = HEALTH_LEVELS[level].label
  19. return (
  20. <div className="w-full border-b flex items-center">
  21. <div className="px-6 py-3 flex items-center gap-3">
  22. {isLoading ? (
  23. <QueryInsightsHealthScoreSkeleton />
  24. ) : (
  25. <QueryInsightsHealthScore score={score} color={color} label={label} />
  26. )}
  27. </div>
  28. <div className="flex-1 border-l h-full">
  29. <div className="grid grid-cols-2">
  30. <QueryInsightsHealthMetric
  31. label="Average P95"
  32. value={`${avgP95}ms`}
  33. className="border-b"
  34. isLoading={isLoading}
  35. />
  36. <QueryInsightsHealthMetric
  37. label="Total Calls"
  38. value={totalCalls.toLocaleString()}
  39. className="border-l border-b"
  40. isLoading={isLoading}
  41. />
  42. <QueryInsightsHealthMetric
  43. label="Total Rows Read"
  44. value={totalRowsRead.toLocaleString()}
  45. isLoading={isLoading}
  46. />
  47. <QueryInsightsHealthMetric
  48. label="Cache Hit Rate"
  49. value={cacheHitRate}
  50. className="border-l"
  51. isLoading={isLoading}
  52. />
  53. </div>
  54. </div>
  55. </div>
  56. )
  57. }