@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 @@
|
|
|
1
|
+
{"version":3,"file":"useTraces.esm.js","sources":["../../src/hooks/useTraces.ts"],"sourcesContent":["import { useCallback, useEffect, useState, useMemo } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { observabilityApiRef } from '../api/ObservabilityApi';\nimport { Filters, Trace } from '../types';\nimport { Entity } from '@backstage/catalog-model';\nimport { CHOREO_ANNOTATIONS } from '@openchoreo/backstage-plugin-common';\nimport { calculateTimeRange } from '@openchoreo/backstage-plugin-react';\n\nconst sortByStartTime = (traceList: Trace[]): Trace[] =>\n [...traceList].sort((a, b) => {\n const aTime = a.startTime ? new Date(a.startTime).getTime() : 0;\n const bTime = b.startTime ? new Date(b.startTime).getTime() : 0;\n return bTime - aTime;\n });\n\nexport function useTraces(filters: Filters, entity: Entity) {\n const observabilityApi = useApi(observabilityApiRef);\n const [traces, setTraces] = useState<Trace[]>([]);\n const [total, setTotal] = useState<number>(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const namespace =\n entity.metadata.annotations?.[CHOREO_ANNOTATIONS.NAMESPACE] ?? '';\n const projectName = entity.metadata.name as string;\n\n // Memoize components string for dependency array\n const componentsKey = useMemo(\n () => filters.components?.join(',') || '',\n [filters.components],\n );\n\n // Memoize filtered traces based on searchQuery\n const filteredTraces = useMemo(() => {\n if (!filters.searchQuery || filters.searchQuery.trim() === '') {\n return traces;\n }\n const searchLower = filters.searchQuery.toLowerCase().trim();\n return traces.filter(trace =>\n trace.traceId.toLowerCase().includes(searchLower),\n );\n }, [traces, filters.searchQuery]);\n\n const fetchTraces = useCallback(async () => {\n if (!filters.environment || !filters.timeRange) {\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const { startTime, endTime } = calculateTimeRange(filters.timeRange, {\n startTime: filters.customStartTime,\n endTime: filters.customEndTime,\n });\n\n const selectedComponents = filters.components ?? [];\n\n const responses =\n selectedComponents.length > 0\n ? await Promise.all(\n selectedComponents.map(name =>\n observabilityApi.getTraces(\n namespace,\n projectName,\n filters.environment.name,\n name,\n { limit: 100, startTime, endTime, sortOrder: 'desc' },\n ),\n ),\n )\n : [\n await observabilityApi.getTraces(\n namespace,\n projectName,\n filters.environment.name,\n undefined,\n { limit: 100, startTime, endTime, sortOrder: 'desc' },\n ),\n ];\n\n // Merge and deduplicate by traceId (same trace can appear from multiple components)\n const seenIds = new Map<string, Trace>();\n responses\n .flatMap(r => r.traces)\n .forEach(trace => {\n if (!seenIds.has(trace.traceId)) seenIds.set(trace.traceId, trace);\n });\n const merged = sortByStartTime(Array.from(seenIds.values()));\n\n setTraces(merged);\n setTotal(merged.length);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch traces');\n } finally {\n setLoading(false);\n }\n }, [\n observabilityApi,\n filters.environment,\n filters.timeRange,\n filters.customStartTime,\n filters.customEndTime,\n filters.components,\n namespace,\n projectName,\n ]);\n\n // Auto-fetch traces when filters change\n useEffect(() => {\n if (filters.environment && filters.timeRange) {\n fetchTraces();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n filters.environment,\n filters.timeRange,\n filters.customStartTime,\n filters.customEndTime,\n componentsKey,\n ]);\n\n const refresh = useCallback(() => {\n setTraces([]);\n setTotal(0);\n fetchTraces();\n }, [fetchTraces]);\n\n return {\n traces: filteredTraces,\n total,\n loading,\n error,\n refresh,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useState, useRef, useCallback } from 'react';
|
|
2
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
3
|
+
import { observabilityApiRef } from '../api/ObservabilityApi.esm.js';
|
|
4
|
+
import '../api/RCAAgentApi.esm.js';
|
|
5
|
+
import '../api/FinOpsAgentApi.esm.js';
|
|
6
|
+
|
|
7
|
+
function useUpdateIncident() {
|
|
8
|
+
const observabilityApi = useApi(observabilityApiRef);
|
|
9
|
+
const [updating, setUpdating] = useState(false);
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
const inFlightRef = useRef(false);
|
|
12
|
+
const updateIncident = useCallback(
|
|
13
|
+
async (incident, newStatus) => {
|
|
14
|
+
if (inFlightRef.current) {
|
|
15
|
+
throw new Error("An incident update is already in progress.");
|
|
16
|
+
}
|
|
17
|
+
const namespaceName = incident.namespaceName || "";
|
|
18
|
+
const environmentName = incident.environmentName || "";
|
|
19
|
+
if (!namespaceName || !environmentName) {
|
|
20
|
+
const msg = "Cannot update incident: missing namespace or environment.";
|
|
21
|
+
setError(msg);
|
|
22
|
+
throw new Error(msg);
|
|
23
|
+
}
|
|
24
|
+
inFlightRef.current = true;
|
|
25
|
+
setUpdating(true);
|
|
26
|
+
setError(null);
|
|
27
|
+
try {
|
|
28
|
+
await observabilityApi.updateIncidentStatus(
|
|
29
|
+
incident.incidentId,
|
|
30
|
+
newStatus,
|
|
31
|
+
namespaceName,
|
|
32
|
+
environmentName
|
|
33
|
+
);
|
|
34
|
+
} catch (err) {
|
|
35
|
+
const msg = err instanceof Error ? err.message : "Failed to update incident.";
|
|
36
|
+
setError(msg);
|
|
37
|
+
throw err;
|
|
38
|
+
} finally {
|
|
39
|
+
setUpdating(false);
|
|
40
|
+
inFlightRef.current = false;
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
[observabilityApi]
|
|
44
|
+
);
|
|
45
|
+
const clearError = useCallback(() => setError(null), []);
|
|
46
|
+
return { updateIncident, updating, error, clearError };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { useUpdateIncident };
|
|
50
|
+
//# sourceMappingURL=useUpdateIncident.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpdateIncident.esm.js","sources":["../../src/hooks/useUpdateIncident.ts"],"sourcesContent":["import { useState, useCallback, useRef } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { observabilityApiRef } from '../api';\nimport type { IncidentSummary } from '../types';\n\nexport interface UseUpdateIncidentResult {\n updateIncident: (\n incident: IncidentSummary,\n newStatus: 'acknowledged' | 'resolved',\n ) => Promise<void>;\n updating: boolean;\n error: string | null;\n clearError: () => void;\n}\n\nexport function useUpdateIncident(): UseUpdateIncidentResult {\n const observabilityApi = useApi(observabilityApiRef);\n const [updating, setUpdating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inFlightRef = useRef(false);\n\n const updateIncident = useCallback(\n async (\n incident: IncidentSummary,\n newStatus: 'acknowledged' | 'resolved',\n ): Promise<void> => {\n if (inFlightRef.current) {\n throw new Error('An incident update is already in progress.');\n }\n\n const namespaceName = incident.namespaceName || '';\n const environmentName = incident.environmentName || '';\n\n if (!namespaceName || !environmentName) {\n const msg = 'Cannot update incident: missing namespace or environment.';\n setError(msg);\n throw new Error(msg);\n }\n\n inFlightRef.current = true;\n setUpdating(true);\n setError(null);\n\n try {\n await observabilityApi.updateIncidentStatus(\n incident.incidentId,\n newStatus,\n namespaceName,\n environmentName,\n );\n } catch (err) {\n const msg =\n err instanceof Error ? err.message : 'Failed to update incident.';\n setError(msg);\n throw err; // re-throw so the caller can skip refresh on failure\n } finally {\n setUpdating(false);\n inFlightRef.current = false;\n }\n },\n [observabilityApi],\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n return { updateIncident, updating, error, clearError };\n}\n"],"names":[],"mappings":";;;;;;AAeO,SAAS,iBAAA,GAA6C;AAC3D,EAAA,MAAM,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,OAAO,KAAK,CAAA;AAEhC,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,OACE,UACA,SAAA,KACkB;AAClB,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAC9D;AAEA,MAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,EAAA;AAChD,MAAA,MAAM,eAAA,GAAkB,SAAS,eAAA,IAAmB,EAAA;AAEpD,MAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,eAAA,EAAiB;AACtC,QAAA,MAAM,GAAA,GAAM,2DAAA;AACZ,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,MACrB;AAEA,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,gBAAA,CAAiB,oBAAA;AAAA,UACrB,QAAA,CAAS,UAAA;AAAA,UACT,SAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,GAAA,GACJ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAAA;AACvC,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,MAAM,GAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,aAAa,WAAA,CAAY,MAAM,SAAS,IAAI,CAAA,EAAG,EAAE,CAAA;AAEvD,EAAA,OAAO,EAAE,cAAA,EAAgB,QAAA,EAAU,KAAA,EAAO,UAAA,EAAW;AACvD;;;;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { useMemo, useCallback } from 'react';
|
|
2
|
+
import { useSearchParams } from 'react-router-dom';
|
|
3
|
+
import { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment.esm.js';
|
|
4
|
+
import { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange.esm.js';
|
|
5
|
+
|
|
6
|
+
function useUrlFilters({ environments }) {
|
|
7
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
8
|
+
const filters = useMemo(() => {
|
|
9
|
+
const envName = searchParams.get("env");
|
|
10
|
+
const components = searchParams.get("components")?.split(",").filter(Boolean) || [];
|
|
11
|
+
const searchQuery = searchParams.get("q") || "";
|
|
12
|
+
const environment = envName ? environments.find(
|
|
13
|
+
(e) => e.name === envName || e.displayName === envName || e.name.toLowerCase() === envName.toLowerCase()
|
|
14
|
+
) || null : null;
|
|
15
|
+
return {
|
|
16
|
+
environment,
|
|
17
|
+
...parseUrlTimeRange(searchParams),
|
|
18
|
+
components,
|
|
19
|
+
searchQuery
|
|
20
|
+
};
|
|
21
|
+
}, [searchParams, environments]);
|
|
22
|
+
useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);
|
|
23
|
+
const updateFilters = useCallback(
|
|
24
|
+
(newFilters) => {
|
|
25
|
+
const newParams = new URLSearchParams(searchParams);
|
|
26
|
+
if (newFilters.environment !== void 0) {
|
|
27
|
+
if (newFilters.environment) {
|
|
28
|
+
newParams.set("env", newFilters.environment.name);
|
|
29
|
+
} else {
|
|
30
|
+
newParams.delete("env");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
writeUrlTimeRange(newParams, newFilters);
|
|
34
|
+
if (newFilters.components !== void 0) {
|
|
35
|
+
if (newFilters.components.length > 0) {
|
|
36
|
+
newParams.set("components", newFilters.components.join(","));
|
|
37
|
+
} else {
|
|
38
|
+
newParams.delete("components");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (newFilters.searchQuery !== void 0) {
|
|
42
|
+
if (newFilters.searchQuery) {
|
|
43
|
+
newParams.set("q", newFilters.searchQuery);
|
|
44
|
+
} else {
|
|
45
|
+
newParams.delete("q");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
setSearchParams(newParams, { replace: true });
|
|
49
|
+
},
|
|
50
|
+
[searchParams, setSearchParams]
|
|
51
|
+
);
|
|
52
|
+
const resetFilters = useCallback(() => {
|
|
53
|
+
const newParams = new URLSearchParams();
|
|
54
|
+
if (environments.length > 0) {
|
|
55
|
+
newParams.set("env", environments[0].name);
|
|
56
|
+
}
|
|
57
|
+
setSearchParams(newParams, { replace: true });
|
|
58
|
+
}, [environments, setSearchParams]);
|
|
59
|
+
return { filters, updateFilters, resetFilters };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { useUrlFilters };
|
|
63
|
+
//# sourceMappingURL=useUrlFilters.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUrlFilters.esm.js","sources":["../../src/hooks/useUrlFilters.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport type { Filters, Environment } from '../types';\nimport { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment';\nimport { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange';\n\ninterface UseUrlFiltersOptions {\n /** Available environments to map names to objects */\n environments: Environment[];\n}\n\n/**\n * Hook for managing observability filters synced to URL query parameters.\n *\n * Query parameters:\n * - `env`: Environment name\n * - `timeRange`: Time range value (defaults to '10m')\n * - `components`: Comma-separated component IDs\n * - `q`: Search query string\n *\n * @example\n * ```tsx\n * const { filters, updateFilters, resetFilters } = useUrlFilters({\n * environments,\n * });\n *\n * // Read filter values\n * console.log(filters.environment, filters.timeRange);\n *\n * // Update filters (writes to URL)\n * updateFilters({ timeRange: '24h' });\n * ```\n */\nexport function useUrlFilters({ environments }: UseUrlFiltersOptions) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Parse filters from URL\n const filters = useMemo<Filters>(() => {\n const envName = searchParams.get('env');\n const components =\n searchParams.get('components')?.split(',').filter(Boolean) || [];\n const searchQuery = searchParams.get('q') || '';\n\n // Find environment by name\n const environment = envName\n ? environments.find(\n e =>\n e.name === envName ||\n e.displayName === envName ||\n e.name.toLowerCase() === envName.toLowerCase(),\n ) || (null as unknown as Environment)\n : (null as unknown as Environment);\n\n return {\n environment,\n ...parseUrlTimeRange(searchParams),\n components,\n searchQuery,\n };\n }, [searchParams, environments]);\n\n // Auto-select first environment if none selected or URL has a stale env name\n useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);\n\n // Update URL when filters change\n const updateFilters = useCallback(\n (newFilters: Partial<Filters>) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newFilters.environment !== undefined) {\n if (newFilters.environment) {\n newParams.set('env', newFilters.environment.name);\n } else {\n newParams.delete('env');\n }\n }\n\n writeUrlTimeRange(newParams, newFilters);\n\n if (newFilters.components !== undefined) {\n if (newFilters.components.length > 0) {\n newParams.set('components', newFilters.components.join(','));\n } else {\n newParams.delete('components');\n }\n }\n\n if (newFilters.searchQuery !== undefined) {\n if (newFilters.searchQuery) {\n newParams.set('q', newFilters.searchQuery);\n } else {\n newParams.delete('q');\n }\n }\n\n setSearchParams(newParams, { replace: true });\n },\n [searchParams, setSearchParams],\n );\n\n // Reset filters to defaults\n const resetFilters = useCallback(() => {\n const newParams = new URLSearchParams();\n if (environments.length > 0) {\n newParams.set('env', environments[0].name);\n }\n setSearchParams(newParams, { replace: true });\n }, [environments, setSearchParams]);\n\n return { filters, updateFilters, resetFilters };\n}\n"],"names":[],"mappings":";;;;;AAiCO,SAAS,aAAA,CAAc,EAAE,YAAA,EAAa,EAAyB;AACpE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,eAAA,EAAgB;AAGxD,EAAA,MAAM,OAAA,GAAU,QAAiB,MAAM;AACrC,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AACtC,IAAA,MAAM,UAAA,GACJ,YAAA,CAAa,GAAA,CAAI,YAAY,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,IAAK,EAAC;AACjE,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,IAAK,EAAA;AAG7C,IAAA,MAAM,WAAA,GAAc,UAChB,YAAA,CAAa,IAAA;AAAA,MACX,CAAA,CAAA,KACE,CAAA,CAAE,IAAA,KAAS,OAAA,IACX,CAAA,CAAE,WAAA,KAAgB,OAAA,IAClB,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,OAAA,CAAQ,WAAA;AAAY,SAC3C,IAAA,GACL,IAAA;AAEL,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,GAAG,kBAAkB,YAAY,CAAA;AAAA,MACjC,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAG/B,EAAA,6BAAA,CAA8B,YAAA,EAAc,cAAc,eAAe,CAAA;AAGzE,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,UAAA,KAAiC;AAChC,MAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAgB,YAAY,CAAA;AAElD,MAAA,IAAI,UAAA,CAAW,gBAAgB,MAAA,EAAW;AACxC,QAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,UAAA,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,UAAA,CAAW,WAAA,CAAY,IAAI,CAAA;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AAEA,MAAA,iBAAA,CAAkB,WAAW,UAAU,CAAA;AAEvC,MAAA,IAAI,UAAA,CAAW,eAAe,MAAA,EAAW;AACvC,QAAA,IAAI,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACpC,UAAA,SAAA,CAAU,IAAI,YAAA,EAAc,UAAA,CAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QAC7D,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,OAAO,YAAY,CAAA;AAAA,QAC/B;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,gBAAgB,MAAA,EAAW;AACxC,QAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,UAAA,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,UAAA,CAAW,WAAW,CAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,QACtB;AAAA,MACF;AAEA,MAAA,eAAA,CAAgB,SAAA,EAAW,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,CAAC,cAAc,eAAe;AAAA,GAChC;AAGA,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,MAAM,SAAA,GAAY,IAAI,eAAA,EAAgB;AACtC,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,YAAA,CAAa,CAAC,EAAE,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,eAAA,CAAgB,SAAA,EAAW,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,YAAA,EAAc,eAAe,CAAC,CAAA;AAElC,EAAA,OAAO,EAAE,OAAA,EAAS,aAAA,EAAe,YAAA,EAAa;AAChD;;;;"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { useMemo, useCallback } from 'react';
|
|
2
|
+
import { useSearchParams } from 'react-router-dom';
|
|
3
|
+
import { ALERT_SEVERITIES } from '../components/Alerts/types.esm.js';
|
|
4
|
+
import { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment.esm.js';
|
|
5
|
+
import { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange.esm.js';
|
|
6
|
+
|
|
7
|
+
function useUrlFiltersForAlerts({
|
|
8
|
+
environments
|
|
9
|
+
}) {
|
|
10
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
11
|
+
const filters = useMemo(() => {
|
|
12
|
+
const envName = searchParams.get("env");
|
|
13
|
+
const { timeRange, customStartTime, customEndTime } = parseUrlTimeRange(searchParams);
|
|
14
|
+
const rawSortOrder = searchParams.get("sort");
|
|
15
|
+
const sortOrder = rawSortOrder === "asc" || rawSortOrder === "desc" ? rawSortOrder : "desc";
|
|
16
|
+
const severityParam = searchParams.get("severity");
|
|
17
|
+
const severity = severityParam ? severityParam.split(",").filter(
|
|
18
|
+
(s) => Boolean(s) && ALERT_SEVERITIES.includes(s)
|
|
19
|
+
) : [];
|
|
20
|
+
const searchQuery = searchParams.get("search") || void 0;
|
|
21
|
+
const environment = envName ? environments.find((e) => e.name === envName) : void 0;
|
|
22
|
+
return {
|
|
23
|
+
environment: environment?.name || "",
|
|
24
|
+
timeRange,
|
|
25
|
+
customStartTime,
|
|
26
|
+
customEndTime,
|
|
27
|
+
sortOrder,
|
|
28
|
+
severity: severity.length > 0 ? severity : void 0,
|
|
29
|
+
searchQuery
|
|
30
|
+
};
|
|
31
|
+
}, [searchParams, environments]);
|
|
32
|
+
useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);
|
|
33
|
+
const updateFilters = useCallback(
|
|
34
|
+
(newFilters) => {
|
|
35
|
+
const newParams = new URLSearchParams(searchParams);
|
|
36
|
+
if (newFilters.environment !== void 0) {
|
|
37
|
+
if (newFilters.environment) {
|
|
38
|
+
newParams.set("env", newFilters.environment);
|
|
39
|
+
} else {
|
|
40
|
+
newParams.delete("env");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
writeUrlTimeRange(newParams, newFilters);
|
|
44
|
+
if (newFilters.sortOrder !== void 0) {
|
|
45
|
+
if (newFilters.sortOrder === "desc") {
|
|
46
|
+
newParams.delete("sort");
|
|
47
|
+
} else {
|
|
48
|
+
newParams.set("sort", newFilters.sortOrder);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (newFilters.severity !== void 0) {
|
|
52
|
+
if (newFilters.severity && newFilters.severity.length > 0) {
|
|
53
|
+
newParams.set("severity", newFilters.severity.join(","));
|
|
54
|
+
} else {
|
|
55
|
+
newParams.delete("severity");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (newFilters.searchQuery !== void 0) {
|
|
59
|
+
if (newFilters.searchQuery) {
|
|
60
|
+
newParams.set("search", newFilters.searchQuery);
|
|
61
|
+
} else {
|
|
62
|
+
newParams.delete("search");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
setSearchParams(newParams, { replace: true });
|
|
66
|
+
},
|
|
67
|
+
[searchParams, setSearchParams]
|
|
68
|
+
);
|
|
69
|
+
const resetFilters = useCallback(() => {
|
|
70
|
+
const newParams = new URLSearchParams();
|
|
71
|
+
if (environments.length > 0) {
|
|
72
|
+
newParams.set("env", environments[0].name);
|
|
73
|
+
}
|
|
74
|
+
setSearchParams(newParams, { replace: true });
|
|
75
|
+
}, [environments, setSearchParams]);
|
|
76
|
+
return { filters, updateFilters, resetFilters };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { useUrlFiltersForAlerts };
|
|
80
|
+
//# sourceMappingURL=useUrlFiltersForAlerts.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUrlFiltersForAlerts.esm.js","sources":["../../src/hooks/useUrlFiltersForAlerts.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { type Environment } from '../types';\nimport {\n type AlertsFilters,\n ALERT_SEVERITIES,\n} from '../components/Alerts/types';\nimport { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment';\nimport { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange';\n\ninterface UseUrlFiltersForAlertsOptions {\n environments: Environment[];\n}\n\nexport function useUrlFiltersForAlerts({\n environments,\n}: UseUrlFiltersForAlertsOptions): {\n filters: AlertsFilters;\n updateFilters: (newFilters: Partial<AlertsFilters>) => void;\n resetFilters: () => void;\n} {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const filters = useMemo<AlertsFilters>(() => {\n const envName = searchParams.get('env');\n const { timeRange, customStartTime, customEndTime } =\n parseUrlTimeRange(searchParams);\n const rawSortOrder = searchParams.get('sort');\n const sortOrder: 'asc' | 'desc' =\n rawSortOrder === 'asc' || rawSortOrder === 'desc' ? rawSortOrder : 'desc';\n const severityParam = searchParams.get('severity');\n const severity = severityParam\n ? severityParam\n .split(',')\n .filter(\n s =>\n Boolean(s) && (ALERT_SEVERITIES as readonly string[]).includes(s),\n )\n : [];\n const searchQuery = searchParams.get('search') || undefined;\n\n const environment = envName\n ? environments.find(e => e.name === envName)\n : undefined;\n\n return {\n environment: environment?.name || '',\n timeRange,\n customStartTime,\n customEndTime,\n sortOrder,\n severity: severity.length > 0 ? severity : undefined,\n searchQuery,\n };\n }, [searchParams, environments]);\n\n useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);\n\n const updateFilters = useCallback(\n (newFilters: Partial<AlertsFilters>) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newFilters.environment !== undefined) {\n if (newFilters.environment) {\n newParams.set('env', newFilters.environment);\n } else {\n newParams.delete('env');\n }\n }\n\n writeUrlTimeRange(newParams, newFilters);\n\n if (newFilters.sortOrder !== undefined) {\n if (newFilters.sortOrder === 'desc') {\n newParams.delete('sort');\n } else {\n newParams.set('sort', newFilters.sortOrder);\n }\n }\n\n if (newFilters.severity !== undefined) {\n if (newFilters.severity && newFilters.severity.length > 0) {\n newParams.set('severity', newFilters.severity.join(','));\n } else {\n newParams.delete('severity');\n }\n }\n\n if (newFilters.searchQuery !== undefined) {\n if (newFilters.searchQuery) {\n newParams.set('search', newFilters.searchQuery);\n } else {\n newParams.delete('search');\n }\n }\n\n setSearchParams(newParams, { replace: true });\n },\n [searchParams, setSearchParams],\n );\n\n const resetFilters = useCallback(() => {\n const newParams = new URLSearchParams();\n if (environments.length > 0) {\n newParams.set('env', environments[0].name);\n }\n setSearchParams(newParams, { replace: true });\n }, [environments, setSearchParams]);\n\n return { filters, updateFilters, resetFilters };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { useMemo, useCallback } from 'react';
|
|
2
|
+
import { useSearchParams } from 'react-router-dom';
|
|
3
|
+
import { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment.esm.js';
|
|
4
|
+
import { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange.esm.js';
|
|
5
|
+
|
|
6
|
+
function useUrlFiltersForIncidents({
|
|
7
|
+
environments
|
|
8
|
+
}) {
|
|
9
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
10
|
+
const filters = useMemo(() => {
|
|
11
|
+
const envName = searchParams.get("env");
|
|
12
|
+
const { timeRange, customStartTime, customEndTime } = parseUrlTimeRange(searchParams);
|
|
13
|
+
const rawSortOrder = searchParams.get("sort");
|
|
14
|
+
const sortOrder = rawSortOrder === "asc" || rawSortOrder === "desc" ? rawSortOrder : "desc";
|
|
15
|
+
const componentsParam = searchParams.get("components");
|
|
16
|
+
const components = componentsParam ? componentsParam.split(",").filter(Boolean) : [];
|
|
17
|
+
const statusParam = searchParams.get("status");
|
|
18
|
+
const status = statusParam ? statusParam.split(",").filter(Boolean) : [];
|
|
19
|
+
const searchQuery = searchParams.get("search") || void 0;
|
|
20
|
+
const environment = envName ? environments.find((e) => e.name === envName) : void 0;
|
|
21
|
+
return {
|
|
22
|
+
environment: environment?.name || "",
|
|
23
|
+
timeRange,
|
|
24
|
+
customStartTime,
|
|
25
|
+
customEndTime,
|
|
26
|
+
sortOrder,
|
|
27
|
+
components: components.length > 0 ? components : void 0,
|
|
28
|
+
status: status.length > 0 ? status : void 0,
|
|
29
|
+
searchQuery
|
|
30
|
+
};
|
|
31
|
+
}, [searchParams, environments]);
|
|
32
|
+
useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);
|
|
33
|
+
const updateFilters = useCallback(
|
|
34
|
+
(newFilters) => {
|
|
35
|
+
const newParams = new URLSearchParams(searchParams);
|
|
36
|
+
if (newFilters.environment !== void 0) {
|
|
37
|
+
if (newFilters.environment) {
|
|
38
|
+
newParams.set("env", newFilters.environment);
|
|
39
|
+
} else {
|
|
40
|
+
newParams.delete("env");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
writeUrlTimeRange(newParams, newFilters);
|
|
44
|
+
if (newFilters.sortOrder !== void 0) {
|
|
45
|
+
if (newFilters.sortOrder === "desc") {
|
|
46
|
+
newParams.delete("sort");
|
|
47
|
+
} else {
|
|
48
|
+
newParams.set("sort", newFilters.sortOrder);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (newFilters.components !== void 0) {
|
|
52
|
+
if (newFilters.components && newFilters.components.length > 0) {
|
|
53
|
+
newParams.set("components", newFilters.components.join(","));
|
|
54
|
+
} else {
|
|
55
|
+
newParams.delete("components");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (newFilters.status !== void 0) {
|
|
59
|
+
if (newFilters.status && newFilters.status.length > 0) {
|
|
60
|
+
newParams.set("status", newFilters.status.join(","));
|
|
61
|
+
} else {
|
|
62
|
+
newParams.delete("status");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (newFilters.searchQuery !== void 0) {
|
|
66
|
+
if (newFilters.searchQuery) {
|
|
67
|
+
newParams.set("search", newFilters.searchQuery);
|
|
68
|
+
} else {
|
|
69
|
+
newParams.delete("search");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
setSearchParams(newParams, { replace: true });
|
|
73
|
+
},
|
|
74
|
+
[searchParams, setSearchParams]
|
|
75
|
+
);
|
|
76
|
+
const resetFilters = useCallback(() => {
|
|
77
|
+
const newParams = new URLSearchParams();
|
|
78
|
+
if (environments.length > 0) {
|
|
79
|
+
newParams.set("env", environments[0].name);
|
|
80
|
+
}
|
|
81
|
+
setSearchParams(newParams, { replace: true });
|
|
82
|
+
}, [environments, setSearchParams]);
|
|
83
|
+
return { filters, updateFilters, resetFilters };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export { useUrlFiltersForIncidents };
|
|
87
|
+
//# sourceMappingURL=useUrlFiltersForIncidents.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUrlFiltersForIncidents.esm.js","sources":["../../src/hooks/useUrlFiltersForIncidents.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport type { Environment } from '../types';\nimport type { IncidentsFilters } from '../components/Incidents/types';\nimport { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment';\nimport { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange';\n\ninterface UseUrlFiltersForIncidentsOptions {\n environments: Environment[];\n}\n\nexport function useUrlFiltersForIncidents({\n environments,\n}: UseUrlFiltersForIncidentsOptions): {\n filters: IncidentsFilters;\n updateFilters: (newFilters: Partial<IncidentsFilters>) => void;\n resetFilters: () => void;\n} {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const filters = useMemo<IncidentsFilters>(() => {\n const envName = searchParams.get('env');\n const { timeRange, customStartTime, customEndTime } =\n parseUrlTimeRange(searchParams);\n const rawSortOrder = searchParams.get('sort');\n const sortOrder: 'asc' | 'desc' =\n rawSortOrder === 'asc' || rawSortOrder === 'desc' ? rawSortOrder : 'desc';\n const componentsParam = searchParams.get('components');\n const components = componentsParam\n ? componentsParam.split(',').filter(Boolean)\n : [];\n const statusParam = searchParams.get('status');\n const status = statusParam ? statusParam.split(',').filter(Boolean) : [];\n const searchQuery = searchParams.get('search') || undefined;\n\n const environment = envName\n ? environments.find(e => e.name === envName)\n : undefined;\n\n return {\n environment: environment?.name || '',\n timeRange,\n customStartTime,\n customEndTime,\n sortOrder,\n components: components.length > 0 ? components : undefined,\n status: status.length > 0 ? status : undefined,\n searchQuery,\n };\n }, [searchParams, environments]);\n\n useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);\n\n const updateFilters = useCallback(\n (newFilters: Partial<IncidentsFilters>) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newFilters.environment !== undefined) {\n if (newFilters.environment) {\n newParams.set('env', newFilters.environment);\n } else {\n newParams.delete('env');\n }\n }\n\n writeUrlTimeRange(newParams, newFilters);\n\n if (newFilters.sortOrder !== undefined) {\n if (newFilters.sortOrder === 'desc') {\n newParams.delete('sort');\n } else {\n newParams.set('sort', newFilters.sortOrder);\n }\n }\n\n if (newFilters.components !== undefined) {\n if (newFilters.components && newFilters.components.length > 0) {\n newParams.set('components', newFilters.components.join(','));\n } else {\n newParams.delete('components');\n }\n }\n\n if (newFilters.status !== undefined) {\n if (newFilters.status && newFilters.status.length > 0) {\n newParams.set('status', newFilters.status.join(','));\n } else {\n newParams.delete('status');\n }\n }\n\n if (newFilters.searchQuery !== undefined) {\n if (newFilters.searchQuery) {\n newParams.set('search', newFilters.searchQuery);\n } else {\n newParams.delete('search');\n }\n }\n\n setSearchParams(newParams, { replace: true });\n },\n [searchParams, setSearchParams],\n );\n\n const resetFilters = useCallback(() => {\n const newParams = new URLSearchParams();\n if (environments.length > 0) {\n newParams.set('env', environments[0].name);\n }\n setSearchParams(newParams, { replace: true });\n }, [environments, setSearchParams]);\n\n return { filters, updateFilters, resetFilters };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { useMemo, useCallback } from 'react';
|
|
2
|
+
import { useSearchParams } from 'react-router-dom';
|
|
3
|
+
import { LOG_LEVELS, LogEntryField, SELECTED_FIELDS } from '../components/RuntimeLogs/types.esm.js';
|
|
4
|
+
import { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment.esm.js';
|
|
5
|
+
import { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange.esm.js';
|
|
6
|
+
|
|
7
|
+
function useUrlFiltersForRuntimeLogs({
|
|
8
|
+
environments
|
|
9
|
+
}) {
|
|
10
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
11
|
+
const filters = useMemo(() => {
|
|
12
|
+
const envName = searchParams.get("env");
|
|
13
|
+
const { timeRange, customStartTime, customEndTime } = parseUrlTimeRange(searchParams);
|
|
14
|
+
const logLevelParam = searchParams.get("logLevel");
|
|
15
|
+
const logLevel = logLevelParam === null ? [...LOG_LEVELS] : LOG_LEVELS.filter(
|
|
16
|
+
(level) => new Set(
|
|
17
|
+
logLevelParam.split(",").map((v) => v.trim()).filter(Boolean)
|
|
18
|
+
).has(level)
|
|
19
|
+
);
|
|
20
|
+
const searchQuery = searchParams.get("search") || void 0;
|
|
21
|
+
const rawSortOrder = searchParams.get("sort");
|
|
22
|
+
const sortOrder = rawSortOrder === "asc" || rawSortOrder === "desc" ? rawSortOrder : "asc";
|
|
23
|
+
const isLive = searchParams.get("live") === "true";
|
|
24
|
+
const componentsParam = searchParams.get("components");
|
|
25
|
+
const components = componentsParam ? componentsParam.split(",").map((v) => v.trim()).filter(Boolean) : [];
|
|
26
|
+
const fieldsParam = searchParams.get("fields");
|
|
27
|
+
let selectedFields;
|
|
28
|
+
if (fieldsParam) {
|
|
29
|
+
selectedFields = fieldsParam.split(",").filter((f) => Object.values(LogEntryField).includes(f)).map((f) => f);
|
|
30
|
+
if (!selectedFields.includes(LogEntryField.Log)) {
|
|
31
|
+
selectedFields.push(LogEntryField.Log);
|
|
32
|
+
}
|
|
33
|
+
selectedFields = SELECTED_FIELDS.filter(
|
|
34
|
+
(field) => selectedFields.includes(field)
|
|
35
|
+
);
|
|
36
|
+
} else {
|
|
37
|
+
selectedFields = [...SELECTED_FIELDS];
|
|
38
|
+
}
|
|
39
|
+
const environment = envName ? environments.find((e) => e.name === envName) : void 0;
|
|
40
|
+
return {
|
|
41
|
+
environment: environment?.name || "",
|
|
42
|
+
timeRange,
|
|
43
|
+
customStartTime,
|
|
44
|
+
customEndTime,
|
|
45
|
+
logLevel,
|
|
46
|
+
selectedFields,
|
|
47
|
+
components,
|
|
48
|
+
searchQuery,
|
|
49
|
+
sortOrder,
|
|
50
|
+
isLive: isLive || false
|
|
51
|
+
};
|
|
52
|
+
}, [searchParams, environments]);
|
|
53
|
+
useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);
|
|
54
|
+
const updateFilters = useCallback(
|
|
55
|
+
(newFilters) => {
|
|
56
|
+
const newParams = new URLSearchParams(searchParams);
|
|
57
|
+
if (newFilters.environment !== void 0) {
|
|
58
|
+
if (newFilters.environment) {
|
|
59
|
+
newParams.set("env", newFilters.environment);
|
|
60
|
+
} else {
|
|
61
|
+
newParams.delete("env");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
writeUrlTimeRange(newParams, newFilters);
|
|
65
|
+
if (newFilters.logLevel !== void 0) {
|
|
66
|
+
const isAllSelected = newFilters.logLevel.length === LOG_LEVELS.length && LOG_LEVELS.every((l) => newFilters.logLevel.includes(l));
|
|
67
|
+
if (isAllSelected) {
|
|
68
|
+
newParams.delete("logLevel");
|
|
69
|
+
} else if (newFilters.logLevel.length === 0) {
|
|
70
|
+
newParams.set("logLevel", "");
|
|
71
|
+
} else {
|
|
72
|
+
newParams.set("logLevel", newFilters.logLevel.join(","));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (newFilters.selectedFields !== void 0) {
|
|
76
|
+
let fields = newFilters.selectedFields;
|
|
77
|
+
if (!fields.includes(LogEntryField.Log)) {
|
|
78
|
+
fields = [...fields, LogEntryField.Log];
|
|
79
|
+
}
|
|
80
|
+
const normalizedFields = SELECTED_FIELDS.filter(
|
|
81
|
+
(field) => fields.includes(field)
|
|
82
|
+
);
|
|
83
|
+
const isDefaultFields = normalizedFields.length === SELECTED_FIELDS.length && normalizedFields.every(
|
|
84
|
+
(field, index) => field === SELECTED_FIELDS[index]
|
|
85
|
+
);
|
|
86
|
+
if (isDefaultFields) {
|
|
87
|
+
newParams.delete("fields");
|
|
88
|
+
} else {
|
|
89
|
+
newParams.set("fields", normalizedFields.join(","));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (newFilters.searchQuery !== void 0) {
|
|
93
|
+
if (newFilters.searchQuery) {
|
|
94
|
+
newParams.set("search", newFilters.searchQuery);
|
|
95
|
+
} else {
|
|
96
|
+
newParams.delete("search");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (newFilters.sortOrder !== void 0) {
|
|
100
|
+
if (newFilters.sortOrder === "asc") {
|
|
101
|
+
newParams.delete("sort");
|
|
102
|
+
} else {
|
|
103
|
+
newParams.set("sort", newFilters.sortOrder);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (newFilters.isLive !== void 0) {
|
|
107
|
+
if (newFilters.isLive) {
|
|
108
|
+
newParams.set("live", "true");
|
|
109
|
+
} else {
|
|
110
|
+
newParams.delete("live");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (newFilters.components !== void 0) {
|
|
114
|
+
if (newFilters.components.length > 0) {
|
|
115
|
+
newParams.set("components", newFilters.components.join(","));
|
|
116
|
+
} else {
|
|
117
|
+
newParams.delete("components");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
setSearchParams(newParams, { replace: true });
|
|
121
|
+
},
|
|
122
|
+
[searchParams, setSearchParams]
|
|
123
|
+
);
|
|
124
|
+
const resetFilters = useCallback(() => {
|
|
125
|
+
const newParams = new URLSearchParams();
|
|
126
|
+
if (environments.length > 0) {
|
|
127
|
+
newParams.set("env", environments[0].name);
|
|
128
|
+
}
|
|
129
|
+
setSearchParams(newParams, { replace: true });
|
|
130
|
+
}, [environments, setSearchParams]);
|
|
131
|
+
return { filters, updateFilters, resetFilters };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export { useUrlFiltersForRuntimeLogs };
|
|
135
|
+
//# sourceMappingURL=useUrlFiltersForRuntimeLogs.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUrlFiltersForRuntimeLogs.esm.js","sources":["../../src/hooks/useUrlFiltersForRuntimeLogs.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n RuntimeLogsFilters,\n LogEntryField,\n LOG_LEVELS,\n SELECTED_FIELDS,\n} from '../components/RuntimeLogs/types';\nimport type { Environment } from '../types';\nimport { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment';\nimport { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange';\n\ninterface UseUrlFiltersForRuntimeLogsOptions {\n /** Available environments to map envName from URL */\n environments: Environment[];\n}\n\n/**\n * Hook for managing runtime logs filters synced to URL query parameters.\n *\n * Query parameters:\n * - `env`: Environment name (auto-selected if not present or invalid)\n * - `timeRange`: Time range value (defaults to '10m')\n * - `logLevel`: Comma-separated log levels (empty value means none selected)\n *\n * @example\n * ```tsx\n * const { filters, updateFilters, resetFilters } = useUrlFiltersForRuntimeLogs({\n * environments,\n * });\n * ```\n */\nexport function useUrlFiltersForRuntimeLogs({\n environments,\n}: UseUrlFiltersForRuntimeLogsOptions) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Parse filters from URL\n const filters = useMemo<RuntimeLogsFilters>(() => {\n const envName = searchParams.get('env');\n const { timeRange, customStartTime, customEndTime } =\n parseUrlTimeRange(searchParams);\n const logLevelParam = searchParams.get('logLevel');\n const logLevel =\n logLevelParam === null\n ? [...LOG_LEVELS]\n : LOG_LEVELS.filter(level =>\n new Set(\n logLevelParam\n .split(',')\n .map(v => v.trim())\n .filter(Boolean),\n ).has(level),\n );\n const searchQuery = searchParams.get('search') || undefined;\n const rawSortOrder = searchParams.get('sort');\n const sortOrder: 'asc' | 'desc' =\n rawSortOrder === 'asc' || rawSortOrder === 'desc' ? rawSortOrder : 'asc';\n\n const isLive = searchParams.get('live') === 'true';\n const componentsParam = searchParams.get('components');\n const components = componentsParam\n ? componentsParam\n .split(',')\n .map(v => v.trim())\n .filter(Boolean)\n : [];\n\n // Parse selectedFields from URL\n const fieldsParam = searchParams.get('fields');\n let selectedFields: LogEntryField[];\n if (fieldsParam) {\n selectedFields = fieldsParam\n .split(',')\n .filter(f => Object.values(LogEntryField).includes(f as LogEntryField))\n .map(f => f as LogEntryField);\n // Ensure Log field is always included\n if (!selectedFields.includes(LogEntryField.Log)) {\n selectedFields.push(LogEntryField.Log);\n }\n // Sort by the order of the SELECTED_FIELDS array to maintain consistent column order\n selectedFields = SELECTED_FIELDS.filter(field =>\n selectedFields.includes(field),\n );\n } else {\n // Default to all fields\n selectedFields = [...SELECTED_FIELDS];\n }\n\n const environment = envName\n ? environments.find(e => e.name === envName)\n : undefined;\n\n return {\n environment: environment?.name || '',\n timeRange,\n customStartTime,\n customEndTime,\n logLevel,\n selectedFields,\n components,\n searchQuery,\n sortOrder,\n isLive: isLive || false,\n };\n }, [searchParams, environments]);\n\n // Auto-select first environment if none selected or URL has a stale env id\n useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);\n\n // Update URL when filters change\n const updateFilters = useCallback(\n (newFilters: Partial<RuntimeLogsFilters>) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newFilters.environment !== undefined) {\n if (newFilters.environment) {\n newParams.set('env', newFilters.environment);\n } else {\n newParams.delete('env');\n }\n }\n\n writeUrlTimeRange(newParams, newFilters);\n\n if (newFilters.logLevel !== undefined) {\n const isAllSelected =\n newFilters.logLevel.length === LOG_LEVELS.length &&\n LOG_LEVELS.every(l => newFilters.logLevel!.includes(l));\n if (isAllSelected) {\n // Default (all) - remove from URL\n newParams.delete('logLevel');\n } else if (newFilters.logLevel.length === 0) {\n // Explicitly represent none selected\n newParams.set('logLevel', '');\n } else {\n newParams.set('logLevel', newFilters.logLevel.join(','));\n }\n }\n\n if (newFilters.selectedFields !== undefined) {\n // Ensure Log field is always included\n let fields = newFilters.selectedFields;\n if (!fields.includes(LogEntryField.Log)) {\n fields = [...fields, LogEntryField.Log];\n }\n\n // Normalize order to match SELECTED_FIELDS\n const normalizedFields = SELECTED_FIELDS.filter(field =>\n fields.includes(field),\n );\n\n // Only store in URL if not the default (all fields selected)\n const isDefaultFields =\n normalizedFields.length === SELECTED_FIELDS.length &&\n normalizedFields.every(\n (field, index) => field === SELECTED_FIELDS[index],\n );\n\n if (isDefaultFields) {\n newParams.delete('fields');\n } else {\n newParams.set('fields', normalizedFields.join(','));\n }\n }\n\n if (newFilters.searchQuery !== undefined) {\n if (newFilters.searchQuery) {\n newParams.set('search', newFilters.searchQuery);\n } else {\n newParams.delete('search');\n }\n }\n\n if (newFilters.sortOrder !== undefined) {\n if (newFilters.sortOrder === 'asc') {\n // Default value - remove from URL\n newParams.delete('sort');\n } else {\n newParams.set('sort', newFilters.sortOrder);\n }\n }\n\n if (newFilters.isLive !== undefined) {\n if (newFilters.isLive) {\n newParams.set('live', 'true');\n } else {\n newParams.delete('live');\n }\n }\n\n if (newFilters.components !== undefined) {\n if (newFilters.components.length > 0) {\n newParams.set('components', newFilters.components.join(','));\n } else {\n newParams.delete('components');\n }\n }\n\n setSearchParams(newParams, { replace: true });\n },\n [searchParams, setSearchParams],\n );\n\n // Reset filters to defaults\n const resetFilters = useCallback(() => {\n const newParams = new URLSearchParams();\n if (environments.length > 0) {\n newParams.set('env', environments[0].name);\n }\n setSearchParams(newParams, { replace: true });\n }, [environments, setSearchParams]);\n\n return { filters, updateFilters, resetFilters };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ComponentLogEntry } from '@openchoreo/backstage-plugin-common';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
|
+
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A single component log entry as returned by POST /api/v1/logs/query.
|
|
8
|
+
* Fields come from the ComponentLogEntry schema (new unified API).
|
|
9
|
+
*/
|
|
10
|
+
type LogEntry = ComponentLogEntry;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Render-prop slot for a per-row action button (assistant integration,
|
|
14
|
+
* "open in external tool", etc.). The host app supplies this from
|
|
15
|
+
* outside the plugin so observability stays free of cross-plugin
|
|
16
|
+
* coupling. When omitted, no action button is rendered.
|
|
17
|
+
*/
|
|
18
|
+
type RenderLogRowAction = (log: LogEntry, getLogsSnapshot?: () => LogEntry[]) => ReactNode;
|
|
19
|
+
|
|
20
|
+
interface ObservabilityProjectRuntimeLogsPageProps {
|
|
21
|
+
renderRowAction?: RenderLogRowAction;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface ObservabilityRuntimeLogsPageProps {
|
|
25
|
+
renderRowAction?: RenderLogRowAction;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
declare const openchoreoObservabilityPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
29
|
+
root: _backstage_core_plugin_api.RouteRef<undefined>;
|
|
30
|
+
}, {}, {}>;
|
|
31
|
+
declare const ObservabilityMetrics: () => react_jsx_runtime.JSX.Element;
|
|
32
|
+
declare const ObservabilityTraces: () => react_jsx_runtime.JSX.Element;
|
|
33
|
+
declare const ObservabilityRCA: () => react_jsx_runtime.JSX.Element;
|
|
34
|
+
declare const ObservabilityRuntimeLogs: ({ renderRowAction, }: ObservabilityRuntimeLogsPageProps) => react_jsx_runtime.JSX.Element;
|
|
35
|
+
declare const ObservabilityProjectRuntimeLogs: ({ renderRowAction, }: ObservabilityProjectRuntimeLogsPageProps) => react_jsx_runtime.JSX.Element;
|
|
36
|
+
declare const ObservabilityAlerts: () => react_jsx_runtime.JSX.Element;
|
|
37
|
+
declare const ObservabilityProjectIncidents: () => react_jsx_runtime.JSX.Element;
|
|
38
|
+
declare const ObservabilityCostAnalysis: () => react_jsx_runtime.JSX.Element;
|
|
39
|
+
|
|
40
|
+
export { ObservabilityAlerts, ObservabilityCostAnalysis, ObservabilityMetrics, ObservabilityProjectIncidents, ObservabilityProjectRuntimeLogs, ObservabilityRCA, ObservabilityRuntimeLogs, ObservabilityTraces, openchoreoObservabilityPlugin };
|
|
41
|
+
export type { RenderLogRowAction };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { ObservabilityAlerts, ObservabilityCostAnalysis, ObservabilityMetrics, ObservabilityProjectIncidents, ObservabilityProjectRuntimeLogs, ObservabilityRCA, ObservabilityRuntimeLogs, ObservabilityTraces, openchoreoObservabilityPlugin } from './plugin.esm.js';
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|