@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,222 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useRef, useEffect } from 'react';
|
|
3
|
+
import { Box, Typography, Button } from '@material-ui/core';
|
|
4
|
+
import { Progress } from '@backstage/core-components';
|
|
5
|
+
import { Alert } from '@material-ui/lab';
|
|
6
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
7
|
+
import { CHOREO_ANNOTATIONS } from '@openchoreo/backstage-plugin-common';
|
|
8
|
+
import { LogsFilter } from './LogsFilter.esm.js';
|
|
9
|
+
import { LogsTable } from './LogsTable.esm.js';
|
|
10
|
+
import { LogsActions } from './LogsActions.esm.js';
|
|
11
|
+
import { useGetNamespaceAndProjectByEntity } from '../../hooks/useGetNamespaceAndProjectByEntity.esm.js';
|
|
12
|
+
import '@backstage/core-plugin-api';
|
|
13
|
+
import { useGetEnvironmentsByNamespace } from '../../hooks/useGetEnvironmentsByNamespace.esm.js';
|
|
14
|
+
import 'react-router-dom';
|
|
15
|
+
import '../../utils/urlTimeRange.esm.js';
|
|
16
|
+
import '../../api/ObservabilityApi.esm.js';
|
|
17
|
+
import { useLogsPermission, ForbiddenState, useInfiniteScroll } from '@openchoreo/backstage-plugin-react';
|
|
18
|
+
import { useRuntimeLogs } from '../../hooks/useRuntimeLogs.esm.js';
|
|
19
|
+
import { LOG_LEVELS } from './types.esm.js';
|
|
20
|
+
import { useUrlFiltersForRuntimeLogs } from '../../hooks/useUrlFiltersForRuntimeLogs.esm.js';
|
|
21
|
+
import '../../api/RCAAgentApi.esm.js';
|
|
22
|
+
import '../../api/FinOpsAgentApi.esm.js';
|
|
23
|
+
import { useRuntimeLogsStyles } from './styles.esm.js';
|
|
24
|
+
|
|
25
|
+
const ObservabilityRuntimeLogsContent = ({
|
|
26
|
+
renderRowAction
|
|
27
|
+
}) => {
|
|
28
|
+
const classes = useRuntimeLogsStyles();
|
|
29
|
+
const { entity } = useEntity();
|
|
30
|
+
const { namespace, project } = useGetNamespaceAndProjectByEntity(entity);
|
|
31
|
+
const {
|
|
32
|
+
environments,
|
|
33
|
+
loading: environmentsLoading,
|
|
34
|
+
error: environmentsError
|
|
35
|
+
} = useGetEnvironmentsByNamespace(namespace, project);
|
|
36
|
+
const { filters, updateFilters } = useUrlFiltersForRuntimeLogs({
|
|
37
|
+
environments
|
|
38
|
+
});
|
|
39
|
+
const selectedEnvironment = environments.find(
|
|
40
|
+
(env) => env.name === filters.environment
|
|
41
|
+
);
|
|
42
|
+
const {
|
|
43
|
+
canViewLogs: canViewLogsForEnv,
|
|
44
|
+
loading: envPermissionLoading,
|
|
45
|
+
deniedTooltip: envPermissionDenied,
|
|
46
|
+
permissionName: envPermissionName
|
|
47
|
+
} = useLogsPermission(selectedEnvironment?.name);
|
|
48
|
+
const componentName = entity.metadata.annotations?.[CHOREO_ANNOTATIONS.COMPONENT];
|
|
49
|
+
const [lastUpdated, setLastUpdated] = useState(/* @__PURE__ */ new Date());
|
|
50
|
+
const allLogLevelsSelected = filters.logLevel.length === LOG_LEVELS.length;
|
|
51
|
+
const noLogLevelSelected = filters.logLevel.length === 0;
|
|
52
|
+
const {
|
|
53
|
+
logs,
|
|
54
|
+
loading: logsLoading,
|
|
55
|
+
error: logsError,
|
|
56
|
+
totalCount,
|
|
57
|
+
hasMore,
|
|
58
|
+
fetchLogs,
|
|
59
|
+
loadMore,
|
|
60
|
+
refresh,
|
|
61
|
+
clearLogs
|
|
62
|
+
} = useRuntimeLogs(entity, namespace || "", project || "", {
|
|
63
|
+
environment: filters.environment,
|
|
64
|
+
timeRange: filters.timeRange,
|
|
65
|
+
customStartTime: filters.customStartTime,
|
|
66
|
+
customEndTime: filters.customEndTime,
|
|
67
|
+
logLevels: allLogLevelsSelected ? void 0 : filters.logLevel,
|
|
68
|
+
limit: 50,
|
|
69
|
+
searchQuery: filters.searchQuery,
|
|
70
|
+
sortOrder: filters.sortOrder || "asc",
|
|
71
|
+
isLive: filters.isLive && !noLogLevelSelected
|
|
72
|
+
});
|
|
73
|
+
const { loadingRef } = useInfiniteScroll(loadMore, hasMore, logsLoading);
|
|
74
|
+
const previousFiltersRef = useRef(null);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
const currentFilters = {
|
|
77
|
+
environment: filters.environment,
|
|
78
|
+
logLevel: filters.logLevel,
|
|
79
|
+
timeRange: filters.timeRange,
|
|
80
|
+
customStartTime: filters.customStartTime,
|
|
81
|
+
customEndTime: filters.customEndTime,
|
|
82
|
+
searchQuery: filters.searchQuery,
|
|
83
|
+
sortOrder: filters.sortOrder
|
|
84
|
+
};
|
|
85
|
+
const filtersChanged = previousFiltersRef.current === null || JSON.stringify(previousFiltersRef.current) !== JSON.stringify(currentFilters);
|
|
86
|
+
if (filters.environment && selectedEnvironment && namespace && project && canViewLogsForEnv && filtersChanged) {
|
|
87
|
+
if (filters.logLevel.length === 0) {
|
|
88
|
+
clearLogs();
|
|
89
|
+
} else {
|
|
90
|
+
fetchLogs(true);
|
|
91
|
+
setLastUpdated(/* @__PURE__ */ new Date());
|
|
92
|
+
}
|
|
93
|
+
previousFiltersRef.current = currentFilters;
|
|
94
|
+
}
|
|
95
|
+
}, [
|
|
96
|
+
filters.environment,
|
|
97
|
+
filters.logLevel,
|
|
98
|
+
filters.timeRange,
|
|
99
|
+
filters.customStartTime,
|
|
100
|
+
filters.customEndTime,
|
|
101
|
+
filters.searchQuery,
|
|
102
|
+
filters.sortOrder,
|
|
103
|
+
fetchLogs,
|
|
104
|
+
clearLogs,
|
|
105
|
+
selectedEnvironment,
|
|
106
|
+
namespace,
|
|
107
|
+
project,
|
|
108
|
+
canViewLogsForEnv,
|
|
109
|
+
envPermissionLoading
|
|
110
|
+
]);
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
if (!logsLoading) {
|
|
113
|
+
setLastUpdated(/* @__PURE__ */ new Date());
|
|
114
|
+
}
|
|
115
|
+
}, [logsLoading]);
|
|
116
|
+
const handleRefresh = () => {
|
|
117
|
+
if (noLogLevelSelected) {
|
|
118
|
+
clearLogs();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
refresh();
|
|
122
|
+
setLastUpdated(/* @__PURE__ */ new Date());
|
|
123
|
+
};
|
|
124
|
+
const handleFiltersChange = (newFilters) => {
|
|
125
|
+
updateFilters(newFilters);
|
|
126
|
+
};
|
|
127
|
+
const renderError = (error) => {
|
|
128
|
+
const isObservabilityDisabled = error.includes(
|
|
129
|
+
"Observability is not enabled"
|
|
130
|
+
);
|
|
131
|
+
return /* @__PURE__ */ jsxs(
|
|
132
|
+
Alert,
|
|
133
|
+
{
|
|
134
|
+
severity: isObservabilityDisabled ? "info" : "error",
|
|
135
|
+
className: classes.errorContainer,
|
|
136
|
+
children: [
|
|
137
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body1", children: isObservabilityDisabled ? "Observability is not enabled for this component in the current environment. Enable observability to view runtime logs." : error }),
|
|
138
|
+
!isObservabilityDisabled && /* @__PURE__ */ jsx(Button, { onClick: handleRefresh, color: "inherit", size: "small", children: "Retry" })
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
};
|
|
143
|
+
if (environmentsError) {
|
|
144
|
+
return /* @__PURE__ */ jsx(Box, { children: renderError(environmentsError) });
|
|
145
|
+
}
|
|
146
|
+
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
147
|
+
/* @__PURE__ */ jsx(
|
|
148
|
+
LogsFilter,
|
|
149
|
+
{
|
|
150
|
+
filters,
|
|
151
|
+
onFiltersChange: handleFiltersChange,
|
|
152
|
+
environments,
|
|
153
|
+
environmentsLoading,
|
|
154
|
+
disabled: logsLoading
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
logsError && renderError(logsError),
|
|
158
|
+
!filters.environment && !environmentsLoading && environments.length === 0 && /* @__PURE__ */ jsx(Alert, { severity: "info", className: classes.errorContainer, children: /* @__PURE__ */ jsx(Typography, { variant: "body1", children: "No environments found. Make sure your component is properly configured." }) }),
|
|
159
|
+
filters.environment && !envPermissionLoading && !canViewLogsForEnv && /* @__PURE__ */ jsx(
|
|
160
|
+
ForbiddenState,
|
|
161
|
+
{
|
|
162
|
+
message: envPermissionDenied,
|
|
163
|
+
permissionName: envPermissionName,
|
|
164
|
+
variant: "compact"
|
|
165
|
+
}
|
|
166
|
+
),
|
|
167
|
+
filters.environment && canViewLogsForEnv && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
168
|
+
/* @__PURE__ */ jsx(
|
|
169
|
+
LogsActions,
|
|
170
|
+
{
|
|
171
|
+
totalCount,
|
|
172
|
+
disabled: logsLoading || !filters.environment,
|
|
173
|
+
onRefresh: handleRefresh,
|
|
174
|
+
filters,
|
|
175
|
+
onFiltersChange: handleFiltersChange,
|
|
176
|
+
lastUpdated
|
|
177
|
+
}
|
|
178
|
+
),
|
|
179
|
+
/* @__PURE__ */ jsx(
|
|
180
|
+
LogsTable,
|
|
181
|
+
{
|
|
182
|
+
selectedFields: filters.selectedFields,
|
|
183
|
+
logs,
|
|
184
|
+
loading: logsLoading,
|
|
185
|
+
hasMore,
|
|
186
|
+
loadingRef,
|
|
187
|
+
environmentName: selectedEnvironment?.displayName || selectedEnvironment?.name,
|
|
188
|
+
projectName: project,
|
|
189
|
+
componentName,
|
|
190
|
+
renderRowAction
|
|
191
|
+
}
|
|
192
|
+
)
|
|
193
|
+
] })
|
|
194
|
+
] });
|
|
195
|
+
};
|
|
196
|
+
const ObservabilityRuntimeLogsPage = ({
|
|
197
|
+
renderRowAction
|
|
198
|
+
}) => {
|
|
199
|
+
const {
|
|
200
|
+
canViewLogs,
|
|
201
|
+
loading: permissionLoading,
|
|
202
|
+
deniedTooltip,
|
|
203
|
+
permissionName
|
|
204
|
+
} = useLogsPermission();
|
|
205
|
+
if (permissionLoading) {
|
|
206
|
+
return /* @__PURE__ */ jsx(Progress, {});
|
|
207
|
+
}
|
|
208
|
+
if (!canViewLogs) {
|
|
209
|
+
return /* @__PURE__ */ jsx(
|
|
210
|
+
ForbiddenState,
|
|
211
|
+
{
|
|
212
|
+
message: deniedTooltip,
|
|
213
|
+
permissionName,
|
|
214
|
+
variant: "fullpage"
|
|
215
|
+
}
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
return /* @__PURE__ */ jsx(ObservabilityRuntimeLogsContent, { renderRowAction });
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
export { ObservabilityRuntimeLogsPage };
|
|
222
|
+
//# sourceMappingURL=ObservabilityRuntimeLogsPage.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObservabilityRuntimeLogsPage.esm.js","sources":["../../../src/components/RuntimeLogs/ObservabilityRuntimeLogsPage.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { Box, Typography, Button } from '@material-ui/core';\nimport { Progress } from '@backstage/core-components';\nimport { Alert } from '@material-ui/lab';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { CHOREO_ANNOTATIONS } from '@openchoreo/backstage-plugin-common';\nimport { LogsFilter } from './LogsFilter';\nimport { LogsTable } from './LogsTable';\nimport { LogsActions } from './LogsActions';\nimport {\n useRuntimeLogs,\n useGetNamespaceAndProjectByEntity,\n useGetEnvironmentsByNamespace,\n useUrlFiltersForRuntimeLogs,\n} from '../../hooks';\nimport {\n useInfiniteScroll,\n useLogsPermission,\n ForbiddenState,\n} from '@openchoreo/backstage-plugin-react';\nimport { useRuntimeLogsStyles } from './styles';\nimport { LOG_LEVELS } from './types';\nimport type { RenderLogRowAction } from './LogEntry';\n\nexport interface ObservabilityRuntimeLogsPageProps {\n renderRowAction?: RenderLogRowAction;\n}\n\nconst ObservabilityRuntimeLogsContent = ({\n renderRowAction,\n}: ObservabilityRuntimeLogsPageProps) => {\n const classes = useRuntimeLogsStyles();\n const { entity } = useEntity();\n\n // Get namespace and project names from entity\n const { namespace, project } = useGetNamespaceAndProjectByEntity(entity);\n\n // Fetch environments from observability backend\n const {\n environments,\n loading: environmentsLoading,\n error: environmentsError,\n } = useGetEnvironmentsByNamespace(namespace, project);\n\n const { filters, updateFilters } = useUrlFiltersForRuntimeLogs({\n environments,\n });\n\n const selectedEnvironment = environments.find(\n env => env.name === filters.environment,\n );\n\n // Per-environment permission check: honors ABAC `resource.environment` CEL\n // constraints (openchoreo#3408). Page-level gate below only verifies the\n // user can view logs *somewhere* — this one gates the actual env content.\n const {\n canViewLogs: canViewLogsForEnv,\n loading: envPermissionLoading,\n deniedTooltip: envPermissionDenied,\n permissionName: envPermissionName,\n } = useLogsPermission(selectedEnvironment?.name);\n\n // Get component name from entity annotations\n const componentName =\n entity.metadata.annotations?.[CHOREO_ANNOTATIONS.COMPONENT];\n\n // Track last updated time\n const [lastUpdated, setLastUpdated] = useState<Date>(new Date());\n\n const allLogLevelsSelected = filters.logLevel.length === LOG_LEVELS.length;\n const noLogLevelSelected = filters.logLevel.length === 0;\n\n const {\n logs,\n loading: logsLoading,\n error: logsError,\n totalCount,\n hasMore,\n fetchLogs,\n loadMore,\n refresh,\n clearLogs,\n } = useRuntimeLogs(entity, namespace || '', project || '', {\n environment: filters.environment,\n timeRange: filters.timeRange,\n customStartTime: filters.customStartTime,\n customEndTime: filters.customEndTime,\n logLevels: allLogLevelsSelected ? undefined : filters.logLevel,\n limit: 50,\n searchQuery: filters.searchQuery,\n sortOrder: filters.sortOrder || 'asc',\n isLive: filters.isLive && !noLogLevelSelected,\n });\n\n const { loadingRef } = useInfiniteScroll(loadMore, hasMore, logsLoading);\n\n // Track previous filter values to detect changes\n // Initialize with null to ensure initial fetch happens when all conditions are ready\n const previousFiltersRef = useRef<{\n environment: string;\n logLevel: string[];\n timeRange: string;\n customStartTime?: string;\n customEndTime?: string;\n searchQuery?: string;\n sortOrder?: 'asc' | 'desc';\n } | null>(null);\n\n // Note: Auto-selection of first environment is handled by useUrlFilters hook\n\n // Fetch logs when filters change or when component/project IDs become available\n useEffect(() => {\n const currentFilters = {\n environment: filters.environment,\n logLevel: filters.logLevel,\n timeRange: filters.timeRange,\n customStartTime: filters.customStartTime,\n customEndTime: filters.customEndTime,\n searchQuery: filters.searchQuery,\n sortOrder: filters.sortOrder,\n };\n\n // Only fetch if filters changed (null means first load)\n const filtersChanged =\n previousFiltersRef.current === null ||\n JSON.stringify(previousFiltersRef.current) !==\n JSON.stringify(currentFilters);\n\n if (\n filters.environment &&\n selectedEnvironment &&\n namespace &&\n project &&\n canViewLogsForEnv &&\n filtersChanged\n ) {\n if (filters.logLevel.length === 0) {\n clearLogs();\n } else {\n fetchLogs(true);\n setLastUpdated(new Date());\n }\n previousFiltersRef.current = currentFilters;\n }\n }, [\n filters.environment,\n filters.logLevel,\n filters.timeRange,\n filters.customStartTime,\n filters.customEndTime,\n filters.searchQuery,\n filters.sortOrder,\n fetchLogs,\n clearLogs,\n selectedEnvironment,\n namespace,\n project,\n canViewLogsForEnv,\n envPermissionLoading,\n ]);\n\n // Update lastUpdated when logs are refreshed\n useEffect(() => {\n if (!logsLoading) {\n setLastUpdated(new Date());\n }\n }, [logsLoading]);\n\n const handleRefresh = () => {\n if (noLogLevelSelected) {\n clearLogs();\n return;\n }\n refresh();\n setLastUpdated(new Date());\n };\n\n const handleFiltersChange = (newFilters: Partial<typeof filters>) => {\n updateFilters(newFilters);\n };\n\n const renderError = (error: string) => {\n const isObservabilityDisabled = error.includes(\n 'Observability is not enabled',\n );\n\n return (\n <Alert\n severity={isObservabilityDisabled ? 'info' : 'error'}\n className={classes.errorContainer}\n >\n <Typography variant=\"body1\">\n {isObservabilityDisabled\n ? 'Observability is not enabled for this component in the current environment. Enable observability to view runtime logs.'\n : error}\n </Typography>\n {!isObservabilityDisabled && (\n <Button onClick={handleRefresh} color=\"inherit\" size=\"small\">\n Retry\n </Button>\n )}\n </Alert>\n );\n };\n\n if (environmentsError) {\n return <Box>{renderError(environmentsError)}</Box>;\n }\n\n return (\n <Box>\n <LogsFilter\n filters={filters}\n onFiltersChange={handleFiltersChange}\n environments={environments}\n environmentsLoading={environmentsLoading}\n disabled={logsLoading}\n />\n\n {logsError && renderError(logsError)}\n\n {!filters.environment &&\n !environmentsLoading &&\n environments.length === 0 && (\n <Alert severity=\"info\" className={classes.errorContainer}>\n <Typography variant=\"body1\">\n No environments found. Make sure your component is properly\n configured.\n </Typography>\n </Alert>\n )}\n\n {filters.environment && !envPermissionLoading && !canViewLogsForEnv && (\n <ForbiddenState\n message={envPermissionDenied}\n permissionName={envPermissionName}\n variant=\"compact\"\n />\n )}\n\n {filters.environment && canViewLogsForEnv && (\n <>\n <LogsActions\n totalCount={totalCount}\n disabled={logsLoading || !filters.environment}\n onRefresh={handleRefresh}\n filters={filters}\n onFiltersChange={handleFiltersChange}\n lastUpdated={lastUpdated}\n />\n\n <LogsTable\n selectedFields={filters.selectedFields}\n logs={logs}\n loading={logsLoading}\n hasMore={hasMore}\n loadingRef={loadingRef}\n environmentName={\n selectedEnvironment?.displayName || selectedEnvironment?.name\n }\n projectName={project}\n componentName={componentName}\n renderRowAction={renderRowAction}\n />\n </>\n )}\n </Box>\n );\n};\n\nexport const ObservabilityRuntimeLogsPage = ({\n renderRowAction,\n}: ObservabilityRuntimeLogsPageProps) => {\n const {\n canViewLogs,\n loading: permissionLoading,\n deniedTooltip,\n permissionName,\n } = useLogsPermission();\n\n if (permissionLoading) {\n return <Progress />;\n }\n\n if (!canViewLogs) {\n return (\n <ForbiddenState\n message={deniedTooltip}\n permissionName={permissionName}\n variant=\"fullpage\"\n />\n );\n }\n\n return <ObservabilityRuntimeLogsContent renderRowAction={renderRowAction} />;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { makeStyles } from '@material-ui/core/styles';
|
|
2
|
+
|
|
3
|
+
const useRuntimeLogsStyles = makeStyles((theme) => ({
|
|
4
|
+
errorContainer: {
|
|
5
|
+
marginTop: theme.spacing(2),
|
|
6
|
+
marginBottom: theme.spacing(2)
|
|
7
|
+
}
|
|
8
|
+
}));
|
|
9
|
+
const useLogsActionsStyles = makeStyles((theme) => ({
|
|
10
|
+
statsContainer: {
|
|
11
|
+
marginTop: theme.spacing(2),
|
|
12
|
+
marginBottom: theme.spacing(2),
|
|
13
|
+
display: "flex",
|
|
14
|
+
justifyContent: "space-between",
|
|
15
|
+
alignItems: "center"
|
|
16
|
+
},
|
|
17
|
+
actionsContainer: {
|
|
18
|
+
display: "flex",
|
|
19
|
+
gap: theme.spacing(1),
|
|
20
|
+
alignItems: "center"
|
|
21
|
+
}
|
|
22
|
+
}));
|
|
23
|
+
const useLogsTableStyles = makeStyles((theme) => ({
|
|
24
|
+
tablePaper: {
|
|
25
|
+
marginBottom: theme.spacing(0),
|
|
26
|
+
paddingBottom: theme.spacing(1)
|
|
27
|
+
},
|
|
28
|
+
tableContainer: {
|
|
29
|
+
maxHeight: "calc(100vh - 320px)",
|
|
30
|
+
overflowY: "auto",
|
|
31
|
+
overflowX: "hidden",
|
|
32
|
+
width: "100%"
|
|
33
|
+
},
|
|
34
|
+
table: {
|
|
35
|
+
width: "100%",
|
|
36
|
+
tableLayout: "fixed"
|
|
37
|
+
},
|
|
38
|
+
headerCell: {
|
|
39
|
+
fontWeight: "bold",
|
|
40
|
+
backgroundColor: theme.palette.background.paper,
|
|
41
|
+
position: "sticky",
|
|
42
|
+
top: 0,
|
|
43
|
+
zIndex: 1,
|
|
44
|
+
fontSize: "0.75rem",
|
|
45
|
+
padding: "4px 8px !important"
|
|
46
|
+
},
|
|
47
|
+
emptyState: {
|
|
48
|
+
textAlign: "center",
|
|
49
|
+
padding: theme.spacing(4),
|
|
50
|
+
color: theme.palette.text.secondary
|
|
51
|
+
},
|
|
52
|
+
loadingContainer: {
|
|
53
|
+
display: "flex",
|
|
54
|
+
justifyContent: "center",
|
|
55
|
+
alignItems: "center",
|
|
56
|
+
padding: theme.spacing(2)
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
const useLogEntryStyles = makeStyles((theme) => ({
|
|
60
|
+
logRow: {
|
|
61
|
+
"&:hover": {
|
|
62
|
+
backgroundColor: theme.palette.action.hover
|
|
63
|
+
},
|
|
64
|
+
cursor: "pointer",
|
|
65
|
+
"& > td": {
|
|
66
|
+
padding: "4px 8px !important"
|
|
67
|
+
},
|
|
68
|
+
// Reveal the hover-action button when this row is hovered
|
|
69
|
+
"&:hover $hoverActionButton": {
|
|
70
|
+
opacity: 1,
|
|
71
|
+
pointerEvents: "auto"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
hoverActionButton: {
|
|
75
|
+
opacity: 0,
|
|
76
|
+
pointerEvents: "none",
|
|
77
|
+
transition: "opacity 0.15s ease"
|
|
78
|
+
},
|
|
79
|
+
expandedRow: {
|
|
80
|
+
backgroundColor: theme.palette.action.selected
|
|
81
|
+
},
|
|
82
|
+
monospaceCell: {
|
|
83
|
+
fontFamily: "monospace",
|
|
84
|
+
fontSize: "11px",
|
|
85
|
+
whiteSpace: "nowrap",
|
|
86
|
+
overflow: "hidden",
|
|
87
|
+
textOverflow: "ellipsis"
|
|
88
|
+
},
|
|
89
|
+
logLevelChip: {
|
|
90
|
+
fontSize: "0.6rem",
|
|
91
|
+
fontWeight: "bold",
|
|
92
|
+
minWidth: "40px",
|
|
93
|
+
height: "14px !important",
|
|
94
|
+
"& .MuiChip-label": {
|
|
95
|
+
padding: "0 4px"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
errorChip: {
|
|
99
|
+
backgroundColor: theme.palette.error.light,
|
|
100
|
+
color: theme.palette.error.dark,
|
|
101
|
+
outline: `1px solid ${theme.palette.error.main}`
|
|
102
|
+
},
|
|
103
|
+
warnChip: {
|
|
104
|
+
backgroundColor: theme.palette.warning.light,
|
|
105
|
+
color: theme.palette.warning.dark,
|
|
106
|
+
outline: `1px solid ${theme.palette.warning.main}`
|
|
107
|
+
},
|
|
108
|
+
infoChip: {
|
|
109
|
+
backgroundColor: theme.palette.info.light,
|
|
110
|
+
color: theme.palette.info.dark,
|
|
111
|
+
outline: `1px solid ${theme.palette.info.main}`
|
|
112
|
+
},
|
|
113
|
+
debugChip: {
|
|
114
|
+
backgroundColor: theme.palette.action.disabledBackground,
|
|
115
|
+
color: theme.palette.text.disabled,
|
|
116
|
+
outline: `1px solid ${theme.palette.text.secondary}`
|
|
117
|
+
},
|
|
118
|
+
undefinedChip: {
|
|
119
|
+
backgroundColor: theme.palette.action.disabledBackground,
|
|
120
|
+
color: theme.palette.text.disabled,
|
|
121
|
+
outline: `1px solid ${theme.palette.text.secondary}`
|
|
122
|
+
},
|
|
123
|
+
logMessage: {
|
|
124
|
+
fontFamily: "monospace",
|
|
125
|
+
fontSize: "11px",
|
|
126
|
+
wordBreak: "break-word",
|
|
127
|
+
overflow: "hidden",
|
|
128
|
+
textOverflow: "ellipsis",
|
|
129
|
+
whiteSpace: "pre-wrap",
|
|
130
|
+
display: "-webkit-box",
|
|
131
|
+
WebkitLineClamp: 3,
|
|
132
|
+
WebkitBoxOrient: "vertical",
|
|
133
|
+
maxWidth: "100%"
|
|
134
|
+
},
|
|
135
|
+
expandedLogMessage: {
|
|
136
|
+
whiteSpace: "pre-wrap",
|
|
137
|
+
overflow: "visible",
|
|
138
|
+
display: "block",
|
|
139
|
+
WebkitLineClamp: "unset",
|
|
140
|
+
WebkitBoxOrient: "unset"
|
|
141
|
+
},
|
|
142
|
+
logCell: {
|
|
143
|
+
overflow: "hidden",
|
|
144
|
+
textOverflow: "clip",
|
|
145
|
+
whiteSpace: "normal"
|
|
146
|
+
},
|
|
147
|
+
logCellContent: {
|
|
148
|
+
display: "flex",
|
|
149
|
+
alignItems: "flex-start",
|
|
150
|
+
width: "100%"
|
|
151
|
+
},
|
|
152
|
+
logTextContainer: {
|
|
153
|
+
flex: 1,
|
|
154
|
+
minWidth: 0
|
|
155
|
+
},
|
|
156
|
+
logActionColumn: {
|
|
157
|
+
// Wide enough for the Copy + Investigate icons to sit side by
|
|
158
|
+
// side. The column used to be a 24 px single-icon slot, which
|
|
159
|
+
// forced the second icon to wrap below the first.
|
|
160
|
+
width: theme.spacing(8),
|
|
161
|
+
minWidth: theme.spacing(8),
|
|
162
|
+
display: "flex",
|
|
163
|
+
flexDirection: "row",
|
|
164
|
+
justifyContent: "flex-end",
|
|
165
|
+
alignItems: "center",
|
|
166
|
+
gap: theme.spacing(0.25),
|
|
167
|
+
flexShrink: 0,
|
|
168
|
+
marginLeft: theme.spacing(1)
|
|
169
|
+
},
|
|
170
|
+
containerCell: {
|
|
171
|
+
fontSize: "0.75rem",
|
|
172
|
+
color: theme.palette.text.secondary,
|
|
173
|
+
overflow: "hidden",
|
|
174
|
+
textOverflow: "ellipsis",
|
|
175
|
+
whiteSpace: "nowrap"
|
|
176
|
+
},
|
|
177
|
+
podCell: {
|
|
178
|
+
fontSize: "0.75rem",
|
|
179
|
+
color: theme.palette.text.secondary,
|
|
180
|
+
fontFamily: "monospace",
|
|
181
|
+
overflow: "hidden",
|
|
182
|
+
textOverflow: "ellipsis",
|
|
183
|
+
whiteSpace: "nowrap"
|
|
184
|
+
},
|
|
185
|
+
expandButton: {
|
|
186
|
+
padding: 0,
|
|
187
|
+
"& .MuiSvgIcon-root": {
|
|
188
|
+
fontSize: "1rem"
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
expandedContent: {
|
|
192
|
+
padding: theme.spacing(2),
|
|
193
|
+
backgroundColor: theme.palette.background.default,
|
|
194
|
+
borderRadius: theme.shape.borderRadius
|
|
195
|
+
},
|
|
196
|
+
metadataSection: {
|
|
197
|
+
marginTop: theme.spacing(2)
|
|
198
|
+
},
|
|
199
|
+
metadataTitle: {
|
|
200
|
+
fontWeight: "bold",
|
|
201
|
+
marginBottom: theme.spacing(1),
|
|
202
|
+
fontSize: "11px"
|
|
203
|
+
},
|
|
204
|
+
metadataGrid: {
|
|
205
|
+
display: "grid",
|
|
206
|
+
gridTemplateColumns: "repeat(2, 1fr)",
|
|
207
|
+
gap: theme.spacing(1)
|
|
208
|
+
},
|
|
209
|
+
metadataItem: {
|
|
210
|
+
display: "flex",
|
|
211
|
+
marginBottom: theme.spacing(0.5)
|
|
212
|
+
},
|
|
213
|
+
metadataKey: {
|
|
214
|
+
fontWeight: "bold",
|
|
215
|
+
minWidth: "120px",
|
|
216
|
+
marginRight: theme.spacing(1),
|
|
217
|
+
fontSize: "11px"
|
|
218
|
+
},
|
|
219
|
+
metadataValue: {
|
|
220
|
+
fontFamily: "monospace",
|
|
221
|
+
fontSize: "11px",
|
|
222
|
+
color: theme.palette.text.secondary
|
|
223
|
+
},
|
|
224
|
+
copyButton: {
|
|
225
|
+
// Compact padding so the icon sits flush with the
|
|
226
|
+
// InvestigateLogButton next to it (both render in
|
|
227
|
+
// ``logActionColumn``). The expanded-detail copy button on the
|
|
228
|
+
// metadata section sets its own marginTop locally rather than
|
|
229
|
+
// relying on a class default.
|
|
230
|
+
padding: theme.spacing(0.5)
|
|
231
|
+
},
|
|
232
|
+
fullLogMessage: {
|
|
233
|
+
fontFamily: "monospace",
|
|
234
|
+
fontSize: "11px",
|
|
235
|
+
whiteSpace: "pre-wrap",
|
|
236
|
+
backgroundColor: theme.palette.background.paper,
|
|
237
|
+
padding: theme.spacing(1),
|
|
238
|
+
borderRadius: theme.shape.borderRadius,
|
|
239
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
240
|
+
maxHeight: "200px",
|
|
241
|
+
overflow: "auto"
|
|
242
|
+
},
|
|
243
|
+
metadataBox: {
|
|
244
|
+
backgroundColor: theme.palette.background.paper,
|
|
245
|
+
padding: theme.spacing(1),
|
|
246
|
+
borderRadius: theme.shape.borderRadius,
|
|
247
|
+
border: `1px solid ${theme.palette.divider}`
|
|
248
|
+
},
|
|
249
|
+
expandedSectionTitle: {
|
|
250
|
+
fontSize: "11px",
|
|
251
|
+
fontWeight: "bold"
|
|
252
|
+
}
|
|
253
|
+
}));
|
|
254
|
+
|
|
255
|
+
export { useLogEntryStyles, useLogsActionsStyles, useLogsTableStyles, useRuntimeLogsStyles };
|
|
256
|
+
//# sourceMappingURL=styles.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.esm.js","sources":["../../../src/components/RuntimeLogs/styles.ts"],"sourcesContent":["import { makeStyles } from '@material-ui/core/styles';\n\nexport const useRuntimeLogsStyles = makeStyles(theme => ({\n errorContainer: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n}));\n\nexport const useLogsActionsStyles = makeStyles(theme => ({\n statsContainer: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n actionsContainer: {\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n },\n}));\n\nexport const useLogsTableStyles = makeStyles(theme => ({\n tablePaper: {\n marginBottom: theme.spacing(0),\n paddingBottom: theme.spacing(1),\n },\n tableContainer: {\n maxHeight: 'calc(100vh - 320px)',\n overflowY: 'auto',\n overflowX: 'hidden',\n width: '100%',\n },\n table: {\n width: '100%',\n tableLayout: 'fixed',\n },\n headerCell: {\n fontWeight: 'bold',\n backgroundColor: theme.palette.background.paper,\n position: 'sticky',\n top: 0,\n zIndex: 1,\n fontSize: '0.75rem',\n padding: '4px 8px !important',\n },\n emptyState: {\n textAlign: 'center',\n padding: theme.spacing(4),\n color: theme.palette.text.secondary,\n },\n loadingContainer: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: theme.spacing(2),\n },\n}));\n\nexport const useLogEntryStyles = makeStyles(theme => ({\n logRow: {\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n cursor: 'pointer',\n '& > td': {\n padding: '4px 8px !important',\n },\n // Reveal the hover-action button when this row is hovered\n '&:hover $hoverActionButton': {\n opacity: 1,\n pointerEvents: 'auto',\n },\n },\n hoverActionButton: {\n opacity: 0,\n pointerEvents: 'none',\n transition: 'opacity 0.15s ease',\n },\n expandedRow: {\n backgroundColor: theme.palette.action.selected,\n },\n monospaceCell: {\n fontFamily: 'monospace',\n fontSize: '11px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n logLevelChip: {\n fontSize: '0.6rem',\n fontWeight: 'bold',\n minWidth: '40px',\n height: '14px !important',\n '& .MuiChip-label': {\n padding: '0 4px',\n },\n },\n errorChip: {\n backgroundColor: theme.palette.error.light,\n color: theme.palette.error.dark,\n outline: `1px solid ${theme.palette.error.main}`,\n },\n warnChip: {\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.dark,\n outline: `1px solid ${theme.palette.warning.main}`,\n },\n infoChip: {\n backgroundColor: theme.palette.info.light,\n color: theme.palette.info.dark,\n outline: `1px solid ${theme.palette.info.main}`,\n },\n debugChip: {\n backgroundColor: theme.palette.action.disabledBackground,\n color: theme.palette.text.disabled,\n outline: `1px solid ${theme.palette.text.secondary}`,\n },\n undefinedChip: {\n backgroundColor: theme.palette.action.disabledBackground,\n color: theme.palette.text.disabled,\n outline: `1px solid ${theme.palette.text.secondary}`,\n },\n logMessage: {\n fontFamily: 'monospace',\n fontSize: '11px',\n wordBreak: 'break-word',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'pre-wrap',\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n maxWidth: '100%',\n },\n expandedLogMessage: {\n whiteSpace: 'pre-wrap',\n overflow: 'visible',\n display: 'block',\n WebkitLineClamp: 'unset' as any,\n WebkitBoxOrient: 'unset' as any,\n },\n logCell: {\n overflow: 'hidden',\n textOverflow: 'clip',\n whiteSpace: 'normal',\n },\n logCellContent: {\n display: 'flex',\n alignItems: 'flex-start',\n width: '100%',\n },\n logTextContainer: {\n flex: 1,\n minWidth: 0,\n },\n logActionColumn: {\n // Wide enough for the Copy + Investigate icons to sit side by\n // side. The column used to be a 24 px single-icon slot, which\n // forced the second icon to wrap below the first.\n width: theme.spacing(8),\n minWidth: theme.spacing(8),\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'flex-end',\n alignItems: 'center',\n gap: theme.spacing(0.25),\n flexShrink: 0,\n marginLeft: theme.spacing(1),\n },\n containerCell: {\n fontSize: '0.75rem',\n color: theme.palette.text.secondary,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n podCell: {\n fontSize: '0.75rem',\n color: theme.palette.text.secondary,\n fontFamily: 'monospace',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n expandButton: {\n padding: 0,\n '& .MuiSvgIcon-root': {\n fontSize: '1rem',\n },\n },\n expandedContent: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n borderRadius: theme.shape.borderRadius,\n },\n metadataSection: {\n marginTop: theme.spacing(2),\n },\n metadataTitle: {\n fontWeight: 'bold',\n marginBottom: theme.spacing(1),\n fontSize: '11px',\n },\n metadataGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: theme.spacing(1),\n },\n metadataItem: {\n display: 'flex',\n marginBottom: theme.spacing(0.5),\n },\n metadataKey: {\n fontWeight: 'bold',\n minWidth: '120px',\n marginRight: theme.spacing(1),\n fontSize: '11px',\n },\n metadataValue: {\n fontFamily: 'monospace',\n fontSize: '11px',\n color: theme.palette.text.secondary,\n },\n copyButton: {\n // Compact padding so the icon sits flush with the\n // InvestigateLogButton next to it (both render in\n // ``logActionColumn``). The expanded-detail copy button on the\n // metadata section sets its own marginTop locally rather than\n // relying on a class default.\n padding: theme.spacing(0.5),\n },\n fullLogMessage: {\n fontFamily: 'monospace',\n fontSize: '11px',\n whiteSpace: 'pre-wrap',\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n maxHeight: '200px',\n overflow: 'auto',\n },\n metadataBox: {\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n },\n expandedSectionTitle: {\n fontSize: '11px',\n fontWeight: 'bold',\n },\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const LOG_LEVELS = ["ERROR", "WARN", "INFO", "DEBUG"];
|
|
2
|
+
var LogEntryField = /* @__PURE__ */ ((LogEntryField2) => {
|
|
3
|
+
LogEntryField2["Timestamp"] = "Timestamp";
|
|
4
|
+
LogEntryField2["Log"] = "Log";
|
|
5
|
+
LogEntryField2["LogLevel"] = "LogLevel";
|
|
6
|
+
LogEntryField2["ComponentName"] = "Component Name";
|
|
7
|
+
return LogEntryField2;
|
|
8
|
+
})(LogEntryField || {});
|
|
9
|
+
const SELECTED_FIELDS = [
|
|
10
|
+
"Timestamp" /* Timestamp */,
|
|
11
|
+
"LogLevel" /* LogLevel */,
|
|
12
|
+
"Log" /* Log */
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
export { LOG_LEVELS, LogEntryField, SELECTED_FIELDS };
|
|
16
|
+
//# sourceMappingURL=types.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.esm.js","sources":["../../../src/components/RuntimeLogs/types.ts"],"sourcesContent":["import type { ComponentLogEntry } from '@openchoreo/backstage-plugin-common';\n\n/**\n * A single component log entry as returned by POST /api/v1/logs/query.\n * Fields come from the ComponentLogEntry schema (new unified API).\n */\nexport type LogEntry = ComponentLogEntry;\n\nexport interface LogsResponse {\n logs: LogEntry[];\n /** Total number of matching logs (renamed from totalCount in old API) */\n total?: number;\n tookMs?: number;\n}\n\nexport interface RuntimeLogsFilters {\n logLevel: string[];\n selectedFields: LogEntryField[];\n environment: string;\n timeRange: string;\n /** ISO start time, used when `timeRange === 'custom'` */\n customStartTime?: string;\n /** ISO end time, used when `timeRange === 'custom'` */\n customEndTime?: string;\n components?: string[];\n searchQuery?: string;\n sortOrder?: 'asc' | 'desc';\n isLive?: boolean;\n}\n\nexport interface RuntimeLogsPagination {\n hasMore: boolean;\n offset: number;\n limit: number;\n}\n\nexport interface RuntimeLogsState {\n logs: LogEntry[];\n loading: boolean;\n error: string | null;\n filters: RuntimeLogsFilters;\n pagination: RuntimeLogsPagination;\n}\n\nexport interface RuntimeLogsParams {\n componentName: string;\n environmentName: string;\n logLevels: string[];\n startTime: string;\n endTime: string;\n limit?: number;\n offset?: number;\n}\n\nexport type LogLevel = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';\n\nexport const LOG_LEVELS: LogLevel[] = ['ERROR', 'WARN', 'INFO', 'DEBUG'];\n\nexport enum LogEntryField {\n Timestamp = 'Timestamp',\n Log = 'Log',\n LogLevel = 'LogLevel',\n ComponentName = 'Component Name',\n}\n\nexport const SELECTED_FIELDS = [\n LogEntryField.Timestamp,\n LogEntryField.LogLevel,\n LogEntryField.Log,\n];\n"],"names":["LogEntryField"],"mappings":"AAwDO,MAAM,UAAA,GAAyB,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,OAAO;AAEhE,IAAK,aAAA,qBAAAA,cAAAA,KAAL;AACL,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,eAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,eAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,eAAA,eAAA,CAAA,GAAgB,gBAAA;AAJN,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAOL,MAAM,eAAA,GAAkB;AAAA,EAC7B,WAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AACF;;;;"}
|