EdgeFunctionPerformanceSection.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { useMemo } from 'react'
  2. import { ChartMetric } from 'ui-patterns/Chart'
  3. import { PageContainer } from 'ui-patterns/PageContainer'
  4. import {
  5. PageSection,
  6. PageSectionContent,
  7. PageSectionMeta,
  8. PageSectionSummary,
  9. PageSectionTitle,
  10. } from 'ui-patterns/PageSection'
  11. import { getExecutionTooltipDetails } from './EdgeFunctionMetricTooltipDetails'
  12. import {
  13. EXECUTION_TIME_CHART_CONFIG,
  14. formatMetric,
  15. getChartEmptyStateCopy,
  16. } from './EdgeFunctionOverview.utils'
  17. import type { EdgeFunctionChartDatum } from './EdgeFunctionOverview.utils'
  18. import { EdgeFunctionTimeSeriesChartCard } from './EdgeFunctionTimeSeriesChartCard'
  19. interface EdgeFunctionPerformanceSectionProps {
  20. data: EdgeFunctionChartDatum[]
  21. dateTimeFormat: string
  22. isLoading: boolean
  23. isError: boolean
  24. errorMessage?: string
  25. averageExecutionTime: number
  26. maxExecutionTime: number
  27. }
  28. export const EdgeFunctionPerformanceSection = ({
  29. data,
  30. dateTimeFormat,
  31. isLoading,
  32. isError,
  33. errorMessage,
  34. averageExecutionTime,
  35. maxExecutionTime,
  36. }: EdgeFunctionPerformanceSectionProps) => {
  37. const emptyStateCopy = getChartEmptyStateCopy('execution time', isError, errorMessage)
  38. const tooltipDetails = useMemo(
  39. () => getExecutionTooltipDetails(averageExecutionTime),
  40. [averageExecutionTime]
  41. )
  42. const metrics = (
  43. <div className="flex flex-wrap gap-x-8 gap-y-4">
  44. <ChartMetric
  45. label="Average Execution Time"
  46. value={formatMetric(averageExecutionTime, 'ms')}
  47. tooltip="Average execution time of function invocations"
  48. />
  49. <ChartMetric
  50. label="Max Execution Time"
  51. value={formatMetric(maxExecutionTime, 'ms')}
  52. tooltip="Maximum execution time of function invocations"
  53. />
  54. </div>
  55. )
  56. return (
  57. <PageSection>
  58. <PageSectionContent>
  59. <PageContainer size="full">
  60. <div className="flex flex-col gap-6">
  61. <PageSectionMeta>
  62. <PageSectionSummary>
  63. <PageSectionTitle>Performance</PageSectionTitle>
  64. </PageSectionSummary>
  65. </PageSectionMeta>
  66. <div className="grid grid-cols-1 gap-6 lg:grid-cols-2">
  67. <EdgeFunctionTimeSeriesChartCard
  68. className="lg:col-span-2"
  69. data={data}
  70. dateTimeFormat={dateTimeFormat}
  71. isLoading={isLoading}
  72. isError={isError}
  73. emptyTitle={emptyStateCopy.title}
  74. emptyDescription={emptyStateCopy.description}
  75. metrics={metrics}
  76. dataKey="max_execution_time"
  77. dataKeys={['avg_execution_time', 'max_execution_time']}
  78. config={EXECUTION_TIME_CHART_CONFIG}
  79. tooltipDetails={tooltipDetails}
  80. referenceLines={[
  81. {
  82. y: averageExecutionTime,
  83. label: 'average',
  84. stroke: 'hsl(var(--foreground-default))',
  85. strokeWidth: 1.5,
  86. },
  87. ]}
  88. yAxisProps={{
  89. width: 64,
  90. tickFormatter: (value: number) => `${Math.round(value)}ms`,
  91. }}
  92. />
  93. </div>
  94. </div>
  95. </PageContainer>
  96. </PageSectionContent>
  97. </PageSection>
  98. )
  99. }