QueryInsights.tsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { useParams } from 'common'
  2. import dayjs from 'dayjs'
  3. import utc from 'dayjs/plugin/utc'
  4. import { useMemo, useState } from 'react'
  5. import { useSupamonitorIndexAdvisor } from './hooks/useSupamonitorIndexAdvisor'
  6. import { getSupamonitorLogsQuery } from './QueryInsights.constants'
  7. import { QueryInsightsChart } from './QueryInsightsChart/QueryInsightsChart'
  8. import { QueryInsightsHealth } from './QueryInsightsHealth/QueryInsightsHealth'
  9. import { QueryInsightsTable } from './QueryInsightsTable/QueryInsightsTable'
  10. import {
  11. aggregateLogsByQuery,
  12. filterSystemLogs,
  13. parseSupamonitorLogs,
  14. transformLogsToChartData,
  15. } from './utils/supamonitor.utils'
  16. import useLogsQuery from '@/hooks/analytics/useLogsQuery'
  17. dayjs.extend(utc)
  18. interface QueryInsightsProps {
  19. dateRange?: {
  20. period_start: { date: string; time_period: string }
  21. period_end: { date: string; time_period: string }
  22. interval: string
  23. }
  24. }
  25. export const QueryInsights = ({ dateRange }: QueryInsightsProps) => {
  26. const { ref } = useParams()
  27. const effectiveDateRange = useMemo(() => {
  28. if (dateRange) {
  29. return {
  30. iso_timestamp_start: dateRange.period_start.date,
  31. iso_timestamp_end: dateRange.period_end.date,
  32. }
  33. }
  34. const end = dayjs.utc()
  35. const start = end.subtract(1, 'hour')
  36. return {
  37. iso_timestamp_start: start.toISOString(),
  38. iso_timestamp_end: end.toISOString(),
  39. }
  40. }, [dateRange])
  41. const sql = useMemo(
  42. () =>
  43. getSupamonitorLogsQuery(
  44. effectiveDateRange.iso_timestamp_start,
  45. effectiveDateRange.iso_timestamp_end
  46. ),
  47. [effectiveDateRange]
  48. )
  49. const { logData, isLoading } = useLogsQuery(ref as string, {
  50. sql,
  51. iso_timestamp_start: effectiveDateRange.iso_timestamp_start,
  52. iso_timestamp_end: effectiveDateRange.iso_timestamp_end,
  53. })
  54. const [selectedQuery, setSelectedQuery] = useState<string | null>(null)
  55. const parsedLogs = useMemo(() => parseSupamonitorLogs(logData || []), [logData])
  56. const filteredLogs = useMemo(() => filterSystemLogs(parsedLogs), [parsedLogs])
  57. const chartData = useMemo(() => transformLogsToChartData(filteredLogs), [filteredLogs])
  58. const selectedChartData = useMemo(
  59. () =>
  60. selectedQuery
  61. ? transformLogsToChartData(
  62. filteredLogs.filter((log) => log.query?.replace(/\s+/g, ' ').trim() === selectedQuery)
  63. )
  64. : undefined,
  65. [filteredLogs, selectedQuery]
  66. )
  67. const aggregatedData = useMemo(() => aggregateLogsByQuery(filteredLogs), [filteredLogs])
  68. const enrichedData = useSupamonitorIndexAdvisor(aggregatedData)
  69. return (
  70. <div className="flex flex-col flex-1 min-h-0">
  71. <QueryInsightsHealth data={enrichedData} isLoading={isLoading} />
  72. <QueryInsightsChart
  73. chartData={chartData}
  74. selectedChartData={selectedChartData}
  75. isLoading={isLoading}
  76. />
  77. <QueryInsightsTable
  78. data={enrichedData}
  79. isLoading={isLoading}
  80. currentSelectedQuery={selectedQuery}
  81. onCurrentSelectQuery={setSelectedQuery}
  82. />
  83. </div>
  84. )
  85. }