@perses-dev/flame-chart-plugin 0.5.1 → 0.6.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/__mf/css/async/120.85c2cbf6.css +1 -0
  2. package/__mf/font/inter-cyrillic-300-normal.432f2b21.woff +0 -0
  3. package/__mf/font/inter-cyrillic-300-normal.9da91009.woff2 +0 -0
  4. package/__mf/font/inter-cyrillic-400-normal.372704ff.woff2 +0 -0
  5. package/__mf/font/inter-cyrillic-400-normal.a6b6ef6f.woff +0 -0
  6. package/__mf/font/inter-cyrillic-500-normal.7c15bba8.woff2 +0 -0
  7. package/__mf/font/inter-cyrillic-500-normal.b9f8c929.woff +0 -0
  8. package/__mf/font/inter-cyrillic-600-normal.2f42892a.woff2 +0 -0
  9. package/__mf/font/inter-cyrillic-600-normal.c3987adc.woff +0 -0
  10. package/__mf/font/inter-cyrillic-700-normal.93eba3c3.woff +0 -0
  11. package/__mf/font/inter-cyrillic-700-normal.e9e5b2dc.woff2 +0 -0
  12. package/__mf/font/inter-cyrillic-900-normal.f285bd7a.woff2 +0 -0
  13. package/__mf/font/inter-cyrillic-900-normal.ffbd8a3a.woff +0 -0
  14. package/__mf/font/inter-cyrillic-ext-300-normal.95bb9038.woff2 +0 -0
  15. package/__mf/font/inter-cyrillic-ext-300-normal.cfc143a9.woff +0 -0
  16. package/__mf/font/inter-cyrillic-ext-400-normal.2a31c04b.woff +0 -0
  17. package/__mf/font/inter-cyrillic-ext-400-normal.f572b170.woff2 +0 -0
  18. package/__mf/font/inter-cyrillic-ext-500-normal.5a6bb1da.woff +0 -0
  19. package/__mf/font/inter-cyrillic-ext-500-normal.fe0d9b14.woff2 +0 -0
  20. package/__mf/font/inter-cyrillic-ext-600-normal.ecbdecad.woff +0 -0
  21. package/__mf/font/inter-cyrillic-ext-600-normal.f7b3c15b.woff2 +0 -0
  22. package/__mf/font/inter-cyrillic-ext-700-normal.4b4022a6.woff +0 -0
  23. package/__mf/font/inter-cyrillic-ext-700-normal.74b516d2.woff2 +0 -0
  24. package/__mf/font/inter-cyrillic-ext-900-normal.9970ddb5.woff +0 -0
  25. package/__mf/font/inter-cyrillic-ext-900-normal.a0d59adc.woff2 +0 -0
  26. package/__mf/font/inter-greek-300-normal.0d7be683.woff2 +0 -0
  27. package/__mf/font/inter-greek-300-normal.8f0b988e.woff +0 -0
  28. package/__mf/font/inter-greek-400-normal.cc58c11b.woff +0 -0
  29. package/__mf/font/inter-greek-400-normal.d7020e3c.woff2 +0 -0
  30. package/__mf/font/inter-greek-500-normal.d9a33207.woff +0 -0
  31. package/__mf/font/inter-greek-500-normal.f41f43db.woff2 +0 -0
  32. package/__mf/font/inter-greek-600-normal.4ec0c1c1.woff +0 -0
  33. package/__mf/font/inter-greek-600-normal.cc532937.woff2 +0 -0
  34. package/__mf/font/inter-greek-700-normal.5ec6c758.woff +0 -0
  35. package/__mf/font/inter-greek-700-normal.97f0eeeb.woff2 +0 -0
  36. package/__mf/font/inter-greek-900-normal.46b66369.woff2 +0 -0
  37. package/__mf/font/inter-greek-900-normal.9ae3a3c5.woff +0 -0
  38. package/__mf/font/inter-greek-ext-300-normal.10247a66.woff2 +0 -0
  39. package/__mf/font/inter-greek-ext-300-normal.4668e5cb.woff +0 -0
  40. package/__mf/font/inter-greek-ext-400-normal.4ce1df5d.woff2 +0 -0
  41. package/__mf/font/inter-greek-ext-400-normal.88ede1ea.woff +0 -0
  42. package/__mf/font/inter-greek-ext-500-normal.7a4aa726.woff +0 -0
  43. package/__mf/font/inter-greek-ext-500-normal.cbd51e2d.woff2 +0 -0
  44. package/__mf/font/inter-greek-ext-600-normal.089a95ee.woff +0 -0
  45. package/__mf/font/inter-greek-ext-600-normal.1f33d317.woff2 +0 -0
  46. package/__mf/font/inter-greek-ext-700-normal.31f1075d.woff +0 -0
  47. package/__mf/font/inter-greek-ext-700-normal.827cd618.woff2 +0 -0
  48. package/__mf/font/inter-greek-ext-900-normal.531bcee7.woff +0 -0
  49. package/__mf/font/inter-greek-ext-900-normal.8a9b36b9.woff2 +0 -0
  50. package/__mf/font/inter-latin-300-normal.15fb600d.woff2 +0 -0
  51. package/__mf/font/inter-latin-300-normal.6f95f590.woff +0 -0
  52. package/__mf/font/inter-latin-400-normal.2c7a775c.woff +0 -0
  53. package/__mf/font/inter-latin-400-normal.ef6d3f52.woff2 +0 -0
  54. package/__mf/font/inter-latin-500-normal.b7b43ace.woff2 +0 -0
  55. package/__mf/font/inter-latin-500-normal.cb4c8ceb.woff +0 -0
  56. package/__mf/font/inter-latin-600-normal.8fb1a964.woff2 +0 -0
  57. package/__mf/font/inter-latin-600-normal.ce0f5f43.woff +0 -0
  58. package/__mf/font/inter-latin-700-normal.953b7aa5.woff2 +0 -0
  59. package/__mf/font/inter-latin-700-normal.9c21d4dc.woff +0 -0
  60. package/__mf/font/inter-latin-900-normal.2a8028ec.woff2 +0 -0
  61. package/__mf/font/inter-latin-900-normal.fa252135.woff +0 -0
  62. package/__mf/font/inter-latin-ext-300-normal.167cc8c9.woff2 +0 -0
  63. package/__mf/font/inter-latin-ext-300-normal.f695be66.woff +0 -0
  64. package/__mf/font/inter-latin-ext-400-normal.32a25442.woff2 +0 -0
  65. package/__mf/font/inter-latin-ext-400-normal.4edcaace.woff +0 -0
  66. package/__mf/font/inter-latin-ext-500-normal.a19a84a6.woff +0 -0
  67. package/__mf/font/inter-latin-ext-500-normal.d9b491de.woff2 +0 -0
  68. package/__mf/font/inter-latin-ext-600-normal.38b075d8.woff2 +0 -0
  69. package/__mf/font/inter-latin-ext-600-normal.49faa47a.woff +0 -0
  70. package/__mf/font/inter-latin-ext-700-normal.93534b50.woff +0 -0
  71. package/__mf/font/inter-latin-ext-700-normal.b63daa1a.woff2 +0 -0
  72. package/__mf/font/inter-latin-ext-900-normal.0efdb307.woff +0 -0
  73. package/__mf/font/inter-latin-ext-900-normal.9c0fc2c7.woff2 +0 -0
  74. package/__mf/font/inter-vietnamese-300-normal.aad496d8.woff +0 -0
  75. package/__mf/font/inter-vietnamese-300-normal.ad9ef503.woff2 +0 -0
  76. package/__mf/font/inter-vietnamese-400-normal.a9dd2faf.woff +0 -0
  77. package/__mf/font/inter-vietnamese-400-normal.de4fc44f.woff2 +0 -0
  78. package/__mf/font/inter-vietnamese-500-normal.7c0a695f.woff2 +0 -0
  79. package/__mf/font/inter-vietnamese-500-normal.a3a73b95.woff +0 -0
  80. package/__mf/font/inter-vietnamese-600-normal.9d518599.woff2 +0 -0
  81. package/__mf/font/inter-vietnamese-600-normal.c5ce3fcb.woff +0 -0
  82. package/__mf/font/inter-vietnamese-700-normal.bc68b199.woff +0 -0
  83. package/__mf/font/inter-vietnamese-700-normal.faf12809.woff2 +0 -0
  84. package/__mf/font/inter-vietnamese-900-normal.2b782045.woff +0 -0
  85. package/__mf/font/inter-vietnamese-900-normal.e639b65a.woff2 +0 -0
  86. package/__mf/js/FlameChart.731be0ae.js +7 -0
  87. package/__mf/js/async/120.29cb4731.js +7 -0
  88. package/__mf/js/async/{372.8b193f5e.js.LICENSE.txt → 120.29cb4731.js.LICENSE.txt} +19 -1
  89. package/__mf/js/async/121.88f2093e.js +2 -0
  90. package/__mf/js/async/177.911d34be.js +1 -0
  91. package/__mf/js/async/192.c44f0e7d.js +1 -0
  92. package/__mf/js/async/2.5aab87dd.js +1 -0
  93. package/__mf/js/async/20.30f1a649.js +24 -0
  94. package/__mf/js/async/{634.563ff812.js.LICENSE.txt → 20.30f1a649.js.LICENSE.txt} +0 -16
  95. package/__mf/js/async/231.dcd12bb9.js +1 -0
  96. package/__mf/js/async/235.8edcc89b.js +1 -0
  97. package/__mf/js/async/274.a224fe4a.js +2 -0
  98. package/__mf/js/async/356.16afbc55.js +1 -0
  99. package/__mf/js/async/392.99054453.js +2 -0
  100. package/__mf/js/async/43.3e719f33.js +2 -0
  101. package/__mf/js/async/469.ff14b116.js +110 -0
  102. package/__mf/js/async/469.ff14b116.js.LICENSE.txt +27 -0
  103. package/__mf/js/async/470.da9d1391.js +2 -0
  104. package/__mf/js/async/558.feec1d53.js +1 -0
  105. package/__mf/js/async/587.a13c3a4e.js +1 -0
  106. package/__mf/js/async/588.7e3ed6a9.js +1 -0
  107. package/__mf/js/async/616.ec1a450a.js +1 -0
  108. package/__mf/js/async/71.2e51f06a.js +1 -0
  109. package/__mf/js/async/798.ad353290.js +39 -0
  110. package/__mf/js/async/{551.70629715.js.LICENSE.txt → 798.ad353290.js.LICENSE.txt} +11 -23
  111. package/__mf/js/async/850.44a5f3a9.js +1 -0
  112. package/__mf/js/async/857.61f4cbef.js +1 -0
  113. package/__mf/js/async/873.ce8f2b61.js +1 -0
  114. package/__mf/js/async/939.f6da5126.js +1 -0
  115. package/__mf/js/async/941.9e88eedc.js +2 -0
  116. package/__mf/js/async/968.b8c86e9c.js +1 -0
  117. package/__mf/js/async/978.8f4e0c97.js +1 -0
  118. package/__mf/js/async/__federation_expose_FlameChart.cebb0677.js +17 -0
  119. package/__mf/js/async/lib-router.51af2eed.js +2 -0
  120. package/__mf/js/main.aa35cb84.js +7 -0
  121. package/lib/cjs/components/CustomBreadcrumb.js +2 -2
  122. package/lib/cjs/utils/format.js +9 -8
  123. package/lib/components/CustomBreadcrumb.js +1 -1
  124. package/lib/components/CustomBreadcrumb.js.map +1 -1
  125. package/lib/components/FlameChart.d.ts +1 -1
  126. package/lib/components/FlameChart.d.ts.map +1 -1
  127. package/lib/components/FlameChart.js.map +1 -1
  128. package/lib/components/FlameChartPanel.d.ts +1 -1
  129. package/lib/components/FlameChartPanel.d.ts.map +1 -1
  130. package/lib/components/FlameChartPanel.js.map +1 -1
  131. package/lib/components/SeriesChart.d.ts +1 -1
  132. package/lib/components/SeriesChart.d.ts.map +1 -1
  133. package/lib/components/SeriesChart.js.map +1 -1
  134. package/lib/components/TableChart.d.ts +1 -1
  135. package/lib/components/TableChart.d.ts.map +1 -1
  136. package/lib/components/TableChart.js.map +1 -1
  137. package/lib/flame-chart-model.d.ts +1 -1
  138. package/lib/flame-chart-model.d.ts.map +1 -1
  139. package/lib/flame-chart-model.js.map +1 -1
  140. package/lib/utils/data-transform.d.ts +1 -1
  141. package/lib/utils/data-transform.js.map +1 -1
  142. package/lib/utils/format.d.ts.map +1 -1
  143. package/lib/utils/format.js +3 -2
  144. package/lib/utils/format.js.map +1 -1
  145. package/mf-manifest.json +62 -50
  146. package/mf-stats.json +73 -50
  147. package/package.json +4 -4
  148. package/__mf/css/async/50.d3010b86.css +0 -1
  149. package/__mf/css/async/61.d3010b86.css +0 -1
  150. package/__mf/css/async/669.d3010b86.css +0 -1
  151. package/__mf/font/lato-all-300-normal.322bdf14.woff +0 -0
  152. package/__mf/font/lato-all-400-normal.63513b00.woff +0 -0
  153. package/__mf/font/lato-all-700-normal.bb27db94.woff +0 -0
  154. package/__mf/font/lato-all-900-normal.a27049a3.woff +0 -0
  155. package/__mf/font/lato-latin-300-normal.c5195215.woff2 +0 -0
  156. package/__mf/font/lato-latin-400-normal.b7ffde23.woff2 +0 -0
  157. package/__mf/font/lato-latin-700-normal.d5eb20bc.woff2 +0 -0
  158. package/__mf/font/lato-latin-900-normal.d884a71c.woff2 +0 -0
  159. package/__mf/font/lato-latin-ext-300-normal.abcc64a9.woff2 +0 -0
  160. package/__mf/font/lato-latin-ext-400-normal.6ebed106.woff2 +0 -0
  161. package/__mf/font/lato-latin-ext-700-normal.8697d1d5.woff2 +0 -0
  162. package/__mf/font/lato-latin-ext-900-normal.20a2b415.woff2 +0 -0
  163. package/__mf/js/FlameChart.1166890c.js +0 -6
  164. package/__mf/js/async/121.be1d1245.js +0 -2
  165. package/__mf/js/async/177.ff98c714.js +0 -1
  166. package/__mf/js/async/192.4886ab0f.js +0 -1
  167. package/__mf/js/async/2.8fe47a72.js +0 -1
  168. package/__mf/js/async/235.78d3d3ed.js +0 -1
  169. package/__mf/js/async/274.ecbc8f96.js +0 -2
  170. package/__mf/js/async/356.e3a2cddf.js +0 -1
  171. package/__mf/js/async/372.8b193f5e.js +0 -7
  172. package/__mf/js/async/392.37cbcda7.js +0 -2
  173. package/__mf/js/async/43.89bbcdef.js +0 -2
  174. package/__mf/js/async/470.5cb376e5.js +0 -2
  175. package/__mf/js/async/482.9649d5bd.js +0 -1
  176. package/__mf/js/async/50.88833b1b.js +0 -1
  177. package/__mf/js/async/551.70629715.js +0 -110
  178. package/__mf/js/async/587.a0083ae7.js +0 -1
  179. package/__mf/js/async/588.eb7ff066.js +0 -1
  180. package/__mf/js/async/616.28425377.js +0 -1
  181. package/__mf/js/async/634.563ff812.js +0 -24
  182. package/__mf/js/async/669.3c4cfa8d.js +0 -1
  183. package/__mf/js/async/698.4392235d.js +0 -1
  184. package/__mf/js/async/71.ae38737a.js +0 -1
  185. package/__mf/js/async/828.7ba17322.js +0 -38
  186. package/__mf/js/async/873.10ff7d3e.js +0 -1
  187. package/__mf/js/async/941.a5b4797a.js +0 -2
  188. package/__mf/js/async/968.564b24c9.js +0 -1
  189. package/__mf/js/async/978.f02ace81.js +0 -1
  190. package/__mf/js/async/__federation_expose_FlameChart.96f61c46.js +0 -17
  191. package/__mf/js/async/lib-router.2759ca80.js +0 -2
  192. package/__mf/js/main.e0705eef.js +0 -6
  193. /package/__mf/js/async/{121.be1d1245.js.LICENSE.txt → 121.88f2093e.js.LICENSE.txt} +0 -0
  194. /package/__mf/js/async/{274.ecbc8f96.js.LICENSE.txt → 274.a224fe4a.js.LICENSE.txt} +0 -0
  195. /package/__mf/js/async/{392.37cbcda7.js.LICENSE.txt → 392.99054453.js.LICENSE.txt} +0 -0
  196. /package/__mf/js/async/{43.89bbcdef.js.LICENSE.txt → 43.3e719f33.js.LICENSE.txt} +0 -0
  197. /package/__mf/js/async/{470.5cb376e5.js.LICENSE.txt → 470.da9d1391.js.LICENSE.txt} +0 -0
  198. /package/__mf/js/async/{941.a5b4797a.js.LICENSE.txt → 941.9e88eedc.js.LICENSE.txt} +0 -0
  199. /package/__mf/js/async/{lib-router.2759ca80.js.LICENSE.txt → lib-router.51af2eed.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/FlameChartPanel.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TitleComponentOption } from 'echarts';\nimport { useChartsTheme } from '@perses-dev/components';\nimport { Stack, Typography, SxProps, useMediaQuery, useTheme } from '@mui/material';\nimport { FC, useState, useEffect, useMemo } from 'react';\nimport { ProfileData, StackTrace } from '@perses-dev/core';\nimport { PanelProps } from '@perses-dev/plugin-system';\nimport { FlameChartOptions } from '../flame-chart-model';\nimport { filterStackTraceById, getMaxDepth } from '../utils/data-transform';\nimport { FlameChart } from './FlameChart';\nimport { Settings } from './Settings';\nimport { TableChart } from './TableChart';\nimport { SeriesChart } from './SeriesChart';\n\nconst LARGE_PANEL_THRESHOLD = 600;\nconst DEFAULT_SERIES_CHART_HEIGHT = 200;\n\nexport type FlameChartPanelProps = PanelProps<FlameChartOptions, ProfileData>;\n\nexport const FlameChartPanel: FC<FlameChartPanelProps> = (props) => {\n const { contentDimensions, queryResults, spec } = props;\n\n const isMobileSize = useMediaQuery(useTheme().breakpoints.down('sm'));\n\n // selectedId equals 0 => Flame Graph is not zoomed in\n // selectedId different from 0 => Flame Graph is zoomed in\n const [selectedId, setSelectedId] = useState(0);\n const [searchValue, setSearchValue] = useState('');\n\n // This spec is used to manage settings temporarily\n const [liveSpec, setLiveSpec] = useState<FlameChartOptions>(spec);\n\n // keep liveSpec up to date\n useEffect(() => {\n setLiveSpec(spec);\n setSelectedId(0);\n setSearchValue('');\n }, [spec]);\n\n const chartsTheme = useChartsTheme();\n const flameChartData = useMemo(() => {\n return queryResults[0];\n }, [queryResults]);\n\n const selectedStackTrace: StackTrace | undefined = useMemo(() => {\n if (!flameChartData) return undefined;\n if (!selectedId) return flameChartData.data.profile.stackTrace;\n\n return filterStackTraceById(flameChartData.data.profile.stackTrace, selectedId);\n }, [flameChartData, selectedId]);\n\n const maxDepth: number = useMemo(\n () => (selectedStackTrace ? getMaxDepth(selectedStackTrace) : 0),\n [selectedStackTrace]\n );\n\n const noDataTextStyle = (chartsTheme.noDataOption.title as TitleComponentOption).textStyle as SxProps;\n\n const onChangePalette = (newPalette: 'package-name' | 'value'): void => {\n setLiveSpec((prev) => {\n return { ...prev, palette: newPalette };\n });\n };\n\n const onDisplayChange = (value: 'table' | 'flame-graph' | 'both' | 'none'): void => {\n let showTable = true;\n let showFlameGraph = true;\n if (value === 'table') {\n showFlameGraph = false;\n } else if (value === 'flame-graph') {\n showTable = false;\n }\n setLiveSpec((prev) => {\n return { ...prev, showTable: showTable, showFlameGraph: showFlameGraph };\n });\n };\n\n if (!contentDimensions) return null;\n\n const PADDING =\n liveSpec.showSeries && liveSpec.showSettings ? 32 : liveSpec.showSeries || liveSpec.showSettings ? 16 : 0;\n\n const SETTINGS_HEIGHT = liveSpec.showSettings ? 30 : 0;\n\n const SERIES_CHART_HEIGHT = liveSpec.showSeries\n ? contentDimensions.height < DEFAULT_SERIES_CHART_HEIGHT\n ? contentDimensions.height\n : DEFAULT_SERIES_CHART_HEIGHT\n : 0;\n\n const TABLE_FLAME_CHART_HEIGHT = liveSpec.traceHeight\n ? Math.max(\n contentDimensions.height -\n (contentDimensions.height > LARGE_PANEL_THRESHOLD ? SERIES_CHART_HEIGHT + SETTINGS_HEIGHT + PADDING : 0),\n maxDepth * liveSpec.traceHeight\n )\n : contentDimensions.height -\n (contentDimensions.height > LARGE_PANEL_THRESHOLD ? SERIES_CHART_HEIGHT + SETTINGS_HEIGHT + PADDING : 0);\n\n const TABLE_CHART_WIDTH = isMobileSize\n ? contentDimensions.width\n : liveSpec.showFlameGraph\n ? 0.4 * contentDimensions.width\n : contentDimensions.width;\n\n const FLAME_CHART_WIDTH = isMobileSize\n ? contentDimensions.width\n : liveSpec.showTable\n ? 0.6 * contentDimensions.width\n : contentDimensions.width;\n\n // TODO (gladorme): allow users to override height (useful for explorer for stack traces with high depth)\n return (\n <Stack\n height={contentDimensions.height}\n width={contentDimensions.width}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n {queryResults.length > 1 ? (\n // display a message if there is more than one query\n <Typography sx={{ ...noDataTextStyle }}>\n There is more than one query. Please make sure that you provided only one query.\n </Typography>\n ) : flameChartData ? (\n <Stack\n gap={2}\n sx={{\n overflowY: 'auto',\n scrollbarGutter: 'stable both-edges',\n paddingTop: liveSpec.showSettings || liveSpec.showSeries ? 1 : 0,\n }}\n >\n {liveSpec.showSeries && (\n <SeriesChart width={contentDimensions.width} height={SERIES_CHART_HEIGHT} data={flameChartData.data} />\n )}\n {liveSpec.showSettings && (\n <Settings\n onSelectedIdChange={setSelectedId}\n onChangePalette={onChangePalette}\n onDisplayChange={onDisplayChange}\n value={liveSpec}\n selectedId={selectedId}\n />\n )}\n <Stack\n direction={isMobileSize ? 'column' : 'row'}\n justifyContent=\"center\"\n alignItems={isMobileSize ? 'center' : 'top'}\n >\n {liveSpec.showTable && (\n <TableChart\n width={TABLE_CHART_WIDTH}\n height={TABLE_FLAME_CHART_HEIGHT}\n data={flameChartData.data}\n searchValue={searchValue}\n onSearchValueChange={setSearchValue}\n onSelectedIdChange={setSelectedId}\n />\n )}\n {liveSpec.showFlameGraph && (\n <FlameChart\n width={FLAME_CHART_WIDTH}\n height={TABLE_FLAME_CHART_HEIGHT}\n data={flameChartData.data}\n palette={liveSpec.palette}\n selectedId={selectedId}\n searchValue={searchValue}\n onSelectedIdChange={setSelectedId}\n />\n )}\n </Stack>\n </Stack>\n ) : (\n <Typography sx={{ ...noDataTextStyle }}>No data</Typography>\n )}\n </Stack>\n );\n};\n"],"names":["useChartsTheme","Stack","Typography","useMediaQuery","useTheme","useState","useEffect","useMemo","filterStackTraceById","getMaxDepth","FlameChart","Settings","TableChart","SeriesChart","LARGE_PANEL_THRESHOLD","DEFAULT_SERIES_CHART_HEIGHT","FlameChartPanel","props","contentDimensions","queryResults","spec","isMobileSize","breakpoints","down","selectedId","setSelectedId","searchValue","setSearchValue","liveSpec","setLiveSpec","chartsTheme","flameChartData","selectedStackTrace","undefined","data","profile","stackTrace","maxDepth","noDataTextStyle","noDataOption","title","textStyle","onChangePalette","newPalette","prev","palette","onDisplayChange","value","showTable","showFlameGraph","PADDING","showSeries","showSettings","SETTINGS_HEIGHT","SERIES_CHART_HEIGHT","height","TABLE_FLAME_CHART_HEIGHT","traceHeight","Math","max","TABLE_CHART_WIDTH","width","FLAME_CHART_WIDTH","justifyContent","alignItems","length","sx","gap","overflowY","scrollbarGutter","paddingTop","onSelectedIdChange","direction","onSearchValueChange"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/FlameChartPanel.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TitleComponentOption } from 'echarts';\nimport { useChartsTheme } from '@perses-dev/components';\nimport { Stack, Typography, SxProps, useMediaQuery, useTheme } from '@mui/material';\nimport { FC, useState, useEffect, useMemo } from 'react';\nimport { PanelProps } from '@perses-dev/plugin-system';\nimport { ProfileData, StackTrace } from '@perses-dev/spec';\nimport { FlameChartOptions } from '../flame-chart-model';\nimport { filterStackTraceById, getMaxDepth } from '../utils/data-transform';\nimport { FlameChart } from './FlameChart';\nimport { Settings } from './Settings';\nimport { TableChart } from './TableChart';\nimport { SeriesChart } from './SeriesChart';\n\nconst LARGE_PANEL_THRESHOLD = 600;\nconst DEFAULT_SERIES_CHART_HEIGHT = 200;\n\nexport type FlameChartPanelProps = PanelProps<FlameChartOptions, ProfileData>;\n\nexport const FlameChartPanel: FC<FlameChartPanelProps> = (props) => {\n const { contentDimensions, queryResults, spec } = props;\n\n const isMobileSize = useMediaQuery(useTheme().breakpoints.down('sm'));\n\n // selectedId equals 0 => Flame Graph is not zoomed in\n // selectedId different from 0 => Flame Graph is zoomed in\n const [selectedId, setSelectedId] = useState(0);\n const [searchValue, setSearchValue] = useState('');\n\n // This spec is used to manage settings temporarily\n const [liveSpec, setLiveSpec] = useState<FlameChartOptions>(spec);\n\n // keep liveSpec up to date\n useEffect(() => {\n setLiveSpec(spec);\n setSelectedId(0);\n setSearchValue('');\n }, [spec]);\n\n const chartsTheme = useChartsTheme();\n const flameChartData = useMemo(() => {\n return queryResults[0];\n }, [queryResults]);\n\n const selectedStackTrace: StackTrace | undefined = useMemo(() => {\n if (!flameChartData) return undefined;\n if (!selectedId) return flameChartData.data.profile.stackTrace;\n\n return filterStackTraceById(flameChartData.data.profile.stackTrace, selectedId);\n }, [flameChartData, selectedId]);\n\n const maxDepth: number = useMemo(\n () => (selectedStackTrace ? getMaxDepth(selectedStackTrace) : 0),\n [selectedStackTrace]\n );\n\n const noDataTextStyle = (chartsTheme.noDataOption.title as TitleComponentOption).textStyle as SxProps;\n\n const onChangePalette = (newPalette: 'package-name' | 'value'): void => {\n setLiveSpec((prev) => {\n return { ...prev, palette: newPalette };\n });\n };\n\n const onDisplayChange = (value: 'table' | 'flame-graph' | 'both' | 'none'): void => {\n let showTable = true;\n let showFlameGraph = true;\n if (value === 'table') {\n showFlameGraph = false;\n } else if (value === 'flame-graph') {\n showTable = false;\n }\n setLiveSpec((prev) => {\n return { ...prev, showTable: showTable, showFlameGraph: showFlameGraph };\n });\n };\n\n if (!contentDimensions) return null;\n\n const PADDING =\n liveSpec.showSeries && liveSpec.showSettings ? 32 : liveSpec.showSeries || liveSpec.showSettings ? 16 : 0;\n\n const SETTINGS_HEIGHT = liveSpec.showSettings ? 30 : 0;\n\n const SERIES_CHART_HEIGHT = liveSpec.showSeries\n ? contentDimensions.height < DEFAULT_SERIES_CHART_HEIGHT\n ? contentDimensions.height\n : DEFAULT_SERIES_CHART_HEIGHT\n : 0;\n\n const TABLE_FLAME_CHART_HEIGHT = liveSpec.traceHeight\n ? Math.max(\n contentDimensions.height -\n (contentDimensions.height > LARGE_PANEL_THRESHOLD ? SERIES_CHART_HEIGHT + SETTINGS_HEIGHT + PADDING : 0),\n maxDepth * liveSpec.traceHeight\n )\n : contentDimensions.height -\n (contentDimensions.height > LARGE_PANEL_THRESHOLD ? SERIES_CHART_HEIGHT + SETTINGS_HEIGHT + PADDING : 0);\n\n const TABLE_CHART_WIDTH = isMobileSize\n ? contentDimensions.width\n : liveSpec.showFlameGraph\n ? 0.4 * contentDimensions.width\n : contentDimensions.width;\n\n const FLAME_CHART_WIDTH = isMobileSize\n ? contentDimensions.width\n : liveSpec.showTable\n ? 0.6 * contentDimensions.width\n : contentDimensions.width;\n\n // TODO (gladorme): allow users to override height (useful for explorer for stack traces with high depth)\n return (\n <Stack\n height={contentDimensions.height}\n width={contentDimensions.width}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n {queryResults.length > 1 ? (\n // display a message if there is more than one query\n <Typography sx={{ ...noDataTextStyle }}>\n There is more than one query. Please make sure that you provided only one query.\n </Typography>\n ) : flameChartData ? (\n <Stack\n gap={2}\n sx={{\n overflowY: 'auto',\n scrollbarGutter: 'stable both-edges',\n paddingTop: liveSpec.showSettings || liveSpec.showSeries ? 1 : 0,\n }}\n >\n {liveSpec.showSeries && (\n <SeriesChart width={contentDimensions.width} height={SERIES_CHART_HEIGHT} data={flameChartData.data} />\n )}\n {liveSpec.showSettings && (\n <Settings\n onSelectedIdChange={setSelectedId}\n onChangePalette={onChangePalette}\n onDisplayChange={onDisplayChange}\n value={liveSpec}\n selectedId={selectedId}\n />\n )}\n <Stack\n direction={isMobileSize ? 'column' : 'row'}\n justifyContent=\"center\"\n alignItems={isMobileSize ? 'center' : 'top'}\n >\n {liveSpec.showTable && (\n <TableChart\n width={TABLE_CHART_WIDTH}\n height={TABLE_FLAME_CHART_HEIGHT}\n data={flameChartData.data}\n searchValue={searchValue}\n onSearchValueChange={setSearchValue}\n onSelectedIdChange={setSelectedId}\n />\n )}\n {liveSpec.showFlameGraph && (\n <FlameChart\n width={FLAME_CHART_WIDTH}\n height={TABLE_FLAME_CHART_HEIGHT}\n data={flameChartData.data}\n palette={liveSpec.palette}\n selectedId={selectedId}\n searchValue={searchValue}\n onSelectedIdChange={setSelectedId}\n />\n )}\n </Stack>\n </Stack>\n ) : (\n <Typography sx={{ ...noDataTextStyle }}>No data</Typography>\n )}\n </Stack>\n );\n};\n"],"names":["useChartsTheme","Stack","Typography","useMediaQuery","useTheme","useState","useEffect","useMemo","filterStackTraceById","getMaxDepth","FlameChart","Settings","TableChart","SeriesChart","LARGE_PANEL_THRESHOLD","DEFAULT_SERIES_CHART_HEIGHT","FlameChartPanel","props","contentDimensions","queryResults","spec","isMobileSize","breakpoints","down","selectedId","setSelectedId","searchValue","setSearchValue","liveSpec","setLiveSpec","chartsTheme","flameChartData","selectedStackTrace","undefined","data","profile","stackTrace","maxDepth","noDataTextStyle","noDataOption","title","textStyle","onChangePalette","newPalette","prev","palette","onDisplayChange","value","showTable","showFlameGraph","PADDING","showSeries","showSettings","SETTINGS_HEIGHT","SERIES_CHART_HEIGHT","height","TABLE_FLAME_CHART_HEIGHT","traceHeight","Math","max","TABLE_CHART_WIDTH","width","FLAME_CHART_WIDTH","justifyContent","alignItems","length","sx","gap","overflowY","scrollbarGutter","paddingTop","onSelectedIdChange","direction","onSearchValueChange"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ReactElement } from 'react';
2
- import { ProfileData } from '@perses-dev/core';
2
+ import { ProfileData } from '@perses-dev/spec';
3
3
  export interface SeriesChartProps {
4
4
  width: number;
5
5
  height: number;
@@ -1 +1 @@
1
- {"version":3,"file":"SeriesChart.d.ts","sourceRoot":"","sources":["../../../src/components/SeriesChart.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAmB,MAAM,OAAO,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAY,MAAM,kBAAkB,CAAC;AAazD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAgKjE"}
1
+ {"version":3,"file":"SeriesChart.d.ts","sourceRoot":"","sources":["../../../src/components/SeriesChart.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAmB,MAAM,OAAO,CAAC;AAOtD,OAAO,EAAE,WAAW,EAAY,MAAM,kBAAkB,CAAC;AAQzD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAgKjE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SeriesChart.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License | Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing | software\n// distributed under the License is distributed on an \"AS IS\" BASIS |\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND | either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ReactElement, useMemo, useRef } from 'react';\nimport { Stack, useTheme } from '@mui/material';\nimport { ProfileData, Timeline } from '@perses-dev/core';\nimport { useChartsTheme, EChart, ZoomEventData, OnEventsType, enableDataZoom } from '@perses-dev/components';\nimport { useTimeRange } from '@perses-dev/plugin-system';\nimport type { EChartsCoreOption, LineSeriesOption } from 'echarts';\nimport { ECharts as EChartsInstance } from 'echarts/core';\nimport { CallbackDataParams } from 'echarts/types/dist/shared';\nimport { formatItemValue } from '../utils/format';\nimport { getSeriesTooltip } from '../utils/series-tooltip';\nimport { SeriesSample } from '../utils/data-model';\n\nconst LINE_WIDTH = 1.25;\nconst POINT_SIZE_OFFSET = 2;\n\nexport interface SeriesChartProps {\n width: number;\n height: number;\n data: ProfileData;\n}\n\nexport function SeriesChart(props: SeriesChartProps): ReactElement {\n const { width, height, data } = props;\n\n const chartsTheme = useChartsTheme();\n const theme = useTheme();\n const { setTimeRange } = useTimeRange();\n const chartRef = useRef<EChartsInstance>();\n\n const handleEvents: OnEventsType<LineSeriesOption['data'] | unknown> = useMemo(() => {\n return {\n datazoom: (params): void => {\n if (params.batch[0] === undefined) return;\n const xAxisStartValue = params.batch?.[0]?.startValue;\n const xAxisEndValue = params.batch?.[0]?.endValue;\n if (xAxisStartValue !== undefined && xAxisEndValue !== undefined) {\n const zoomEvent: ZoomEventData = {\n start: xAxisStartValue,\n end: xAxisEndValue,\n };\n setTimeRange({ start: new Date(zoomEvent.start), end: new Date(zoomEvent.end) });\n }\n },\n finished: (): void => {\n if (chartRef.current !== undefined) {\n enableDataZoom(chartRef.current);\n }\n },\n };\n }, [setTimeRange]);\n\n const seriesData: SeriesSample[] = useMemo(() => {\n const timeLine: Timeline = data.timeline || ({} as Timeline);\n const startTime = timeLine.startTime;\n const durationDelta = timeLine.durationDelta;\n return timeLine.samples.map((sample, index) => ({\n id: index,\n value: [(startTime + index * durationDelta) * 1000, Number(sample)],\n }));\n }, [data.timeline]);\n\n const option: EChartsCoreOption = useMemo(() => {\n const seriesMapping = {\n type: 'line',\n color: theme.palette.primary.main,\n sampling: 'lttb',\n showSymbol: true,\n showAllSymbol: true,\n symbolSize: LINE_WIDTH + POINT_SIZE_OFFSET,\n lineStyle: {\n width: LINE_WIDTH,\n opacity: 0.95,\n },\n areaStyle: {\n opacity: 0,\n },\n data: seriesData,\n };\n\n const timeLine: Timeline = data.timeline || ({} as Timeline);\n\n const option: EChartsCoreOption = {\n series: seriesMapping,\n xAxis: {\n type: 'time',\n min: timeLine.startTime * 1000,\n max: (timeLine.startTime + timeLine.samples.length * timeLine.durationDelta) * 1000,\n axisLabel: {\n hideOverlap: true,\n },\n axisPointer: {\n snap: false, // important so shared crosshair does not lag\n },\n },\n yAxis: {\n type: 'value',\n axisLabel: {\n formatter: (value: number) => {\n return formatItemValue(data.metadata?.units, value);\n },\n },\n },\n animation: false,\n tooltip: {\n show: true,\n showContent: true,\n trigger: 'axis',\n appendToBody: true,\n confine: true,\n backgroundColor: theme.palette.background.paper,\n borderColor: theme.palette.background.paper,\n textStyle: {\n color: theme.palette.text.primary,\n },\n formatter: (params: CallbackDataParams[]) =>\n getSeriesTooltip(\n (params[0]?.data as SeriesSample) || {},\n data.metadata?.units || '',\n data.metadata?.name || '',\n theme.palette.primary.main,\n theme.palette.divider\n ),\n },\n axisPointer: {\n type: 'line',\n z: 0, // ensure point symbol shows on top of dashed line\n triggerEmphasis: true,\n triggerTooltip: false,\n snap: false,\n },\n toolbox: {\n feature: {\n dataZoom: {\n icon: null,\n yAxisIndex: 'none',\n },\n },\n },\n grid: {\n left: 10,\n right: 10,\n top: 10,\n bottom: 10,\n },\n };\n\n return option;\n }, [data.timeline, data.metadata, seriesData, theme]);\n\n const seriesChart = useMemo(\n () => (\n <EChart\n style={{\n width: width,\n height: height,\n }}\n option={option}\n theme={chartsTheme.echartsTheme}\n onEvents={handleEvents}\n _instance={chartRef}\n />\n ),\n [chartsTheme.echartsTheme, height, option, width, handleEvents]\n );\n\n return (\n <Stack\n width={width}\n height={height}\n alignItems=\"center\"\n justifyContent=\"center\"\n onMouseEnter={() => {\n // This is necessary to ensure that the data zoom feature is enabled after the theme is changed.\n if (chartRef.current !== undefined) {\n enableDataZoom(chartRef.current);\n }\n }}\n >\n {seriesChart}\n </Stack>\n );\n}\n"],"names":["useMemo","useRef","Stack","useTheme","useChartsTheme","EChart","enableDataZoom","useTimeRange","formatItemValue","getSeriesTooltip","LINE_WIDTH","POINT_SIZE_OFFSET","SeriesChart","props","width","height","data","chartsTheme","theme","setTimeRange","chartRef","handleEvents","datazoom","params","batch","undefined","xAxisStartValue","startValue","xAxisEndValue","endValue","zoomEvent","start","end","Date","finished","current","seriesData","timeLine","timeline","startTime","durationDelta","samples","map","sample","index","id","value","Number","option","seriesMapping","type","color","palette","primary","main","sampling","showSymbol","showAllSymbol","symbolSize","lineStyle","opacity","areaStyle","series","xAxis","min","max","length","axisLabel","hideOverlap","axisPointer","snap","yAxis","formatter","metadata","units","animation","tooltip","show","showContent","trigger","appendToBody","confine","backgroundColor","background","paper","borderColor","textStyle","text","name","divider","z","triggerEmphasis","triggerTooltip","toolbox","feature","dataZoom","icon","yAxisIndex","grid","left","right","top","bottom","seriesChart","style","echartsTheme","onEvents","_instance","alignItems","justifyContent","onMouseEnter"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/SeriesChart.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License | Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing | software\n// distributed under the License is distributed on an \"AS IS\" BASIS |\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND | either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ReactElement, useMemo, useRef } from 'react';\nimport { Stack, useTheme } from '@mui/material';\nimport { useChartsTheme, EChart, ZoomEventData, OnEventsType, enableDataZoom } from '@perses-dev/components';\nimport { useTimeRange } from '@perses-dev/plugin-system';\nimport type { EChartsCoreOption, LineSeriesOption } from 'echarts';\nimport { ECharts as EChartsInstance } from 'echarts/core';\nimport { CallbackDataParams } from 'echarts/types/dist/shared';\nimport { ProfileData, Timeline } from '@perses-dev/spec';\nimport { formatItemValue } from '../utils/format';\nimport { getSeriesTooltip } from '../utils/series-tooltip';\nimport { SeriesSample } from '../utils/data-model';\n\nconst LINE_WIDTH = 1.25;\nconst POINT_SIZE_OFFSET = 2;\n\nexport interface SeriesChartProps {\n width: number;\n height: number;\n data: ProfileData;\n}\n\nexport function SeriesChart(props: SeriesChartProps): ReactElement {\n const { width, height, data } = props;\n\n const chartsTheme = useChartsTheme();\n const theme = useTheme();\n const { setTimeRange } = useTimeRange();\n const chartRef = useRef<EChartsInstance>();\n\n const handleEvents: OnEventsType<LineSeriesOption['data'] | unknown> = useMemo(() => {\n return {\n datazoom: (params): void => {\n if (params.batch[0] === undefined) return;\n const xAxisStartValue = params.batch?.[0]?.startValue;\n const xAxisEndValue = params.batch?.[0]?.endValue;\n if (xAxisStartValue !== undefined && xAxisEndValue !== undefined) {\n const zoomEvent: ZoomEventData = {\n start: xAxisStartValue,\n end: xAxisEndValue,\n };\n setTimeRange({ start: new Date(zoomEvent.start), end: new Date(zoomEvent.end) });\n }\n },\n finished: (): void => {\n if (chartRef.current !== undefined) {\n enableDataZoom(chartRef.current);\n }\n },\n };\n }, [setTimeRange]);\n\n const seriesData: SeriesSample[] = useMemo(() => {\n const timeLine: Timeline = data.timeline || ({} as Timeline);\n const startTime = timeLine.startTime;\n const durationDelta = timeLine.durationDelta;\n return timeLine.samples.map((sample, index) => ({\n id: index,\n value: [(startTime + index * durationDelta) * 1000, Number(sample)],\n }));\n }, [data.timeline]);\n\n const option: EChartsCoreOption = useMemo(() => {\n const seriesMapping = {\n type: 'line',\n color: theme.palette.primary.main,\n sampling: 'lttb',\n showSymbol: true,\n showAllSymbol: true,\n symbolSize: LINE_WIDTH + POINT_SIZE_OFFSET,\n lineStyle: {\n width: LINE_WIDTH,\n opacity: 0.95,\n },\n areaStyle: {\n opacity: 0,\n },\n data: seriesData,\n };\n\n const timeLine: Timeline = data.timeline || ({} as Timeline);\n\n const option: EChartsCoreOption = {\n series: seriesMapping,\n xAxis: {\n type: 'time',\n min: timeLine.startTime * 1000,\n max: (timeLine.startTime + timeLine.samples.length * timeLine.durationDelta) * 1000,\n axisLabel: {\n hideOverlap: true,\n },\n axisPointer: {\n snap: false, // important so shared crosshair does not lag\n },\n },\n yAxis: {\n type: 'value',\n axisLabel: {\n formatter: (value: number) => {\n return formatItemValue(data.metadata?.units, value);\n },\n },\n },\n animation: false,\n tooltip: {\n show: true,\n showContent: true,\n trigger: 'axis',\n appendToBody: true,\n confine: true,\n backgroundColor: theme.palette.background.paper,\n borderColor: theme.palette.background.paper,\n textStyle: {\n color: theme.palette.text.primary,\n },\n formatter: (params: CallbackDataParams[]) =>\n getSeriesTooltip(\n (params[0]?.data as SeriesSample) || {},\n data.metadata?.units || '',\n data.metadata?.name || '',\n theme.palette.primary.main,\n theme.palette.divider\n ),\n },\n axisPointer: {\n type: 'line',\n z: 0, // ensure point symbol shows on top of dashed line\n triggerEmphasis: true,\n triggerTooltip: false,\n snap: false,\n },\n toolbox: {\n feature: {\n dataZoom: {\n icon: null,\n yAxisIndex: 'none',\n },\n },\n },\n grid: {\n left: 10,\n right: 10,\n top: 10,\n bottom: 10,\n },\n };\n\n return option;\n }, [data.timeline, data.metadata, seriesData, theme]);\n\n const seriesChart = useMemo(\n () => (\n <EChart\n style={{\n width: width,\n height: height,\n }}\n option={option}\n theme={chartsTheme.echartsTheme}\n onEvents={handleEvents}\n _instance={chartRef}\n />\n ),\n [chartsTheme.echartsTheme, height, option, width, handleEvents]\n );\n\n return (\n <Stack\n width={width}\n height={height}\n alignItems=\"center\"\n justifyContent=\"center\"\n onMouseEnter={() => {\n // This is necessary to ensure that the data zoom feature is enabled after the theme is changed.\n if (chartRef.current !== undefined) {\n enableDataZoom(chartRef.current);\n }\n }}\n >\n {seriesChart}\n </Stack>\n );\n}\n"],"names":["useMemo","useRef","Stack","useTheme","useChartsTheme","EChart","enableDataZoom","useTimeRange","formatItemValue","getSeriesTooltip","LINE_WIDTH","POINT_SIZE_OFFSET","SeriesChart","props","width","height","data","chartsTheme","theme","setTimeRange","chartRef","handleEvents","datazoom","params","batch","undefined","xAxisStartValue","startValue","xAxisEndValue","endValue","zoomEvent","start","end","Date","finished","current","seriesData","timeLine","timeline","startTime","durationDelta","samples","map","sample","index","id","value","Number","option","seriesMapping","type","color","palette","primary","main","sampling","showSymbol","showAllSymbol","symbolSize","lineStyle","opacity","areaStyle","series","xAxis","min","max","length","axisLabel","hideOverlap","axisPointer","snap","yAxis","formatter","metadata","units","animation","tooltip","show","showContent","trigger","appendToBody","confine","backgroundColor","background","paper","borderColor","textStyle","text","name","divider","z","triggerEmphasis","triggerTooltip","toolbox","feature","dataZoom","icon","yAxisIndex","grid","left","right","top","bottom","seriesChart","style","echartsTheme","onEvents","_instance","alignItems","justifyContent","onMouseEnter"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ReactElement } from 'react';
2
- import { ProfileData } from '@perses-dev/core';
2
+ import { ProfileData } from '@perses-dev/spec';
3
3
  export interface TableChartProps {
4
4
  width: number;
5
5
  height: number;
@@ -1 +1 @@
1
- {"version":3,"file":"TableChart.d.ts","sourceRoot":"","sources":["../../../src/components/TableChart.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAqB,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAa/C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAyG/D"}
1
+ {"version":3,"file":"TableChart.d.ts","sourceRoot":"","sources":["../../../src/components/TableChart.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAqB,MAAM,OAAO,CAAC;AAKxD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAW/C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAyG/D"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TableChart.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License | Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing | software\n// distributed under the License is distributed on an \"AS IS\" BASIS |\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND | either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ReactElement, useMemo, useState } from 'react';\nimport { Stack, useTheme, Link } from '@mui/material';\nimport { ProfileData } from '@perses-dev/core';\nimport { Table, TableColumnConfig } from '@perses-dev/components';\nimport { SortingState } from '@tanstack/react-table';\nimport { tableRecursionJson } from '../utils/data-transform';\nimport { TableChartSample } from '../utils/data-model';\nimport { formatItemValue } from '../utils/format';\nimport { SearchBar } from './SearchBar';\n\nconst LARGE_PANEL_TRESHOLD = 600; // heigth treshold to switch to large panel mode\nconst PADDING_TOP = 8;\nconst SCROLL_BAR_WIDTH = 15;\nconst SEARCH_BAR_HEIGHT = 50;\n\nexport interface TableChartProps {\n width: number;\n height: number;\n data: ProfileData;\n searchValue: string;\n onSearchValueChange: (value: string) => void;\n onSelectedIdChange: (id: number) => void;\n}\n\nexport function TableChart(props: TableChartProps): ReactElement {\n const { width, height, data, searchValue, onSearchValueChange, onSelectedIdChange } = props;\n\n const theme = useTheme();\n\n const availableHeight = height;\n const availableWidth = width - 10;\n\n const tableData: TableChartSample[] = useMemo(() => {\n return tableRecursionJson(data.profile.stackTrace, searchValue);\n }, [data, searchValue]);\n\n const columns: Array<TableColumnConfig<unknown>> = useMemo(() => {\n const unit = data.metadata?.units || '';\n\n const columnSettings: Array<TableColumnConfig<unknown>> = [\n {\n accessorKey: 'name',\n header: 'Name',\n headerDescription: 'Function name',\n align: 'left',\n enableSorting: true,\n width: 0.5 * availableWidth,\n cell: (ctx): ReactElement => {\n const cellValue = ctx.getValue();\n return (\n <Link\n href=\"#\"\n underline=\"hover\"\n onClick={(e) => {\n e.preventDefault();\n const currentSample = ctx.row.original as TableChartSample;\n onSelectedIdChange(currentSample.id); // focus on this item in the flame graph\n onSearchValueChange(currentSample.name);\n }}\n >\n {cellValue}\n </Link>\n );\n },\n cellDescription: () => '',\n },\n {\n accessorKey: 'self',\n header: 'Self',\n headerDescription: 'Function self samples',\n align: 'right',\n enableSorting: true,\n width: 0.25 * availableWidth - SCROLL_BAR_WIDTH,\n cell: (ctx): string => {\n const cellValue = ctx.getValue();\n return formatItemValue(unit, cellValue);\n },\n },\n {\n accessorKey: 'total',\n header: 'Total',\n headerDescription: 'Function total samples',\n align: 'right',\n enableSorting: true,\n width: 0.25 * availableWidth,\n cell: (ctx): string => {\n const cellValue = ctx.getValue();\n return formatItemValue(unit, cellValue);\n },\n },\n ];\n\n return columnSettings;\n }, [data.metadata?.units, availableWidth, onSearchValueChange, onSelectedIdChange]);\n\n const [sorting, setSorting] = useState<SortingState>([{ id: 'total', desc: true }]);\n\n return (\n <Stack\n width={availableWidth}\n height={availableHeight}\n gap={1}\n sx={{\n '& .MuiTable-root': {\n borderCollapse: 'collapse',\n },\n '& .MuiTableCell-root': {\n borderBottom: `1px solid ${theme.palette.divider}`,\n borderRight: `1px solid ${theme.palette.divider}`,\n '&:last-child': {\n borderRight: 'none',\n },\n },\n }}\n >\n <SearchBar searchValue={searchValue} onSearchValueChange={onSearchValueChange} />\n <Table\n data={tableData}\n columns={columns}\n height={availableHeight - PADDING_TOP - SEARCH_BAR_HEIGHT}\n width={availableWidth}\n density={availableHeight < LARGE_PANEL_TRESHOLD ? 'compact' : 'standard'}\n defaultColumnWidth=\"auto\"\n defaultColumnHeight=\"auto\"\n sorting={sorting}\n onSortingChange={setSorting}\n />\n </Stack>\n );\n}\n"],"names":["useMemo","useState","Stack","useTheme","Link","Table","tableRecursionJson","formatItemValue","SearchBar","LARGE_PANEL_TRESHOLD","PADDING_TOP","SCROLL_BAR_WIDTH","SEARCH_BAR_HEIGHT","TableChart","props","width","height","data","searchValue","onSearchValueChange","onSelectedIdChange","theme","availableHeight","availableWidth","tableData","profile","stackTrace","columns","unit","metadata","units","columnSettings","accessorKey","header","headerDescription","align","enableSorting","cell","ctx","cellValue","getValue","href","underline","onClick","e","preventDefault","currentSample","row","original","id","name","cellDescription","sorting","setSorting","desc","gap","sx","borderCollapse","borderBottom","palette","divider","borderRight","density","defaultColumnWidth","defaultColumnHeight","onSortingChange"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/TableChart.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License | Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing | software\n// distributed under the License is distributed on an \"AS IS\" BASIS |\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND | either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ReactElement, useMemo, useState } from 'react';\nimport { Stack, useTheme, Link } from '@mui/material';\n\nimport { Table, TableColumnConfig } from '@perses-dev/components';\nimport { SortingState } from '@tanstack/react-table';\nimport { ProfileData } from '@perses-dev/spec';\nimport { tableRecursionJson } from '../utils/data-transform';\nimport { TableChartSample } from '../utils/data-model';\nimport { formatItemValue } from '../utils/format';\nimport { SearchBar } from './SearchBar';\n\nconst LARGE_PANEL_TRESHOLD = 600; // heigth treshold to switch to large panel mode\nconst PADDING_TOP = 8;\nconst SCROLL_BAR_WIDTH = 15;\nconst SEARCH_BAR_HEIGHT = 50;\n\nexport interface TableChartProps {\n width: number;\n height: number;\n data: ProfileData;\n searchValue: string;\n onSearchValueChange: (value: string) => void;\n onSelectedIdChange: (id: number) => void;\n}\n\nexport function TableChart(props: TableChartProps): ReactElement {\n const { width, height, data, searchValue, onSearchValueChange, onSelectedIdChange } = props;\n\n const theme = useTheme();\n\n const availableHeight = height;\n const availableWidth = width - 10;\n\n const tableData: TableChartSample[] = useMemo(() => {\n return tableRecursionJson(data.profile.stackTrace, searchValue);\n }, [data, searchValue]);\n\n const columns: Array<TableColumnConfig<unknown>> = useMemo(() => {\n const unit = data.metadata?.units || '';\n\n const columnSettings: Array<TableColumnConfig<unknown>> = [\n {\n accessorKey: 'name',\n header: 'Name',\n headerDescription: 'Function name',\n align: 'left',\n enableSorting: true,\n width: 0.5 * availableWidth,\n cell: (ctx): ReactElement => {\n const cellValue = ctx.getValue();\n return (\n <Link\n href=\"#\"\n underline=\"hover\"\n onClick={(e) => {\n e.preventDefault();\n const currentSample = ctx.row.original as TableChartSample;\n onSelectedIdChange(currentSample.id); // focus on this item in the flame graph\n onSearchValueChange(currentSample.name);\n }}\n >\n {cellValue}\n </Link>\n );\n },\n cellDescription: () => '',\n },\n {\n accessorKey: 'self',\n header: 'Self',\n headerDescription: 'Function self samples',\n align: 'right',\n enableSorting: true,\n width: 0.25 * availableWidth - SCROLL_BAR_WIDTH,\n cell: (ctx): string => {\n const cellValue = ctx.getValue();\n return formatItemValue(unit, cellValue);\n },\n },\n {\n accessorKey: 'total',\n header: 'Total',\n headerDescription: 'Function total samples',\n align: 'right',\n enableSorting: true,\n width: 0.25 * availableWidth,\n cell: (ctx): string => {\n const cellValue = ctx.getValue();\n return formatItemValue(unit, cellValue);\n },\n },\n ];\n\n return columnSettings;\n }, [data.metadata?.units, availableWidth, onSearchValueChange, onSelectedIdChange]);\n\n const [sorting, setSorting] = useState<SortingState>([{ id: 'total', desc: true }]);\n\n return (\n <Stack\n width={availableWidth}\n height={availableHeight}\n gap={1}\n sx={{\n '& .MuiTable-root': {\n borderCollapse: 'collapse',\n },\n '& .MuiTableCell-root': {\n borderBottom: `1px solid ${theme.palette.divider}`,\n borderRight: `1px solid ${theme.palette.divider}`,\n '&:last-child': {\n borderRight: 'none',\n },\n },\n }}\n >\n <SearchBar searchValue={searchValue} onSearchValueChange={onSearchValueChange} />\n <Table\n data={tableData}\n columns={columns}\n height={availableHeight - PADDING_TOP - SEARCH_BAR_HEIGHT}\n width={availableWidth}\n density={availableHeight < LARGE_PANEL_TRESHOLD ? 'compact' : 'standard'}\n defaultColumnWidth=\"auto\"\n defaultColumnHeight=\"auto\"\n sorting={sorting}\n onSortingChange={setSorting}\n />\n </Stack>\n );\n}\n"],"names":["useMemo","useState","Stack","useTheme","Link","Table","tableRecursionJson","formatItemValue","SearchBar","LARGE_PANEL_TRESHOLD","PADDING_TOP","SCROLL_BAR_WIDTH","SEARCH_BAR_HEIGHT","TableChart","props","width","height","data","searchValue","onSearchValueChange","onSelectedIdChange","theme","availableHeight","availableWidth","tableData","profile","stackTrace","columns","unit","metadata","units","columnSettings","accessorKey","header","headerDescription","align","enableSorting","cell","ctx","cellValue","getValue","href","underline","onClick","e","preventDefault","currentSample","row","original","id","name","cellDescription","sorting","setSorting","desc","gap","sx","borderCollapse","borderBottom","palette","divider","borderRight","density","defaultColumnWidth","defaultColumnHeight","onSortingChange"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { Definition } from '@perses-dev/core';
2
1
  import { OptionsEditorProps } from '@perses-dev/plugin-system';
2
+ import { Definition } from '@perses-dev/spec';
3
3
  /**
4
4
  * The schema for a FlameChart panel.
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"flame-chart-model.d.ts","sourceRoot":"","sources":["../../src/flame-chart-model.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IACzE,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,4BAA4B,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;AAEjF,wBAAgB,8BAA8B,IAAI,iBAAiB,CAQlE"}
1
+ {"version":3,"file":"flame-chart-model.d.ts","sourceRoot":"","sources":["../../src/flame-chart-model.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IACzE,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,4BAA4B,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;AAEjF,wBAAgB,8BAA8B,IAAI,iBAAiB,CAQlE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/flame-chart-model.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Definition } from '@perses-dev/core';\nimport { OptionsEditorProps } from '@perses-dev/plugin-system';\n\n/**\n * The schema for a FlameChart panel.\n */\nexport interface FlameChartDefinition extends Definition<FlameChartOptions> {\n kind: 'FlameChart';\n}\n\nexport interface FlameChartOptions {\n palette: 'package-name' | 'value';\n showSettings: boolean;\n showSeries: boolean;\n showTable: boolean;\n showFlameGraph: boolean;\n traceHeight?: number;\n}\n\nexport type FlameChartOptionsEditorProps = OptionsEditorProps<FlameChartOptions>;\n\nexport function createInitialFlameChartOptions(): FlameChartOptions {\n return {\n palette: 'package-name',\n showSettings: true,\n showSeries: false,\n showTable: true,\n showFlameGraph: true,\n };\n}\n"],"names":["createInitialFlameChartOptions","palette","showSettings","showSeries","showTable","showFlameGraph"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAuBjC,OAAO,SAASA;IACd,OAAO;QACLC,SAAS;QACTC,cAAc;QACdC,YAAY;QACZC,WAAW;QACXC,gBAAgB;IAClB;AACF"}
1
+ {"version":3,"sources":["../../src/flame-chart-model.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { OptionsEditorProps } from '@perses-dev/plugin-system';\nimport { Definition } from '@perses-dev/spec';\n\n/**\n * The schema for a FlameChart panel.\n */\nexport interface FlameChartDefinition extends Definition<FlameChartOptions> {\n kind: 'FlameChart';\n}\n\nexport interface FlameChartOptions {\n palette: 'package-name' | 'value';\n showSettings: boolean;\n showSeries: boolean;\n showTable: boolean;\n showFlameGraph: boolean;\n traceHeight?: number;\n}\n\nexport type FlameChartOptionsEditorProps = OptionsEditorProps<FlameChartOptions>;\n\nexport function createInitialFlameChartOptions(): FlameChartOptions {\n return {\n palette: 'package-name',\n showSettings: true,\n showSeries: false,\n showTable: true,\n showFlameGraph: true,\n };\n}\n"],"names":["createInitialFlameChartOptions","palette","showSettings","showSeries","showTable","showFlameGraph"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAuBjC,OAAO,SAASA;IACd,OAAO;QACLC,SAAS;QACTC,cAAc;QACdC,YAAY;QACZC,WAAW;QACXC,gBAAgB;IAClB;AACF"}
@@ -1,4 +1,4 @@
1
- import { ProfileMetaData, StackTrace } from '@perses-dev/core';
1
+ import { ProfileMetaData, StackTrace } from '@perses-dev/spec';
2
2
  import { FlameChartSample as Sample, TableChartSample } from './data-model';
3
3
  /**
4
4
  * Filter the global stacktrace by a function ID to focus on that function and display its corresponding flame chart
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/data-transform.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ProfileMetaData, StackTrace } from '@perses-dev/core';\nimport { FlameChartSample as Sample, TableChartSample } from './data-model';\nimport { getSpanColor } from './palette-gen';\nimport { formatItemValue } from './format';\n\n/**\n * Filter the global stacktrace by a function ID to focus on that function and display its corresponding flame chart\n */\nexport function filterStackTraceById(trace: StackTrace, id: number | undefined): StackTrace {\n if (id === undefined) {\n return trace;\n }\n\n const recur = (trace: StackTrace, id: number | undefined): StackTrace | undefined => {\n if (trace.id === id) {\n return trace;\n }\n\n for (const child of trace.children ?? []) {\n const temp = recur(child, id);\n if (temp) {\n trace = { ...trace }; // Create a shallow copy of the trace to avoid mutating the original object\n // Override parents' values\n trace.children = [temp];\n trace.start = temp.start;\n trace.end = temp.end;\n\n return trace;\n }\n }\n\n return undefined;\n };\n\n return recur(trace, id) ?? trace;\n}\n\n// build the name of the corresponding flamechart item\nfunction formatName(item: StackTrace, rootVal: number, unit: string | undefined): string {\n return (item.total / rootVal) * 100 < 1 ? '' : item.name + ` (${formatItemValue(unit, item.total)})`;\n}\n\n/**\n * Search the total value of an item corresponding to a given ID\n */\nfunction getCurrentTotalValue(json: StackTrace, id: number | undefined): number {\n if (id === undefined) return 0;\n\n const recur = (item: StackTrace): number => {\n if (item.id === id) {\n return item.total;\n }\n\n for (const child of item.children || []) {\n const total = recur(child);\n if (total !== undefined) {\n return total;\n }\n }\n return 0; // If not found, return 0\n };\n\n return recur(json);\n}\n\n/**\n * Build series data for the flame chart option\n */\nexport function buildSamples(\n palette: string,\n metadata: ProfileMetaData | undefined,\n traces: StackTrace,\n searchValue: string,\n id?: number\n): Sample[] {\n const data: Sample[] = [];\n const filteredJson = filterStackTraceById(traces, id);\n\n const rootVal = filteredJson.total; // total samples of root node\n const currentVal = getCurrentTotalValue(filteredJson, id); // total samples of the selected item, used to generate items colors\n\n const recur = (item: StackTrace): void => {\n const temp = {\n name: item.id,\n value: [\n item.level,\n item.start,\n item.end,\n formatName(item, currentVal ? currentVal : rootVal, metadata?.units),\n (item.total / rootVal) * 100,\n (item.self / rootVal) * 100,\n item.name,\n item.self,\n item.total,\n ],\n itemStyle: {\n color: !isItemNameMatchesSearchFilters(item.name, searchValue)\n ? '#dee2e6'\n : getSpanColor(palette, item.name, (item.total / (currentVal ? currentVal : rootVal)) * 100),\n },\n };\n data.push(temp as Sample);\n\n for (const child of item.children || []) {\n recur(child);\n }\n };\n\n // check is filteredJson is not empty before call recur\n if (filteredJson.id) recur(filteredJson);\n return data;\n}\n\n/**\n * Transform query results to a tabular format for the table chart\n */\nexport function tableRecursionJson(jsonObj: StackTrace, searchValue: string): TableChartSample[] {\n const data: TableChartSample[] = [];\n const structuredJson = structuredClone(jsonObj);\n\n const recur = (item: StackTrace): void => {\n const temp = {\n id: item.id,\n name: item.name,\n self: item.self,\n total: item.total,\n };\n\n if (isItemNameMatchesSearchFilters(temp.name, searchValue)) data.push(temp as TableChartSample);\n\n for (const child of item.children || []) {\n recur(child);\n }\n };\n\n // check is structuredJson is not empty before call recur\n if (structuredJson.id) recur(structuredJson);\n return data;\n}\n\n// Checks if an item name matches all parts of a search value.\nfunction isItemNameMatchesSearchFilters(itemName: string, searchValue: string): boolean {\n if (searchValue === '') return true;\n\n const filters = searchValue\n .trim()\n .toLocaleLowerCase()\n .split(/[^a-zA-Z0-9']+/)\n .filter((s) => s !== '');\n\n if (filters.length === 0) {\n return false;\n } else {\n return filters.every((filter) => itemName.toLowerCase().includes(filter.trim()));\n }\n}\n\n/**\n * Finds the total sample value of the series data item with the specified name.\n */\nexport function findTotalSampleByName(seriesData: Sample[], name: number | undefined): number | undefined {\n if (name === undefined || name === 0) return undefined;\n const item = seriesData.find((item) => item.name === name);\n const totalSample = item?.value[8];\n return Number(totalSample);\n}\n\n/*\n * Calculate the maximum depth of the stack trace\n */\nexport function getMaxDepth(trace: StackTrace): number {\n if (!trace.children?.length) {\n return 1;\n }\n return 1 + Math.max(...trace.children.map(getMaxDepth));\n}\n"],"names":["getSpanColor","formatItemValue","filterStackTraceById","trace","id","undefined","recur","child","children","temp","start","end","formatName","item","rootVal","unit","total","name","getCurrentTotalValue","json","buildSamples","palette","metadata","traces","searchValue","data","filteredJson","currentVal","value","level","units","self","itemStyle","color","isItemNameMatchesSearchFilters","push","tableRecursionJson","jsonObj","structuredJson","structuredClone","itemName","filters","trim","toLocaleLowerCase","split","filter","s","length","every","toLowerCase","includes","findTotalSampleByName","seriesData","find","totalSample","Number","getMaxDepth","Math","max","map"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/data-transform.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ProfileMetaData, StackTrace } from '@perses-dev/spec';\nimport { FlameChartSample as Sample, TableChartSample } from './data-model';\nimport { getSpanColor } from './palette-gen';\nimport { formatItemValue } from './format';\n\n/**\n * Filter the global stacktrace by a function ID to focus on that function and display its corresponding flame chart\n */\nexport function filterStackTraceById(trace: StackTrace, id: number | undefined): StackTrace {\n if (id === undefined) {\n return trace;\n }\n\n const recur = (trace: StackTrace, id: number | undefined): StackTrace | undefined => {\n if (trace.id === id) {\n return trace;\n }\n\n for (const child of trace.children ?? []) {\n const temp = recur(child, id);\n if (temp) {\n trace = { ...trace }; // Create a shallow copy of the trace to avoid mutating the original object\n // Override parents' values\n trace.children = [temp];\n trace.start = temp.start;\n trace.end = temp.end;\n\n return trace;\n }\n }\n\n return undefined;\n };\n\n return recur(trace, id) ?? trace;\n}\n\n// build the name of the corresponding flamechart item\nfunction formatName(item: StackTrace, rootVal: number, unit: string | undefined): string {\n return (item.total / rootVal) * 100 < 1 ? '' : item.name + ` (${formatItemValue(unit, item.total)})`;\n}\n\n/**\n * Search the total value of an item corresponding to a given ID\n */\nfunction getCurrentTotalValue(json: StackTrace, id: number | undefined): number {\n if (id === undefined) return 0;\n\n const recur = (item: StackTrace): number => {\n if (item.id === id) {\n return item.total;\n }\n\n for (const child of item.children || []) {\n const total = recur(child);\n if (total !== undefined) {\n return total;\n }\n }\n return 0; // If not found, return 0\n };\n\n return recur(json);\n}\n\n/**\n * Build series data for the flame chart option\n */\nexport function buildSamples(\n palette: string,\n metadata: ProfileMetaData | undefined,\n traces: StackTrace,\n searchValue: string,\n id?: number\n): Sample[] {\n const data: Sample[] = [];\n const filteredJson = filterStackTraceById(traces, id);\n\n const rootVal = filteredJson.total; // total samples of root node\n const currentVal = getCurrentTotalValue(filteredJson, id); // total samples of the selected item, used to generate items colors\n\n const recur = (item: StackTrace): void => {\n const temp = {\n name: item.id,\n value: [\n item.level,\n item.start,\n item.end,\n formatName(item, currentVal ? currentVal : rootVal, metadata?.units),\n (item.total / rootVal) * 100,\n (item.self / rootVal) * 100,\n item.name,\n item.self,\n item.total,\n ],\n itemStyle: {\n color: !isItemNameMatchesSearchFilters(item.name, searchValue)\n ? '#dee2e6'\n : getSpanColor(palette, item.name, (item.total / (currentVal ? currentVal : rootVal)) * 100),\n },\n };\n data.push(temp as Sample);\n\n for (const child of item.children || []) {\n recur(child);\n }\n };\n\n // check is filteredJson is not empty before call recur\n if (filteredJson.id) recur(filteredJson);\n return data;\n}\n\n/**\n * Transform query results to a tabular format for the table chart\n */\nexport function tableRecursionJson(jsonObj: StackTrace, searchValue: string): TableChartSample[] {\n const data: TableChartSample[] = [];\n const structuredJson = structuredClone(jsonObj);\n\n const recur = (item: StackTrace): void => {\n const temp = {\n id: item.id,\n name: item.name,\n self: item.self,\n total: item.total,\n };\n\n if (isItemNameMatchesSearchFilters(temp.name, searchValue)) data.push(temp as TableChartSample);\n\n for (const child of item.children || []) {\n recur(child);\n }\n };\n\n // check is structuredJson is not empty before call recur\n if (structuredJson.id) recur(structuredJson);\n return data;\n}\n\n// Checks if an item name matches all parts of a search value.\nfunction isItemNameMatchesSearchFilters(itemName: string, searchValue: string): boolean {\n if (searchValue === '') return true;\n\n const filters = searchValue\n .trim()\n .toLocaleLowerCase()\n .split(/[^a-zA-Z0-9']+/)\n .filter((s) => s !== '');\n\n if (filters.length === 0) {\n return false;\n } else {\n return filters.every((filter) => itemName.toLowerCase().includes(filter.trim()));\n }\n}\n\n/**\n * Finds the total sample value of the series data item with the specified name.\n */\nexport function findTotalSampleByName(seriesData: Sample[], name: number | undefined): number | undefined {\n if (name === undefined || name === 0) return undefined;\n const item = seriesData.find((item) => item.name === name);\n const totalSample = item?.value[8];\n return Number(totalSample);\n}\n\n/*\n * Calculate the maximum depth of the stack trace\n */\nexport function getMaxDepth(trace: StackTrace): number {\n if (!trace.children?.length) {\n return 1;\n }\n return 1 + Math.max(...trace.children.map(getMaxDepth));\n}\n"],"names":["getSpanColor","formatItemValue","filterStackTraceById","trace","id","undefined","recur","child","children","temp","start","end","formatName","item","rootVal","unit","total","name","getCurrentTotalValue","json","buildSamples","palette","metadata","traces","searchValue","data","filteredJson","currentVal","value","level","units","self","itemStyle","color","isItemNameMatchesSearchFilters","push","tableRecursionJson","jsonObj","structuredJson","structuredClone","itemName","filters","trim","toLocaleLowerCase","split","filter","s","length","every","toLowerCase","includes","findTotalSampleByName","seriesData","find","totalSample","Number","getMaxDepth","Math","max","map"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"AAeA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAuB/E"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"AAgBA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAuB/E"}
@@ -10,7 +10,8 @@
10
10
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
- import { msToPrometheusDuration, formatDuration, formatValue } from '@perses-dev/core';
13
+ import { formatValue } from '@perses-dev/components';
14
+ import { convertTimeToDuration, formatDuration } from '@perses-dev/spec';
14
15
  export function formatNanoDuration(value) {
15
16
  // The value to format is in nanoseconds
16
17
  if (value < 1_000) {
@@ -26,7 +27,7 @@ export function formatNanoDuration(value) {
26
27
  shortValues: true
27
28
  }) + 'μs';
28
29
  } else {
29
- return formatDuration(msToPrometheusDuration(value / 1_000_000));
30
+ return formatDuration(convertTimeToDuration(value / 1_000_000));
30
31
  }
31
32
  }
32
33
  export function formatItemValue(unit, value) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/format.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { msToPrometheusDuration, formatDuration, formatValue } from '@perses-dev/core';\n\nexport function formatNanoDuration(value: number): string {\n // The value to format is in nanoseconds\n if (value < 1_000) {\n return formatValue(value, { unit: 'decimal', decimalPlaces: 2, shortValues: true }) + 'ns';\n } else if (value < 1_000_000) {\n return formatValue(value / 1_000, { unit: 'decimal', decimalPlaces: 2, shortValues: true }) + 'μs';\n } else {\n return formatDuration(msToPrometheusDuration(value / 1_000_000));\n }\n}\n\nexport function formatItemValue(unit: string | undefined, value: number): string {\n let valueWithUnit = '';\n switch (unit) {\n case 'count':\n valueWithUnit = formatValue(value, { unit: 'decimal', decimalPlaces: 2, shortValues: true });\n break;\n case 'samples':\n valueWithUnit = formatValue(value, { unit: 'decimal', decimalPlaces: 2, shortValues: true });\n break;\n case 'objects':\n valueWithUnit = formatValue(value, { unit: 'decimal', decimalPlaces: 2, shortValues: true });\n break;\n case 'bytes':\n valueWithUnit = formatValue(value, { unit: 'bytes' });\n break;\n case 'nanoseconds':\n valueWithUnit = formatNanoDuration(value);\n break;\n default:\n valueWithUnit = `${value} ${unit}`;\n break;\n }\n return valueWithUnit;\n}\n"],"names":["msToPrometheusDuration","formatDuration","formatValue","formatNanoDuration","value","unit","decimalPlaces","shortValues","formatItemValue","valueWithUnit"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,sBAAsB,EAAEC,cAAc,EAAEC,WAAW,QAAQ,mBAAmB;AAEvF,OAAO,SAASC,mBAAmBC,KAAa;IAC9C,wCAAwC;IACxC,IAAIA,QAAQ,OAAO;QACjB,OAAOF,YAAYE,OAAO;YAAEC,MAAM;YAAWC,eAAe;YAAGC,aAAa;QAAK,KAAK;IACxF,OAAO,IAAIH,QAAQ,WAAW;QAC5B,OAAOF,YAAYE,QAAQ,OAAO;YAAEC,MAAM;YAAWC,eAAe;YAAGC,aAAa;QAAK,KAAK;IAChG,OAAO;QACL,OAAON,eAAeD,uBAAuBI,QAAQ;IACvD;AACF;AAEA,OAAO,SAASI,gBAAgBH,IAAwB,EAAED,KAAa;IACrE,IAAIK,gBAAgB;IACpB,OAAQJ;QACN,KAAK;YACHI,gBAAgBP,YAAYE,OAAO;gBAAEC,MAAM;gBAAWC,eAAe;gBAAGC,aAAa;YAAK;YAC1F;QACF,KAAK;YACHE,gBAAgBP,YAAYE,OAAO;gBAAEC,MAAM;gBAAWC,eAAe;gBAAGC,aAAa;YAAK;YAC1F;QACF,KAAK;YACHE,gBAAgBP,YAAYE,OAAO;gBAAEC,MAAM;gBAAWC,eAAe;gBAAGC,aAAa;YAAK;YAC1F;QACF,KAAK;YACHE,gBAAgBP,YAAYE,OAAO;gBAAEC,MAAM;YAAQ;YACnD;QACF,KAAK;YACHI,gBAAgBN,mBAAmBC;YACnC;QACF;YACEK,gBAAgB,GAAGL,MAAM,CAAC,EAAEC,MAAM;YAClC;IACJ;IACA,OAAOI;AACT"}
1
+ {"version":3,"sources":["../../../src/utils/format.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { formatValue } from '@perses-dev/components';\nimport { convertTimeToDuration, formatDuration } from '@perses-dev/spec';\n\nexport function formatNanoDuration(value: number): string {\n // The value to format is in nanoseconds\n if (value < 1_000) {\n return formatValue(value, { unit: 'decimal', decimalPlaces: 2, shortValues: true }) + 'ns';\n } else if (value < 1_000_000) {\n return formatValue(value / 1_000, { unit: 'decimal', decimalPlaces: 2, shortValues: true }) + 'μs';\n } else {\n return formatDuration(convertTimeToDuration(value / 1_000_000));\n }\n}\n\nexport function formatItemValue(unit: string | undefined, value: number): string {\n let valueWithUnit = '';\n switch (unit) {\n case 'count':\n valueWithUnit = formatValue(value, { unit: 'decimal', decimalPlaces: 2, shortValues: true });\n break;\n case 'samples':\n valueWithUnit = formatValue(value, { unit: 'decimal', decimalPlaces: 2, shortValues: true });\n break;\n case 'objects':\n valueWithUnit = formatValue(value, { unit: 'decimal', decimalPlaces: 2, shortValues: true });\n break;\n case 'bytes':\n valueWithUnit = formatValue(value, { unit: 'bytes' });\n break;\n case 'nanoseconds':\n valueWithUnit = formatNanoDuration(value);\n break;\n default:\n valueWithUnit = `${value} ${unit}`;\n break;\n }\n return valueWithUnit;\n}\n"],"names":["formatValue","convertTimeToDuration","formatDuration","formatNanoDuration","value","unit","decimalPlaces","shortValues","formatItemValue","valueWithUnit"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,WAAW,QAAQ,yBAAyB;AACrD,SAASC,qBAAqB,EAAEC,cAAc,QAAQ,mBAAmB;AAEzE,OAAO,SAASC,mBAAmBC,KAAa;IAC9C,wCAAwC;IACxC,IAAIA,QAAQ,OAAO;QACjB,OAAOJ,YAAYI,OAAO;YAAEC,MAAM;YAAWC,eAAe;YAAGC,aAAa;QAAK,KAAK;IACxF,OAAO,IAAIH,QAAQ,WAAW;QAC5B,OAAOJ,YAAYI,QAAQ,OAAO;YAAEC,MAAM;YAAWC,eAAe;YAAGC,aAAa;QAAK,KAAK;IAChG,OAAO;QACL,OAAOL,eAAeD,sBAAsBG,QAAQ;IACtD;AACF;AAEA,OAAO,SAASI,gBAAgBH,IAAwB,EAAED,KAAa;IACrE,IAAIK,gBAAgB;IACpB,OAAQJ;QACN,KAAK;YACHI,gBAAgBT,YAAYI,OAAO;gBAAEC,MAAM;gBAAWC,eAAe;gBAAGC,aAAa;YAAK;YAC1F;QACF,KAAK;YACHE,gBAAgBT,YAAYI,OAAO;gBAAEC,MAAM;gBAAWC,eAAe;gBAAGC,aAAa;YAAK;YAC1F;QACF,KAAK;YACHE,gBAAgBT,YAAYI,OAAO;gBAAEC,MAAM;gBAAWC,eAAe;gBAAGC,aAAa;YAAK;YAC1F;QACF,KAAK;YACHE,gBAAgBT,YAAYI,OAAO;gBAAEC,MAAM;YAAQ;YACnD;QACF,KAAK;YACHI,gBAAgBN,mBAAmBC;YACnC;QACF;YACEK,gBAAgB,GAAGL,MAAM,CAAC,EAAEC,MAAM;YAClC;IACJ;IACA,OAAOI;AACT"}
package/mf-manifest.json CHANGED
@@ -5,11 +5,11 @@
5
5
  "name": "FlameChart",
6
6
  "type": "app",
7
7
  "buildInfo": {
8
- "buildVersion": "0.5.1",
8
+ "buildVersion": "0.6.0-beta.0",
9
9
  "buildName": "@perses-dev/flame-chart-plugin"
10
10
  },
11
11
  "remoteEntry": {
12
- "name": "__mf/js/FlameChart.1166890c.js",
12
+ "name": "__mf/js/FlameChart.731be0ae.js",
13
13
  "path": "",
14
14
  "type": "global"
15
15
  },
@@ -20,8 +20,7 @@
20
20
  "api": ""
21
21
  },
22
22
  "globalName": "FlameChart",
23
- "pluginVersion": "0.21.6",
24
- "prefetchInterface": false,
23
+ "pluginVersion": "2.4.0",
25
24
  "getPublicPath": "function() { const prefix = window.PERSES_PLUGIN_ASSETS_PATH || window.PERSES_APP_CONFIG?.api_prefix || \"\"; return prefix + \"/plugins/FlameChart/\"; }"
26
25
  },
27
26
  "shared": [
@@ -35,34 +34,36 @@
35
34
  "js": {
36
35
  "async": [],
37
36
  "sync": [
38
- "__mf/js/async/274.ecbc8f96.js"
37
+ "__mf/js/async/274.a224fe4a.js"
39
38
  ]
40
39
  },
41
40
  "css": {
42
41
  "async": [],
43
42
  "sync": []
44
43
  }
45
- }
44
+ },
45
+ "fallback": ""
46
46
  },
47
47
  {
48
48
  "id": "FlameChart:@emotion/styled",
49
49
  "name": "@emotion/styled",
50
- "version": "11.14.0",
50
+ "version": "11.14.1",
51
51
  "singleton": true,
52
- "requiredVersion": "^11.14.0",
52
+ "requiredVersion": "^11.14.1",
53
53
  "assets": {
54
54
  "js": {
55
55
  "async": [],
56
56
  "sync": [
57
- "__mf/js/async/235.78d3d3ed.js",
58
- "__mf/js/async/616.28425377.js"
57
+ "__mf/js/async/235.8edcc89b.js",
58
+ "__mf/js/async/616.ec1a450a.js"
59
59
  ]
60
60
  },
61
61
  "css": {
62
62
  "async": [],
63
63
  "sync": []
64
64
  }
65
- }
65
+ },
66
+ "fallback": ""
66
67
  },
67
68
  {
68
69
  "id": "FlameChart:@hookform/resolvers",
@@ -74,53 +75,58 @@
74
75
  "js": {
75
76
  "async": [],
76
77
  "sync": [
77
- "__mf/js/async/587.a0083ae7.js",
78
- "__mf/js/async/968.564b24c9.js"
78
+ "__mf/js/async/587.a13c3a4e.js",
79
+ "__mf/js/async/968.b8c86e9c.js"
79
80
  ]
80
81
  },
81
82
  "css": {
82
83
  "async": [],
83
84
  "sync": []
84
85
  }
85
- }
86
+ },
87
+ "fallback": ""
86
88
  },
87
89
  {
88
90
  "id": "FlameChart:@perses-dev/components",
89
91
  "name": "@perses-dev/components",
90
- "version": "0.53.1",
92
+ "version": "0.54.0-beta.3",
91
93
  "singleton": true,
92
- "requiredVersion": "^0.53.1",
94
+ "requiredVersion": "^0.54.0-beta.3",
93
95
  "assets": {
94
96
  "js": {
95
97
  "async": [],
96
98
  "sync": [
97
- "__mf/js/async/372.8b193f5e.js"
99
+ "__mf/js/async/120.29cb4731.js"
98
100
  ]
99
101
  },
100
102
  "css": {
101
103
  "async": [],
102
- "sync": []
104
+ "sync": [
105
+ "__mf/css/async/120.85c2cbf6.css"
106
+ ]
103
107
  }
104
- }
108
+ },
109
+ "fallback": ""
105
110
  },
106
111
  {
107
112
  "id": "FlameChart:@perses-dev/plugin-system",
108
113
  "name": "@perses-dev/plugin-system",
109
- "version": "0.53.1",
114
+ "version": "0.54.0-beta.3",
110
115
  "singleton": true,
111
- "requiredVersion": "^0.53.1",
116
+ "requiredVersion": "^0.54.0-beta.3",
112
117
  "assets": {
113
118
  "js": {
114
119
  "async": [],
115
120
  "sync": [
116
- "__mf/js/async/634.563ff812.js"
121
+ "__mf/js/async/20.30f1a649.js"
117
122
  ]
118
123
  },
119
124
  "css": {
120
125
  "async": [],
121
126
  "sync": []
122
127
  }
123
- }
128
+ },
129
+ "fallback": ""
124
130
  },
125
131
  {
126
132
  "id": "FlameChart:date-fns",
@@ -132,14 +138,15 @@
132
138
  "js": {
133
139
  "async": [],
134
140
  "sync": [
135
- "__mf/js/async/192.4886ab0f.js"
141
+ "__mf/js/async/192.c44f0e7d.js"
136
142
  ]
137
143
  },
138
144
  "css": {
139
145
  "async": [],
140
146
  "sync": []
141
147
  }
142
- }
148
+ },
149
+ "fallback": ""
143
150
  },
144
151
  {
145
152
  "id": "FlameChart:echarts",
@@ -151,33 +158,35 @@
151
158
  "js": {
152
159
  "async": [],
153
160
  "sync": [
154
- "__mf/js/async/873.10ff7d3e.js"
161
+ "__mf/js/async/873.ce8f2b61.js"
155
162
  ]
156
163
  },
157
164
  "css": {
158
165
  "async": [],
159
166
  "sync": []
160
167
  }
161
- }
168
+ },
169
+ "fallback": ""
162
170
  },
163
171
  {
164
172
  "id": "FlameChart:lodash",
165
173
  "name": "lodash",
166
- "version": "4.17.23",
174
+ "version": "4.18.1",
167
175
  "singleton": true,
168
- "requiredVersion": "^4.17.23",
176
+ "requiredVersion": "^4.18.1",
169
177
  "assets": {
170
178
  "js": {
171
179
  "async": [],
172
180
  "sync": [
173
- "__mf/js/async/392.37cbcda7.js"
181
+ "__mf/js/async/392.99054453.js"
174
182
  ]
175
183
  },
176
184
  "css": {
177
185
  "async": [],
178
186
  "sync": []
179
187
  }
180
- }
188
+ },
189
+ "fallback": ""
181
190
  },
182
191
  {
183
192
  "id": "FlameChart:react-dom",
@@ -189,14 +198,15 @@
189
198
  "js": {
190
199
  "async": [],
191
200
  "sync": [
192
- "__mf/js/async/470.5cb376e5.js"
201
+ "__mf/js/async/470.da9d1391.js"
193
202
  ]
194
203
  },
195
204
  "css": {
196
205
  "async": [],
197
206
  "sync": []
198
207
  }
199
- }
208
+ },
209
+ "fallback": ""
200
210
  },
