@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.
- package/CHANGELOG.md +5 -0
- package/README.md +22 -0
- package/dist/api/FinOpsAgentApi.esm.js +43 -0
- package/dist/api/FinOpsAgentApi.esm.js.map +1 -0
- package/dist/api/ObservabilityApi.esm.js +568 -0
- package/dist/api/ObservabilityApi.esm.js.map +1 -0
- package/dist/api/ObserverUrlCache.esm.js +59 -0
- package/dist/api/ObserverUrlCache.esm.js.map +1 -0
- package/dist/api/RCAAgentApi.esm.js +104 -0
- package/dist/api/RCAAgentApi.esm.js.map +1 -0
- package/dist/components/Alerts/AlertRow.esm.js +203 -0
- package/dist/components/Alerts/AlertRow.esm.js.map +1 -0
- package/dist/components/Alerts/AlertsActions.esm.js +77 -0
- package/dist/components/Alerts/AlertsActions.esm.js.map +1 -0
- package/dist/components/Alerts/AlertsFilter.esm.js +95 -0
- package/dist/components/Alerts/AlertsFilter.esm.js.map +1 -0
- package/dist/components/Alerts/AlertsTable.esm.js +63 -0
- package/dist/components/Alerts/AlertsTable.esm.js.map +1 -0
- package/dist/components/Alerts/ObservabilityAlertsPage.esm.js +251 -0
- package/dist/components/Alerts/ObservabilityAlertsPage.esm.js.map +1 -0
- package/dist/components/Alerts/types.esm.js +4 -0
- package/dist/components/Alerts/types.esm.js.map +1 -0
- package/dist/components/CostAnalysis/CostAnalysisPage.esm.js +141 -0
- package/dist/components/CostAnalysis/CostAnalysisPage.esm.js.map +1 -0
- package/dist/components/CostAnalysis/CostAnalysisReport.esm.js +128 -0
- package/dist/components/CostAnalysis/CostAnalysisReport.esm.js.map +1 -0
- package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js +517 -0
- package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js.map +1 -0
- package/dist/components/CostAnalysis/CostAnalysisTable.esm.js +149 -0
- package/dist/components/CostAnalysis/CostAnalysisTable.esm.js.map +1 -0
- package/dist/components/CostAnalysis/FinOpsApplyButton.esm.js +112 -0
- package/dist/components/CostAnalysis/FinOpsApplyButton.esm.js.map +1 -0
- package/dist/components/CostAnalysis/index.esm.js +2 -0
- package/dist/components/CostAnalysis/index.esm.js.map +1 -0
- package/dist/components/Incidents/IncidentRow.esm.js +258 -0
- package/dist/components/Incidents/IncidentRow.esm.js.map +1 -0
- package/dist/components/Incidents/IncidentsActions.esm.js +77 -0
- package/dist/components/Incidents/IncidentsActions.esm.js.map +1 -0
- package/dist/components/Incidents/IncidentsFilter.esm.js +144 -0
- package/dist/components/Incidents/IncidentsFilter.esm.js.map +1 -0
- package/dist/components/Incidents/IncidentsTable.esm.js +68 -0
- package/dist/components/Incidents/IncidentsTable.esm.js.map +1 -0
- package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js +283 -0
- package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js.map +1 -0
- package/dist/components/Incidents/types.esm.js +8 -0
- package/dist/components/Incidents/types.esm.js.map +1 -0
- package/dist/components/Metrics/ChartTooltip.esm.js +53 -0
- package/dist/components/Metrics/ChartTooltip.esm.js.map +1 -0
- package/dist/components/Metrics/HTTPMetricsSection.esm.js +109 -0
- package/dist/components/Metrics/HTTPMetricsSection.esm.js.map +1 -0
- package/dist/components/Metrics/MetricGraphByComponent.esm.js +99 -0
- package/dist/components/Metrics/MetricGraphByComponent.esm.js.map +1 -0
- package/dist/components/Metrics/MetricsActions.esm.js +30 -0
- package/dist/components/Metrics/MetricsActions.esm.js.map +1 -0
- package/dist/components/Metrics/MetricsFilters.esm.js +49 -0
- package/dist/components/Metrics/MetricsFilters.esm.js.map +1 -0
- package/dist/components/Metrics/ObservabilityMetricsPage.esm.js +196 -0
- package/dist/components/Metrics/ObservabilityMetricsPage.esm.js.map +1 -0
- package/dist/components/Metrics/styles.esm.js +55 -0
- package/dist/components/Metrics/styles.esm.js.map +1 -0
- package/dist/components/Metrics/utils.esm.js +221 -0
- package/dist/components/Metrics/utils.esm.js.map +1 -0
- package/dist/components/RCA/RCAActions.esm.js +42 -0
- package/dist/components/RCA/RCAActions.esm.js.map +1 -0
- package/dist/components/RCA/RCAFilters.esm.js +100 -0
- package/dist/components/RCA/RCAFilters.esm.js.map +1 -0
- package/dist/components/RCA/RCAPage.esm.js +137 -0
- package/dist/components/RCA/RCAPage.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/EntityLinkContext.esm.js +9 -0
- package/dist/components/RCA/RCAReport/EntityLinkContext.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/FormattedText.esm.js +94 -0
- package/dist/components/RCA/RCAReport/FormattedText.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/RCAReportView.esm.js +308 -0
- package/dist/components/RCA/RCAReport/RCAReportView.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/AssessmentSection.esm.js +113 -0
- package/dist/components/RCA/RCAReport/sections/AssessmentSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js +272 -0
- package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/ExcludedCausesSection.esm.js +48 -0
- package/dist/components/RCA/RCAReport/sections/ExcludedCausesSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/IncidentOverviewSection.esm.js +205 -0
- package/dist/components/RCA/RCAReport/sections/IncidentOverviewSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/InvestigationPathSection.esm.js +121 -0
- package/dist/components/RCA/RCAReport/sections/InvestigationPathSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/PatchTabContent.esm.js +593 -0
- package/dist/components/RCA/RCAReport/sections/PatchTabContent.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/QuickFixesPanelSection.esm.js +35 -0
- package/dist/components/RCA/RCAReport/sections/QuickFixesPanelSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/RecommendationsSection.esm.js +54 -0
- package/dist/components/RCA/RCAReport/sections/RecommendationsSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/RootCausesSection.esm.js +526 -0
- package/dist/components/RCA/RCAReport/sections/RootCausesSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/SystemTimelineSection.esm.js +70 -0
- package/dist/components/RCA/RCAReport/sections/SystemTimelineSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/VisibilityImprovementsSection.esm.js +54 -0
- package/dist/components/RCA/RCAReport/sections/VisibilityImprovementsSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/styles.esm.js +467 -0
- package/dist/components/RCA/RCAReport/styles.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport.esm.js +109 -0
- package/dist/components/RCA/RCAReport.esm.js.map +1 -0
- package/dist/components/RCA/RCATable.esm.js +140 -0
- package/dist/components/RCA/RCATable.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogEntry.esm.js +182 -0
- package/dist/components/RuntimeLogs/LogEntry.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogsActions.esm.js +106 -0
- package/dist/components/RuntimeLogs/LogsActions.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogsFilter.esm.js +200 -0
- package/dist/components/RuntimeLogs/LogsFilter.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogsTable.esm.js +91 -0
- package/dist/components/RuntimeLogs/LogsTable.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js +220 -0
- package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js +222 -0
- package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/styles.esm.js +256 -0
- package/dist/components/RuntimeLogs/styles.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/types.esm.js +16 -0
- package/dist/components/RuntimeLogs/types.esm.js.map +1 -0
- package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js +280 -0
- package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js.map +1 -0
- package/dist/components/Traces/ObservabilityTracesPage.esm.js +165 -0
- package/dist/components/Traces/ObservabilityTracesPage.esm.js.map +1 -0
- package/dist/components/Traces/TracesActions.esm.js +37 -0
- package/dist/components/Traces/TracesActions.esm.js.map +1 -0
- package/dist/components/Traces/TracesFilters.esm.js +121 -0
- package/dist/components/Traces/TracesFilters.esm.js.map +1 -0
- package/dist/components/Traces/TracesTable.esm.js +137 -0
- package/dist/components/Traces/TracesTable.esm.js.map +1 -0
- package/dist/components/Traces/WaterfallView.esm.js +567 -0
- package/dist/components/Traces/WaterfallView.esm.js.map +1 -0
- package/dist/components/Traces/styles.esm.js +198 -0
- package/dist/components/Traces/styles.esm.js.map +1 -0
- package/dist/components/Traces/utils.esm.js +19 -0
- package/dist/components/Traces/utils.esm.js.map +1 -0
- package/dist/hooks/useAutoSelectFirstEnvironment.esm.js +25 -0
- package/dist/hooks/useAutoSelectFirstEnvironment.esm.js.map +1 -0
- package/dist/hooks/useComponentAlerts.esm.js +80 -0
- package/dist/hooks/useComponentAlerts.esm.js.map +1 -0
- package/dist/hooks/useDataPlaneNetPolProvider.esm.js +55 -0
- package/dist/hooks/useDataPlaneNetPolProvider.esm.js.map +1 -0
- package/dist/hooks/useDebouncedSearch.esm.js +24 -0
- package/dist/hooks/useDebouncedSearch.esm.js.map +1 -0
- package/dist/hooks/useFilters.esm.js +29 -0
- package/dist/hooks/useFilters.esm.js.map +1 -0
- package/dist/hooks/useFinOpsReport.esm.js +66 -0
- package/dist/hooks/useFinOpsReport.esm.js.map +1 -0
- package/dist/hooks/useFinOpsReports.esm.js +70 -0
- package/dist/hooks/useFinOpsReports.esm.js.map +1 -0
- package/dist/hooks/useGetComponentsByProject.esm.js +57 -0
- package/dist/hooks/useGetComponentsByProject.esm.js.map +1 -0
- package/dist/hooks/useGetEnvironmentsByNamespace.esm.js +53 -0
- package/dist/hooks/useGetEnvironmentsByNamespace.esm.js.map +1 -0
- package/dist/hooks/useGetNamespaceAndProjectByEntity.esm.js +40 -0
- package/dist/hooks/useGetNamespaceAndProjectByEntity.esm.js.map +1 -0
- package/dist/hooks/useMetrics.esm.js +107 -0
- package/dist/hooks/useMetrics.esm.js.map +1 -0
- package/dist/hooks/useProjectIncidents.esm.js +111 -0
- package/dist/hooks/useProjectIncidents.esm.js.map +1 -0
- package/dist/hooks/useProjectRuntimeLogs.esm.js +185 -0
- package/dist/hooks/useProjectRuntimeLogs.esm.js.map +1 -0
- package/dist/hooks/useRCAReportByAlert.esm.js +54 -0
- package/dist/hooks/useRCAReportByAlert.esm.js.map +1 -0
- package/dist/hooks/useRCAReports.esm.js +75 -0
- package/dist/hooks/useRCAReports.esm.js.map +1 -0
- package/dist/hooks/useRuntimeLogs.esm.js +147 -0
- package/dist/hooks/useRuntimeLogs.esm.js.map +1 -0
- package/dist/hooks/useSpanDetails.esm.js +71 -0
- package/dist/hooks/useSpanDetails.esm.js.map +1 -0
- package/dist/hooks/useTraceSpans.esm.js +80 -0
- package/dist/hooks/useTraceSpans.esm.js.map +1 -0
- package/dist/hooks/useTraces.esm.js +112 -0
- package/dist/hooks/useTraces.esm.js.map +1 -0
- package/dist/hooks/useUpdateIncident.esm.js +50 -0
- package/dist/hooks/useUpdateIncident.esm.js.map +1 -0
- package/dist/hooks/useUrlFilters.esm.js +63 -0
- package/dist/hooks/useUrlFilters.esm.js.map +1 -0
- package/dist/hooks/useUrlFiltersForAlerts.esm.js +80 -0
- package/dist/hooks/useUrlFiltersForAlerts.esm.js.map +1 -0
- package/dist/hooks/useUrlFiltersForIncidents.esm.js +87 -0
- package/dist/hooks/useUrlFiltersForIncidents.esm.js.map +1 -0
- package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js +135 -0
- package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/plugin.esm.js +107 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +8 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/types.esm.js +18 -0
- package/dist/types.esm.js.map +1 -0
- package/dist/utils/applyResourceChange.esm.js +79 -0
- package/dist/utils/applyResourceChange.esm.js.map +1 -0
- package/dist/utils/urlTimeRange.esm.js +52 -0
- package/dist/utils/urlTimeRange.esm.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
|
|
2
|
+
import { Fragment, useState } from 'react';
|
|
3
|
+
import { List, ListItem, Divider, Box, Typography, ButtonBase, Collapse } from '@material-ui/core';
|
|
4
|
+
import { makeStyles, alpha } from '@material-ui/core/styles';
|
|
5
|
+
import DescriptionOutlinedIcon from '@material-ui/icons/DescriptionOutlined';
|
|
6
|
+
import ShowChartIcon from '@material-ui/icons/ShowChart';
|
|
7
|
+
import AccountTreeIcon from '@material-ui/icons/AccountTree';
|
|
8
|
+
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
9
|
+
import { FormattedText } from '../FormattedText.esm.js';
|
|
10
|
+
|
|
11
|
+
const useStyles = makeStyles((theme) => ({
|
|
12
|
+
list: {
|
|
13
|
+
padding: 0
|
|
14
|
+
},
|
|
15
|
+
listItem: {
|
|
16
|
+
padding: theme.spacing(1.5, 0),
|
|
17
|
+
display: "block"
|
|
18
|
+
},
|
|
19
|
+
rootCauseHeader: {
|
|
20
|
+
display: "flex",
|
|
21
|
+
justifyContent: "space-between",
|
|
22
|
+
alignItems: "flex-start",
|
|
23
|
+
gap: theme.spacing(2),
|
|
24
|
+
marginBottom: theme.spacing(1)
|
|
25
|
+
},
|
|
26
|
+
rootCauseContent: {
|
|
27
|
+
paddingLeft: theme.spacing(2)
|
|
28
|
+
},
|
|
29
|
+
rootCauseTitle: {
|
|
30
|
+
fontSize: theme.typography.body2.fontSize,
|
|
31
|
+
fontWeight: 500,
|
|
32
|
+
color: theme.palette.text.primary,
|
|
33
|
+
flex: 1,
|
|
34
|
+
lineHeight: 1.4
|
|
35
|
+
},
|
|
36
|
+
confidenceBadge: {
|
|
37
|
+
padding: theme.spacing(0.5, 1.5),
|
|
38
|
+
borderRadius: theme.shape.borderRadius,
|
|
39
|
+
fontWeight: 500,
|
|
40
|
+
fontSize: theme.typography.caption.fontSize,
|
|
41
|
+
textTransform: "uppercase",
|
|
42
|
+
letterSpacing: "0.5px"
|
|
43
|
+
},
|
|
44
|
+
highConfidence: {
|
|
45
|
+
backgroundColor: theme.palette.success.light,
|
|
46
|
+
color: theme.palette.success.dark
|
|
47
|
+
},
|
|
48
|
+
mediumConfidence: {
|
|
49
|
+
backgroundColor: theme.palette.warning.light,
|
|
50
|
+
color: theme.palette.warning.dark
|
|
51
|
+
},
|
|
52
|
+
lowConfidence: {
|
|
53
|
+
backgroundColor: theme.palette.error.light,
|
|
54
|
+
color: theme.palette.error.dark
|
|
55
|
+
},
|
|
56
|
+
analysis: {
|
|
57
|
+
marginTop: theme.spacing(1),
|
|
58
|
+
marginBottom: theme.spacing(2)
|
|
59
|
+
},
|
|
60
|
+
findingsContainer: {
|
|
61
|
+
marginTop: theme.spacing(2)
|
|
62
|
+
},
|
|
63
|
+
findingsHeader: {
|
|
64
|
+
display: "flex",
|
|
65
|
+
alignItems: "center",
|
|
66
|
+
gap: theme.spacing(1),
|
|
67
|
+
marginBottom: theme.spacing(1),
|
|
68
|
+
color: theme.palette.text.secondary,
|
|
69
|
+
fontSize: theme.typography.body2.fontSize,
|
|
70
|
+
fontWeight: 500
|
|
71
|
+
},
|
|
72
|
+
findingCard: {
|
|
73
|
+
marginBottom: theme.spacing(1.5),
|
|
74
|
+
marginTop: theme.spacing(1.5),
|
|
75
|
+
borderRadius: theme.shape.borderRadius,
|
|
76
|
+
overflow: "hidden"
|
|
77
|
+
},
|
|
78
|
+
findingHeader: {
|
|
79
|
+
display: "flex",
|
|
80
|
+
alignItems: "flex-start",
|
|
81
|
+
justifyContent: "space-between",
|
|
82
|
+
gap: theme.spacing(1),
|
|
83
|
+
padding: theme.spacing(1.5),
|
|
84
|
+
width: "100%",
|
|
85
|
+
textAlign: "left",
|
|
86
|
+
backgroundColor: "transparent",
|
|
87
|
+
transition: "background-color 0.15s ease",
|
|
88
|
+
"&:hover": {
|
|
89
|
+
backgroundColor: theme.palette.action.hover
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
findingHeaderContent: {
|
|
93
|
+
flex: 1,
|
|
94
|
+
minWidth: 0
|
|
95
|
+
},
|
|
96
|
+
findingObservation: {
|
|
97
|
+
fontWeight: 500,
|
|
98
|
+
fontSize: theme.typography.body2.fontSize,
|
|
99
|
+
color: theme.palette.text.primary,
|
|
100
|
+
marginBottom: theme.spacing(0.5),
|
|
101
|
+
lineHeight: 1.4
|
|
102
|
+
},
|
|
103
|
+
findingMeta: {
|
|
104
|
+
display: "flex",
|
|
105
|
+
alignItems: "center",
|
|
106
|
+
gap: theme.spacing(2),
|
|
107
|
+
flexWrap: "wrap"
|
|
108
|
+
},
|
|
109
|
+
evidenceTypeBadge: {
|
|
110
|
+
display: "flex",
|
|
111
|
+
alignItems: "center",
|
|
112
|
+
gap: theme.spacing(0.5),
|
|
113
|
+
fontSize: theme.typography.caption.fontSize,
|
|
114
|
+
fontWeight: 500,
|
|
115
|
+
color: theme.palette.text.secondary,
|
|
116
|
+
marginTop: theme.spacing(0.5),
|
|
117
|
+
"& a": {
|
|
118
|
+
color: theme.palette.primary.main,
|
|
119
|
+
fontWeight: 500
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
evidenceTypeBadgeIcon: {
|
|
123
|
+
fontSize: "0.875rem",
|
|
124
|
+
color: theme.palette.primary.main
|
|
125
|
+
},
|
|
126
|
+
expandIcon: {
|
|
127
|
+
color: theme.palette.text.secondary,
|
|
128
|
+
transition: "transform 0.2s ease",
|
|
129
|
+
flexShrink: 0,
|
|
130
|
+
marginTop: theme.spacing(0.25)
|
|
131
|
+
},
|
|
132
|
+
expandIconOpen: {
|
|
133
|
+
transform: "rotate(180deg)"
|
|
134
|
+
},
|
|
135
|
+
findingEvidenceContainer: {
|
|
136
|
+
padding: theme.spacing(0, 1.5, 1.5, 1.5),
|
|
137
|
+
borderTop: `1px solid ${theme.palette.divider}`,
|
|
138
|
+
backgroundColor: alpha(theme.palette.background.default, 0.5)
|
|
139
|
+
},
|
|
140
|
+
componentName: {
|
|
141
|
+
fontSize: theme.typography.caption.fontSize,
|
|
142
|
+
color: theme.palette.text.secondary,
|
|
143
|
+
fontWeight: 500,
|
|
144
|
+
marginBottom: theme.spacing(1),
|
|
145
|
+
marginTop: theme.spacing(1)
|
|
146
|
+
},
|
|
147
|
+
timeRange: {
|
|
148
|
+
fontSize: theme.typography.caption.fontSize,
|
|
149
|
+
color: theme.palette.text.secondary
|
|
150
|
+
},
|
|
151
|
+
evidenceCard: {
|
|
152
|
+
marginTop: theme.spacing(1)
|
|
153
|
+
},
|
|
154
|
+
evidenceTopRow: {
|
|
155
|
+
display: "flex",
|
|
156
|
+
justifyContent: "space-between",
|
|
157
|
+
alignItems: "flex-start",
|
|
158
|
+
marginBottom: theme.spacing(1)
|
|
159
|
+
},
|
|
160
|
+
evidenceFooter: {
|
|
161
|
+
display: "flex",
|
|
162
|
+
justifyContent: "space-between",
|
|
163
|
+
alignItems: "center",
|
|
164
|
+
marginTop: theme.spacing(1)
|
|
165
|
+
},
|
|
166
|
+
evidenceTypeLabel: {
|
|
167
|
+
display: "flex",
|
|
168
|
+
alignItems: "center",
|
|
169
|
+
gap: theme.spacing(0.5),
|
|
170
|
+
fontSize: theme.typography.caption.fontSize,
|
|
171
|
+
fontWeight: 500,
|
|
172
|
+
color: theme.palette.text.primary,
|
|
173
|
+
marginRight: theme.spacing(1)
|
|
174
|
+
},
|
|
175
|
+
evidenceIcon: {
|
|
176
|
+
fontSize: "1rem",
|
|
177
|
+
color: theme.palette.primary.main
|
|
178
|
+
},
|
|
179
|
+
logLine: {
|
|
180
|
+
fontFamily: "monospace",
|
|
181
|
+
fontSize: theme.typography.caption.fontSize,
|
|
182
|
+
marginTop: theme.spacing(0.75),
|
|
183
|
+
padding: theme.spacing(0.75, 1),
|
|
184
|
+
backgroundColor: theme.palette.type === "dark" ? "rgba(255, 255, 255, 0.05)" : "rgba(0, 0, 0, 0.03)",
|
|
185
|
+
borderRadius: theme.shape.borderRadius,
|
|
186
|
+
borderLeft: `3px solid ${theme.palette.success.main}`
|
|
187
|
+
},
|
|
188
|
+
logLinesContainer: {
|
|
189
|
+
marginTop: theme.spacing(0.75)
|
|
190
|
+
},
|
|
191
|
+
logLinesScrollContainer: {
|
|
192
|
+
overflowX: "auto",
|
|
193
|
+
marginLeft: theme.spacing(-1.5),
|
|
194
|
+
marginRight: theme.spacing(-1.5),
|
|
195
|
+
paddingLeft: theme.spacing(1.5),
|
|
196
|
+
paddingRight: theme.spacing(1.5)
|
|
197
|
+
},
|
|
198
|
+
logLineItem: {
|
|
199
|
+
display: "flex",
|
|
200
|
+
alignItems: "center",
|
|
201
|
+
gap: theme.spacing(1.5),
|
|
202
|
+
fontFamily: "monospace",
|
|
203
|
+
fontSize: theme.typography.caption.fontSize,
|
|
204
|
+
whiteSpace: "nowrap",
|
|
205
|
+
padding: theme.spacing(0.5, 0)
|
|
206
|
+
},
|
|
207
|
+
logLineDivider: {
|
|
208
|
+
marginLeft: theme.spacing(-1.5),
|
|
209
|
+
marginRight: theme.spacing(-1.5)
|
|
210
|
+
},
|
|
211
|
+
timestamp: {
|
|
212
|
+
color: theme.palette.text.secondary,
|
|
213
|
+
fontSize: theme.typography.overline.fontSize
|
|
214
|
+
},
|
|
215
|
+
logLevel: {
|
|
216
|
+
fontSize: theme.typography.caption.fontSize,
|
|
217
|
+
fontWeight: 500
|
|
218
|
+
},
|
|
219
|
+
errorLevel: {
|
|
220
|
+
color: theme.palette.error.main
|
|
221
|
+
},
|
|
222
|
+
warnLevel: {
|
|
223
|
+
color: theme.palette.warning.main
|
|
224
|
+
},
|
|
225
|
+
infoLevel: {
|
|
226
|
+
color: theme.palette.info.main
|
|
227
|
+
},
|
|
228
|
+
debugLevel: {
|
|
229
|
+
color: theme.palette.text.secondary
|
|
230
|
+
},
|
|
231
|
+
logMessageText: {
|
|
232
|
+
flex: 1,
|
|
233
|
+
wordBreak: "break-word"
|
|
234
|
+
},
|
|
235
|
+
repetitionText: {
|
|
236
|
+
fontStyle: "italic",
|
|
237
|
+
color: theme.palette.text.secondary,
|
|
238
|
+
fontSize: theme.typography.caption.fontSize,
|
|
239
|
+
marginTop: theme.spacing(0.5)
|
|
240
|
+
},
|
|
241
|
+
metricLine: {
|
|
242
|
+
fontFamily: "monospace",
|
|
243
|
+
fontSize: theme.typography.caption.fontSize,
|
|
244
|
+
marginTop: theme.spacing(0.75),
|
|
245
|
+
padding: theme.spacing(0.75, 1),
|
|
246
|
+
backgroundColor: theme.palette.type === "dark" ? "rgba(255, 255, 255, 0.05)" : "rgba(0, 0, 0, 0.03)",
|
|
247
|
+
borderRadius: theme.shape.borderRadius,
|
|
248
|
+
borderLeft: `3px solid ${theme.palette.success.main}`
|
|
249
|
+
},
|
|
250
|
+
metricName: {
|
|
251
|
+
fontWeight: 500,
|
|
252
|
+
fontSize: theme.typography.body2.fontSize,
|
|
253
|
+
color: theme.palette.text.primary
|
|
254
|
+
},
|
|
255
|
+
metricSummary: {
|
|
256
|
+
flex: 1,
|
|
257
|
+
wordBreak: "break-word"
|
|
258
|
+
},
|
|
259
|
+
tracePropertyRow: {
|
|
260
|
+
display: "flex",
|
|
261
|
+
alignItems: "baseline",
|
|
262
|
+
gap: theme.spacing(2),
|
|
263
|
+
marginBottom: theme.spacing(0.5)
|
|
264
|
+
},
|
|
265
|
+
tracePropertyKey: {
|
|
266
|
+
fontWeight: 500,
|
|
267
|
+
color: theme.palette.text.secondary,
|
|
268
|
+
fontSize: theme.typography.body2.fontSize,
|
|
269
|
+
minWidth: 50,
|
|
270
|
+
flexShrink: 0
|
|
271
|
+
},
|
|
272
|
+
tracePropertyValue: {
|
|
273
|
+
fontFamily: "monospace",
|
|
274
|
+
color: theme.palette.text.primary,
|
|
275
|
+
fontSize: theme.typography.body2.fontSize,
|
|
276
|
+
wordBreak: "break-word"
|
|
277
|
+
},
|
|
278
|
+
traceInfoBox: {
|
|
279
|
+
padding: theme.spacing(0.75, 1),
|
|
280
|
+
backgroundColor: alpha(theme.palette.text.primary, 0.03),
|
|
281
|
+
borderRadius: theme.shape.borderRadius,
|
|
282
|
+
borderLeft: `3px solid ${theme.palette.success.main}`
|
|
283
|
+
},
|
|
284
|
+
traceSummary: {
|
|
285
|
+
fontSize: theme.typography.body2.fontSize,
|
|
286
|
+
color: theme.palette.text.primary,
|
|
287
|
+
marginTop: theme.spacing(0.5)
|
|
288
|
+
},
|
|
289
|
+
traceError: {
|
|
290
|
+
color: theme.palette.error.main,
|
|
291
|
+
fontWeight: 500,
|
|
292
|
+
marginTop: theme.spacing(0.5)
|
|
293
|
+
},
|
|
294
|
+
spanInfo: {
|
|
295
|
+
fontSize: theme.typography.caption.fontSize,
|
|
296
|
+
color: theme.palette.text.secondary,
|
|
297
|
+
marginTop: theme.spacing(0.5)
|
|
298
|
+
}
|
|
299
|
+
}));
|
|
300
|
+
const getLogLevelColorClass = (level, classes) => {
|
|
301
|
+
switch (level) {
|
|
302
|
+
case "ERROR":
|
|
303
|
+
return classes.errorLevel;
|
|
304
|
+
case "WARN":
|
|
305
|
+
return classes.warnLevel;
|
|
306
|
+
case "INFO":
|
|
307
|
+
return classes.infoLevel;
|
|
308
|
+
case "DEBUG":
|
|
309
|
+
return classes.debugLevel;
|
|
310
|
+
default:
|
|
311
|
+
return "";
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
const getConfidenceBadgeClass = (confidence, classes) => {
|
|
315
|
+
const base = classes.confidenceBadge;
|
|
316
|
+
switch (confidence) {
|
|
317
|
+
case "high":
|
|
318
|
+
return `${base} ${classes.highConfidence}`;
|
|
319
|
+
case "medium":
|
|
320
|
+
return `${base} ${classes.mediumConfidence}`;
|
|
321
|
+
case "low":
|
|
322
|
+
return `${base} ${classes.lowConfidence}`;
|
|
323
|
+
default:
|
|
324
|
+
return base;
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
const formatTimestamp = (timestamp) => {
|
|
328
|
+
try {
|
|
329
|
+
const date = new Date(timestamp);
|
|
330
|
+
return date.toLocaleString("en-US", {
|
|
331
|
+
month: "short",
|
|
332
|
+
day: "numeric",
|
|
333
|
+
hour: "2-digit",
|
|
334
|
+
minute: "2-digit",
|
|
335
|
+
second: "2-digit"
|
|
336
|
+
});
|
|
337
|
+
} catch {
|
|
338
|
+
return timestamp;
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
const LogEvidenceComponent = ({
|
|
342
|
+
evidence,
|
|
343
|
+
classes
|
|
344
|
+
}) => /* @__PURE__ */ jsxs(Box, { className: classes.evidenceCard, children: [
|
|
345
|
+
/* @__PURE__ */ jsx(Box, { className: classes.logLinesScrollContainer, children: evidence.log_lines?.map((line, idx) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
346
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.logLineItem, children: [
|
|
347
|
+
/* @__PURE__ */ jsx("span", { className: classes.timestamp, children: formatTimestamp(line.timestamp) }),
|
|
348
|
+
/* @__PURE__ */ jsx(
|
|
349
|
+
"span",
|
|
350
|
+
{
|
|
351
|
+
className: `${classes.logLevel} ${getLogLevelColorClass(
|
|
352
|
+
line.level,
|
|
353
|
+
classes
|
|
354
|
+
)}`,
|
|
355
|
+
children: line.level
|
|
356
|
+
}
|
|
357
|
+
),
|
|
358
|
+
/* @__PURE__ */ jsx("span", { className: classes.logMessageText, children: line.log })
|
|
359
|
+
] }),
|
|
360
|
+
/* @__PURE__ */ jsx(Divider, { className: classes.logLineDivider })
|
|
361
|
+
] }, idx)) }),
|
|
362
|
+
evidence.repetition && /* @__PURE__ */ jsx(Typography, { className: classes.repetitionText, children: evidence.repetition })
|
|
363
|
+
] });
|
|
364
|
+
const MetricEvidenceComponent = ({
|
|
365
|
+
evidence,
|
|
366
|
+
classes
|
|
367
|
+
}) => /* @__PURE__ */ jsx(Box, { className: classes.evidenceCard, children: /* @__PURE__ */ jsx(Typography, { component: "div", className: classes.metricSummary, children: /* @__PURE__ */ jsx(FormattedText, { text: evidence.summary }) }) });
|
|
368
|
+
const TraceEvidenceComponent = ({
|
|
369
|
+
evidence,
|
|
370
|
+
classes
|
|
371
|
+
}) => /* @__PURE__ */ jsxs(Box, { className: classes.evidenceCard, children: [
|
|
372
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.tracePropertyRow, children: [
|
|
373
|
+
/* @__PURE__ */ jsx("span", { className: classes.tracePropertyKey, children: "Trace" }),
|
|
374
|
+
/* @__PURE__ */ jsx("span", { className: classes.tracePropertyValue, children: evidence.trace_id })
|
|
375
|
+
] }),
|
|
376
|
+
evidence.span_id && /* @__PURE__ */ jsxs(Box, { className: classes.tracePropertyRow, children: [
|
|
377
|
+
/* @__PURE__ */ jsx("span", { className: classes.tracePropertyKey, children: "Span" }),
|
|
378
|
+
/* @__PURE__ */ jsx("span", { className: classes.tracePropertyValue, children: evidence.span_id })
|
|
379
|
+
] }),
|
|
380
|
+
/* @__PURE__ */ jsx(Typography, { component: "div", className: classes.traceSummary, children: /* @__PURE__ */ jsx(FormattedText, { text: evidence.summary }) }),
|
|
381
|
+
evidence.is_error && evidence.error_message && /* @__PURE__ */ jsxs(Typography, { className: classes.traceError, children: [
|
|
382
|
+
"Error: ",
|
|
383
|
+
evidence.error_message
|
|
384
|
+
] }),
|
|
385
|
+
evidence.repetition && /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
386
|
+
/* @__PURE__ */ jsx(Divider, { className: classes.logLineDivider }),
|
|
387
|
+
/* @__PURE__ */ jsx(Typography, { className: classes.repetitionText, children: evidence.repetition })
|
|
388
|
+
] })
|
|
389
|
+
] });
|
|
390
|
+
const getEvidenceTypeWithComponent = (type, componentUid, classes) => {
|
|
391
|
+
let icon = null;
|
|
392
|
+
let label = "";
|
|
393
|
+
switch (type) {
|
|
394
|
+
case "log":
|
|
395
|
+
icon = /* @__PURE__ */ jsx(DescriptionOutlinedIcon, { className: classes.evidenceTypeBadgeIcon });
|
|
396
|
+
label = "Logs";
|
|
397
|
+
break;
|
|
398
|
+
case "metric":
|
|
399
|
+
icon = /* @__PURE__ */ jsx(ShowChartIcon, { className: classes.evidenceTypeBadgeIcon });
|
|
400
|
+
label = "Metrics";
|
|
401
|
+
break;
|
|
402
|
+
case "trace":
|
|
403
|
+
icon = /* @__PURE__ */ jsx(AccountTreeIcon, { className: classes.evidenceTypeBadgeIcon });
|
|
404
|
+
label = "Traces";
|
|
405
|
+
break;
|
|
406
|
+
default:
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
return /* @__PURE__ */ jsxs("span", { className: classes.evidenceTypeBadge, children: [
|
|
410
|
+
icon,
|
|
411
|
+
label,
|
|
412
|
+
componentUid && /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
413
|
+
" in ",
|
|
414
|
+
/* @__PURE__ */ jsx(FormattedText, { text: componentUid })
|
|
415
|
+
] })
|
|
416
|
+
] });
|
|
417
|
+
};
|
|
418
|
+
const FindingCard = ({
|
|
419
|
+
finding,
|
|
420
|
+
classes
|
|
421
|
+
}) => {
|
|
422
|
+
const [expanded, setExpanded] = useState(false);
|
|
423
|
+
const evidence = finding.evidence;
|
|
424
|
+
let evidenceComponent = null;
|
|
425
|
+
if (evidence?.type === "log") {
|
|
426
|
+
evidenceComponent = /* @__PURE__ */ jsx(
|
|
427
|
+
LogEvidenceComponent,
|
|
428
|
+
{
|
|
429
|
+
evidence,
|
|
430
|
+
classes
|
|
431
|
+
}
|
|
432
|
+
);
|
|
433
|
+
} else if (evidence?.type === "metric") {
|
|
434
|
+
evidenceComponent = /* @__PURE__ */ jsx(
|
|
435
|
+
MetricEvidenceComponent,
|
|
436
|
+
{
|
|
437
|
+
evidence,
|
|
438
|
+
classes
|
|
439
|
+
}
|
|
440
|
+
);
|
|
441
|
+
} else if (evidence?.type === "trace") {
|
|
442
|
+
evidenceComponent = /* @__PURE__ */ jsx(
|
|
443
|
+
TraceEvidenceComponent,
|
|
444
|
+
{
|
|
445
|
+
evidence,
|
|
446
|
+
classes
|
|
447
|
+
}
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
const hasEvidence = evidenceComponent !== null;
|
|
451
|
+
return /* @__PURE__ */ jsxs(Box, { className: classes.findingCard, children: [
|
|
452
|
+
/* @__PURE__ */ jsxs(
|
|
453
|
+
ButtonBase,
|
|
454
|
+
{
|
|
455
|
+
className: classes.findingHeader,
|
|
456
|
+
onClick: () => hasEvidence && setExpanded(!expanded),
|
|
457
|
+
disabled: !hasEvidence,
|
|
458
|
+
disableRipple: true,
|
|
459
|
+
children: [
|
|
460
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.findingHeaderContent, children: [
|
|
461
|
+
/* @__PURE__ */ jsx(Typography, { component: "div", className: classes.findingObservation, children: /* @__PURE__ */ jsx(FormattedText, { text: finding.observation, disableMarkdown: true }) }),
|
|
462
|
+
evidence?.type && getEvidenceTypeWithComponent(
|
|
463
|
+
evidence.type,
|
|
464
|
+
finding.component,
|
|
465
|
+
classes
|
|
466
|
+
),
|
|
467
|
+
finding.time_range && /* @__PURE__ */ jsxs("span", { className: classes.timeRange, children: [
|
|
468
|
+
formatTimestamp(finding.time_range.start),
|
|
469
|
+
" -",
|
|
470
|
+
" ",
|
|
471
|
+
formatTimestamp(finding.time_range.end)
|
|
472
|
+
] })
|
|
473
|
+
] }),
|
|
474
|
+
hasEvidence && /* @__PURE__ */ jsx(
|
|
475
|
+
ExpandMoreIcon,
|
|
476
|
+
{
|
|
477
|
+
className: `${classes.expandIcon} ${expanded ? classes.expandIconOpen : ""}`
|
|
478
|
+
}
|
|
479
|
+
)
|
|
480
|
+
]
|
|
481
|
+
}
|
|
482
|
+
),
|
|
483
|
+
hasEvidence && /* @__PURE__ */ jsx(Collapse, { in: expanded, children: /* @__PURE__ */ jsx(Box, { className: classes.findingEvidenceContainer, children: evidenceComponent }) })
|
|
484
|
+
] });
|
|
485
|
+
};
|
|
486
|
+
const RootCauseItem = ({
|
|
487
|
+
rootCause,
|
|
488
|
+
classes
|
|
489
|
+
}) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
490
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.rootCauseHeader, children: [
|
|
491
|
+
/* @__PURE__ */ jsx(Typography, { className: classes.rootCauseTitle, children: /* @__PURE__ */ jsx(FormattedText, { text: rootCause.summary, disableMarkdown: true }) }),
|
|
492
|
+
/* @__PURE__ */ jsxs("span", { className: getConfidenceBadgeClass(rootCause.confidence, classes), children: [
|
|
493
|
+
rootCause.confidence,
|
|
494
|
+
" confidence"
|
|
495
|
+
] })
|
|
496
|
+
] }),
|
|
497
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.rootCauseContent, children: [
|
|
498
|
+
rootCause.analysis && /* @__PURE__ */ jsx(
|
|
499
|
+
Typography,
|
|
500
|
+
{
|
|
501
|
+
component: "div",
|
|
502
|
+
variant: "body1",
|
|
503
|
+
color: "textSecondary",
|
|
504
|
+
className: classes.analysis,
|
|
505
|
+
children: /* @__PURE__ */ jsx(FormattedText, { text: rootCause.analysis })
|
|
506
|
+
}
|
|
507
|
+
),
|
|
508
|
+
rootCause.supporting_findings && rootCause.supporting_findings.length > 0 && /* @__PURE__ */ jsxs(Box, { className: classes.findingsContainer, children: [
|
|
509
|
+
/* @__PURE__ */ jsx(Typography, { className: classes.findingsHeader, children: "Supporting Findings" }),
|
|
510
|
+
rootCause.supporting_findings.map((finding, idx) => /* @__PURE__ */ jsx(FindingCard, { finding, classes }, idx))
|
|
511
|
+
] })
|
|
512
|
+
] })
|
|
513
|
+
] });
|
|
514
|
+
const RootCausesSection = ({ rootCauses }) => {
|
|
515
|
+
const classes = useStyles();
|
|
516
|
+
if (!rootCauses || rootCauses.length === 0) {
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
return /* @__PURE__ */ jsx(List, { className: classes.list, disablePadding: true, children: rootCauses.map((rootCause, idx) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
520
|
+
/* @__PURE__ */ jsx(ListItem, { className: classes.listItem, disableGutters: true, children: /* @__PURE__ */ jsx(RootCauseItem, { rootCause, classes }) }),
|
|
521
|
+
idx < rootCauses.length - 1 && /* @__PURE__ */ jsx(Divider, { component: "li" })
|
|
522
|
+
] }, idx)) });
|
|
523
|
+
};
|
|
524
|
+
|
|
525
|
+
export { RootCausesSection };
|
|
526
|
+
//# sourceMappingURL=RootCausesSection.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RootCausesSection.esm.js","sources":["../../../../../src/components/RCA/RCAReport/sections/RootCausesSection.tsx"],"sourcesContent":["import { Fragment, useState } from 'react';\nimport {\n Box,\n Typography,\n Divider,\n List,\n ListItem,\n Collapse,\n ButtonBase,\n} from '@material-ui/core';\nimport { alpha, makeStyles } from '@material-ui/core/styles';\nimport DescriptionOutlinedIcon from '@material-ui/icons/DescriptionOutlined';\nimport ShowChartIcon from '@material-ui/icons/ShowChart';\nimport AccountTreeIcon from '@material-ui/icons/AccountTree';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { FormattedText } from '../FormattedText';\nimport type { AIRCAAgentComponents } from '@openchoreo/backstage-plugin-common';\n\ntype RootCause = AIRCAAgentComponents['schemas']['RootCause'];\ntype Finding = AIRCAAgentComponents['schemas']['Finding'];\ntype LogEvidence = AIRCAAgentComponents['schemas']['LogEvidence'];\ntype MetricEvidence = AIRCAAgentComponents['schemas']['MetricEvidence'];\ntype TraceEvidence = AIRCAAgentComponents['schemas']['TraceEvidence'];\n\ninterface RootCausesSectionProps {\n rootCauses?: RootCause[];\n}\n\nconst useStyles = makeStyles(theme => ({\n list: {\n padding: 0,\n },\n listItem: {\n padding: theme.spacing(1.5, 0),\n display: 'block',\n },\n rootCauseHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n marginBottom: theme.spacing(1),\n },\n rootCauseContent: {\n paddingLeft: theme.spacing(2),\n },\n rootCauseTitle: {\n fontSize: theme.typography.body2.fontSize,\n fontWeight: 500,\n color: theme.palette.text.primary,\n flex: 1,\n lineHeight: 1.4,\n },\n confidenceBadge: {\n padding: theme.spacing(0.5, 1.5),\n borderRadius: theme.shape.borderRadius,\n fontWeight: 500,\n fontSize: theme.typography.caption.fontSize,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n },\n highConfidence: {\n backgroundColor: theme.palette.success.light,\n color: theme.palette.success.dark,\n },\n mediumConfidence: {\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.dark,\n },\n lowConfidence: {\n backgroundColor: theme.palette.error.light,\n color: theme.palette.error.dark,\n },\n analysis: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(2),\n },\n findingsContainer: {\n marginTop: theme.spacing(2),\n },\n findingsHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n fontWeight: 500,\n },\n findingCard: {\n marginBottom: theme.spacing(1.5),\n marginTop: theme.spacing(1.5),\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n },\n findingHeader: {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n padding: theme.spacing(1.5),\n width: '100%',\n textAlign: 'left',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s ease',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n findingHeaderContent: {\n flex: 1,\n minWidth: 0,\n },\n findingObservation: {\n fontWeight: 500,\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n marginBottom: theme.spacing(0.5),\n lineHeight: 1.4,\n },\n findingMeta: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n flexWrap: 'wrap' as const,\n },\n evidenceTypeBadge: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n fontSize: theme.typography.caption.fontSize,\n fontWeight: 500,\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.5),\n '& a': {\n color: theme.palette.primary.main,\n fontWeight: 500,\n },\n },\n evidenceTypeBadgeIcon: {\n fontSize: '0.875rem',\n color: theme.palette.primary.main,\n },\n expandIcon: {\n color: theme.palette.text.secondary,\n transition: 'transform 0.2s ease',\n flexShrink: 0,\n marginTop: theme.spacing(0.25),\n },\n expandIconOpen: {\n transform: 'rotate(180deg)',\n },\n findingEvidenceContainer: {\n padding: theme.spacing(0, 1.5, 1.5, 1.5),\n borderTop: `1px solid ${theme.palette.divider}`,\n backgroundColor: alpha(theme.palette.background.default, 0.5),\n },\n componentName: {\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n fontWeight: 500,\n marginBottom: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n timeRange: {\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n },\n evidenceCard: {\n marginTop: theme.spacing(1),\n },\n evidenceTopRow: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: theme.spacing(1),\n },\n evidenceFooter: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: theme.spacing(1),\n },\n evidenceTypeLabel: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n fontSize: theme.typography.caption.fontSize,\n fontWeight: 500,\n color: theme.palette.text.primary,\n marginRight: theme.spacing(1),\n },\n evidenceIcon: {\n fontSize: '1rem',\n color: theme.palette.primary.main,\n },\n logLine: {\n fontFamily: 'monospace',\n fontSize: theme.typography.caption.fontSize,\n marginTop: theme.spacing(0.75),\n padding: theme.spacing(0.75, 1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(255, 255, 255, 0.05)'\n : 'rgba(0, 0, 0, 0.03)',\n borderRadius: theme.shape.borderRadius,\n borderLeft: `3px solid ${theme.palette.success.main}`,\n },\n logLinesContainer: {\n marginTop: theme.spacing(0.75),\n },\n logLinesScrollContainer: {\n overflowX: 'auto',\n marginLeft: theme.spacing(-1.5),\n marginRight: theme.spacing(-1.5),\n paddingLeft: theme.spacing(1.5),\n paddingRight: theme.spacing(1.5),\n },\n logLineItem: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n fontFamily: 'monospace',\n fontSize: theme.typography.caption.fontSize,\n whiteSpace: 'nowrap',\n padding: theme.spacing(0.5, 0),\n },\n logLineDivider: {\n marginLeft: theme.spacing(-1.5),\n marginRight: theme.spacing(-1.5),\n },\n timestamp: {\n color: theme.palette.text.secondary,\n fontSize: theme.typography.overline.fontSize,\n },\n logLevel: {\n fontSize: theme.typography.caption.fontSize,\n fontWeight: 500,\n },\n errorLevel: {\n color: theme.palette.error.main,\n },\n warnLevel: {\n color: theme.palette.warning.main,\n },\n infoLevel: {\n color: theme.palette.info.main,\n },\n debugLevel: {\n color: theme.palette.text.secondary,\n },\n logMessageText: {\n flex: 1,\n wordBreak: 'break-word',\n },\n repetitionText: {\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n fontSize: theme.typography.caption.fontSize,\n marginTop: theme.spacing(0.5),\n },\n metricLine: {\n fontFamily: 'monospace',\n fontSize: theme.typography.caption.fontSize,\n marginTop: theme.spacing(0.75),\n padding: theme.spacing(0.75, 1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(255, 255, 255, 0.05)'\n : 'rgba(0, 0, 0, 0.03)',\n borderRadius: theme.shape.borderRadius,\n borderLeft: `3px solid ${theme.palette.success.main}`,\n },\n metricName: {\n fontWeight: 500,\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n },\n metricSummary: {\n flex: 1,\n wordBreak: 'break-word',\n },\n tracePropertyRow: {\n display: 'flex',\n alignItems: 'baseline',\n gap: theme.spacing(2),\n marginBottom: theme.spacing(0.5),\n },\n tracePropertyKey: {\n fontWeight: 500,\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n minWidth: 50,\n flexShrink: 0,\n },\n tracePropertyValue: {\n fontFamily: 'monospace',\n color: theme.palette.text.primary,\n fontSize: theme.typography.body2.fontSize,\n wordBreak: 'break-word',\n },\n traceInfoBox: {\n padding: theme.spacing(0.75, 1),\n backgroundColor: alpha(theme.palette.text.primary, 0.03),\n borderRadius: theme.shape.borderRadius,\n borderLeft: `3px solid ${theme.palette.success.main}`,\n },\n traceSummary: {\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n marginTop: theme.spacing(0.5),\n },\n traceError: {\n color: theme.palette.error.main,\n fontWeight: 500,\n marginTop: theme.spacing(0.5),\n },\n spanInfo: {\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.5),\n },\n}));\n\nconst getLogLevelColorClass = (\n level: string,\n classes: ReturnType<typeof useStyles>,\n): string => {\n switch (level) {\n case 'ERROR':\n return classes.errorLevel;\n case 'WARN':\n return classes.warnLevel;\n case 'INFO':\n return classes.infoLevel;\n case 'DEBUG':\n return classes.debugLevel;\n default:\n return '';\n }\n};\n\nconst getConfidenceBadgeClass = (\n confidence: string,\n classes: ReturnType<typeof useStyles>,\n): string => {\n const base = classes.confidenceBadge;\n switch (confidence) {\n case 'high':\n return `${base} ${classes.highConfidence}`;\n case 'medium':\n return `${base} ${classes.mediumConfidence}`;\n case 'low':\n return `${base} ${classes.lowConfidence}`;\n default:\n return base;\n }\n};\n\nconst formatTimestamp = (timestamp: string): string => {\n try {\n const date = new Date(timestamp);\n return date.toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n } catch {\n return timestamp;\n }\n};\n\nconst LogEvidenceComponent = ({\n evidence,\n classes,\n}: {\n evidence: LogEvidence;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <Box className={classes.evidenceCard}>\n <Box className={classes.logLinesScrollContainer}>\n {evidence.log_lines?.map((line, idx) => (\n <Fragment key={idx}>\n <Box className={classes.logLineItem}>\n <span className={classes.timestamp}>\n {formatTimestamp(line.timestamp)}\n </span>\n <span\n className={`${classes.logLevel} ${getLogLevelColorClass(\n line.level,\n classes,\n )}`}\n >\n {line.level}\n </span>\n <span className={classes.logMessageText}>{line.log}</span>\n </Box>\n <Divider className={classes.logLineDivider} />\n </Fragment>\n ))}\n </Box>\n {evidence.repetition && (\n <Typography className={classes.repetitionText}>\n {evidence.repetition}\n </Typography>\n )}\n </Box>\n);\n\nconst MetricEvidenceComponent = ({\n evidence,\n classes,\n}: {\n evidence: MetricEvidence;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <Box className={classes.evidenceCard}>\n <Typography component=\"div\" className={classes.metricSummary}>\n <FormattedText text={evidence.summary} />\n </Typography>\n </Box>\n);\n\nconst TraceEvidenceComponent = ({\n evidence,\n classes,\n}: {\n evidence: TraceEvidence;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <Box className={classes.evidenceCard}>\n <Box className={classes.tracePropertyRow}>\n <span className={classes.tracePropertyKey}>Trace</span>\n <span className={classes.tracePropertyValue}>{evidence.trace_id}</span>\n </Box>\n {evidence.span_id && (\n <Box className={classes.tracePropertyRow}>\n <span className={classes.tracePropertyKey}>Span</span>\n <span className={classes.tracePropertyValue}>{evidence.span_id}</span>\n </Box>\n )}\n <Typography component=\"div\" className={classes.traceSummary}>\n <FormattedText text={evidence.summary} />\n </Typography>\n {evidence.is_error && evidence.error_message && (\n <Typography className={classes.traceError}>\n Error: {evidence.error_message}\n </Typography>\n )}\n {evidence.repetition && (\n <>\n <Divider className={classes.logLineDivider} />\n <Typography className={classes.repetitionText}>\n {evidence.repetition}\n </Typography>\n </>\n )}\n </Box>\n);\n\nconst getEvidenceTypeWithComponent = (\n type: string | undefined,\n componentUid: string | undefined,\n classes: ReturnType<typeof useStyles>,\n) => {\n let icon = null;\n let label = '';\n\n switch (type) {\n case 'log':\n icon = (\n <DescriptionOutlinedIcon className={classes.evidenceTypeBadgeIcon} />\n );\n label = 'Logs';\n break;\n case 'metric':\n icon = <ShowChartIcon className={classes.evidenceTypeBadgeIcon} />;\n label = 'Metrics';\n break;\n case 'trace':\n icon = <AccountTreeIcon className={classes.evidenceTypeBadgeIcon} />;\n label = 'Traces';\n break;\n default:\n return null;\n }\n\n return (\n <span className={classes.evidenceTypeBadge}>\n {icon}\n {label}\n {componentUid && (\n <>\n {' in '}\n <FormattedText text={componentUid} />\n </>\n )}\n </span>\n );\n};\n\nconst FindingCard = ({\n finding,\n classes,\n}: {\n finding: Finding;\n classes: ReturnType<typeof useStyles>;\n}) => {\n const [expanded, setExpanded] = useState(false);\n const evidence = finding.evidence;\n\n let evidenceComponent = null;\n if (evidence?.type === 'log') {\n evidenceComponent = (\n <LogEvidenceComponent\n evidence={evidence as LogEvidence}\n classes={classes}\n />\n );\n } else if (evidence?.type === 'metric') {\n evidenceComponent = (\n <MetricEvidenceComponent\n evidence={evidence as MetricEvidence}\n classes={classes}\n />\n );\n } else if (evidence?.type === 'trace') {\n evidenceComponent = (\n <TraceEvidenceComponent\n evidence={evidence as TraceEvidence}\n classes={classes}\n />\n );\n }\n\n const hasEvidence = evidenceComponent !== null;\n\n return (\n <Box className={classes.findingCard}>\n <ButtonBase\n className={classes.findingHeader}\n onClick={() => hasEvidence && setExpanded(!expanded)}\n disabled={!hasEvidence}\n disableRipple\n >\n <Box className={classes.findingHeaderContent}>\n <Typography component=\"div\" className={classes.findingObservation}>\n <FormattedText text={finding.observation} disableMarkdown />\n </Typography>\n {evidence?.type &&\n getEvidenceTypeWithComponent(\n evidence.type,\n finding.component,\n classes,\n )}\n {finding.time_range && (\n <span className={classes.timeRange}>\n {formatTimestamp(finding.time_range.start)} -{' '}\n {formatTimestamp(finding.time_range.end)}\n </span>\n )}\n </Box>\n {hasEvidence && (\n <ExpandMoreIcon\n className={`${classes.expandIcon} ${\n expanded ? classes.expandIconOpen : ''\n }`}\n />\n )}\n </ButtonBase>\n {hasEvidence && (\n <Collapse in={expanded}>\n <Box className={classes.findingEvidenceContainer}>\n {evidenceComponent}\n </Box>\n </Collapse>\n )}\n </Box>\n );\n};\n\nconst RootCauseItem = ({\n rootCause,\n classes,\n}: {\n rootCause: RootCause;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <>\n <Box className={classes.rootCauseHeader}>\n <Typography className={classes.rootCauseTitle}>\n <FormattedText text={rootCause.summary} disableMarkdown />\n </Typography>\n <span className={getConfidenceBadgeClass(rootCause.confidence, classes)}>\n {rootCause.confidence} confidence\n </span>\n </Box>\n <Box className={classes.rootCauseContent}>\n {rootCause.analysis && (\n <Typography\n component=\"div\"\n variant=\"body1\"\n color=\"textSecondary\"\n className={classes.analysis}\n >\n <FormattedText text={rootCause.analysis} />\n </Typography>\n )}\n\n {rootCause.supporting_findings &&\n rootCause.supporting_findings.length > 0 && (\n <Box className={classes.findingsContainer}>\n <Typography className={classes.findingsHeader}>\n Supporting Findings\n </Typography>\n {rootCause.supporting_findings.map((finding, idx) => (\n <FindingCard key={idx} finding={finding} classes={classes} />\n ))}\n </Box>\n )}\n </Box>\n </>\n);\n\nexport const RootCausesSection = ({ rootCauses }: RootCausesSectionProps) => {\n const classes = useStyles();\n\n if (!rootCauses || rootCauses.length === 0) {\n return null;\n }\n\n return (\n <List className={classes.list} disablePadding>\n {rootCauses.map((rootCause, idx) => (\n <Fragment key={idx}>\n <ListItem className={classes.listItem} disableGutters>\n <RootCauseItem rootCause={rootCause} classes={classes} />\n </ListItem>\n {idx < rootCauses.length - 1 && <Divider component=\"li\" />}\n </Fragment>\n ))}\n </List>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Box, Typography } from '@material-ui/core';
|
|
3
|
+
import { Timeline, TimelineItem, TimelineOppositeContent, TimelineSeparator, TimelineDot, TimelineConnector, TimelineContent } from '@material-ui/lab';
|
|
4
|
+
import { useRCAReportStyles } from '../styles.esm.js';
|
|
5
|
+
import { FormattedText } from '../FormattedText.esm.js';
|
|
6
|
+
|
|
7
|
+
const formatTimelineTimestamp = (timestamp) => {
|
|
8
|
+
if (!timestamp) return "N/A";
|
|
9
|
+
try {
|
|
10
|
+
const date = new Date(timestamp);
|
|
11
|
+
return date.toLocaleString("en-US", {
|
|
12
|
+
month: "short",
|
|
13
|
+
day: "numeric",
|
|
14
|
+
hour: "numeric",
|
|
15
|
+
minute: "2-digit"
|
|
16
|
+
});
|
|
17
|
+
} catch {
|
|
18
|
+
return timestamp;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const SystemTimelineSection = ({
|
|
22
|
+
timeline
|
|
23
|
+
}) => {
|
|
24
|
+
const classes = useRCAReportStyles();
|
|
25
|
+
if (!timeline || timeline.length === 0) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return /* @__PURE__ */ jsx(Box, { className: classes.timelineContainer, children: /* @__PURE__ */ jsx(Timeline, { style: { padding: "4px 0", margin: 0 }, children: timeline.map((event, idx) => /* @__PURE__ */ jsxs(TimelineItem, { style: { minHeight: "auto" }, children: [
|
|
29
|
+
/* @__PURE__ */ jsx(
|
|
30
|
+
TimelineOppositeContent,
|
|
31
|
+
{
|
|
32
|
+
style: {
|
|
33
|
+
maxWidth: 0,
|
|
34
|
+
padding: 0,
|
|
35
|
+
flex: 0
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
/* @__PURE__ */ jsxs(TimelineSeparator, { children: [
|
|
40
|
+
/* @__PURE__ */ jsx(TimelineDot, { color: "primary" }),
|
|
41
|
+
idx < timeline.length - 1 && /* @__PURE__ */ jsx(TimelineConnector, {})
|
|
42
|
+
] }),
|
|
43
|
+
/* @__PURE__ */ jsxs(TimelineContent, { style: { paddingRight: 0 }, children: [
|
|
44
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.timelineHeaderRow, children: [
|
|
45
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: formatTimelineTimestamp(event.timestamp) }),
|
|
46
|
+
event.component && /* @__PURE__ */ jsx(
|
|
47
|
+
Typography,
|
|
48
|
+
{
|
|
49
|
+
variant: "caption",
|
|
50
|
+
color: "textSecondary",
|
|
51
|
+
style: { marginLeft: 8 },
|
|
52
|
+
children: /* @__PURE__ */ jsx(FormattedText, { text: event.component })
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
] }),
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
Typography,
|
|
58
|
+
{
|
|
59
|
+
component: "div",
|
|
60
|
+
variant: "body2",
|
|
61
|
+
className: classes.timelineEventText,
|
|
62
|
+
children: /* @__PURE__ */ jsx(FormattedText, { text: event.event || "" })
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
] })
|
|
66
|
+
] }, idx)) }) });
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { SystemTimelineSection };
|
|
70
|
+
//# sourceMappingURL=SystemTimelineSection.esm.js.map
|