@openchoreo/backstage-plugin-openchoreo-observability 1.1.6 → 1.2.0-m.1
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 +27 -0
- package/dist/api/ObservabilityApi.esm.js +36 -0
- package/dist/api/ObservabilityApi.esm.js.map +1 -1
- package/dist/components/Alerts/AlertsFilter.esm.js +9 -23
- package/dist/components/Alerts/AlertsFilter.esm.js.map +1 -1
- package/dist/components/Alerts/AlertsTable.esm.js +5 -5
- package/dist/components/Alerts/AlertsTable.esm.js.map +1 -1
- package/dist/components/Alerts/ObservabilityAlertsPage.esm.js +5 -35
- package/dist/components/Alerts/ObservabilityAlertsPage.esm.js.map +1 -1
- package/dist/components/CostAnalysis/CostAnalysisPage.esm.js +2 -7
- package/dist/components/CostAnalysis/CostAnalysisPage.esm.js.map +1 -1
- package/dist/components/CostAnalysis/CostAnalysisReport.esm.js +2 -6
- package/dist/components/CostAnalysis/CostAnalysisReport.esm.js.map +1 -1
- package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js +1 -1
- package/dist/components/CostAnalysis/CostAnalysisTable.esm.js +1 -1
- package/dist/components/CostAnalysis/index.esm.js +5 -1
- package/dist/components/CostAnalysis/index.esm.js.map +1 -1
- package/dist/components/Incidents/IncidentsFilter.esm.js +12 -25
- package/dist/components/Incidents/IncidentsFilter.esm.js.map +1 -1
- package/dist/components/Incidents/IncidentsTable.esm.js +6 -6
- package/dist/components/Incidents/IncidentsTable.esm.js.map +1 -1
- package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js +4 -8
- package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js.map +1 -1
- package/dist/components/Metrics/HTTPMetricsSection.esm.js +1 -1
- package/dist/components/Metrics/MetricGraphByComponent.esm.js +8 -2
- package/dist/components/Metrics/MetricGraphByComponent.esm.js.map +1 -1
- package/dist/components/Metrics/MetricsFilters.esm.js +14 -23
- package/dist/components/Metrics/MetricsFilters.esm.js.map +1 -1
- package/dist/components/Metrics/ObservabilityMetricsPage.esm.js +2 -7
- package/dist/components/Metrics/ObservabilityMetricsPage.esm.js.map +1 -1
- package/dist/components/Metrics/utils.esm.js +41 -3
- package/dist/components/Metrics/utils.esm.js.map +1 -1
- package/dist/components/RCA/RCAFilters.esm.js +12 -28
- package/dist/components/RCA/RCAFilters.esm.js.map +1 -1
- package/dist/components/RCA/RCAPage.esm.js +2 -7
- package/dist/components/RCA/RCAPage.esm.js.map +1 -1
- package/dist/components/RCA/RCAReport.esm.js +2 -6
- package/dist/components/RCA/RCAReport.esm.js.map +1 -1
- package/dist/components/RCA/RCATable.esm.js +1 -1
- package/dist/components/RuntimeEvents/EventEntry.esm.js +178 -0
- package/dist/components/RuntimeEvents/EventEntry.esm.js.map +1 -0
- package/dist/components/RuntimeEvents/EventsActions.esm.js +108 -0
- package/dist/components/RuntimeEvents/EventsActions.esm.js.map +1 -0
- package/dist/components/RuntimeEvents/EventsFilter.esm.js +82 -0
- package/dist/components/RuntimeEvents/EventsFilter.esm.js.map +1 -0
- package/dist/components/RuntimeEvents/EventsTable.esm.js +91 -0
- package/dist/components/RuntimeEvents/EventsTable.esm.js.map +1 -0
- package/dist/components/RuntimeEvents/ObservabilityRuntimeEventsPage.esm.js +197 -0
- package/dist/components/RuntimeEvents/ObservabilityRuntimeEventsPage.esm.js.map +1 -0
- package/dist/components/RuntimeEvents/styles.esm.js +212 -0
- package/dist/components/RuntimeEvents/styles.esm.js.map +1 -0
- package/dist/components/RuntimeEvents/types.esm.js +18 -0
- package/dist/components/RuntimeEvents/types.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogsFilter.esm.js +9 -22
- package/dist/components/RuntimeLogs/LogsFilter.esm.js.map +1 -1
- package/dist/components/RuntimeLogs/LogsTable.esm.js +14 -4
- package/dist/components/RuntimeLogs/LogsTable.esm.js.map +1 -1
- package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js +3 -7
- package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js.map +1 -1
- package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js +3 -7
- package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js.map +1 -1
- package/dist/components/Traces/ObservabilityTracesPage.esm.js +2 -7
- package/dist/components/Traces/ObservabilityTracesPage.esm.js.map +1 -1
- package/dist/components/Traces/TracesFilters.esm.js +9 -27
- package/dist/components/Traces/TracesFilters.esm.js.map +1 -1
- package/dist/components/Traces/TracesTable.esm.js +6 -5
- package/dist/components/Traces/TracesTable.esm.js.map +1 -1
- package/dist/components/Wirelogs/ObservabilityWirelogsPage.esm.js +191 -0
- package/dist/components/Wirelogs/ObservabilityWirelogsPage.esm.js.map +1 -0
- package/dist/components/Wirelogs/WirelogsFilter.esm.js +107 -0
- package/dist/components/Wirelogs/WirelogsFilter.esm.js.map +1 -0
- package/dist/components/Wirelogs/WirelogsFlowDrawer.esm.js +81 -0
- package/dist/components/Wirelogs/WirelogsFlowDrawer.esm.js.map +1 -0
- package/dist/components/Wirelogs/WirelogsFlowTabs.esm.js +193 -0
- package/dist/components/Wirelogs/WirelogsFlowTabs.esm.js.map +1 -0
- package/dist/components/Wirelogs/WirelogsStats.esm.js +53 -0
- package/dist/components/Wirelogs/WirelogsStats.esm.js.map +1 -0
- package/dist/components/Wirelogs/WirelogsTable.esm.js +236 -0
- package/dist/components/Wirelogs/WirelogsTable.esm.js.map +1 -0
- package/dist/components/Wirelogs/flowFormat.esm.js +165 -0
- package/dist/components/Wirelogs/flowFormat.esm.js.map +1 -0
- package/dist/components/Wirelogs/styles.esm.js +485 -0
- package/dist/components/Wirelogs/styles.esm.js.map +1 -0
- package/dist/components/Wirelogs/useWirelogsStream.esm.js +175 -0
- package/dist/components/Wirelogs/useWirelogsStream.esm.js.map +1 -0
- package/dist/hooks/useAutoSelectFirstEnvironment.esm.js.map +1 -1
- package/dist/hooks/useFilters.esm.js.map +1 -1
- package/dist/hooks/useRuntimeEvents.esm.js +145 -0
- package/dist/hooks/useRuntimeEvents.esm.js.map +1 -0
- package/dist/hooks/useUrlFilters.esm.js.map +1 -1
- package/dist/hooks/useUrlFiltersForAlerts.esm.js.map +1 -1
- package/dist/hooks/useUrlFiltersForIncidents.esm.js.map +1 -1
- package/dist/hooks/useUrlFiltersForRuntimeEvents.esm.js +101 -0
- package/dist/hooks/useUrlFiltersForRuntimeEvents.esm.js.map +1 -0
- package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js.map +1 -1
- package/dist/hooks/useWirelogsEnvironments.esm.js +90 -0
- package/dist/hooks/useWirelogsEnvironments.esm.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +19 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/types.esm.js +1 -11
- package/dist/types.esm.js.map +1 -1
- package/dist/utils/urlTimeRange.esm.js +1 -1
- package/dist/utils/urlTimeRange.esm.js.map +1 -1
- package/package.json +13 -15
- package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js +0 -280
- package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js.map +0 -1
- package/dist/components/common/NoEnvironmentsEmptyState.esm.js +0 -16
- package/dist/components/common/NoEnvironmentsEmptyState.esm.js.map +0 -1
- package/dist/hooks/useGetEnvironmentsByNamespace.esm.js +0 -53
- package/dist/hooks/useGetEnvironmentsByNamespace.esm.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# @openchoreo/backstage-plugin-openchoreo-observability
|
|
2
2
|
|
|
3
|
+
## 1.2.0-next.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 529f13c: add component events view and hooks
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0.
|
|
12
|
+
|
|
13
|
+
This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches.
|
|
14
|
+
|
|
15
|
+
Notable adapter-side changes:
|
|
16
|
+
|
|
17
|
+
- Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3.
|
|
18
|
+
- Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against.
|
|
19
|
+
- The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`.
|
|
20
|
+
- React 18 + Node 22 are required at runtime, in line with Backstage v1.50+.
|
|
21
|
+
|
|
22
|
+
- Updated dependencies [529f13c]
|
|
23
|
+
- Updated dependencies [1207eda]
|
|
24
|
+
- Updated dependencies [7c76d05]
|
|
25
|
+
- Updated dependencies [8d8bd80]
|
|
26
|
+
- @openchoreo/backstage-plugin-common@1.2.0-next.0
|
|
27
|
+
- @openchoreo/backstage-plugin-react@1.2.0-next.0
|
|
28
|
+
- @openchoreo/backstage-design-system@1.2.0-next.0
|
|
29
|
+
|
|
3
30
|
## 1.1.1
|
|
4
31
|
|
|
5
32
|
- HTTP metrics now refresh on refresh button click. (#595)
|
|
@@ -451,6 +451,42 @@ class ObservabilityClient {
|
|
|
451
451
|
const data = await response.json();
|
|
452
452
|
return data;
|
|
453
453
|
}
|
|
454
|
+
async getRuntimeEvents(namespaceName, projectName, environmentName, componentName, options) {
|
|
455
|
+
const { observerUrl } = await this.urlCache.resolveUrls(
|
|
456
|
+
namespaceName,
|
|
457
|
+
environmentName
|
|
458
|
+
);
|
|
459
|
+
const response = await this.fetchApi.fetch(
|
|
460
|
+
`${observerUrl}/api/v1/events/query`,
|
|
461
|
+
{
|
|
462
|
+
method: "POST",
|
|
463
|
+
headers: { "Content-Type": "application/json", ...DIRECT_HEADER },
|
|
464
|
+
body: JSON.stringify({
|
|
465
|
+
startTime: options?.startTime || new Date(Date.now() - 60 * 60 * 1e3).toISOString(),
|
|
466
|
+
endTime: options?.endTime || (/* @__PURE__ */ new Date()).toISOString(),
|
|
467
|
+
limit: options?.limit || 100,
|
|
468
|
+
sortOrder: options?.sortOrder || "desc",
|
|
469
|
+
searchScope: {
|
|
470
|
+
namespace: namespaceName,
|
|
471
|
+
project: projectName,
|
|
472
|
+
...componentName ? { component: componentName } : {},
|
|
473
|
+
environment: environmentName
|
|
474
|
+
}
|
|
475
|
+
})
|
|
476
|
+
}
|
|
477
|
+
);
|
|
478
|
+
if (!response.ok) {
|
|
479
|
+
const error = await this.parseError(response);
|
|
480
|
+
if (error.includes("Observability is not configured for component")) {
|
|
481
|
+
throw new Error("Observability is not enabled for this component");
|
|
482
|
+
}
|
|
483
|
+
throw new Error(
|
|
484
|
+
error || `Failed to fetch events: ${response.status} ${response.statusText}`
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
const data = await response.json();
|
|
488
|
+
return data;
|
|
489
|
+
}
|
|
454
490
|
async updateIncidentStatus(incidentId, status, namespaceName, environmentName) {
|
|
455
491
|
const { observerUrl } = await this.urlCache.resolveUrls(
|
|
456
492
|
namespaceName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservabilityApi.esm.js","sources":["../../src/api/ObservabilityApi.ts"],"sourcesContent":["import {\n createApiRef,\n DiscoveryApi,\n FetchApi,\n} from '@backstage/core-plugin-api';\nimport {\n ResourceMetrics,\n HttpMetrics,\n MetricType,\n Trace,\n Span,\n SpanDetails,\n RCAReportSummary,\n RCAReportDetailed,\n AlertSummary,\n IncidentSummary,\n FinOpsReportSummary,\n FinOpsReportDetailed,\n} from '../types';\nimport { LogsResponse } from '../components/RuntimeLogs/types';\nimport { ObserverUrlCache } from './ObserverUrlCache';\n\nexport interface ObservabilityApi {\n getRuntimeLogs(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n logLevels?: string[];\n searchQuery?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<LogsResponse>;\n\n getMetrics(\n environmentName: string,\n componentName: string,\n namespaceName: string,\n projectName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n step?: string;\n type?: MetricType;\n },\n ): Promise<ResourceMetrics | HttpMetrics>;\n\n getTraces(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n traces: Trace[];\n total: number;\n tookMs: number;\n }>;\n\n getTraceSpans(\n traceId: string,\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n startTime?: string;\n endTime?: string;\n },\n ): Promise<{\n spans: Span[];\n total: number;\n tookMs: number;\n }>;\n\n getSpanDetails(\n traceId: string,\n spanId: string,\n namespaceName: string,\n environmentName: string,\n ): Promise<SpanDetails>;\n\n getRCAReports(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n },\n ): Promise<{\n reports: RCAReportSummary[];\n totalCount?: number;\n }>;\n\n getRCAReport(\n reportId: string,\n environmentName: string,\n namespaceName: string,\n ): Promise<RCAReportDetailed>;\n\n getIncidents(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n startTime?: string;\n endTime?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n incidents: IncidentSummary[];\n total: number;\n }>;\n\n getAlerts(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n alerts: AlertSummary[];\n total: number;\n }>;\n\n updateIncidentStatus(\n incidentId: string,\n status: 'acknowledged' | 'resolved',\n namespaceName: string,\n environmentName: string,\n ): Promise<void>;\n\n getFinOpsReports(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n sort?: string;\n },\n ): Promise<{\n reports: FinOpsReportSummary[];\n totalCount?: number;\n }>;\n\n getFinOpsReport(\n reportId: string,\n environmentName: string,\n namespaceName: string,\n ): Promise<FinOpsReportDetailed>;\n}\n\nexport const observabilityApiRef = createApiRef<ObservabilityApi>({\n id: 'plugin.openchoreo-observability.service',\n});\n\nconst DIRECT_HEADER = { 'x-openchoreo-direct': 'true' };\n\nexport class ObservabilityClient implements ObservabilityApi {\n private readonly fetchApi: FetchApi;\n private readonly urlCache: ObserverUrlCache;\n\n constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi }) {\n this.fetchApi = options.fetchApi;\n this.urlCache = new ObserverUrlCache(options);\n }\n\n async getMetrics(\n environmentName: string,\n componentName: string,\n namespaceName: string,\n projectName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n step?: string;\n type?: MetricType;\n },\n ): Promise<ResourceMetrics | HttpMetrics> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const searchScope = {\n namespace: namespaceName,\n project: projectName,\n component: componentName,\n environment: environmentName,\n };\n\n const baseBody = {\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n searchScope,\n ...(options?.step ? { step: options.step } : {}),\n };\n\n const fetchOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n };\n\n const metricType = options?.type ?? 'resource';\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1/metrics/query`,\n {\n ...fetchOptions,\n body: JSON.stringify({ ...baseBody, metric: metricType }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch metrics: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n\n switch (metricType) {\n case 'resource':\n return {\n cpuUsage: {\n cpuUsage: data.cpuUsage ?? [],\n cpuRequests: data.cpuRequests ?? [],\n cpuLimits: data.cpuLimits ?? [],\n },\n memoryUsage: {\n memoryUsage: data.memoryUsage ?? [],\n memoryRequests: data.memoryRequests ?? [],\n memoryLimits: data.memoryLimits ?? [],\n },\n };\n case 'http':\n return {\n networkThroughput: {\n requestCount: data.requestCount ?? [],\n successfulRequestCount: data.successfulRequestCount ?? [],\n unsuccessfulRequestCount: data.unsuccessfulRequestCount ?? [],\n },\n networkLatency: {\n meanLatency: data.meanLatency ?? [],\n latencyP50: data.latencyP50 ?? [],\n latencyP90: data.latencyP90 ?? [],\n latencyP99: data.latencyP99 ?? [],\n },\n };\n default:\n throw new Error(`Unsupported metric type: ${metricType}`);\n }\n }\n\n async getTraces(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n traces: Trace[];\n total: number;\n tookMs: number;\n }> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/traces/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n limit: options?.limit ?? 100,\n sortOrder: options?.sortOrder ?? 'desc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch traces: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n traces: (data.traces ?? []).map((t: any) => ({\n traceId: t.traceId ?? '',\n traceName: t.traceName,\n spanCount: t.spanCount ?? 0,\n rootSpanId: t.rootSpanId,\n rootSpanName: t.rootSpanName,\n rootSpanKind: t.rootSpanKind,\n startTime: t.startTime ?? '',\n endTime: t.endTime ?? '',\n durationNs: t.durationNs ?? 0,\n hasErrors: t.hasErrors ?? false,\n })),\n total: data.total ?? 0,\n tookMs: data.tookMs ?? 0,\n };\n }\n\n async getTraceSpans(\n traceId: string,\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n startTime?: string;\n endTime?: string;\n },\n ): Promise<{\n spans: Span[];\n total: number;\n tookMs: number;\n }> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/traces/${encodeURIComponent(\n traceId,\n )}/spans/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n limit: 1000,\n sortOrder: 'asc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw new Error(\n error ||\n `Failed to fetch spans for trace ${traceId}: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n spans: (data.spans ?? []).map((s: any) => ({\n spanId: s.spanId ?? '',\n spanName: s.spanName ?? '',\n spanKind: s.spanKind,\n startTime: s.startTime ?? '',\n endTime: s.endTime ?? '',\n durationNs: s.durationNs ?? 0,\n parentSpanId: s.parentSpanId,\n status: s.status,\n })),\n total: data.total ?? 0,\n tookMs: data.tookMs ?? 0,\n };\n }\n\n async getSpanDetails(\n traceId: string,\n spanId: string,\n namespaceName: string,\n environmentName: string,\n ): Promise<SpanDetails> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/traces/${encodeURIComponent(\n traceId,\n )}/spans/${encodeURIComponent(spanId)}`,\n {\n headers: { ...DIRECT_HEADER },\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw new Error(\n error ||\n `Failed to fetch span details for span ${spanId}: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n spanId: data.spanId ?? '',\n spanName: data.spanName ?? '',\n spanKind: data.spanKind,\n startTime: data.startTime ?? '',\n endTime: data.endTime ?? '',\n durationNs: data.durationNs ?? 0,\n parentSpanId: data.parentSpanId,\n attributes: data.attributes,\n resourceAttributes: data.resourceAttributes,\n };\n }\n\n async getRCAReports(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n },\n ): Promise<{\n reports: RCAReportSummary[];\n totalCount?: number;\n }> {\n const { rcaAgentUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n if (!rcaAgentUrl) {\n throw new Error('RCA service is not configured');\n }\n\n const url = new URL(`${rcaAgentUrl}/api/v1/rca-agent/reports`);\n url.searchParams.set('namespace', namespaceName);\n url.searchParams.set('project', projectName);\n url.searchParams.set('environment', environmentName);\n if (options?.startTime)\n url.searchParams.set('startTime', options.startTime);\n if (options?.endTime) url.searchParams.set('endTime', options.endTime);\n if (options?.status) url.searchParams.set('status', options.status);\n if (options?.limit !== undefined)\n url.searchParams.set('limit', String(options.limit));\n\n let response: Response;\n try {\n response = await this.fetchApi.fetch(url.toString(), {\n headers: { ...DIRECT_HEADER },\n });\n } catch (err) {\n throw new Error(\n `RCA service is unreachable: ${\n err instanceof Error ? err.message : err\n }`,\n );\n }\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('RCA service is not configured')) {\n throw new Error('RCA service is not configured');\n }\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch RCA reports: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n reports: data.reports || [],\n totalCount: data.totalCount,\n };\n }\n\n async getRCAReport(\n reportId: string,\n environmentName: string,\n namespaceName: string,\n ): Promise<RCAReportDetailed> {\n const { rcaAgentUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n if (!rcaAgentUrl) {\n throw new Error('RCA service is not configured');\n }\n\n const url = new URL(\n `${rcaAgentUrl}/api/v1/rca-agent/reports/${encodeURIComponent(reportId)}`,\n );\n\n let response: Response;\n try {\n response = await this.fetchApi.fetch(url.toString(), {\n headers: { ...DIRECT_HEADER },\n });\n } catch (err) {\n throw new Error(\n `RCA service is unreachable: ${\n err instanceof Error ? err.message : err\n }`,\n );\n }\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('RCA service is not configured')) {\n throw new Error('RCA service is not configured');\n }\n if (error.includes('RCA report not found')) {\n throw new Error('RCA report not found');\n }\n throw new Error(\n error || `Failed to fetch RCA report: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data;\n }\n\n async getIncidents(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n startTime?: string;\n endTime?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n incidents: IncidentSummary[];\n total: number;\n }> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/incidents/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n limit: options?.limit ?? 100,\n sortOrder: options?.sortOrder ?? 'desc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch incidents: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n const validStatuses = ['active', 'acknowledged', 'resolved'];\n return {\n incidents: (data.incidents ?? [])\n .filter((i: any) => validStatuses.includes(i.status))\n .map(\n (i: any): IncidentSummary => ({\n incidentId: i.incidentId ?? '',\n alertId: i.alertId ?? '',\n status: i.status,\n description: i.description,\n notes: i.notes,\n timestamp: i.timestamp,\n triggeredAt: i.triggeredAt,\n acknowledgedAt: i.acknowledgedAt,\n resolvedAt: i.resolvedAt,\n incidentTriggerAiRca: i.incidentTriggerAiRca ?? false,\n incidentTriggerAiCostAnalysis:\n i.incidentTriggerAiCostAnalysis ?? false,\n projectName: i.labels?.projectName,\n componentName: i.labels?.componentName,\n environmentName: i.labels?.environmentName,\n namespaceName: i.labels?.namespaceName,\n }),\n ),\n total: data.total ?? 0,\n };\n }\n\n async getAlerts(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n alerts: AlertSummary[];\n total: number;\n }> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/alerts/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n limit: options?.limit ?? 100,\n sortOrder: options?.sortOrder ?? 'desc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n component: componentName,\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch alerts: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n\n return {\n alerts: (data.alerts ?? []).map(\n (a: any): AlertSummary => ({\n timestamp: a.timestamp,\n alertId: a.alertId ?? '',\n alertValue: a.alertValue,\n ruleName: a.metadata?.alertRule?.name,\n ruleDescription: a.metadata?.alertRule?.description,\n severity: a.metadata?.alertRule?.severity,\n sourceType: a.metadata?.alertRule?.source?.type,\n sourceQuery: a.metadata?.alertRule?.source?.query,\n sourceMetric: a.metadata?.alertRule?.source?.metric,\n projectName: a.metadata?.labels?.projectName,\n componentName: a.metadata?.labels?.componentName,\n environmentName: a.metadata?.labels?.environmentName,\n namespaceName: a.metadata?.labels?.namespaceName,\n notificationChannels: a.notificationChannels ?? [],\n incidentEnabled: a.incidentEnabled ?? false,\n }),\n ),\n total: data.total ?? 0,\n };\n }\n\n async getRuntimeLogs(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n logLevels?: string[];\n searchQuery?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<LogsResponse> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1/logs/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ||\n new Date(Date.now() - 60 * 60 * 1000).toISOString(),\n endTime: options?.endTime || new Date().toISOString(),\n limit: options?.limit || 100,\n sortOrder: options?.sortOrder || 'desc',\n ...(options?.logLevels &&\n options.logLevels.length > 0 && { logLevels: options.logLevels }),\n ...(options?.searchQuery && {\n searchPhrase: options.searchQuery,\n }),\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error ||\n `Failed to fetch runtime logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data;\n }\n\n async updateIncidentStatus(\n incidentId: string,\n status: 'acknowledged' | 'resolved',\n namespaceName: string,\n environmentName: string,\n ): Promise<void> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/incidents/${encodeURIComponent(incidentId)}`,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({ status }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw new Error(\n error || `Failed to update incident: ${response.statusText}`,\n );\n }\n }\n\n async getFinOpsReports(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n sort?: string;\n },\n ): Promise<{\n reports: FinOpsReportSummary[];\n totalCount?: number;\n }> {\n const { finopsAgentUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n if (!finopsAgentUrl) {\n throw new Error('FinOps service is not configured');\n }\n\n const url = new URL(`${finopsAgentUrl}/api/v1alpha1/reports`);\n url.searchParams.set('namespace', namespaceName);\n url.searchParams.set('project', projectName);\n url.searchParams.set('environment', environmentName);\n if (options?.startTime)\n url.searchParams.set('startTime', options.startTime);\n if (options?.endTime) url.searchParams.set('endTime', options.endTime);\n if (options?.status) url.searchParams.set('status', options.status);\n if (options?.limit !== undefined)\n url.searchParams.set('limit', String(options.limit));\n if (options?.sort) url.searchParams.set('sort', options.sort);\n\n let response: Response;\n try {\n response = await this.fetchApi.fetch(url.toString(), {\n headers: { ...DIRECT_HEADER },\n });\n } catch (err) {\n throw new Error(\n `FinOps service is unreachable: ${\n err instanceof Error ? err.message : err\n }`,\n );\n }\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('FinOps service is not configured')) {\n throw new Error('FinOps service is not configured');\n }\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch FinOps reports: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n reports: data.reports || [],\n totalCount: data.totalCount,\n };\n }\n\n async getFinOpsReport(\n reportId: string,\n environmentName: string,\n namespaceName: string,\n ): Promise<FinOpsReportDetailed> {\n const { finopsAgentUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n if (!finopsAgentUrl) {\n throw new Error('FinOps service is not configured');\n }\n\n const url = new URL(\n `${finopsAgentUrl}/api/v1alpha1/reports/${encodeURIComponent(reportId)}`,\n );\n\n let response: Response;\n try {\n response = await this.fetchApi.fetch(url.toString(), {\n headers: { ...DIRECT_HEADER },\n });\n } catch (err) {\n throw new Error(\n `FinOps service is unreachable: ${\n err instanceof Error ? err.message : err\n }`,\n );\n }\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('FinOps service is not configured')) {\n throw new Error('FinOps service is not configured');\n }\n if (error.includes('FinOps report not found')) {\n throw new Error('FinOps report not found');\n }\n throw new Error(\n error || `Failed to fetch FinOps report: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data;\n }\n\n private async parseError(response: Response): Promise<string> {\n try {\n const error = await response.json();\n return (\n error.error ||\n error.message ||\n `${response.status} ${response.statusText}`\n );\n } catch {\n return `${response.status} ${response.statusText}`;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ObservabilityApi.esm.js","sources":["../../src/api/ObservabilityApi.ts"],"sourcesContent":["import {\n createApiRef,\n DiscoveryApi,\n FetchApi,\n} from '@backstage/core-plugin-api';\nimport {\n ResourceMetrics,\n HttpMetrics,\n MetricType,\n Trace,\n Span,\n SpanDetails,\n RCAReportSummary,\n RCAReportDetailed,\n AlertSummary,\n IncidentSummary,\n FinOpsReportSummary,\n FinOpsReportDetailed,\n} from '../types';\nimport { LogsResponse } from '../components/RuntimeLogs/types';\nimport { EventsResponse } from '../components/RuntimeEvents/types';\nimport { ObserverUrlCache } from './ObserverUrlCache';\n\nexport interface ObservabilityApi {\n getRuntimeLogs(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n logLevels?: string[];\n searchQuery?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<LogsResponse>;\n\n getRuntimeEvents(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<EventsResponse>;\n\n getMetrics(\n environmentName: string,\n componentName: string,\n namespaceName: string,\n projectName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n step?: string;\n type?: MetricType;\n },\n ): Promise<ResourceMetrics | HttpMetrics>;\n\n getTraces(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n traces: Trace[];\n total: number;\n tookMs: number;\n }>;\n\n getTraceSpans(\n traceId: string,\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n startTime?: string;\n endTime?: string;\n },\n ): Promise<{\n spans: Span[];\n total: number;\n tookMs: number;\n }>;\n\n getSpanDetails(\n traceId: string,\n spanId: string,\n namespaceName: string,\n environmentName: string,\n ): Promise<SpanDetails>;\n\n getRCAReports(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n },\n ): Promise<{\n reports: RCAReportSummary[];\n totalCount?: number;\n }>;\n\n getRCAReport(\n reportId: string,\n environmentName: string,\n namespaceName: string,\n ): Promise<RCAReportDetailed>;\n\n getIncidents(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n startTime?: string;\n endTime?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n incidents: IncidentSummary[];\n total: number;\n }>;\n\n getAlerts(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n alerts: AlertSummary[];\n total: number;\n }>;\n\n updateIncidentStatus(\n incidentId: string,\n status: 'acknowledged' | 'resolved',\n namespaceName: string,\n environmentName: string,\n ): Promise<void>;\n\n getFinOpsReports(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n sort?: string;\n },\n ): Promise<{\n reports: FinOpsReportSummary[];\n totalCount?: number;\n }>;\n\n getFinOpsReport(\n reportId: string,\n environmentName: string,\n namespaceName: string,\n ): Promise<FinOpsReportDetailed>;\n}\n\nexport const observabilityApiRef = createApiRef<ObservabilityApi>({\n id: 'plugin.openchoreo-observability.service',\n});\n\nconst DIRECT_HEADER = { 'x-openchoreo-direct': 'true' };\n\nexport class ObservabilityClient implements ObservabilityApi {\n private readonly fetchApi: FetchApi;\n private readonly urlCache: ObserverUrlCache;\n\n constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi }) {\n this.fetchApi = options.fetchApi;\n this.urlCache = new ObserverUrlCache(options);\n }\n\n async getMetrics(\n environmentName: string,\n componentName: string,\n namespaceName: string,\n projectName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n step?: string;\n type?: MetricType;\n },\n ): Promise<ResourceMetrics | HttpMetrics> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const searchScope = {\n namespace: namespaceName,\n project: projectName,\n component: componentName,\n environment: environmentName,\n };\n\n const baseBody = {\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n searchScope,\n ...(options?.step ? { step: options.step } : {}),\n };\n\n const fetchOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n };\n\n const metricType = options?.type ?? 'resource';\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1/metrics/query`,\n {\n ...fetchOptions,\n body: JSON.stringify({ ...baseBody, metric: metricType }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch metrics: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n\n switch (metricType) {\n case 'resource':\n return {\n cpuUsage: {\n cpuUsage: data.cpuUsage ?? [],\n cpuRequests: data.cpuRequests ?? [],\n cpuLimits: data.cpuLimits ?? [],\n },\n memoryUsage: {\n memoryUsage: data.memoryUsage ?? [],\n memoryRequests: data.memoryRequests ?? [],\n memoryLimits: data.memoryLimits ?? [],\n },\n };\n case 'http':\n return {\n networkThroughput: {\n requestCount: data.requestCount ?? [],\n successfulRequestCount: data.successfulRequestCount ?? [],\n unsuccessfulRequestCount: data.unsuccessfulRequestCount ?? [],\n },\n networkLatency: {\n meanLatency: data.meanLatency ?? [],\n latencyP50: data.latencyP50 ?? [],\n latencyP90: data.latencyP90 ?? [],\n latencyP99: data.latencyP99 ?? [],\n },\n };\n default:\n throw new Error(`Unsupported metric type: ${metricType}`);\n }\n }\n\n async getTraces(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n traces: Trace[];\n total: number;\n tookMs: number;\n }> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/traces/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n limit: options?.limit ?? 100,\n sortOrder: options?.sortOrder ?? 'desc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch traces: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n traces: (data.traces ?? []).map((t: any) => ({\n traceId: t.traceId ?? '',\n traceName: t.traceName,\n spanCount: t.spanCount ?? 0,\n rootSpanId: t.rootSpanId,\n rootSpanName: t.rootSpanName,\n rootSpanKind: t.rootSpanKind,\n startTime: t.startTime ?? '',\n endTime: t.endTime ?? '',\n durationNs: t.durationNs ?? 0,\n hasErrors: t.hasErrors ?? false,\n })),\n total: data.total ?? 0,\n tookMs: data.tookMs ?? 0,\n };\n }\n\n async getTraceSpans(\n traceId: string,\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n startTime?: string;\n endTime?: string;\n },\n ): Promise<{\n spans: Span[];\n total: number;\n tookMs: number;\n }> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/traces/${encodeURIComponent(\n traceId,\n )}/spans/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n limit: 1000,\n sortOrder: 'asc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw new Error(\n error ||\n `Failed to fetch spans for trace ${traceId}: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n spans: (data.spans ?? []).map((s: any) => ({\n spanId: s.spanId ?? '',\n spanName: s.spanName ?? '',\n spanKind: s.spanKind,\n startTime: s.startTime ?? '',\n endTime: s.endTime ?? '',\n durationNs: s.durationNs ?? 0,\n parentSpanId: s.parentSpanId,\n status: s.status,\n })),\n total: data.total ?? 0,\n tookMs: data.tookMs ?? 0,\n };\n }\n\n async getSpanDetails(\n traceId: string,\n spanId: string,\n namespaceName: string,\n environmentName: string,\n ): Promise<SpanDetails> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/traces/${encodeURIComponent(\n traceId,\n )}/spans/${encodeURIComponent(spanId)}`,\n {\n headers: { ...DIRECT_HEADER },\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw new Error(\n error ||\n `Failed to fetch span details for span ${spanId}: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n spanId: data.spanId ?? '',\n spanName: data.spanName ?? '',\n spanKind: data.spanKind,\n startTime: data.startTime ?? '',\n endTime: data.endTime ?? '',\n durationNs: data.durationNs ?? 0,\n parentSpanId: data.parentSpanId,\n attributes: data.attributes,\n resourceAttributes: data.resourceAttributes,\n };\n }\n\n async getRCAReports(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n },\n ): Promise<{\n reports: RCAReportSummary[];\n totalCount?: number;\n }> {\n const { rcaAgentUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n if (!rcaAgentUrl) {\n throw new Error('RCA service is not configured');\n }\n\n const url = new URL(`${rcaAgentUrl}/api/v1/rca-agent/reports`);\n url.searchParams.set('namespace', namespaceName);\n url.searchParams.set('project', projectName);\n url.searchParams.set('environment', environmentName);\n if (options?.startTime)\n url.searchParams.set('startTime', options.startTime);\n if (options?.endTime) url.searchParams.set('endTime', options.endTime);\n if (options?.status) url.searchParams.set('status', options.status);\n if (options?.limit !== undefined)\n url.searchParams.set('limit', String(options.limit));\n\n let response: Response;\n try {\n response = await this.fetchApi.fetch(url.toString(), {\n headers: { ...DIRECT_HEADER },\n });\n } catch (err) {\n throw new Error(\n `RCA service is unreachable: ${\n err instanceof Error ? err.message : err\n }`,\n );\n }\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('RCA service is not configured')) {\n throw new Error('RCA service is not configured');\n }\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch RCA reports: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n reports: data.reports || [],\n totalCount: data.totalCount,\n };\n }\n\n async getRCAReport(\n reportId: string,\n environmentName: string,\n namespaceName: string,\n ): Promise<RCAReportDetailed> {\n const { rcaAgentUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n if (!rcaAgentUrl) {\n throw new Error('RCA service is not configured');\n }\n\n const url = new URL(\n `${rcaAgentUrl}/api/v1/rca-agent/reports/${encodeURIComponent(reportId)}`,\n );\n\n let response: Response;\n try {\n response = await this.fetchApi.fetch(url.toString(), {\n headers: { ...DIRECT_HEADER },\n });\n } catch (err) {\n throw new Error(\n `RCA service is unreachable: ${\n err instanceof Error ? err.message : err\n }`,\n );\n }\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('RCA service is not configured')) {\n throw new Error('RCA service is not configured');\n }\n if (error.includes('RCA report not found')) {\n throw new Error('RCA report not found');\n }\n throw new Error(\n error || `Failed to fetch RCA report: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data;\n }\n\n async getIncidents(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n startTime?: string;\n endTime?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n incidents: IncidentSummary[];\n total: number;\n }> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/incidents/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n limit: options?.limit ?? 100,\n sortOrder: options?.sortOrder ?? 'desc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch incidents: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n const validStatuses = ['active', 'acknowledged', 'resolved'];\n return {\n incidents: (data.incidents ?? [])\n .filter((i: any) => validStatuses.includes(i.status))\n .map(\n (i: any): IncidentSummary => ({\n incidentId: i.incidentId ?? '',\n alertId: i.alertId ?? '',\n status: i.status,\n description: i.description,\n notes: i.notes,\n timestamp: i.timestamp,\n triggeredAt: i.triggeredAt,\n acknowledgedAt: i.acknowledgedAt,\n resolvedAt: i.resolvedAt,\n incidentTriggerAiRca: i.incidentTriggerAiRca ?? false,\n incidentTriggerAiCostAnalysis:\n i.incidentTriggerAiCostAnalysis ?? false,\n projectName: i.labels?.projectName,\n componentName: i.labels?.componentName,\n environmentName: i.labels?.environmentName,\n namespaceName: i.labels?.namespaceName,\n }),\n ),\n total: data.total ?? 0,\n };\n }\n\n async getAlerts(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<{\n alerts: AlertSummary[];\n total: number;\n }> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/alerts/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ?? new Date(Date.now() - 3600000).toISOString(),\n endTime: options?.endTime ?? new Date().toISOString(),\n limit: options?.limit ?? 100,\n sortOrder: options?.sortOrder ?? 'desc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n component: componentName,\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch alerts: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n\n return {\n alerts: (data.alerts ?? []).map(\n (a: any): AlertSummary => ({\n timestamp: a.timestamp,\n alertId: a.alertId ?? '',\n alertValue: a.alertValue,\n ruleName: a.metadata?.alertRule?.name,\n ruleDescription: a.metadata?.alertRule?.description,\n severity: a.metadata?.alertRule?.severity,\n sourceType: a.metadata?.alertRule?.source?.type,\n sourceQuery: a.metadata?.alertRule?.source?.query,\n sourceMetric: a.metadata?.alertRule?.source?.metric,\n projectName: a.metadata?.labels?.projectName,\n componentName: a.metadata?.labels?.componentName,\n environmentName: a.metadata?.labels?.environmentName,\n namespaceName: a.metadata?.labels?.namespaceName,\n notificationChannels: a.notificationChannels ?? [],\n incidentEnabled: a.incidentEnabled ?? false,\n }),\n ),\n total: data.total ?? 0,\n };\n }\n\n async getRuntimeLogs(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n logLevels?: string[];\n searchQuery?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<LogsResponse> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1/logs/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ||\n new Date(Date.now() - 60 * 60 * 1000).toISOString(),\n endTime: options?.endTime || new Date().toISOString(),\n limit: options?.limit || 100,\n sortOrder: options?.sortOrder || 'desc',\n ...(options?.logLevels &&\n options.logLevels.length > 0 && { logLevels: options.logLevels }),\n ...(options?.searchQuery && {\n searchPhrase: options.searchQuery,\n }),\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error ||\n `Failed to fetch runtime logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data;\n }\n\n async getRuntimeEvents(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n componentName?: string,\n options?: {\n limit?: number;\n startTime?: string;\n endTime?: string;\n sortOrder?: 'asc' | 'desc';\n },\n ): Promise<EventsResponse> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1/events/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({\n startTime:\n options?.startTime ||\n new Date(Date.now() - 60 * 60 * 1000).toISOString(),\n endTime: options?.endTime || new Date().toISOString(),\n limit: options?.limit || 100,\n sortOrder: options?.sortOrder || 'desc',\n searchScope: {\n namespace: namespaceName,\n project: projectName,\n ...(componentName ? { component: componentName } : {}),\n environment: environmentName,\n },\n }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error ||\n `Failed to fetch events: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data;\n }\n\n async updateIncidentStatus(\n incidentId: string,\n status: 'acknowledged' | 'resolved',\n namespaceName: string,\n environmentName: string,\n ): Promise<void> {\n const { observerUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n const response = await this.fetchApi.fetch(\n `${observerUrl}/api/v1alpha1/incidents/${encodeURIComponent(incidentId)}`,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...DIRECT_HEADER },\n body: JSON.stringify({ status }),\n },\n );\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw new Error(\n error || `Failed to update incident: ${response.statusText}`,\n );\n }\n }\n\n async getFinOpsReports(\n namespaceName: string,\n projectName: string,\n environmentName: string,\n options?: {\n startTime?: string;\n endTime?: string;\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n sort?: string;\n },\n ): Promise<{\n reports: FinOpsReportSummary[];\n totalCount?: number;\n }> {\n const { finopsAgentUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n if (!finopsAgentUrl) {\n throw new Error('FinOps service is not configured');\n }\n\n const url = new URL(`${finopsAgentUrl}/api/v1alpha1/reports`);\n url.searchParams.set('namespace', namespaceName);\n url.searchParams.set('project', projectName);\n url.searchParams.set('environment', environmentName);\n if (options?.startTime)\n url.searchParams.set('startTime', options.startTime);\n if (options?.endTime) url.searchParams.set('endTime', options.endTime);\n if (options?.status) url.searchParams.set('status', options.status);\n if (options?.limit !== undefined)\n url.searchParams.set('limit', String(options.limit));\n if (options?.sort) url.searchParams.set('sort', options.sort);\n\n let response: Response;\n try {\n response = await this.fetchApi.fetch(url.toString(), {\n headers: { ...DIRECT_HEADER },\n });\n } catch (err) {\n throw new Error(\n `FinOps service is unreachable: ${\n err instanceof Error ? err.message : err\n }`,\n );\n }\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('FinOps service is not configured')) {\n throw new Error('FinOps service is not configured');\n }\n if (error.includes('Observability is not configured for component')) {\n throw new Error('Observability is not enabled for this component');\n }\n throw new Error(\n error || `Failed to fetch FinOps reports: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return {\n reports: data.reports || [],\n totalCount: data.totalCount,\n };\n }\n\n async getFinOpsReport(\n reportId: string,\n environmentName: string,\n namespaceName: string,\n ): Promise<FinOpsReportDetailed> {\n const { finopsAgentUrl } = await this.urlCache.resolveUrls(\n namespaceName,\n environmentName,\n );\n\n if (!finopsAgentUrl) {\n throw new Error('FinOps service is not configured');\n }\n\n const url = new URL(\n `${finopsAgentUrl}/api/v1alpha1/reports/${encodeURIComponent(reportId)}`,\n );\n\n let response: Response;\n try {\n response = await this.fetchApi.fetch(url.toString(), {\n headers: { ...DIRECT_HEADER },\n });\n } catch (err) {\n throw new Error(\n `FinOps service is unreachable: ${\n err instanceof Error ? err.message : err\n }`,\n );\n }\n\n if (!response.ok) {\n const error = await this.parseError(response);\n if (error.includes('FinOps service is not configured')) {\n throw new Error('FinOps service is not configured');\n }\n if (error.includes('FinOps report not found')) {\n throw new Error('FinOps report not found');\n }\n throw new Error(\n error || `Failed to fetch FinOps report: ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data;\n }\n\n private async parseError(response: Response): Promise<string> {\n try {\n const error = await response.json();\n return (\n error.error ||\n error.message ||\n `${response.status} ${response.statusText}`\n );\n } catch {\n return `${response.status} ${response.statusText}`;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { Grid, TextField, FormControl, InputLabel, Select, MenuItem, Checkbox } from '@material-ui/core';
|
|
3
|
-
import { Skeleton } from '@material-ui/lab';
|
|
4
3
|
import { ALERT_SEVERITIES } from './types.esm.js';
|
|
5
|
-
import { TimeRangeFilter } from '
|
|
4
|
+
import { EnvironmentFilter, TimeRangeFilter } from '@openchoreo/backstage-plugin-react';
|
|
6
5
|
import { useDebouncedSearch } from '../../hooks/useDebouncedSearch.esm.js';
|
|
7
6
|
|
|
8
7
|
const AlertsFilter = ({
|
|
@@ -16,9 +15,6 @@ const AlertsFilter = ({
|
|
|
16
15
|
filters.searchQuery,
|
|
17
16
|
(value) => onFiltersChange({ searchQuery: value })
|
|
18
17
|
);
|
|
19
|
-
const handleEnvironmentChange = (event) => {
|
|
20
|
-
onFiltersChange({ environment: event.target.value });
|
|
21
|
-
};
|
|
22
18
|
const handleSeverityChange = (event) => {
|
|
23
19
|
onFiltersChange({ severity: event.target.value });
|
|
24
20
|
};
|
|
@@ -57,25 +53,15 @@ const AlertsFilter = ({
|
|
|
57
53
|
}
|
|
58
54
|
)
|
|
59
55
|
] }) }),
|
|
60
|
-
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 2, children: /* @__PURE__ */
|
|
61
|
-
|
|
56
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 2, children: /* @__PURE__ */ jsx(
|
|
57
|
+
EnvironmentFilter,
|
|
62
58
|
{
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
Select,
|
|
70
|
-
{
|
|
71
|
-
value: filters.environment,
|
|
72
|
-
onChange: handleEnvironmentChange,
|
|
73
|
-
labelId: "environment-label",
|
|
74
|
-
label: "Environment",
|
|
75
|
-
children: environments.map((env) => /* @__PURE__ */ jsx(MenuItem, { value: env.name, children: env.displayName || env.name }, env.name))
|
|
76
|
-
}
|
|
77
|
-
)
|
|
78
|
-
]
|
|
59
|
+
environments,
|
|
60
|
+
loading: environmentsLoading,
|
|
61
|
+
value: environments.find((e) => e.name === filters.environment) ?? null,
|
|
62
|
+
onChange: (env) => onFiltersChange({ environment: env?.name ?? "" }),
|
|
63
|
+
disabled,
|
|
64
|
+
size: "medium"
|
|
79
65
|
}
|
|
80
66
|
) }),
|
|
81
67
|
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 2, children: /* @__PURE__ */ jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlertsFilter.esm.js","sources":["../../../src/components/Alerts/AlertsFilter.tsx"],"sourcesContent":["import { FC, ChangeEvent } from 'react';\nimport {\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Checkbox,\n Grid,\n TextField,\n} from '@material-ui/core';\nimport {
|
|
1
|
+
{"version":3,"file":"AlertsFilter.esm.js","sources":["../../../src/components/Alerts/AlertsFilter.tsx"],"sourcesContent":["import { FC, ChangeEvent } from 'react';\nimport {\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Checkbox,\n Grid,\n TextField,\n} from '@material-ui/core';\nimport { type AlertsFilters, ALERT_SEVERITIES } from './types';\nimport {\n Environment,\n EnvironmentFilter,\n TimeRangeFilter,\n} from '@openchoreo/backstage-plugin-react';\nimport { useDebouncedSearch } from '../../hooks/useDebouncedSearch';\n\ninterface AlertsFilterProps {\n filters: AlertsFilters;\n onFiltersChange: (filters: Partial<AlertsFilters>) => void;\n environments: Environment[];\n environmentsLoading: boolean;\n disabled?: boolean;\n}\n\nexport const AlertsFilter: FC<AlertsFilterProps> = ({\n filters,\n onFiltersChange,\n environments,\n environmentsLoading,\n disabled = false,\n}) => {\n const [searchInput, handleSearchChange] = useDebouncedSearch(\n filters.searchQuery,\n value => onFiltersChange({ searchQuery: value }),\n );\n\n const handleSeverityChange = (event: ChangeEvent<{ value: unknown }>) => {\n onFiltersChange({ severity: event.target.value as string[] });\n };\n\n return (\n <Grid container spacing={2}>\n <Grid item xs={12} md={6}>\n <TextField\n fullWidth\n placeholder=\"Search alerts...\"\n variant=\"outlined\"\n value={searchInput}\n onChange={handleSearchChange}\n disabled={disabled}\n />\n </Grid>\n\n <Grid item xs={12} md={2}>\n <FormControl fullWidth disabled={disabled} variant=\"outlined\">\n <InputLabel id=\"severity-label\">Severity</InputLabel>\n <Select\n multiple\n value={filters.severity || []}\n onChange={handleSeverityChange}\n labelId=\"severity-label\"\n label=\"Severity\"\n renderValue={selected =>\n (selected as string[]).length === 0\n ? 'All'\n : (selected as string[]).join(', ')\n }\n >\n {ALERT_SEVERITIES.map(sev => (\n <MenuItem key={sev} value={sev}>\n <Checkbox\n checked={(filters.severity || []).indexOf(sev) > -1}\n />\n {sev.charAt(0).toUpperCase() + sev.slice(1)}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Grid>\n\n <Grid item xs={12} md={2}>\n <EnvironmentFilter\n environments={environments}\n loading={environmentsLoading}\n value={environments.find(e => e.name === filters.environment) ?? null}\n onChange={env => onFiltersChange({ environment: env?.name ?? '' })}\n disabled={disabled}\n size=\"medium\"\n />\n </Grid>\n\n <Grid item xs={12} md={2}>\n <TimeRangeFilter\n value={filters.timeRange}\n customStartTime={filters.customStartTime}\n customEndTime={filters.customEndTime}\n onChange={onFiltersChange}\n disabled={disabled}\n />\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -30,11 +30,11 @@ const AlertsTable = ({
|
|
|
30
30
|
return /* @__PURE__ */ jsxs(Paper, { className: classes.tablePaper, children: [
|
|
31
31
|
/* @__PURE__ */ jsx(Box, { className: classes.tableContainer, children: /* @__PURE__ */ jsxs(Table, { className: classes.table, size: "small", stickyHeader: true, children: [
|
|
32
32
|
/* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
33
|
-
/* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, children: "Time" }),
|
|
34
|
-
/* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, children: "Rule" }),
|
|
35
|
-
/* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, children: "Severity" }),
|
|
36
|
-
/* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, children: "Source" }),
|
|
37
|
-
/* @__PURE__ */ jsx(TableCell, { className: classes.headerCell, children: "Value" })
|
|
33
|
+
/* @__PURE__ */ jsx(TableCell, { scope: "col", className: classes.headerCell, children: "Time" }),
|
|
34
|
+
/* @__PURE__ */ jsx(TableCell, { scope: "col", className: classes.headerCell, children: "Rule" }),
|
|
35
|
+
/* @__PURE__ */ jsx(TableCell, { scope: "col", className: classes.headerCell, children: "Severity" }),
|
|
36
|
+
/* @__PURE__ */ jsx(TableCell, { scope: "col", className: classes.headerCell, children: "Source" }),
|
|
37
|
+
/* @__PURE__ */ jsx(TableCell, { scope: "col", className: classes.headerCell, children: "Value" })
|
|
38
38
|
] }) }),
|
|
39
39
|
/* @__PURE__ */ jsxs(TableBody, { children: [
|
|
40
40
|
loading && renderLoadingSkeletons(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlertsTable.esm.js","sources":["../../../src/components/Alerts/AlertsTable.tsx"],"sourcesContent":["import { FC } from 'react';\nimport {\n Table,\n TableHead,\n TableBody,\n TableRow,\n TableCell,\n Paper,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport type { AlertSummary } from '../../types';\nimport { useLogsTableStyles } from '../RuntimeLogs/styles';\nimport { AlertRow } from './AlertRow';\n\ninterface AlertsTableProps {\n alerts: AlertSummary[];\n loading: boolean;\n environmentName?: string;\n projectName?: string;\n componentName?: string;\n namespaceName?: string;\n onViewIncident?: (alert: AlertSummary) => void;\n onViewCostAnalysis?: (alert: AlertSummary) => void;\n}\n\nexport const AlertsTable: FC<AlertsTableProps> = ({\n alerts,\n loading,\n environmentName = '',\n projectName = '',\n componentName = '',\n namespaceName = 'default',\n onViewIncident,\n onViewCostAnalysis,\n}) => {\n const classes = useLogsTableStyles();\n\n const renderLoadingSkeletons = () =>\n Array.from({ length: 5 }).map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n </TableRow>\n ));\n\n const renderEmptyState = () => (\n <TableRow>\n <TableCell colSpan={5}>\n <Box className={classes.emptyState}>\n <Typography variant=\"h6\" gutterBottom>\n No alerts found\n </Typography>\n <Typography variant=\"body2\">\n No alerts found for the selected time range and filters.\n </Typography>\n </Box>\n </TableCell>\n </TableRow>\n );\n\n const filteredAlerts = alerts;\n\n return (\n <Paper className={classes.tablePaper}>\n <Box className={classes.tableContainer}>\n <Table className={classes.table} size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell className={classes.headerCell}
|
|
1
|
+
{"version":3,"file":"AlertsTable.esm.js","sources":["../../../src/components/Alerts/AlertsTable.tsx"],"sourcesContent":["import { FC } from 'react';\nimport {\n Table,\n TableHead,\n TableBody,\n TableRow,\n TableCell,\n Paper,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport type { AlertSummary } from '../../types';\nimport { useLogsTableStyles } from '../RuntimeLogs/styles';\nimport { AlertRow } from './AlertRow';\n\ninterface AlertsTableProps {\n alerts: AlertSummary[];\n loading: boolean;\n environmentName?: string;\n projectName?: string;\n componentName?: string;\n namespaceName?: string;\n onViewIncident?: (alert: AlertSummary) => void;\n onViewCostAnalysis?: (alert: AlertSummary) => void;\n}\n\nexport const AlertsTable: FC<AlertsTableProps> = ({\n alerts,\n loading,\n environmentName = '',\n projectName = '',\n componentName = '',\n namespaceName = 'default',\n onViewIncident,\n onViewCostAnalysis,\n}) => {\n const classes = useLogsTableStyles();\n\n const renderLoadingSkeletons = () =>\n Array.from({ length: 5 }).map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n <TableCell>\n <Skeleton variant=\"text\" width=\"100%\" />\n </TableCell>\n </TableRow>\n ));\n\n const renderEmptyState = () => (\n <TableRow>\n <TableCell colSpan={5}>\n <Box className={classes.emptyState}>\n <Typography variant=\"h6\" gutterBottom>\n No alerts found\n </Typography>\n <Typography variant=\"body2\">\n No alerts found for the selected time range and filters.\n </Typography>\n </Box>\n </TableCell>\n </TableRow>\n );\n\n const filteredAlerts = alerts;\n\n return (\n <Paper className={classes.tablePaper}>\n <Box className={classes.tableContainer}>\n <Table className={classes.table} size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell scope=\"col\" className={classes.headerCell}>\n Time\n </TableCell>\n <TableCell scope=\"col\" className={classes.headerCell}>\n Rule\n </TableCell>\n <TableCell scope=\"col\" className={classes.headerCell}>\n Severity\n </TableCell>\n <TableCell scope=\"col\" className={classes.headerCell}>\n Source\n </TableCell>\n <TableCell scope=\"col\" className={classes.headerCell}>\n Value\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading && renderLoadingSkeletons()}\n {!loading && filteredAlerts.length === 0 && renderEmptyState()}\n {!loading &&\n filteredAlerts.map(alert => (\n <AlertRow\n key={alert.alertId}\n alert={alert}\n environmentName={environmentName}\n projectName={projectName}\n componentName={componentName}\n namespaceName={namespaceName}\n onViewIncident={onViewIncident ?? (() => {})}\n onViewCostAnalysis={onViewCostAnalysis}\n />\n ))}\n </TableBody>\n </Table>\n </Box>\n {loading && filteredAlerts.length > 0 && (\n <Box className={classes.loadingContainer}>\n <CircularProgress size={24} />\n </Box>\n )}\n </Paper>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -10,16 +10,14 @@ import { AlertsTable } from './AlertsTable.esm.js';
|
|
|
10
10
|
import { AlertsActions } from './AlertsActions.esm.js';
|
|
11
11
|
import { useGetNamespaceAndProjectByEntity } from '../../hooks/useGetNamespaceAndProjectByEntity.esm.js';
|
|
12
12
|
import '@backstage/core-plugin-api';
|
|
13
|
-
import {
|
|
13
|
+
import { useAlertsPermission, useProjectEnvironments, pickRangeForAge } from '@openchoreo/backstage-plugin-react';
|
|
14
14
|
import 'react-router-dom';
|
|
15
15
|
import '../../utils/urlTimeRange.esm.js';
|
|
16
16
|
import '../../api/ObservabilityApi.esm.js';
|
|
17
|
-
import { useAlertsPermission } from '@openchoreo/backstage-plugin-react';
|
|
18
17
|
import { useUrlFiltersForAlerts } from '../../hooks/useUrlFiltersForAlerts.esm.js';
|
|
19
18
|
import { useComponentAlerts } from '../../hooks/useComponentAlerts.esm.js';
|
|
20
19
|
import '../../api/RCAAgentApi.esm.js';
|
|
21
20
|
import '../../api/FinOpsAgentApi.esm.js';
|
|
22
|
-
import { NoEnvironmentsEmptyState } from '../common/NoEnvironmentsEmptyState.esm.js';
|
|
23
21
|
import { useRuntimeLogsStyles } from '../RuntimeLogs/styles.esm.js';
|
|
24
22
|
|
|
25
23
|
const ObservabilityAlertsContent = () => {
|
|
@@ -30,7 +28,7 @@ const ObservabilityAlertsContent = () => {
|
|
|
30
28
|
environments,
|
|
31
29
|
loading: environmentsLoading,
|
|
32
30
|
error: environmentsError
|
|
33
|
-
} =
|
|
31
|
+
} = useProjectEnvironments(project, namespace);
|
|
34
32
|
const { filters, updateFilters } = useUrlFiltersForAlerts({
|
|
35
33
|
environments
|
|
36
34
|
});
|
|
@@ -112,20 +110,7 @@ const ObservabilityAlertsContent = () => {
|
|
|
112
110
|
const parentProject = entity.spec?.system || project || "";
|
|
113
111
|
const catalogNs = entity.metadata.namespace || "default";
|
|
114
112
|
if (!parentProject) return;
|
|
115
|
-
const
|
|
116
|
-
{ value: "10m", ms: 10 * 60 * 1e3 },
|
|
117
|
-
{ value: "30m", ms: 30 * 60 * 1e3 },
|
|
118
|
-
{ value: "1h", ms: 60 * 60 * 1e3 },
|
|
119
|
-
{ value: "24h", ms: 24 * 60 * 60 * 1e3 },
|
|
120
|
-
{ value: "7d", ms: 7 * 24 * 60 * 60 * 1e3 },
|
|
121
|
-
{ value: "14d", ms: 14 * 24 * 60 * 60 * 1e3 }
|
|
122
|
-
];
|
|
123
|
-
let timeRange = "1h";
|
|
124
|
-
if (alert.timestamp) {
|
|
125
|
-
const ageMs = Date.now() - new Date(alert.timestamp).getTime();
|
|
126
|
-
const match = PRESETS.find((p) => p.ms >= ageMs);
|
|
127
|
-
timeRange = match ? match.value : PRESETS[PRESETS.length - 1].value;
|
|
128
|
-
}
|
|
113
|
+
const timeRange = alert.timestamp ? pickRangeForAge(Date.now() - new Date(alert.timestamp).getTime()) : "1h";
|
|
129
114
|
const params = new URLSearchParams({
|
|
130
115
|
search: alert.alertId,
|
|
131
116
|
timeRange,
|
|
@@ -141,20 +126,7 @@ const ObservabilityAlertsContent = () => {
|
|
|
141
126
|
const parentProject = entity.spec?.system || project || "";
|
|
142
127
|
const catalogNs = entity.metadata.namespace || "default";
|
|
143
128
|
if (!parentProject) return;
|
|
144
|
-
const
|
|
145
|
-
{ value: "10m", ms: 10 * 60 * 1e3 },
|
|
146
|
-
{ value: "30m", ms: 30 * 60 * 1e3 },
|
|
147
|
-
{ value: "1h", ms: 60 * 60 * 1e3 },
|
|
148
|
-
{ value: "24h", ms: 24 * 60 * 60 * 1e3 },
|
|
149
|
-
{ value: "7d", ms: 7 * 24 * 60 * 60 * 1e3 },
|
|
150
|
-
{ value: "14d", ms: 14 * 24 * 60 * 60 * 1e3 }
|
|
151
|
-
];
|
|
152
|
-
let timeRange = "1h";
|
|
153
|
-
if (alert.timestamp) {
|
|
154
|
-
const ageMs = Date.now() - new Date(alert.timestamp).getTime();
|
|
155
|
-
const match = PRESETS.find((p) => p.ms >= ageMs);
|
|
156
|
-
timeRange = match ? match.value : PRESETS[PRESETS.length - 1].value;
|
|
157
|
-
}
|
|
129
|
+
const timeRange = alert.timestamp ? pickRangeForAge(Date.now() - new Date(alert.timestamp).getTime()) : "1h";
|
|
158
130
|
const params = new URLSearchParams({
|
|
159
131
|
q: alert.alertId,
|
|
160
132
|
timeRange,
|
|
@@ -184,9 +156,6 @@ const ObservabilityAlertsContent = () => {
|
|
|
184
156
|
if (environmentsError) {
|
|
185
157
|
return /* @__PURE__ */ jsx(Box, { children: renderError(environmentsError) });
|
|
186
158
|
}
|
|
187
|
-
if (!environmentsLoading && environments.length === 0) {
|
|
188
|
-
return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(NoEnvironmentsEmptyState, { feature: "alerts" }) });
|
|
189
|
-
}
|
|
190
159
|
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
191
160
|
/* @__PURE__ */ jsx(
|
|
192
161
|
AlertsFilter,
|
|
@@ -199,6 +168,7 @@ const ObservabilityAlertsContent = () => {
|
|
|
199
168
|
}
|
|
200
169
|
),
|
|
201
170
|
alertsError && renderError(alertsError),
|
|
171
|
+
!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." }) }),
|
|
202
172
|
filters.environment && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
203
173
|
/* @__PURE__ */ jsx(
|
|
204
174
|
AlertsActions,
|