@openchoreo/backstage-plugin-openchoreo-observability 1.1.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 (196) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +22 -0
  3. package/dist/api/FinOpsAgentApi.esm.js +43 -0
  4. package/dist/api/FinOpsAgentApi.esm.js.map +1 -0
  5. package/dist/api/ObservabilityApi.esm.js +568 -0
  6. package/dist/api/ObservabilityApi.esm.js.map +1 -0
  7. package/dist/api/ObserverUrlCache.esm.js +59 -0
  8. package/dist/api/ObserverUrlCache.esm.js.map +1 -0
  9. package/dist/api/RCAAgentApi.esm.js +104 -0
  10. package/dist/api/RCAAgentApi.esm.js.map +1 -0
  11. package/dist/components/Alerts/AlertRow.esm.js +203 -0
  12. package/dist/components/Alerts/AlertRow.esm.js.map +1 -0
  13. package/dist/components/Alerts/AlertsActions.esm.js +77 -0
  14. package/dist/components/Alerts/AlertsActions.esm.js.map +1 -0
  15. package/dist/components/Alerts/AlertsFilter.esm.js +95 -0
  16. package/dist/components/Alerts/AlertsFilter.esm.js.map +1 -0
  17. package/dist/components/Alerts/AlertsTable.esm.js +63 -0
  18. package/dist/components/Alerts/AlertsTable.esm.js.map +1 -0
  19. package/dist/components/Alerts/ObservabilityAlertsPage.esm.js +251 -0
  20. package/dist/components/Alerts/ObservabilityAlertsPage.esm.js.map +1 -0
  21. package/dist/components/Alerts/types.esm.js +4 -0
  22. package/dist/components/Alerts/types.esm.js.map +1 -0
  23. package/dist/components/CostAnalysis/CostAnalysisPage.esm.js +141 -0
  24. package/dist/components/CostAnalysis/CostAnalysisPage.esm.js.map +1 -0
  25. package/dist/components/CostAnalysis/CostAnalysisReport.esm.js +128 -0
  26. package/dist/components/CostAnalysis/CostAnalysisReport.esm.js.map +1 -0
  27. package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js +517 -0
  28. package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js.map +1 -0
  29. package/dist/components/CostAnalysis/CostAnalysisTable.esm.js +149 -0
  30. package/dist/components/CostAnalysis/CostAnalysisTable.esm.js.map +1 -0
  31. package/dist/components/CostAnalysis/FinOpsApplyButton.esm.js +112 -0
  32. package/dist/components/CostAnalysis/FinOpsApplyButton.esm.js.map +1 -0
  33. package/dist/components/CostAnalysis/index.esm.js +2 -0
  34. package/dist/components/CostAnalysis/index.esm.js.map +1 -0
  35. package/dist/components/Incidents/IncidentRow.esm.js +258 -0
  36. package/dist/components/Incidents/IncidentRow.esm.js.map +1 -0
  37. package/dist/components/Incidents/IncidentsActions.esm.js +77 -0
  38. package/dist/components/Incidents/IncidentsActions.esm.js.map +1 -0
  39. package/dist/components/Incidents/IncidentsFilter.esm.js +144 -0
  40. package/dist/components/Incidents/IncidentsFilter.esm.js.map +1 -0
  41. package/dist/components/Incidents/IncidentsTable.esm.js +68 -0
  42. package/dist/components/Incidents/IncidentsTable.esm.js.map +1 -0
  43. package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js +283 -0
  44. package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js.map +1 -0
  45. package/dist/components/Incidents/types.esm.js +8 -0
  46. package/dist/components/Incidents/types.esm.js.map +1 -0
  47. package/dist/components/Metrics/ChartTooltip.esm.js +53 -0
  48. package/dist/components/Metrics/ChartTooltip.esm.js.map +1 -0
  49. package/dist/components/Metrics/HTTPMetricsSection.esm.js +109 -0
  50. package/dist/components/Metrics/HTTPMetricsSection.esm.js.map +1 -0
  51. package/dist/components/Metrics/MetricGraphByComponent.esm.js +99 -0
  52. package/dist/components/Metrics/MetricGraphByComponent.esm.js.map +1 -0
  53. package/dist/components/Metrics/MetricsActions.esm.js +30 -0
  54. package/dist/components/Metrics/MetricsActions.esm.js.map +1 -0
  55. package/dist/components/Metrics/MetricsFilters.esm.js +49 -0
  56. package/dist/components/Metrics/MetricsFilters.esm.js.map +1 -0
  57. package/dist/components/Metrics/ObservabilityMetricsPage.esm.js +196 -0
  58. package/dist/components/Metrics/ObservabilityMetricsPage.esm.js.map +1 -0
  59. package/dist/components/Metrics/styles.esm.js +55 -0
  60. package/dist/components/Metrics/styles.esm.js.map +1 -0
  61. package/dist/components/Metrics/utils.esm.js +221 -0
  62. package/dist/components/Metrics/utils.esm.js.map +1 -0
  63. package/dist/components/RCA/RCAActions.esm.js +42 -0
  64. package/dist/components/RCA/RCAActions.esm.js.map +1 -0
  65. package/dist/components/RCA/RCAFilters.esm.js +100 -0
  66. package/dist/components/RCA/RCAFilters.esm.js.map +1 -0
  67. package/dist/components/RCA/RCAPage.esm.js +137 -0
  68. package/dist/components/RCA/RCAPage.esm.js.map +1 -0
  69. package/dist/components/RCA/RCAReport/EntityLinkContext.esm.js +9 -0
  70. package/dist/components/RCA/RCAReport/EntityLinkContext.esm.js.map +1 -0
  71. package/dist/components/RCA/RCAReport/FormattedText.esm.js +94 -0
  72. package/dist/components/RCA/RCAReport/FormattedText.esm.js.map +1 -0
  73. package/dist/components/RCA/RCAReport/RCAReportView.esm.js +308 -0
  74. package/dist/components/RCA/RCAReport/RCAReportView.esm.js.map +1 -0
  75. package/dist/components/RCA/RCAReport/sections/AssessmentSection.esm.js +113 -0
  76. package/dist/components/RCA/RCAReport/sections/AssessmentSection.esm.js.map +1 -0
  77. package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js +272 -0
  78. package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js.map +1 -0
  79. package/dist/components/RCA/RCAReport/sections/ExcludedCausesSection.esm.js +48 -0
  80. package/dist/components/RCA/RCAReport/sections/ExcludedCausesSection.esm.js.map +1 -0
  81. package/dist/components/RCA/RCAReport/sections/IncidentOverviewSection.esm.js +205 -0
  82. package/dist/components/RCA/RCAReport/sections/IncidentOverviewSection.esm.js.map +1 -0
  83. package/dist/components/RCA/RCAReport/sections/InvestigationPathSection.esm.js +121 -0
  84. package/dist/components/RCA/RCAReport/sections/InvestigationPathSection.esm.js.map +1 -0
  85. package/dist/components/RCA/RCAReport/sections/PatchTabContent.esm.js +593 -0
  86. package/dist/components/RCA/RCAReport/sections/PatchTabContent.esm.js.map +1 -0
  87. package/dist/components/RCA/RCAReport/sections/QuickFixesPanelSection.esm.js +35 -0
  88. package/dist/components/RCA/RCAReport/sections/QuickFixesPanelSection.esm.js.map +1 -0
  89. package/dist/components/RCA/RCAReport/sections/RecommendationsSection.esm.js +54 -0
  90. package/dist/components/RCA/RCAReport/sections/RecommendationsSection.esm.js.map +1 -0
  91. package/dist/components/RCA/RCAReport/sections/RootCausesSection.esm.js +526 -0
  92. package/dist/components/RCA/RCAReport/sections/RootCausesSection.esm.js.map +1 -0
  93. package/dist/components/RCA/RCAReport/sections/SystemTimelineSection.esm.js +70 -0
  94. package/dist/components/RCA/RCAReport/sections/SystemTimelineSection.esm.js.map +1 -0
  95. package/dist/components/RCA/RCAReport/sections/VisibilityImprovementsSection.esm.js +54 -0
  96. package/dist/components/RCA/RCAReport/sections/VisibilityImprovementsSection.esm.js.map +1 -0
  97. package/dist/components/RCA/RCAReport/styles.esm.js +467 -0
  98. package/dist/components/RCA/RCAReport/styles.esm.js.map +1 -0
  99. package/dist/components/RCA/RCAReport.esm.js +109 -0
  100. package/dist/components/RCA/RCAReport.esm.js.map +1 -0
  101. package/dist/components/RCA/RCATable.esm.js +140 -0
  102. package/dist/components/RCA/RCATable.esm.js.map +1 -0
  103. package/dist/components/RuntimeLogs/LogEntry.esm.js +182 -0
  104. package/dist/components/RuntimeLogs/LogEntry.esm.js.map +1 -0
  105. package/dist/components/RuntimeLogs/LogsActions.esm.js +106 -0
  106. package/dist/components/RuntimeLogs/LogsActions.esm.js.map +1 -0
  107. package/dist/components/RuntimeLogs/LogsFilter.esm.js +200 -0
  108. package/dist/components/RuntimeLogs/LogsFilter.esm.js.map +1 -0
  109. package/dist/components/RuntimeLogs/LogsTable.esm.js +91 -0
  110. package/dist/components/RuntimeLogs/LogsTable.esm.js.map +1 -0
  111. package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js +220 -0
  112. package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js.map +1 -0
  113. package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js +222 -0
  114. package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js.map +1 -0
  115. package/dist/components/RuntimeLogs/styles.esm.js +256 -0
  116. package/dist/components/RuntimeLogs/styles.esm.js.map +1 -0
  117. package/dist/components/RuntimeLogs/types.esm.js +16 -0
  118. package/dist/components/RuntimeLogs/types.esm.js.map +1 -0
  119. package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js +280 -0
  120. package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js.map +1 -0
  121. package/dist/components/Traces/ObservabilityTracesPage.esm.js +165 -0
  122. package/dist/components/Traces/ObservabilityTracesPage.esm.js.map +1 -0
  123. package/dist/components/Traces/TracesActions.esm.js +37 -0
  124. package/dist/components/Traces/TracesActions.esm.js.map +1 -0
  125. package/dist/components/Traces/TracesFilters.esm.js +121 -0
  126. package/dist/components/Traces/TracesFilters.esm.js.map +1 -0
  127. package/dist/components/Traces/TracesTable.esm.js +137 -0
  128. package/dist/components/Traces/TracesTable.esm.js.map +1 -0
  129. package/dist/components/Traces/WaterfallView.esm.js +567 -0
  130. package/dist/components/Traces/WaterfallView.esm.js.map +1 -0
  131. package/dist/components/Traces/styles.esm.js +198 -0
  132. package/dist/components/Traces/styles.esm.js.map +1 -0
  133. package/dist/components/Traces/utils.esm.js +19 -0
  134. package/dist/components/Traces/utils.esm.js.map +1 -0
  135. package/dist/hooks/useAutoSelectFirstEnvironment.esm.js +25 -0
  136. package/dist/hooks/useAutoSelectFirstEnvironment.esm.js.map +1 -0
  137. package/dist/hooks/useComponentAlerts.esm.js +80 -0
  138. package/dist/hooks/useComponentAlerts.esm.js.map +1 -0
  139. package/dist/hooks/useDataPlaneNetPolProvider.esm.js +55 -0
  140. package/dist/hooks/useDataPlaneNetPolProvider.esm.js.map +1 -0
  141. package/dist/hooks/useDebouncedSearch.esm.js +24 -0
  142. package/dist/hooks/useDebouncedSearch.esm.js.map +1 -0
  143. package/dist/hooks/useFilters.esm.js +29 -0
  144. package/dist/hooks/useFilters.esm.js.map +1 -0
  145. package/dist/hooks/useFinOpsReport.esm.js +66 -0
  146. package/dist/hooks/useFinOpsReport.esm.js.map +1 -0
  147. package/dist/hooks/useFinOpsReports.esm.js +70 -0
  148. package/dist/hooks/useFinOpsReports.esm.js.map +1 -0
  149. package/dist/hooks/useGetComponentsByProject.esm.js +57 -0
  150. package/dist/hooks/useGetComponentsByProject.esm.js.map +1 -0
  151. package/dist/hooks/useGetEnvironmentsByNamespace.esm.js +53 -0
  152. package/dist/hooks/useGetEnvironmentsByNamespace.esm.js.map +1 -0
  153. package/dist/hooks/useGetNamespaceAndProjectByEntity.esm.js +40 -0
  154. package/dist/hooks/useGetNamespaceAndProjectByEntity.esm.js.map +1 -0
  155. package/dist/hooks/useMetrics.esm.js +107 -0
  156. package/dist/hooks/useMetrics.esm.js.map +1 -0
  157. package/dist/hooks/useProjectIncidents.esm.js +111 -0
  158. package/dist/hooks/useProjectIncidents.esm.js.map +1 -0
  159. package/dist/hooks/useProjectRuntimeLogs.esm.js +185 -0
  160. package/dist/hooks/useProjectRuntimeLogs.esm.js.map +1 -0
  161. package/dist/hooks/useRCAReportByAlert.esm.js +54 -0
  162. package/dist/hooks/useRCAReportByAlert.esm.js.map +1 -0
  163. package/dist/hooks/useRCAReports.esm.js +75 -0
  164. package/dist/hooks/useRCAReports.esm.js.map +1 -0
  165. package/dist/hooks/useRuntimeLogs.esm.js +147 -0
  166. package/dist/hooks/useRuntimeLogs.esm.js.map +1 -0
  167. package/dist/hooks/useSpanDetails.esm.js +71 -0
  168. package/dist/hooks/useSpanDetails.esm.js.map +1 -0
  169. package/dist/hooks/useTraceSpans.esm.js +80 -0
  170. package/dist/hooks/useTraceSpans.esm.js.map +1 -0
  171. package/dist/hooks/useTraces.esm.js +112 -0
  172. package/dist/hooks/useTraces.esm.js.map +1 -0
  173. package/dist/hooks/useUpdateIncident.esm.js +50 -0
  174. package/dist/hooks/useUpdateIncident.esm.js.map +1 -0
  175. package/dist/hooks/useUrlFilters.esm.js +63 -0
  176. package/dist/hooks/useUrlFilters.esm.js.map +1 -0
  177. package/dist/hooks/useUrlFiltersForAlerts.esm.js +80 -0
  178. package/dist/hooks/useUrlFiltersForAlerts.esm.js.map +1 -0
  179. package/dist/hooks/useUrlFiltersForIncidents.esm.js +87 -0
  180. package/dist/hooks/useUrlFiltersForIncidents.esm.js.map +1 -0
  181. package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js +135 -0
  182. package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js.map +1 -0
  183. package/dist/index.d.ts +41 -0
  184. package/dist/index.esm.js +2 -0
  185. package/dist/index.esm.js.map +1 -0
  186. package/dist/plugin.esm.js +107 -0
  187. package/dist/plugin.esm.js.map +1 -0
  188. package/dist/routes.esm.js +8 -0
  189. package/dist/routes.esm.js.map +1 -0
  190. package/dist/types.esm.js +18 -0
  191. package/dist/types.esm.js.map +1 -0
  192. package/dist/utils/applyResourceChange.esm.js +79 -0
  193. package/dist/utils/applyResourceChange.esm.js.map +1 -0
  194. package/dist/utils/urlTimeRange.esm.js +52 -0
  195. package/dist/utils/urlTimeRange.esm.js.map +1 -0
  196. package/package.json +81 -0