201
211
  {
202
212
  "id": "FlameChart:react",
@@ -208,14 +218,15 @@
208
218
  "js": {
209
219
  "async": [],
210
220
  "sync": [
211
- "__mf/js/async/121.be1d1245.js"
221
+ "__mf/js/async/121.88f2093e.js"
212
222
  ]
213
223
  },
214
224
  "css": {
215
225
  "async": [],
216
226
  "sync": []
217
227
  }
218
- }
228
+ },
229
+ "fallback": ""
219
230
  },
220
231
  {
221
232
  "id": "FlameChart:date-fns-tz",
@@ -227,14 +238,15 @@
227
238
  "js": {
228
239
  "async": [],
229
240
  "sync": [
230
- "__mf/js/async/978.f02ace81.js"
241
+ "__mf/js/async/978.8f4e0c97.js"
231
242
  ]
232
243
  },
233
244
  "css": {
234
245
  "async": [],
235
246
  "sync": []
236
247
  }
237
- }
248
+ },
249
+ "fallback": ""
238
250
  }
239
251
  ],
240
252
  "remotes": [],
@@ -245,26 +257,26 @@
245
257
  "assets": {
246
258
  "js": {
247
259
  "sync": [
248
- "__mf/js/async/551.70629715.js",
249
- "__mf/js/async/482.9649d5bd.js",
250
- "__mf/js/async/__federation_expose_FlameChart.96f61c46.js"
260
+ "__mf/js/async/469.ff14b116.js",
261
+ "__mf/js/async/857.61f4cbef.js",
262
+ "__mf/js/async/558.feec1d53.js",
263
+ "__mf/js/async/__federation_expose_FlameChart.cebb0677.js"
251
264
  ],
252
265
  "async": [
253
- "__mf/js/async/588.eb7ff066.js",
254
- "__mf/js/async/71.ae38737a.js",
255
- "__mf/js/async/356.e3a2cddf.js",
256
- "__mf/js/async/43.89bbcdef.js",
257
- "__mf/js/async/828.7ba17322.js",
258
- "__mf/js/async/lib-router.2759ca80.js",
259
- "__mf/js/async/177.ff98c714.js",
260
- "__mf/js/async/669.3c4cfa8d.js"
266
+ "__mf/js/async/588.7e3ed6a9.js",
267
+ "__mf/js/async/71.2e51f06a.js",
268
+ "__mf/js/async/356.16afbc55.js",
269
+ "__mf/js/async/43.3e719f33.js",
270
+ "__mf/js/async/798.ad353290.js",
271
+ "__mf/js/async/lib-router.51af2eed.js",
272
+ "__mf/js/async/177.911d34be.js",
273
+ "__mf/js/async/231.dcd12bb9.js"
261
274
  ]
262
275
  },
263
276
  "css": {
264
277
  "sync": [],
265
278
  "async": [
266
- "__mf/css/async/61.d3010b86.css",
267
- "__mf/css/async/669.d3010b86.css"
279
+ "__mf/css/async/120.85c2cbf6.css"
268
280
  ]
269
281
  }
270
282
  },