From cd0d02a61b1fc62804cef4dc81edcb19858a01fb Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:06:38 +0100 Subject: [PATCH] feat: static mock data for executions, routes, agents, metrics Co-Authored-By: Claude Opus 4.6 (1M context) --- src/mocks/agents.ts | 69 +++++++++ src/mocks/executions.ts | 302 ++++++++++++++++++++++++++++++++++++++++ src/mocks/metrics.ts | 200 ++++++++++++++++++++++++++ src/mocks/routes.ts | 99 +++++++++++++ 4 files changed, 670 insertions(+) create mode 100644 src/mocks/agents.ts create mode 100644 src/mocks/executions.ts create mode 100644 src/mocks/metrics.ts create mode 100644 src/mocks/routes.ts diff --git a/src/mocks/agents.ts b/src/mocks/agents.ts new file mode 100644 index 0000000..286785d --- /dev/null +++ b/src/mocks/agents.ts @@ -0,0 +1,69 @@ +import type { Agent } from '../design-system/layout/Sidebar/Sidebar' + +export interface AgentHealth extends Agent { + uptime: string + memoryUsagePct: number + cpuUsagePct: number + activeRoutes: number + totalRoutes: number +} + +export const agents: AgentHealth[] = [ + { + id: 'prod-1', + name: 'prod-1', + service: 'order-service', + version: 'v3.2.1', + tps: '14.2/s', + lastSeen: '12s ago', + status: 'live', + uptime: '14d 6h', + memoryUsagePct: 62, + cpuUsagePct: 24, + activeRoutes: 3, + totalRoutes: 3, + }, + { + id: 'prod-2', + name: 'prod-2', + service: 'payment-svc', + version: 'v3.2.1', + tps: '11.8/s', + lastSeen: '8s ago', + status: 'live', + errorRate: '3 err/h', + uptime: '14d 6h', + memoryUsagePct: 71, + cpuUsagePct: 31, + activeRoutes: 2, + totalRoutes: 2, + }, + { + id: 'prod-3', + name: 'prod-3', + service: 'shipment-svc', + version: 'v3.2.0', + tps: '12.1/s', + lastSeen: '5s ago', + status: 'live', + uptime: '7d 14h', + memoryUsagePct: 55, + cpuUsagePct: 19, + activeRoutes: 2, + totalRoutes: 2, + }, + { + id: 'prod-4', + name: 'prod-4', + service: 'shipment-svc', + version: 'v3.2.0', + tps: '9.1/s', + lastSeen: '3s ago', + status: 'live', + uptime: '7d 14h', + memoryUsagePct: 48, + cpuUsagePct: 15, + activeRoutes: 2, + totalRoutes: 2, + }, +] diff --git a/src/mocks/executions.ts b/src/mocks/executions.ts new file mode 100644 index 0000000..e8e669e --- /dev/null +++ b/src/mocks/executions.ts @@ -0,0 +1,302 @@ +export interface ProcessorData { + name: string + type: string + durationMs: number + status: 'ok' | 'slow' | 'fail' + startMs: number +} + +export interface Execution { + id: string + orderId: string + customer: string + route: string + routeGroup: string + status: 'completed' | 'failed' | 'running' | 'warning' + durationMs: number + timestamp: Date + correlationId: string + agent: string + errorMessage?: string + errorClass?: string + processors: ProcessorData[] +} + +export const executions: Execution[] = [ + { + id: 'E-2026-03-18-00201', + orderId: 'OP-92184', + customer: 'CUST-44210', + route: 'order-intake', + routeGroup: 'order-flow', + status: 'completed', + durationMs: 87, + timestamp: new Date('2026-03-18T09:12:04'), + correlationId: 'cmr-f4a1c82b-9d3e', + agent: 'prod-1', + processors: [ + { name: 'from(jms:orders)', type: 'consumer', durationMs: 4, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 6, status: 'ok', startMs: 4 }, + { name: 'validate(schema)', type: 'process', durationMs: 10, status: 'ok', startMs: 10 }, + { name: 'enrich(customer-db)', type: 'enrich', durationMs: 52, status: 'ok', startMs: 20 }, + { name: 'to(order-enrichment)', type: 'to', durationMs: 15, status: 'ok', startMs: 72 }, + ], + }, + { + id: 'E-2026-03-18-00200', + orderId: 'OP-92183', + customer: 'CUST-18773', + route: 'payment-validate', + routeGroup: 'payment-flow', + status: 'completed', + durationMs: 164, + timestamp: new Date('2026-03-18T09:11:22'), + correlationId: 'cmr-7b2d9f14-c5a8', + agent: 'prod-2', + processors: [ + { name: 'from(jms:payments)', type: 'consumer', durationMs: 5, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 8, status: 'ok', startMs: 5 }, + { name: 'validate(payment-schema)', type: 'process', durationMs: 15, status: 'ok', startMs: 13 }, + { name: 'check(fraud-service)', type: 'enrich', durationMs: 112, status: 'ok', startMs: 28 }, + { name: 'to(payment-process)', type: 'to', durationMs: 24, status: 'ok', startMs: 140 }, + ], + }, + { + id: 'E-2026-03-18-00202', + orderId: 'OP-92185', + customer: 'CUST-67501', + route: 'order-enrichment', + routeGroup: 'order-flow', + status: 'running', + durationMs: 30000, + timestamp: new Date('2026-03-18T09:13:44'), + correlationId: 'cmr-3c8e1a7f-d2b6', + agent: 'prod-1', + processors: [ + { name: 'from(jms:orders)', type: 'consumer', durationMs: 5, status: 'ok', startMs: 0 }, + { name: 'enrich(inventory-api)', type: 'enrich', durationMs: 29990, status: 'slow', startMs: 5 }, + ], + }, + { + id: 'E-2026-03-18-00198', + orderId: 'OP-92180', + customer: 'CUST-55019', + route: 'shipment-dispatch', + routeGroup: 'shipment-flow', + status: 'warning', + durationMs: 248, + timestamp: new Date('2026-03-18T09:09:47'), + correlationId: 'cmr-a9f3b2c1-e4d7', + agent: 'prod-3', + processors: [ + { name: 'from(jms:shipments)', type: 'consumer', durationMs: 6, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 8, status: 'ok', startMs: 6 }, + { name: 'enrich(carrier-api)', type: 'enrich', durationMs: 198, status: 'slow', startMs: 14 }, + { name: 'to(carrier-gateway)', type: 'to', durationMs: 36, status: 'ok', startMs: 212 }, + ], + }, + { + id: 'E-2026-03-18-00191', + orderId: 'OP-88421', + customer: 'CUST-31094', + route: 'payment-process', + routeGroup: 'payment-flow', + status: 'failed', + durationMs: 412, + timestamp: new Date('2026-03-18T09:06:11'), + correlationId: 'cmr-9a4f2b71-e8c3', + agent: 'prod-2', + errorMessage: 'org.apache.camel.CamelExecutionException: Payment gateway timeout after 5000ms — POST https://pay.provider.com/v2/charge returned HTTP 504. Retry exhausted (3/3).', + errorClass: 'org.apache.camel.CamelExecutionException', + processors: [ + { name: 'from(jms:payments)', type: 'consumer', durationMs: 5, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 8, status: 'ok', startMs: 5 }, + { name: 'validate(payment-schema)', type: 'process', durationMs: 12, status: 'ok', startMs: 13 }, + { name: 'to(payment-gateway)', type: 'to', durationMs: 387, status: 'fail', startMs: 25 }, + ], + }, + { + id: 'E-2026-03-18-00189', + orderId: 'OP-88419', + customer: 'CUST-72841', + route: 'order-enrichment', + routeGroup: 'order-flow', + status: 'failed', + durationMs: 1247, + timestamp: new Date('2026-03-18T09:02:38'), + correlationId: 'cmr-b6d7c3a2-f1e9', + agent: 'prod-1', + errorMessage: 'java.sql.SQLTransientConnectionException: HikariPool-1 - Connection not available, request timed out after 1000ms. (pool: 10, active: 10, idle: 0, waiting: 3)', + errorClass: 'java.sql.SQLTransientConnectionException', + processors: [ + { name: 'from(jms:orders)', type: 'consumer', durationMs: 5, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 9, status: 'ok', startMs: 5 }, + { name: 'enrich(customer-db)', type: 'enrich', durationMs: 1233, status: 'fail', startMs: 14 }, + ], + }, + { + id: 'E-2026-03-18-00186', + orderId: 'OP-92179', + customer: 'CUST-90123', + route: 'order-intake', + routeGroup: 'order-flow', + status: 'completed', + durationMs: 62, + timestamp: new Date('2026-03-18T09:00:15'), + correlationId: 'cmr-2e5f8d9a-b4c1', + agent: 'prod-3', + processors: [ + { name: 'from(jms:orders)', type: 'consumer', durationMs: 3, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 5, status: 'ok', startMs: 3 }, + { name: 'validate(schema)', type: 'process', durationMs: 8, status: 'ok', startMs: 8 }, + { name: 'enrich(customer-db)', type: 'enrich', durationMs: 34, status: 'ok', startMs: 16 }, + { name: 'to(order-enrichment)', type: 'to', durationMs: 12, status: 'ok', startMs: 50 }, + ], + }, + { + id: 'E-2026-03-18-00184', + orderId: 'OP-92178', + customer: 'CUST-44210', + route: 'payment-validate', + routeGroup: 'payment-flow', + status: 'completed', + durationMs: 131, + timestamp: new Date('2026-03-18T08:58:33'), + correlationId: 'cmr-d1a3e7f4-c2b8', + agent: 'prod-1', + processors: [ + { name: 'from(jms:payments)', type: 'consumer', durationMs: 4, status: 'ok', startMs: 0 }, + { name: 'validate(payment-schema)', type: 'process', durationMs: 14, status: 'ok', startMs: 4 }, + { name: 'check(fraud-service)', type: 'enrich', durationMs: 88, status: 'ok', startMs: 18 }, + { name: 'to(payment-process)', type: 'to', durationMs: 25, status: 'ok', startMs: 106 }, + ], + }, + { + id: 'E-2026-03-18-00179', + orderId: 'OP-92175', + customer: 'CUST-67892', + route: 'shipment-track', + routeGroup: 'shipment-flow', + status: 'completed', + durationMs: 94, + timestamp: new Date('2026-03-18T08:53:07'), + correlationId: 'cmr-e8b2c9d4-a7f3', + agent: 'prod-4', + processors: [ + { name: 'from(jms:tracking)', type: 'consumer', durationMs: 4, status: 'ok', startMs: 0 }, + { name: 'enrich(carrier-api)', type: 'enrich', durationMs: 72, status: 'ok', startMs: 4 }, + { name: 'to(notification-hub)', type: 'to', durationMs: 18, status: 'ok', startMs: 76 }, + ], + }, + { + id: 'E-2026-03-18-00177', + orderId: 'OP-92174', + customer: 'CUST-15293', + route: 'order-intake', + routeGroup: 'order-flow', + status: 'completed', + durationMs: 73, + timestamp: new Date('2026-03-18T08:50:41'), + correlationId: 'cmr-f3c7a1b9-d5e2', + agent: 'prod-1', + processors: [ + { name: 'from(jms:orders)', type: 'consumer', durationMs: 3, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 6, status: 'ok', startMs: 3 }, + { name: 'validate(schema)', type: 'process', durationMs: 9, status: 'ok', startMs: 9 }, + { name: 'enrich(customer-db)', type: 'enrich', durationMs: 40, status: 'ok', startMs: 18 }, + { name: 'to(order-enrichment)', type: 'to', durationMs: 15, status: 'ok', startMs: 58 }, + ], + }, + { + id: 'E-2026-03-18-00173', + orderId: 'OP-92173', + customer: 'CUST-88104', + route: 'payment-process', + routeGroup: 'payment-flow', + status: 'completed', + durationMs: 198, + timestamp: new Date('2026-03-18T08:46:19'), + correlationId: 'cmr-a2d8f5c3-b9e1', + agent: 'prod-2', + processors: [ + { name: 'from(jms:payments)', type: 'consumer', durationMs: 5, status: 'ok', startMs: 0 }, + { name: 'validate(payment-schema)', type: 'process', durationMs: 12, status: 'ok', startMs: 5 }, + { name: 'to(payment-gateway)', type: 'to', durationMs: 156, status: 'ok', startMs: 17 }, + { name: 'to(order-service)', type: 'to', durationMs: 25, status: 'ok', startMs: 173 }, + ], + }, + { + id: 'E-2026-03-18-00164', + orderId: 'OP-92170', + customer: 'CUST-50321', + route: 'order-enrichment', + routeGroup: 'order-flow', + status: 'warning', + durationMs: 267, + timestamp: new Date('2026-03-18T08:39:52'), + correlationId: 'cmr-c4f1b7a8-e3d6', + agent: 'prod-1', + processors: [ + { name: 'from(jms:orders)', type: 'consumer', durationMs: 5, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 8, status: 'ok', startMs: 5 }, + { name: 'enrich(inventory-api)', type: 'enrich', durationMs: 224, status: 'slow', startMs: 13 }, + { name: 'to(payment-process)', type: 'to', durationMs: 30, status: 'ok', startMs: 237 }, + ], + }, + { + id: 'E-2026-03-18-00158', + orderId: 'OP-88412', + customer: 'CUST-23781', + route: 'payment-process', + routeGroup: 'payment-flow', + status: 'failed', + durationMs: 5234, + timestamp: new Date('2026-03-18T08:31:05'), + correlationId: 'cmr-7e9a2c5f-d1b4', + agent: 'prod-2', + errorMessage: 'org.apache.camel.component.http.HttpOperationFailedException: HTTP operation failed invoking https://pay.provider.com/v2/charge with statusCode: 422 — Unprocessable Entity: card declined (insufficient funds)', + errorClass: 'org.apache.camel.component.http.HttpOperationFailedException', + processors: [ + { name: 'from(jms:payments)', type: 'consumer', durationMs: 5, status: 'ok', startMs: 0 }, + { name: 'validate(payment-schema)', type: 'process', durationMs: 11, status: 'ok', startMs: 5 }, + { name: 'to(payment-gateway)', type: 'to', durationMs: 5218, status: 'fail', startMs: 16 }, + ], + }, + { + id: 'E-2026-03-18-00151', + orderId: 'OP-92166', + customer: 'CUST-61042', + route: 'shipment-dispatch', + routeGroup: 'shipment-flow', + status: 'completed', + durationMs: 112, + timestamp: new Date('2026-03-18T08:22:44'), + correlationId: 'cmr-b5c8d2a7-f4e3', + agent: 'prod-3', + processors: [ + { name: 'from(jms:shipments)', type: 'consumer', durationMs: 5, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 7, status: 'ok', startMs: 5 }, + { name: 'enrich(carrier-api)', type: 'enrich', durationMs: 80, status: 'ok', startMs: 12 }, + { name: 'to(carrier-gateway)', type: 'to', durationMs: 20, status: 'ok', startMs: 92 }, + ], + }, + { + id: 'E-2026-03-18-00144', + orderId: 'OP-92161', + customer: 'CUST-77215', + route: 'order-intake', + routeGroup: 'order-flow', + status: 'completed', + durationMs: 91, + timestamp: new Date('2026-03-18T08:15:19'), + correlationId: 'cmr-d9e3f7b1-a6c5', + agent: 'prod-4', + processors: [ + { name: 'from(jms:orders)', type: 'consumer', durationMs: 4, status: 'ok', startMs: 0 }, + { name: 'unmarshal(json)', type: 'transform', durationMs: 7, status: 'ok', startMs: 4 }, + { name: 'validate(schema)', type: 'process', durationMs: 10, status: 'ok', startMs: 11 }, + { name: 'enrich(customer-db)', type: 'enrich', durationMs: 54, status: 'ok', startMs: 21 }, + { name: 'to(order-enrichment)', type: 'to', durationMs: 16, status: 'ok', startMs: 75 }, + ], + }, +] diff --git a/src/mocks/metrics.ts b/src/mocks/metrics.ts new file mode 100644 index 0000000..8314895 --- /dev/null +++ b/src/mocks/metrics.ts @@ -0,0 +1,200 @@ +export interface KpiMetric { + label: string + value: string | number + unit?: string + trend: 'up' | 'down' | 'neutral' + trendValue: string + trendSentiment: 'good' | 'bad' | 'neutral' + detail: string + accent: 'amber' | 'success' | 'error' | 'running' | 'warning' + sparkline: number[] +} + +export interface TimeSeriesPoint { + timestamp: Date + value: number +} + +export interface MetricSeries { + label: string + data: TimeSeriesPoint[] +} + +// Generate a realistic time series for the past shift (06:00 - now ~09:15) +function generateTimeSeries( + baseValue: number, + variance: number, + points: number, + startHour = 6, +): TimeSeriesPoint[] { + const result: TimeSeriesPoint[] = [] + const now = new Date('2026-03-18T09:15:00') + const start = new Date('2026-03-18T06:00:00') + const totalMs = now.getTime() - start.getTime() + const interval = totalMs / points + + for (let i = 0; i <= points; i++) { + const ts = new Date(start.getTime() + i * interval) + const noise = (Math.random() - 0.5) * 2 * variance + const trend = (i / points) * (baseValue * 0.1) // slight upward trend + result.push({ timestamp: ts, value: Math.max(0, baseValue + noise + trend) }) + } + return result +} + +// KPI stat cards data +export const kpiMetrics: KpiMetric[] = [ + { + label: 'Executions (shift)', + value: '3,241', + trend: 'up', + trendValue: '+12%', + trendSentiment: 'good', + detail: '97.1% success since 06:00', + accent: 'amber', + sparkline: [28, 32, 29, 35, 38, 41, 37, 44, 42, 47, 45, 51, 48, 52], + }, + { + label: 'Success Rate', + value: '97.1%', + trend: 'down', + trendValue: '-0.4%', + trendSentiment: 'bad', + detail: '3,147 ok / 56 warn / 38 error', + accent: 'success', + sparkline: [98.2, 97.9, 98.1, 97.8, 97.5, 97.6, 97.4, 97.2, 97.3, 97.1, 97.0, 97.1, 97.2, 97.1], + }, + { + label: 'Errors (shift)', + value: 38, + trend: 'up', + trendValue: '+5', + trendSentiment: 'bad', + detail: '23 overnight · 15 since 06:00', + accent: 'error', + sparkline: [1, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8], + }, + { + label: 'Throughput', + value: '47.2', + unit: 'msg/s', + trend: 'neutral', + trendValue: '→', + trendSentiment: 'neutral', + detail: 'Capacity: 120 msg/s · 39%', + accent: 'running', + sparkline: [44, 46, 45, 47, 48, 46, 47, 48, 46, 47, 48, 47, 46, 47], + }, + { + label: 'Latency p99', + value: 287, + unit: 'ms', + trend: 'up', + trendValue: '+23ms', + trendSentiment: 'bad', + detail: 'SLA: <300ms · CLOSE', + accent: 'warning', + sparkline: [198, 212, 205, 218, 224, 231, 238, 245, 252, 261, 268, 275, 281, 287], + }, +] + +// Time series chart data +export const throughputSeries: MetricSeries[] = [ + { + label: 'order-service', + data: generateTimeSeries(47, 8, 40), + }, + { + label: 'payment-svc', + data: generateTimeSeries(28, 5, 40), + }, + { + label: 'shipment-svc', + data: generateTimeSeries(19, 4, 40), + }, +] + +export const latencySeries: MetricSeries[] = [ + { + label: 'p50', + data: generateTimeSeries(98, 15, 40), + }, + { + label: 'p95', + data: generateTimeSeries(187, 25, 40), + }, + { + label: 'p99', + data: generateTimeSeries(258, 35, 40), + }, +] + +export const errorCountSeries: MetricSeries[] = [ + { + label: 'payment-flow', + data: generateTimeSeries(12, 4, 40), + }, + { + label: 'order-flow', + data: generateTimeSeries(8, 3, 40), + }, + { + label: 'shipment-flow', + data: generateTimeSeries(4, 2, 40), + }, +] + +// Route-level metrics summary +export interface RouteMetricRow { + routeId: string + routeName: string + execCount: number + successRate: number + avgDurationMs: number + p99DurationMs: number + errorCount: number + sparkline: number[] +} + +export const routeMetrics: RouteMetricRow[] = [ + { + routeId: 'order-intake', + routeName: 'order-intake', + execCount: 892, + successRate: 99.2, + avgDurationMs: 88, + p99DurationMs: 142, + errorCount: 7, + sparkline: [82, 86, 84, 88, 91, 87, 90, 88, 85, 89, 88, 86, 89, 88], + }, + { + routeId: 'order-enrichment', + routeName: 'order-enrichment', + execCount: 541, + successRate: 97.6, + avgDurationMs: 156, + p99DurationMs: 287, + errorCount: 13, + sparkline: [142, 148, 152, 158, 162, 155, 159, 164, 156, 160, 154, 158, 156, 156], + }, + { + routeId: 'payment-process', + routeName: 'payment-process', + execCount: 414, + successRate: 96.1, + avgDurationMs: 234, + p99DurationMs: 412, + errorCount: 16, + sparkline: [210, 225, 232, 218, 241, 235, 228, 242, 238, 231, 244, 237, 233, 234], + }, + { + routeId: 'shipment-dispatch', + routeName: 'shipment-dispatch', + execCount: 387, + successRate: 98.4, + avgDurationMs: 118, + p99DurationMs: 248, + errorCount: 6, + sparkline: [112, 115, 118, 114, 120, 116, 119, 117, 118, 121, 116, 118, 119, 118], + }, +] diff --git a/src/mocks/routes.ts b/src/mocks/routes.ts new file mode 100644 index 0000000..85a11b2 --- /dev/null +++ b/src/mocks/routes.ts @@ -0,0 +1,99 @@ +export interface RouteDefinition { + id: string + name: string + group: string + description: string + execCount: number + successRate: number + avgDurationMs: number + p99DurationMs: number + status: 'healthy' | 'degraded' | 'down' + processors: string[] +} + +export const routes: RouteDefinition[] = [ + { + id: 'order-intake', + name: 'order-intake', + group: 'order-flow', + description: 'Ingests new orders from JMS queue, validates schema, enriches with customer data', + execCount: 892, + successRate: 99.2, + avgDurationMs: 88, + p99DurationMs: 142, + status: 'healthy', + processors: ['from(jms:orders)', 'unmarshal(json)', 'validate(schema)', 'enrich(customer-db)', 'to(order-enrichment)'], + }, + { + id: 'order-enrichment', + name: 'order-enrichment', + group: 'order-flow', + description: 'Enriches order with inventory availability, pricing, and shipment options', + execCount: 541, + successRate: 97.6, + avgDurationMs: 156, + p99DurationMs: 287, + status: 'degraded', + processors: ['from(jms:orders-enriched)', 'enrich(inventory-api)', 'enrich(pricing-service)', 'to(payment-process)'], + }, + { + id: 'payment-process', + name: 'payment-process', + group: 'payment-flow', + description: 'Processes payment through gateway, handles retries and partial failures', + execCount: 414, + successRate: 96.1, + avgDurationMs: 234, + p99DurationMs: 412, + status: 'degraded', + processors: ['from(jms:payments)', 'validate(payment-schema)', 'to(payment-gateway)', 'to(order-service)'], + }, + { + id: 'payment-validate', + name: 'payment-validate', + group: 'payment-flow', + description: 'Validates payment details and performs fraud check before processing', + execCount: 498, + successRate: 99.8, + avgDurationMs: 142, + p99DurationMs: 198, + status: 'healthy', + processors: ['from(jms:payments)', 'validate(payment-schema)', 'check(fraud-service)', 'to(payment-process)'], + }, + { + id: 'shipment-dispatch', + name: 'shipment-dispatch', + group: 'shipment-flow', + description: 'Dispatches shipment to carrier after order confirmation', + execCount: 387, + successRate: 98.4, + avgDurationMs: 118, + p99DurationMs: 248, + status: 'healthy', + processors: ['from(jms:shipments)', 'unmarshal(json)', 'enrich(carrier-api)', 'to(carrier-gateway)'], + }, + { + id: 'shipment-track', + name: 'shipment-track', + group: 'shipment-flow', + description: 'Polls carrier APIs for shipment status updates and notifies customers', + execCount: 923, + successRate: 99.5, + avgDurationMs: 94, + p99DurationMs: 167, + status: 'healthy', + processors: ['from(jms:tracking)', 'enrich(carrier-api)', 'to(notification-hub)'], + }, + { + id: 'notification-dispatch', + name: 'notification-dispatch', + group: 'notification-flow', + description: 'Sends email and SMS notifications to customers for order events', + execCount: 471, + successRate: 98.9, + avgDurationMs: 62, + p99DurationMs: 124, + status: 'healthy', + processors: ['from(jms:notifications)', 'route(by-type)', 'to(smtp)', 'to(sms-gateway)'], + }, +]