@@ -0,0 +1,121 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Grid, TextField, FormControl, InputLabel, Select, MenuItem, Checkbox } from '@material-ui/core';
3
+ import { Skeleton } from '@material-ui/lab';
4
+ import { TimeRangeFilter } from '../TimeRangeFilter/TimeRangeFilter.esm.js';
5
+ import { useDebouncedSearch } from '../../hooks/useDebouncedSearch.esm.js';
6
+
7
+ const TracesFilters = ({
8
+ filters,
9
+ onFiltersChange,
10
+ environments,
11
+ environmentsLoading,
12
+ components,
13
+ componentsLoading,
14
+ disabled = false
15
+ }) => {
16
+ const [searchInput, handleSearchChange] = useDebouncedSearch(
17
+ filters.searchQuery,
18
+ (value) => onFiltersChange({ searchQuery: value }),
19
+ 500
20
+ );
21
+ const handleEnvironmentChange = (event) => {
22
+ const selectedEnvironment = environments.find(
23
+ (env) => env.uid === event.target.value
24
+ );
25
+ if (selectedEnvironment) {
26
+ onFiltersChange({ environment: selectedEnvironment });
27
+ }
28
+ };
29
+ const handleComponentChange = (event) => {
30
+ const value = event.target.value;
31
+ onFiltersChange({ components: value });
32
+ };
33
+ return /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
34
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 3, children: /* @__PURE__ */ jsx(
35
+ TextField,
36
+ {
37
+ fullWidth: true,
38
+ label: "Search Trace ID",
39
+ variant: "outlined",
40
+ value: searchInput,
41
+ onChange: handleSearchChange,
42
+ placeholder: "Enter Trace ID to search",
43
+ disabled
44
+ }
45
+ ) }),
46
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 3, children: /* @__PURE__ */ jsxs(
47
+ FormControl,
48
+ {
49
+ fullWidth: true,
50
+ disabled: disabled || componentsLoading,
51
+ variant: "outlined",
52
+ children: [
53
+ /* @__PURE__ */ jsx(InputLabel, { id: "components-label", children: "Components" }),
54
+ componentsLoading ? /* @__PURE__ */ jsx(Skeleton, { variant: "rect", height: 56 }) : /* @__PURE__ */ jsx(
55
+ Select,
56
+ {
57
+ multiple: true,
58
+ value: filters.components || [],
59
+ onChange: handleComponentChange,
60
+ labelId: "components-label",
61
+ label: "Component",
62
+ renderValue: (selected) => {
63
+ const selectedArray = selected;
64
+ if (selectedArray.length === 0) return "All";
65
+ return selectedArray.map((id) => {
66
+ const comp = components.find((c) => c.name === id);
67
+ return comp?.displayName || comp?.name || id;
68
+ }).join(", ");
69
+ },
70
+ children: components.map((component) => {
71
+ return /* @__PURE__ */ jsxs(MenuItem, { value: component.name, children: [
72
+ /* @__PURE__ */ jsx(
73
+ Checkbox,
74
+ {
75
+ checked: (filters.components || []).indexOf(component.name) > -1
76
+ }
77
+ ),
78
+ component.displayName || component.name
79
+ ] }, component.name);
80
+ })
81
+ }
82
+ )
83
+ ]
84
+ }
85
+ ) }),
86
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 3, children: /* @__PURE__ */ jsxs(
87
+ FormControl,
88
+ {
89
+ fullWidth: true,
90
+ disabled: disabled || environmentsLoading,
91
+ variant: "outlined",
92
+ children: [
93
+ /* @__PURE__ */ jsx(InputLabel, { id: "environment-label", children: "Environment" }),
94
+ environmentsLoading ? /* @__PURE__ */ jsx(Skeleton, { variant: "rect", height: 56 }) : /* @__PURE__ */ jsx(
95
+ Select,
96
+ {
97
+ value: filters.environment?.uid || "",
98
+ onChange: handleEnvironmentChange,
99
+ labelId: "environment-label",
100
+ label: "Environment",
101
+ children: environments.map((env) => /* @__PURE__ */ jsx(MenuItem, { value: env.uid || env.name, children: env.displayName || env.name }, env.uid || env.name))
102
+ }
103
+ )
104
+ ]
105
+ }
106
+ ) }),
107
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 3, children: /* @__PURE__ */ jsx(
108
+ TimeRangeFilter,
109
+ {
110
+ value: filters.timeRange,
111
+ customStartTime: filters.customStartTime,
112
+ customEndTime: filters.customEndTime,
113
+ onChange: onFiltersChange,
114
+ disabled
115
+ }
116
+ ) })
117
+ ] });
118
+ };
119
+
120
+ export { TracesFilters };
121
+ //# sourceMappingURL=TracesFilters.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TracesFilters.esm.js","sources":["../../../src/components/Traces/TracesFilters.tsx"],"sourcesContent":["import { FC, ChangeEvent } from 'react';\nimport {\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Grid,\n TextField,\n Checkbox,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport { type Environment, Filters } from '../../types';\nimport { TimeRangeFilter } from '../TimeRangeFilter';\nimport { Component } from '../../hooks/useGetComponentsByProject';\nimport { useDebouncedSearch } from '../../hooks/useDebouncedSearch';\n\ninterface TracesFiltersProps {\n filters: Filters;\n onFiltersChange: (filters: Partial<Filters>) => void;\n environments: Environment[];\n environmentsLoading: boolean;\n components: Component[];\n componentsLoading: boolean;\n disabled?: boolean;\n}\n\nexport const TracesFilters: FC<TracesFiltersProps> = ({\n filters,\n onFiltersChange,\n environments,\n environmentsLoading,\n components,\n componentsLoading,\n disabled = false,\n}) => {\n const [searchInput, handleSearchChange] = useDebouncedSearch(\n filters.searchQuery,\n value => onFiltersChange({ searchQuery: value }),\n 500,\n );\n\n const handleEnvironmentChange = (event: ChangeEvent<{ value: unknown }>) => {\n const selectedEnvironment = environments.find(\n env => env.uid === (event.target.value as string),\n );\n if (selectedEnvironment) {\n onFiltersChange({ environment: selectedEnvironment });\n }\n };\n\n const handleComponentChange = (event: ChangeEvent<{ value: unknown }>) => {\n const value = event.target.value as string[];\n onFiltersChange({ components: value });\n };\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12} md={3}>\n <TextField\n fullWidth\n label=\"Search Trace ID\"\n variant=\"outlined\"\n value={searchInput}\n onChange={handleSearchChange}\n placeholder=\"Enter Trace ID to search\"\n disabled={disabled}\n />\n </Grid>\n\n <Grid item xs={12} md={3}>\n <FormControl\n fullWidth\n disabled={disabled || componentsLoading}\n variant=\"outlined\"\n >\n <InputLabel id=\"components-label\">Components</InputLabel>\n {componentsLoading ? (\n <Skeleton variant=\"rect\" height={56} />\n ) : (\n <Select\n multiple\n value={filters.components || []}\n onChange={handleComponentChange}\n labelId=\"components-label\"\n label=\"Component\"\n renderValue={selected => {\n const selectedArray = selected as string[];\n if (selectedArray.length === 0) return 'All';\n return selectedArray\n .map(id => {\n const comp = components.find(c => c.name === id);\n return comp?.displayName || comp?.name || id;\n })\n .join(', ');\n }}\n >\n {components.map(component => {\n return (\n <MenuItem key={component.name} value={component.name}>\n <Checkbox\n checked={\n (filters.components || []).indexOf(component.name) > -1\n }\n />\n {component.displayName || component.name}\n </MenuItem>\n );\n })}\n </Select>\n )}\n </FormControl>\n </Grid>\n\n <Grid item xs={12} md={3}>\n <FormControl\n fullWidth\n disabled={disabled || environmentsLoading}\n variant=\"outlined\"\n >\n <InputLabel id=\"environment-label\">Environment</InputLabel>\n {environmentsLoading ? (\n <Skeleton variant=\"rect\" height={56} />\n ) : (\n <Select\n value={filters.environment?.uid || ''}\n onChange={handleEnvironmentChange}\n labelId=\"environment-label\"\n label=\"Environment\"\n >\n {environments.map((env: Environment) => (\n <MenuItem key={env.uid || env.name} value={env.uid || env.name}>\n {env.displayName || env.name}\n </MenuItem>\n ))}\n </Select>\n )}\n </FormControl>\n </Grid>\n\n <Grid item xs={12} md={3}>\n <TimeRangeFilter\n value={filters.timeRange}\n customStartTime={filters.customStartTime}\n customEndTime={filters.customEndTime}\n onChange={onFiltersChange}\n disabled={disabled}\n />\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState, Fragment } from 'react';
3
+ import { Paper, Box, Table, TableHead, TableRow, TableCell, TableBody, Tooltip, IconButton, CircularProgress, Typography } from '@material-ui/core';
4
+ import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
5
+ import ExpandLessIcon from '@material-ui/icons/ExpandLess';
6
+ import { WaterfallView } from './WaterfallView.esm.js';
7
+ import { useTracesTableStyles } from './styles.esm.js';
8
+ import { formatDuration } from './utils.esm.js';
9
+
10
+ const TracesTable = ({
11
+ traces,
12
+ traceSpans,
13
+ spanDetails,
14
+ loading = false
15
+ }) => {
16
+ const classes = useTracesTableStyles();
17
+ const [expandedRows, setExpandedRows] = useState(/* @__PURE__ */ new Set());
18
+ const toggleRowExpansion = (traceId) => {
19
+ const newExpanded = new Set(expandedRows);
20
+ if (newExpanded.has(traceId)) {
21
+ newExpanded.delete(traceId);
22
+ } else {
23
+ newExpanded.add(traceId);
24
+ traceSpans.fetchSpans(traceId);
25
+ }
26
+ setExpandedRows(newExpanded);
27
+ };
28
+ const renderEmptyState = () => {
29
+ if (loading) {
30
+ return null;
31
+ }
32
+ return /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 6, children: /* @__PURE__ */ jsxs(Box, { className: classes.emptyState, children: [
33
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", gutterBottom: true, children: "No traces found" }),
34
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Try adjusting your filters or time range to see more traces." })
35
+ ] }) }) });
36
+ };
37
+ return /* @__PURE__ */ jsx(Paper, { className: classes.tablePaper, children: /* @__PURE__ */ jsx(Box, { className: classes.tableContainer, children: /* @__PURE__ */ jsxs(Table, { className: classes.table, "aria-label": "traces table", stickyHeader: true, children: [
38
+ /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
39
+ /* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, width: "12%", children: "Trace Name" }),
40
+ /* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, width: "20%", children: "Start Time" }),
41
+ /* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, width: "20%", children: "End Time" }),
42
+ /* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, width: "12%", children: "Duration" }),
43
+ /* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, width: "12%", children: "Number of Spans" }),
44
+ /* @__PURE__ */ jsx(
45
+ TableCell,
46
+ {
47
+ className: classes.headerCell,
48
+ width: "12%",
49
+ align: "right",
50
+ children: "Details"
51
+ }
52
+ )
53
+ ] }) }),
54
+ /* @__PURE__ */ jsxs(TableBody, { children: [
55
+ traces.length === 0 && !loading && renderEmptyState(),
56
+ traces.map((trace) => {
57
+ const isExpanded = expandedRows.has(trace.traceId);
58
+ const spans = traceSpans.getSpans(trace.traceId);
59
+ const spansLoading = traceSpans.isLoading(trace.traceId);
60
+ const spansError = traceSpans.getError(trace.traceId);
61
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
62
+ /* @__PURE__ */ jsxs(
63
+ TableRow,
64
+ {
65
+ className: `${classes.traceRow} ${isExpanded ? classes.expandedRow : ""} ${trace.hasErrors ? classes.errorRow : ""}`,
66
+ onClick: () => toggleRowExpansion(trace.traceId),
67
+ children: [
68
+ /* @__PURE__ */ jsxs(
69
+ TableCell,
70
+ {
71
+ component: "th",
72
+ scope: "row",
73
+ width: "12%",
74
+ className: classes.traceIdCell,
75
+ children: [
76
+ trace.hasErrors && /* @__PURE__ */ jsx(Tooltip, { title: "This trace contains errors", arrow: true, children: /* @__PURE__ */ jsx(
77
+ "span",
78
+ {
79
+ className: classes.errorStripe,
80
+ role: "presentation"
81
+ }
82
+ ) }),
83
+ /* @__PURE__ */ jsx(Tooltip, { title: trace.traceId, children: /* @__PURE__ */ jsx("span", { children: trace.traceName || `${trace.traceId.slice(0, 8)}...` }) })
84
+ ]
85
+ }
86
+ ),
87
+ /* @__PURE__ */ jsx(TableCell, { width: "20%", className: classes.traceCell, children: trace.startTime }),
88
+ /* @__PURE__ */ jsx(TableCell, { width: "20%", className: classes.traceCell, children: trace.endTime }),
89
+ /* @__PURE__ */ jsx(TableCell, { width: "12%", className: classes.traceCell, children: formatDuration(trace.durationNs) }),
90
+ /* @__PURE__ */ jsx(TableCell, { width: "12%", className: classes.traceCell, children: trace.spanCount }),
91
+ /* @__PURE__ */ jsx(TableCell, { width: "12%", align: "right", children: /* @__PURE__ */ jsx(
92
+ IconButton,
93
+ {
94
+ size: "small",
95
+ onClick: (e) => {
96
+ e.stopPropagation();
97
+ toggleRowExpansion(trace.traceId);
98
+ },
99
+ className: classes.expandIcon,
100
+ children: isExpanded ? /* @__PURE__ */ jsx(ExpandLessIcon, {}) : /* @__PURE__ */ jsx(ExpandMoreIcon, {})
101
+ }
102
+ ) })
103
+ ]
104
+ }
105
+ ),
106
+ isExpanded && /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsxs(TableCell, { colSpan: 6, style: { padding: 0 }, children: [
107
+ spansLoading && /* @__PURE__ */ jsx(
108
+ Box,
109
+ {
110
+ display: "flex",
111
+ justifyContent: "center",
112
+ alignItems: "center",
113
+ p: 2,
114
+ children: /* @__PURE__ */ jsx(CircularProgress, { size: 24 })
115
+ }
116
+ ),
117
+ spansError && /* @__PURE__ */ jsx(Box, { p: 2, children: /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "error", children: [
118
+ "Failed to load spans: ",
119
+ spansError
120
+ ] }) }),
121
+ !spansLoading && !spansError && spans && /* @__PURE__ */ jsx(
122
+ WaterfallView,
123
+ {
124
+ traceId: trace.traceId,
125
+ spans,
126
+ spanDetails
127
+ }
128
+ )
129
+ ] }) })
130
+ ] }, trace.traceId);
131
+ })
132
+ ] })
133
+ ] }) }) });
134
+ };
135
+
136
+ export { TracesTable };
137
+ //# sourceMappingURL=TracesTable.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TracesTable.esm.js","sources":["../../../src/components/Traces/TracesTable.tsx"],"sourcesContent":["import { FC, useState, Fragment } from 'react';\nimport {\n Table,\n TableHead,\n TableBody,\n TableRow,\n TableCell,\n Paper,\n IconButton,\n Tooltip,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport { WaterfallView } from './WaterfallView';\nimport { useTracesTableStyles } from './styles';\nimport { Trace, Span, SpanDetails } from '../../types';\nimport { formatDuration } from './utils';\n\ninterface TraceSpansHook {\n fetchSpans: (traceId: string) => Promise<void>;\n getSpans: (traceId: string) => Span[] | undefined;\n isLoading: (traceId: string) => boolean;\n getError: (traceId: string) => string | undefined;\n}\n\ninterface SpanDetailsHook {\n fetchSpanDetails: (traceId: string, spanId: string) => Promise<void>;\n getDetails: (traceId: string, spanId: string) => SpanDetails | undefined;\n isLoading: (traceId: string, spanId: string) => boolean;\n getError: (traceId: string, spanId: string) => string | undefined;\n}\n\ninterface TracesTableProps {\n traces: Trace[];\n traceSpans: TraceSpansHook;\n spanDetails: SpanDetailsHook;\n loading?: boolean;\n}\n\nexport const TracesTable: FC<TracesTableProps> = ({\n traces,\n traceSpans,\n spanDetails,\n loading = false,\n}) => {\n const classes = useTracesTableStyles();\n const [expandedRows, setExpandedRows] = useState<Set<string>>(new Set());\n\n const toggleRowExpansion = (traceId: string) => {\n const newExpanded = new Set(expandedRows);\n if (newExpanded.has(traceId)) {\n newExpanded.delete(traceId);\n } else {\n newExpanded.add(traceId);\n // Trigger on-demand span fetch when expanding\n traceSpans.fetchSpans(traceId);\n }\n setExpandedRows(newExpanded);\n };\n\n const renderEmptyState = () => {\n if (loading) {\n return null;\n }\n\n return (\n <TableRow>\n <TableCell colSpan={6}>\n <Box className={classes.emptyState}>\n <Typography variant=\"h6\" gutterBottom>\n No traces found\n </Typography>\n <Typography variant=\"body2\">\n Try adjusting your filters or time range to see more traces.\n </Typography>\n </Box>\n </TableCell>\n </TableRow>\n );\n };\n\n return (\n <Paper className={classes.tablePaper}>\n <Box className={classes.tableContainer}>\n <Table className={classes.table} aria-label=\"traces table\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell className={classes.headerCell} width=\"12%\">\n Trace Name\n </TableCell>\n <TableCell className={classes.headerCell} width=\"20%\">\n Start Time\n </TableCell>\n <TableCell className={classes.headerCell} width=\"20%\">\n End Time\n </TableCell>\n <TableCell className={classes.headerCell} width=\"12%\">\n Duration\n </TableCell>\n <TableCell className={classes.headerCell} width=\"12%\">\n Number of Spans\n </TableCell>\n <TableCell\n className={classes.headerCell}\n width=\"12%\"\n align=\"right\"\n >\n Details\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {traces.length === 0 && !loading && renderEmptyState()}\n\n {traces.map(trace => {\n const isExpanded = expandedRows.has(trace.traceId);\n const spans = traceSpans.getSpans(trace.traceId);\n const spansLoading = traceSpans.isLoading(trace.traceId);\n const spansError = traceSpans.getError(trace.traceId);\n\n return (\n <Fragment key={trace.traceId}>\n <TableRow\n className={`${classes.traceRow} ${\n isExpanded ? classes.expandedRow : ''\n } ${trace.hasErrors ? classes.errorRow : ''}`}\n onClick={() => toggleRowExpansion(trace.traceId)}\n >\n <TableCell\n component=\"th\"\n scope=\"row\"\n width=\"12%\"\n className={classes.traceIdCell}\n >\n {trace.hasErrors && (\n <Tooltip title=\"This trace contains errors\" arrow>\n <span\n className={classes.errorStripe}\n role=\"presentation\"\n />\n </Tooltip>\n )}\n <Tooltip title={trace.traceId}>\n <span>\n {trace.traceName || `${trace.traceId.slice(0, 8)}...`}\n </span>\n </Tooltip>\n </TableCell>\n <TableCell width=\"20%\" className={classes.traceCell}>\n {trace.startTime}\n </TableCell>\n <TableCell width=\"20%\" className={classes.traceCell}>\n {trace.endTime}\n </TableCell>\n <TableCell width=\"12%\" className={classes.traceCell}>\n {formatDuration(trace.durationNs)}\n </TableCell>\n <TableCell width=\"12%\" className={classes.traceCell}>\n {trace.spanCount}\n </TableCell>\n <TableCell width=\"12%\" align=\"right\">\n <IconButton\n size=\"small\"\n onClick={e => {\n e.stopPropagation();\n toggleRowExpansion(trace.traceId);\n }}\n className={classes.expandIcon}\n >\n {isExpanded ? <ExpandLessIcon /> : <ExpandMoreIcon />}\n </IconButton>\n </TableCell>\n </TableRow>\n\n {isExpanded && (\n <TableRow>\n <TableCell colSpan={6} style={{ padding: 0 }}>\n {spansLoading && (\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n p={2}\n >\n <CircularProgress size={24} />\n </Box>\n )}\n {spansError && (\n <Box p={2}>\n <Typography variant=\"body2\" color=\"error\">\n Failed to load spans: {spansError}\n </Typography>\n </Box>\n )}\n {!spansLoading && !spansError && spans && (\n <WaterfallView\n traceId={trace.traceId}\n spans={spans}\n spanDetails={spanDetails}\n />\n )}\n </TableCell>\n </TableRow>\n )}\n </Fragment>\n );\n })}\n </TableBody>\n </Table>\n </Box>\n </Paper>\n );\n};\n"],"names":[],"mappings":"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"}