@meyicloud/meyi-insight-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/incidentCategories.d.ts +18 -0
- package/dist/constants/incidentCategories.d.ts.map +1 -0
- package/dist/constants/incidentCategories.js +36 -0
- package/dist/constants/incidentCategories.js.map +1 -0
- package/dist/controllers/alert.controller.d.ts +12 -0
- package/dist/controllers/alert.controller.d.ts.map +1 -0
- package/dist/controllers/alert.controller.js +89 -0
- package/dist/controllers/alert.controller.js.map +1 -0
- package/dist/controllers/incident.controller.d.ts +16 -0
- package/dist/controllers/incident.controller.d.ts.map +1 -0
- package/dist/controllers/incident.controller.js +215 -0
- package/dist/controllers/incident.controller.js.map +1 -0
- package/dist/controllers/notification-provider.controller.d.ts +10 -0
- package/dist/controllers/notification-provider.controller.d.ts.map +1 -0
- package/dist/controllers/notification-provider.controller.js +59 -0
- package/dist/controllers/notification-provider.controller.js.map +1 -0
- package/dist/controllers/settings.controller.d.ts +7 -0
- package/dist/controllers/settings.controller.d.ts.map +1 -0
- package/dist/controllers/settings.controller.js +27 -0
- package/dist/controllers/settings.controller.js.map +1 -0
- package/dist/controllers/sop.controller.d.ts +11 -0
- package/dist/controllers/sop.controller.d.ts.map +1 -0
- package/dist/controllers/sop.controller.js +89 -0
- package/dist/controllers/sop.controller.js.map +1 -0
- package/dist/controllers/source.controller.d.ts +26 -0
- package/dist/controllers/source.controller.d.ts.map +1 -0
- package/dist/controllers/source.controller.js +333 -0
- package/dist/controllers/source.controller.js.map +1 -0
- package/dist/controllers/sourceDatadog.controller.d.ts +17 -0
- package/dist/controllers/sourceDatadog.controller.d.ts.map +1 -0
- package/dist/controllers/sourceDatadog.controller.js +169 -0
- package/dist/controllers/sourceDatadog.controller.js.map +1 -0
- package/dist/controllers/tenant.controller.d.ts +7 -0
- package/dist/controllers/tenant.controller.d.ts.map +1 -0
- package/dist/controllers/tenant.controller.js +33 -0
- package/dist/controllers/tenant.controller.js.map +1 -0
- package/dist/controllers/webhook.controller.d.ts +6 -0
- package/dist/controllers/webhook.controller.d.ts.map +1 -0
- package/dist/controllers/webhook.controller.js +83 -0
- package/dist/controllers/webhook.controller.js.map +1 -0
- package/dist/controllers/workflow.controller.d.ts +18 -0
- package/dist/controllers/workflow.controller.d.ts.map +1 -0
- package/dist/controllers/workflow.controller.js +118 -0
- package/dist/controllers/workflow.controller.js.map +1 -0
- package/dist/database/index.d.ts +7 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +12 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/schema.d.ts +5358 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +516 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/features/sources/cloudtrail/controller.d.ts +38 -0
- package/dist/features/sources/cloudtrail/controller.d.ts.map +1 -0
- package/dist/features/sources/cloudtrail/controller.js +421 -0
- package/dist/features/sources/cloudtrail/controller.js.map +1 -0
- package/dist/features/sources/cloudtrail/routes.d.ts +6 -0
- package/dist/features/sources/cloudtrail/routes.d.ts.map +1 -0
- package/dist/features/sources/cloudtrail/routes.js +8 -0
- package/dist/features/sources/cloudtrail/routes.js.map +1 -0
- package/dist/features/sources/cloudtrail/schema.d.ts +2 -0
- package/dist/features/sources/cloudtrail/schema.d.ts.map +1 -0
- package/dist/features/sources/cloudtrail/schema.js +26 -0
- package/dist/features/sources/cloudtrail/schema.js.map +1 -0
- package/dist/features/sources/cloudtrail/stackTemplates.d.ts +3 -0
- package/dist/features/sources/cloudtrail/stackTemplates.d.ts.map +1 -0
- package/dist/features/sources/cloudtrail/stackTemplates.js +548 -0
- package/dist/features/sources/cloudtrail/stackTemplates.js.map +1 -0
- package/dist/features/sources/cloudtrail/template.d.ts +21 -0
- package/dist/features/sources/cloudtrail/template.d.ts.map +1 -0
- package/dist/features/sources/cloudtrail/template.js +1230 -0
- package/dist/features/sources/cloudtrail/template.js.map +1 -0
- package/dist/features/sources/cloudwatch/controller.d.ts +13 -0
- package/dist/features/sources/cloudwatch/controller.d.ts.map +1 -0
- package/dist/features/sources/cloudwatch/controller.js +514 -0
- package/dist/features/sources/cloudwatch/controller.js.map +1 -0
- package/dist/features/sources/cloudwatch/eventbridgeTemplate.d.ts +7 -0
- package/dist/features/sources/cloudwatch/eventbridgeTemplate.d.ts.map +1 -0
- package/dist/features/sources/cloudwatch/eventbridgeTemplate.js +230 -0
- package/dist/features/sources/cloudwatch/eventbridgeTemplate.js.map +1 -0
- package/dist/features/sources/cloudwatch/service.d.ts +50 -0
- package/dist/features/sources/cloudwatch/service.d.ts.map +1 -0
- package/dist/features/sources/cloudwatch/service.js +269 -0
- package/dist/features/sources/cloudwatch/service.js.map +1 -0
- package/dist/features/sources/cloudwatch/template.d.ts +26 -0
- package/dist/features/sources/cloudwatch/template.d.ts.map +1 -0
- package/dist/features/sources/cloudwatch/template.js +335 -0
- package/dist/features/sources/cloudwatch/template.js.map +1 -0
- package/dist/features/sources/cloudwatch/types.d.ts +26 -0
- package/dist/features/sources/cloudwatch/types.d.ts.map +1 -0
- package/dist/features/sources/cloudwatch/types.js +2 -0
- package/dist/features/sources/cloudwatch/types.js.map +1 -0
- package/dist/features/sources/grafana/controller.d.ts +18 -0
- package/dist/features/sources/grafana/controller.d.ts.map +1 -0
- package/dist/features/sources/grafana/controller.js +183 -0
- package/dist/features/sources/grafana/controller.js.map +1 -0
- package/dist/features/sources/grafana/routes.d.ts +6 -0
- package/dist/features/sources/grafana/routes.d.ts.map +1 -0
- package/dist/features/sources/grafana/routes.js +6 -0
- package/dist/features/sources/grafana/routes.js.map +1 -0
- package/dist/features/sources/grafana/schema.d.ts +2 -0
- package/dist/features/sources/grafana/schema.d.ts.map +1 -0
- package/dist/features/sources/grafana/schema.js +24 -0
- package/dist/features/sources/grafana/schema.js.map +1 -0
- package/dist/features/sources/grafana/service.d.ts +33 -0
- package/dist/features/sources/grafana/service.d.ts.map +1 -0
- package/dist/features/sources/grafana/service.js +215 -0
- package/dist/features/sources/grafana/service.js.map +1 -0
- package/dist/features/sources/index.d.ts +29 -0
- package/dist/features/sources/index.d.ts.map +1 -0
- package/dist/features/sources/index.js +47 -0
- package/dist/features/sources/index.js.map +1 -0
- package/dist/features/sources/observability/controller.d.ts +6 -0
- package/dist/features/sources/observability/controller.d.ts.map +1 -0
- package/dist/features/sources/observability/controller.js +16 -0
- package/dist/features/sources/observability/controller.js.map +1 -0
- package/dist/features/sources/observability/routes.d.ts +4 -0
- package/dist/features/sources/observability/routes.d.ts.map +1 -0
- package/dist/features/sources/observability/routes.js +8 -0
- package/dist/features/sources/observability/routes.js.map +1 -0
- package/dist/features/sources/observability/schema.d.ts +3 -0
- package/dist/features/sources/observability/schema.d.ts.map +1 -0
- package/dist/features/sources/observability/schema.js +44 -0
- package/dist/features/sources/observability/schema.js.map +1 -0
- package/dist/features/sources/observability/service.d.ts +36 -0
- package/dist/features/sources/observability/service.d.ts.map +1 -0
- package/dist/features/sources/observability/service.js +127 -0
- package/dist/features/sources/observability/service.js.map +1 -0
- package/dist/features/sources/prometheus/controller.d.ts +9 -0
- package/dist/features/sources/prometheus/controller.d.ts.map +1 -0
- package/dist/features/sources/prometheus/controller.js +359 -0
- package/dist/features/sources/prometheus/controller.js.map +1 -0
- package/dist/features/sources/prometheus/templates.d.ts +18 -0
- package/dist/features/sources/prometheus/templates.d.ts.map +1 -0
- package/dist/features/sources/prometheus/templates.js +244 -0
- package/dist/features/sources/prometheus/templates.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/0007_pipeline_yaml_definitions.d.ts +3 -0
- package/dist/migrations/0007_pipeline_yaml_definitions.d.ts.map +1 -0
- package/dist/migrations/0007_pipeline_yaml_definitions.js +19 -0
- package/dist/migrations/0007_pipeline_yaml_definitions.js.map +1 -0
- package/dist/migrations/0008_tenant_isolation.d.ts +3 -0
- package/dist/migrations/0008_tenant_isolation.d.ts.map +1 -0
- package/dist/migrations/0008_tenant_isolation.js +42 -0
- package/dist/migrations/0008_tenant_isolation.js.map +1 -0
- package/dist/migrations/run.d.ts +6 -0
- package/dist/migrations/run.d.ts.map +1 -0
- package/dist/migrations/run.js +1262 -0
- package/dist/migrations/run.js.map +1 -0
- package/dist/models/alarm-group.model.d.ts +42 -0
- package/dist/models/alarm-group.model.d.ts.map +1 -0
- package/dist/models/alarm-group.model.js +98 -0
- package/dist/models/alarm-group.model.js.map +1 -0
- package/dist/models/alert.model.d.ts +54 -0
- package/dist/models/alert.model.d.ts.map +1 -0
- package/dist/models/alert.model.js +119 -0
- package/dist/models/alert.model.js.map +1 -0
- package/dist/models/dedup-config.model.d.ts +53 -0
- package/dist/models/dedup-config.model.d.ts.map +1 -0
- package/dist/models/dedup-config.model.js +157 -0
- package/dist/models/dedup-config.model.js.map +1 -0
- package/dist/models/grouping-config.model.d.ts +70 -0
- package/dist/models/grouping-config.model.d.ts.map +1 -0
- package/dist/models/grouping-config.model.js +174 -0
- package/dist/models/grouping-config.model.js.map +1 -0
- package/dist/models/incident-comment.model.d.ts +14 -0
- package/dist/models/incident-comment.model.d.ts.map +1 -0
- package/dist/models/incident-comment.model.js +38 -0
- package/dist/models/incident-comment.model.js.map +1 -0
- package/dist/models/incident-event.model.d.ts +16 -0
- package/dist/models/incident-event.model.d.ts.map +1 -0
- package/dist/models/incident-event.model.js +31 -0
- package/dist/models/incident-event.model.js.map +1 -0
- package/dist/models/incident.model.d.ts +47 -0
- package/dist/models/incident.model.d.ts.map +1 -0
- package/dist/models/incident.model.js +201 -0
- package/dist/models/incident.model.js.map +1 -0
- package/dist/models/normalization-config.model.d.ts +44 -0
- package/dist/models/normalization-config.model.d.ts.map +1 -0
- package/dist/models/normalization-config.model.js +153 -0
- package/dist/models/normalization-config.model.js.map +1 -0
- package/dist/models/notification-provider.model.d.ts +12 -0
- package/dist/models/notification-provider.model.d.ts.map +1 -0
- package/dist/models/notification-provider.model.js +48 -0
- package/dist/models/notification-provider.model.js.map +1 -0
- package/dist/models/pipeline-event.model.d.ts +15 -0
- package/dist/models/pipeline-event.model.d.ts.map +1 -0
- package/dist/models/pipeline-event.model.js +32 -0
- package/dist/models/pipeline-event.model.js.map +1 -0
- package/dist/models/settings.model.d.ts +8 -0
- package/dist/models/settings.model.d.ts.map +1 -0
- package/dist/models/settings.model.js +30 -0
- package/dist/models/settings.model.js.map +1 -0
- package/dist/models/sop.model.d.ts +58 -0
- package/dist/models/sop.model.d.ts.map +1 -0
- package/dist/models/sop.model.js +138 -0
- package/dist/models/sop.model.js.map +1 -0
- package/dist/models/source.model.d.ts +177 -0
- package/dist/models/source.model.d.ts.map +1 -0
- package/dist/models/source.model.js +794 -0
- package/dist/models/source.model.js.map +1 -0
- package/dist/models/tenant.model.d.ts +13 -0
- package/dist/models/tenant.model.d.ts.map +1 -0
- package/dist/models/tenant.model.js +28 -0
- package/dist/models/tenant.model.js.map +1 -0
- package/dist/models/workflow.model.d.ts +36 -0
- package/dist/models/workflow.model.d.ts.map +1 -0
- package/dist/models/workflow.model.js +136 -0
- package/dist/models/workflow.model.js.map +1 -0
- package/dist/pipeline/AlarmPipelineWorker.d.ts +18 -0
- package/dist/pipeline/AlarmPipelineWorker.d.ts.map +1 -0
- package/dist/pipeline/AlarmPipelineWorker.js +342 -0
- package/dist/pipeline/AlarmPipelineWorker.js.map +1 -0
- package/dist/pipeline/CanonicalAlarm.d.ts +59 -0
- package/dist/pipeline/CanonicalAlarm.d.ts.map +1 -0
- package/dist/pipeline/CanonicalAlarm.js +81 -0
- package/dist/pipeline/CanonicalAlarm.js.map +1 -0
- package/dist/pipeline/DedupService.d.ts +29 -0
- package/dist/pipeline/DedupService.d.ts.map +1 -0
- package/dist/pipeline/DedupService.js +172 -0
- package/dist/pipeline/DedupService.js.map +1 -0
- package/dist/pipeline/GroupFlushWorker.d.ts +16 -0
- package/dist/pipeline/GroupFlushWorker.d.ts.map +1 -0
- package/dist/pipeline/GroupFlushWorker.js +196 -0
- package/dist/pipeline/GroupFlushWorker.js.map +1 -0
- package/dist/pipeline/GroupingService.d.ts +27 -0
- package/dist/pipeline/GroupingService.d.ts.map +1 -0
- package/dist/pipeline/GroupingService.js +338 -0
- package/dist/pipeline/GroupingService.js.map +1 -0
- package/dist/pipeline/NormalizationRuleEngine.d.ts +5 -0
- package/dist/pipeline/NormalizationRuleEngine.d.ts.map +1 -0
- package/dist/pipeline/NormalizationRuleEngine.js +86 -0
- package/dist/pipeline/NormalizationRuleEngine.js.map +1 -0
- package/dist/pipeline/NormalizationService.d.ts +29 -0
- package/dist/pipeline/NormalizationService.d.ts.map +1 -0
- package/dist/pipeline/NormalizationService.js +275 -0
- package/dist/pipeline/NormalizationService.js.map +1 -0
- package/dist/pipeline/alarmQueue.d.ts +66 -0
- package/dist/pipeline/alarmQueue.d.ts.map +1 -0
- package/dist/pipeline/alarmQueue.js +254 -0
- package/dist/pipeline/alarmQueue.js.map +1 -0
- package/dist/pipeline/defaults/ensureDefaults.d.ts +3 -0
- package/dist/pipeline/defaults/ensureDefaults.d.ts.map +1 -0
- package/dist/pipeline/defaults/ensureDefaults.js +124 -0
- package/dist/pipeline/defaults/ensureDefaults.js.map +1 -0
- package/dist/pipeline/defaults/pipelineDefaults.d.ts +13 -0
- package/dist/pipeline/defaults/pipelineDefaults.d.ts.map +1 -0
- package/dist/pipeline/defaults/pipelineDefaults.js +266 -0
- package/dist/pipeline/defaults/pipelineDefaults.js.map +1 -0
- package/dist/pipeline/yaml/DedupYaml.d.ts +33 -0
- package/dist/pipeline/yaml/DedupYaml.d.ts.map +1 -0
- package/dist/pipeline/yaml/DedupYaml.js +25 -0
- package/dist/pipeline/yaml/DedupYaml.js.map +1 -0
- package/dist/pipeline/yaml/GroupingYaml.d.ts +49 -0
- package/dist/pipeline/yaml/GroupingYaml.d.ts.map +1 -0
- package/dist/pipeline/yaml/GroupingYaml.js +39 -0
- package/dist/pipeline/yaml/GroupingYaml.js.map +1 -0
- package/dist/pipeline/yaml/NormalizationYaml.d.ts +54 -0
- package/dist/pipeline/yaml/NormalizationYaml.d.ts.map +1 -0
- package/dist/pipeline/yaml/NormalizationYaml.js +23 -0
- package/dist/pipeline/yaml/NormalizationYaml.js.map +1 -0
- package/dist/pipeline/yaml/pipelineYaml.d.ts +11 -0
- package/dist/pipeline/yaml/pipelineYaml.d.ts.map +1 -0
- package/dist/pipeline/yaml/pipelineYaml.js +49 -0
- package/dist/pipeline/yaml/pipelineYaml.js.map +1 -0
- package/dist/realtime/events.d.ts +11 -0
- package/dist/realtime/events.d.ts.map +1 -0
- package/dist/realtime/events.js +21 -0
- package/dist/realtime/events.js.map +1 -0
- package/dist/routes/alert.routes.d.ts +4 -0
- package/dist/routes/alert.routes.d.ts.map +1 -0
- package/dist/routes/alert.routes.js +15 -0
- package/dist/routes/alert.routes.js.map +1 -0
- package/dist/routes/dedup-config.routes.d.ts +4 -0
- package/dist/routes/dedup-config.routes.d.ts.map +1 -0
- package/dist/routes/dedup-config.routes.js +82 -0
- package/dist/routes/dedup-config.routes.js.map +1 -0
- package/dist/routes/grouping-config.routes.d.ts +4 -0
- package/dist/routes/grouping-config.routes.d.ts.map +1 -0
- package/dist/routes/grouping-config.routes.js +82 -0
- package/dist/routes/grouping-config.routes.js.map +1 -0
- package/dist/routes/incident.routes.d.ts +4 -0
- package/dist/routes/incident.routes.d.ts.map +1 -0
- package/dist/routes/incident.routes.js +21 -0
- package/dist/routes/incident.routes.js.map +1 -0
- package/dist/routes/index.d.ts +47 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +83 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/normalization-config.routes.d.ts +4 -0
- package/dist/routes/normalization-config.routes.d.ts.map +1 -0
- package/dist/routes/normalization-config.routes.js +199 -0
- package/dist/routes/normalization-config.routes.js.map +1 -0
- package/dist/routes/notification-provider.routes.d.ts +4 -0
- package/dist/routes/notification-provider.routes.d.ts.map +1 -0
- package/dist/routes/notification-provider.routes.js +13 -0
- package/dist/routes/notification-provider.routes.js.map +1 -0
- package/dist/routes/pipeline.routes.d.ts +8 -0
- package/dist/routes/pipeline.routes.d.ts.map +1 -0
- package/dist/routes/pipeline.routes.js +243 -0
- package/dist/routes/pipeline.routes.js.map +1 -0
- package/dist/routes/settings.routes.d.ts +4 -0
- package/dist/routes/settings.routes.d.ts.map +1 -0
- package/dist/routes/settings.routes.js +10 -0
- package/dist/routes/settings.routes.js.map +1 -0
- package/dist/routes/sop.routes.d.ts +4 -0
- package/dist/routes/sop.routes.d.ts.map +1 -0
- package/dist/routes/sop.routes.js +14 -0
- package/dist/routes/sop.routes.js.map +1 -0
- package/dist/routes/source.routes.d.ts +9 -0
- package/dist/routes/source.routes.d.ts.map +1 -0
- package/dist/routes/source.routes.js +31 -0
- package/dist/routes/source.routes.js.map +1 -0
- package/dist/routes/tenant.routes.d.ts +4 -0
- package/dist/routes/tenant.routes.d.ts.map +1 -0
- package/dist/routes/tenant.routes.js +10 -0
- package/dist/routes/tenant.routes.js.map +1 -0
- package/dist/routes/workflow.routes.d.ts +4 -0
- package/dist/routes/workflow.routes.d.ts.map +1 -0
- package/dist/routes/workflow.routes.js +18 -0
- package/dist/routes/workflow.routes.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +76 -0
- package/dist/server.js.map +1 -0
- package/dist/service.d.ts +159 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +156 -0
- package/dist/service.js.map +1 -0
- package/dist/services/alert.service.d.ts +76 -0
- package/dist/services/alert.service.d.ts.map +1 -0
- package/dist/services/alert.service.js +688 -0
- package/dist/services/alert.service.js.map +1 -0
- package/dist/services/connector.service.d.ts +65 -0
- package/dist/services/connector.service.d.ts.map +1 -0
- package/dist/services/connector.service.js +28 -0
- package/dist/services/connector.service.js.map +1 -0
- package/dist/services/incident.service.d.ts +108 -0
- package/dist/services/incident.service.d.ts.map +1 -0
- package/dist/services/incident.service.js +325 -0
- package/dist/services/incident.service.js.map +1 -0
- package/dist/services/notification-provider.service.d.ts +12 -0
- package/dist/services/notification-provider.service.d.ts.map +1 -0
- package/dist/services/notification-provider.service.js +25 -0
- package/dist/services/notification-provider.service.js.map +1 -0
- package/dist/services/settings.service.d.ts +8 -0
- package/dist/services/settings.service.d.ts.map +1 -0
- package/dist/services/settings.service.js +14 -0
- package/dist/services/settings.service.js.map +1 -0
- package/dist/services/sop.service.d.ts +60 -0
- package/dist/services/sop.service.d.ts.map +1 -0
- package/dist/services/sop.service.js +66 -0
- package/dist/services/sop.service.js.map +1 -0
- package/dist/services/source.service.d.ts +162 -0
- package/dist/services/source.service.d.ts.map +1 -0
- package/dist/services/source.service.js +124 -0
- package/dist/services/source.service.js.map +1 -0
- package/dist/services/tenant.service.d.ts +11 -0
- package/dist/services/tenant.service.d.ts.map +1 -0
- package/dist/services/tenant.service.js +22 -0
- package/dist/services/tenant.service.js.map +1 -0
- package/dist/services/workflow.service.d.ts +32 -0
- package/dist/services/workflow.service.d.ts.map +1 -0
- package/dist/services/workflow.service.js +291 -0
- package/dist/services/workflow.service.js.map +1 -0
- package/dist/standalone.d.ts +2 -0
- package/dist/standalone.d.ts.map +1 -0
- package/dist/standalone.js +55 -0
- package/dist/standalone.js.map +1 -0
- package/dist/tenancy.d.ts +5 -0
- package/dist/tenancy.d.ts.map +1 -0
- package/dist/tenancy.js +35 -0
- package/dist/tenancy.js.map +1 -0
- package/dist/utils/notificationTemplates.d.ts +98 -0
- package/dist/utils/notificationTemplates.d.ts.map +1 -0
- package/dist/utils/notificationTemplates.js +227 -0
- package/dist/utils/notificationTemplates.js.map +1 -0
- package/dist/utils/secretCrypto.d.ts +3 -0
- package/dist/utils/secretCrypto.d.ts.map +1 -0
- package/dist/utils/secretCrypto.js +40 -0
- package/dist/utils/secretCrypto.js.map +1 -0
- package/dist/utils/workflowYaml.d.ts +53 -0
- package/dist/utils/workflowYaml.d.ts.map +1 -0
- package/dist/utils/workflowYaml.js +269 -0
- package/dist/utils/workflowYaml.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { Worker } from "bullmq";
|
|
2
|
+
import { sql } from "drizzle-orm";
|
|
3
|
+
import { getRedisClient } from "./alarmQueue.js";
|
|
4
|
+
const PIPELINE_CONCURRENCY = parseInt(process.env.PIPELINE_CONCURRENCY ?? "5", 10);
|
|
5
|
+
// Default job lock duration (ms). Jobs that take longer than this need lock renewal.
|
|
6
|
+
// Must be > the longest expected stage duration. 30s is BullMQ default.
|
|
7
|
+
const LOCK_DURATION_MS = 60_000; // 60s — generous for DB + normalization
|
|
8
|
+
export function createAlarmPipelineWorker(deps) {
|
|
9
|
+
const { normalizationService, dedupService, groupingService, pipelineEventModel, alertModel, workflowService, realtimePublisher } = deps;
|
|
10
|
+
// BullMQ Worker uses its own internal ioredis connection via plain options
|
|
11
|
+
const redisUrl = process.env.REDIS_URL ?? "redis://localhost:6379";
|
|
12
|
+
let connOpts;
|
|
13
|
+
try {
|
|
14
|
+
const url = new URL(redisUrl);
|
|
15
|
+
connOpts = {
|
|
16
|
+
host: url.hostname || "localhost",
|
|
17
|
+
port: parseInt(url.port || "6379", 10),
|
|
18
|
+
password: url.password || undefined,
|
|
19
|
+
db: url.pathname ? parseInt(url.pathname.slice(1) || "0", 10) : 0,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
connOpts = { host: "localhost", port: 6379, db: 0 };
|
|
24
|
+
}
|
|
25
|
+
const worker = new Worker("alarm-pipeline", async (job) => {
|
|
26
|
+
const { sourceId, sourceType, sourceName, tenantId, rawPayload, receivedAt } = job.data;
|
|
27
|
+
let alarmId;
|
|
28
|
+
// ── Stage 0: Create placeholder alarm immediately (fail-fast guarantee) ─
|
|
29
|
+
// IMPORTANT: If this throws, BullMQ will retry the job (attempts: 3).
|
|
30
|
+
// Do NOT catch-and-return here — that would silently complete the job
|
|
31
|
+
// without creating an alert and prevent retries.
|
|
32
|
+
const placeholderRow = await alertModel.create({
|
|
33
|
+
sourceId,
|
|
34
|
+
sourceName: sourceName ?? "",
|
|
35
|
+
sourceType,
|
|
36
|
+
tenantId: tenantId ?? null, // ← propagated from source via job data
|
|
37
|
+
resourceId: "pending",
|
|
38
|
+
resourceName: "pending",
|
|
39
|
+
resourceType: sourceType,
|
|
40
|
+
tags: {},
|
|
41
|
+
severity: "high",
|
|
42
|
+
alertName: "Processing...",
|
|
43
|
+
description: null,
|
|
44
|
+
additionalConfiguration: null,
|
|
45
|
+
downTime: receivedAt,
|
|
46
|
+
aliasId: null,
|
|
47
|
+
pipelineStatus: "queued",
|
|
48
|
+
rawPayload,
|
|
49
|
+
});
|
|
50
|
+
alarmId = placeholderRow.id;
|
|
51
|
+
// Non-fatal pipeline event recording
|
|
52
|
+
await pipelineEventModel.append({
|
|
53
|
+
alarmId,
|
|
54
|
+
stage: "queue",
|
|
55
|
+
status: "ok",
|
|
56
|
+
meta: { sourceId, sourceType, receivedAt, jobId: job.id },
|
|
57
|
+
}).catch((e) => console.warn("[AlarmPipelineWorker] Stage 0 event append failed (non-fatal):", e?.message));
|
|
58
|
+
// Emit real-time event so UI updates immediately without polling
|
|
59
|
+
if (realtimePublisher) {
|
|
60
|
+
try {
|
|
61
|
+
realtimePublisher.emit({
|
|
62
|
+
topic: "alert:created",
|
|
63
|
+
ts: new Date().toISOString(),
|
|
64
|
+
payload: { alert: placeholderRow },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch { /* best-effort */ }
|
|
68
|
+
}
|
|
69
|
+
// ── Stage 1+2: Normalization ─────────────────────────────────────────────
|
|
70
|
+
const canonical = await normalizationService.normalize({
|
|
71
|
+
alarmId,
|
|
72
|
+
sourceId,
|
|
73
|
+
sourceType,
|
|
74
|
+
sourceName,
|
|
75
|
+
rawPayload,
|
|
76
|
+
receivedAt,
|
|
77
|
+
tenantId,
|
|
78
|
+
});
|
|
79
|
+
if (!canonical) {
|
|
80
|
+
// Normalization failed — mark alarm as dlq, stop processing
|
|
81
|
+
await alertModel.update(alarmId, { pipelineStatus: "dlq" }).catch(() => { });
|
|
82
|
+
await pipelineEventModel.append({ alarmId, stage: "dlq", status: "error", meta: { reason: "normalization_failed" } }).catch(() => { });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Update placeholder alarm with normalized fields
|
|
86
|
+
await alertModel.update(alarmId, {
|
|
87
|
+
resourceId: canonical.resourceId,
|
|
88
|
+
resourceName: canonical.resourceName,
|
|
89
|
+
resourceType: canonical.resourceType,
|
|
90
|
+
accountId: canonical.accountId ?? null,
|
|
91
|
+
accountName: canonical.accountName ?? null,
|
|
92
|
+
alertName: canonical.alertName,
|
|
93
|
+
severity: canonical.severity,
|
|
94
|
+
description: canonical.description ?? null,
|
|
95
|
+
tags: canonical.tags ?? {},
|
|
96
|
+
downTime: new Date(canonical.downTime),
|
|
97
|
+
fingerprint: canonical.fingerprint,
|
|
98
|
+
rawPayload: canonical.rawPayload,
|
|
99
|
+
pipelineStatus: "normalised",
|
|
100
|
+
additionalConfiguration: canonical.additionalConfiguration ?? null,
|
|
101
|
+
// Ensure tenantId is set after normalization (in case it was null from placeholder)
|
|
102
|
+
...(tenantId ? { tenantId } : {}),
|
|
103
|
+
}).catch((err) => {
|
|
104
|
+
console.warn("[AlarmPipelineWorker] Could not update alarm after normalization:", err?.message);
|
|
105
|
+
});
|
|
106
|
+
// ── Stage 3: Dedup ───────────────────────────────────────────────────────
|
|
107
|
+
let dedupResult;
|
|
108
|
+
try {
|
|
109
|
+
dedupResult = await dedupService.check(canonical, alarmId);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
// Dedup failure is non-fatal — continue to grouping
|
|
113
|
+
console.warn("[AlarmPipelineWorker] Dedup check failed (non-fatal):", err?.message);
|
|
114
|
+
dedupResult = { suppressed: false, dedupKey: "", reason: "dedup_error" };
|
|
115
|
+
}
|
|
116
|
+
if (dedupResult.suppressed) {
|
|
117
|
+
// P7: Suppressed alarms do NOT enter grouping
|
|
118
|
+
// Instead of keeping a duplicate alert, we add info to the main alert and delete this placeholder
|
|
119
|
+
if (dedupResult.mainAlarmId) {
|
|
120
|
+
try {
|
|
121
|
+
const mainAlarm = await alertModel.findById(dedupResult.mainAlarmId);
|
|
122
|
+
if (mainAlarm) {
|
|
123
|
+
await alertModel.update(dedupResult.mainAlarmId, {
|
|
124
|
+
dupCount: (mainAlarm.dupCount ?? 0) + 1,
|
|
125
|
+
lastDupAt: new Date(),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
console.warn("[AlarmPipelineWorker] Failed to update main alert with dup info:", err?.message);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Delete the placeholder so duplicates don't clutter the UI
|
|
134
|
+
if (alarmId) {
|
|
135
|
+
await alertModel.delete(alarmId).catch(() => { });
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
let finalSeverity = canonical.severity;
|
|
140
|
+
if (dedupResult.flapState === "elevate_severity") {
|
|
141
|
+
const SEVERITIES = ["info", "low", "medium", "high", "critical"];
|
|
142
|
+
const idx = SEVERITIES.indexOf((canonical.severity || "info").toLowerCase());
|
|
143
|
+
if (idx >= 0 && idx < SEVERITIES.length - 1) {
|
|
144
|
+
finalSeverity = SEVERITIES[idx + 1];
|
|
145
|
+
}
|
|
146
|
+
else if (idx === -1) {
|
|
147
|
+
finalSeverity = "high"; // Fallback if unknown
|
|
148
|
+
}
|
|
149
|
+
canonical.severity = finalSeverity;
|
|
150
|
+
}
|
|
151
|
+
// Update alarm with dedup key and status (and potentially elevated severity)
|
|
152
|
+
await alertModel.update(alarmId, {
|
|
153
|
+
pipelineStatus: "dedup_passed",
|
|
154
|
+
dedupKey: dedupResult.dedupKey,
|
|
155
|
+
severity: finalSeverity,
|
|
156
|
+
}).catch(() => { });
|
|
157
|
+
// ── Stage 4: Grouping ────────────────────────────────────────────────────
|
|
158
|
+
let groupId;
|
|
159
|
+
try {
|
|
160
|
+
const groupingResult = await groupingService.assign(canonical, alarmId);
|
|
161
|
+
groupId = groupingResult.groupId;
|
|
162
|
+
// Fetch group config to calculate group name if needed
|
|
163
|
+
let groupName = "";
|
|
164
|
+
if (groupingResult.groupNameTemplate) {
|
|
165
|
+
groupName = groupingResult.groupNameTemplate
|
|
166
|
+
.replace(/{{resourceName}}/g, canonical.resourceName ?? "Unknown")
|
|
167
|
+
.replace(/{{alertName}}/g, canonical.alertName ?? "Alert")
|
|
168
|
+
.replace(/{{severity}}/g, finalSeverity)
|
|
169
|
+
.replace(/{{count}}/g, "1+");
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
groupName = groupingResult.matchedStrategyLabel || "Group: " + (canonical.resourceName ?? "Unknown");
|
|
173
|
+
}
|
|
174
|
+
const currentConfig = canonical.additionalConfiguration || {};
|
|
175
|
+
// Update alarm with its group ID and computed groupName
|
|
176
|
+
await alertModel.update(alarmId, {
|
|
177
|
+
pipelineStatus: "routed",
|
|
178
|
+
groupId,
|
|
179
|
+
additionalConfiguration: {
|
|
180
|
+
...currentConfig,
|
|
181
|
+
groupName
|
|
182
|
+
}
|
|
183
|
+
}).catch(() => { });
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
// Grouping failure is non-fatal — continue to workflow routing
|
|
187
|
+
console.warn("[AlarmPipelineWorker] Stage 4 grouping failed (non-fatal):", err?.message);
|
|
188
|
+
// Update pipeline status to routed since it bypassed grouping
|
|
189
|
+
await alertModel.update(alarmId, { pipelineStatus: "routed" }).catch(() => { });
|
|
190
|
+
}
|
|
191
|
+
// ── Stage 5: Workflow routing ──────────────────────────────────────────
|
|
192
|
+
if (workflowService) {
|
|
193
|
+
try {
|
|
194
|
+
const savedAlert = await alertModel.findById(alarmId);
|
|
195
|
+
if (savedAlert) {
|
|
196
|
+
let lockKey = null;
|
|
197
|
+
const redis = getRedisClient();
|
|
198
|
+
if (groupId && redis) {
|
|
199
|
+
lockKey = `lock:group_workflow:${groupId}`;
|
|
200
|
+
const acquired = await redis.set(lockKey, "1", "PX", 30000, "NX");
|
|
201
|
+
if (!acquired) {
|
|
202
|
+
// Wait a bit to see if another worker processes it, but ideally we wait via a retry.
|
|
203
|
+
// For now, if we can't get the lock, we just wait a bit and proceed, or we could delay the job.
|
|
204
|
+
// Actually, if we just wait for the lock:
|
|
205
|
+
for (let i = 0; i < 30; i++) {
|
|
206
|
+
const gotLock = await redis.set(lockKey, "1", "PX", 30000, "NX");
|
|
207
|
+
if (gotLock) {
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
// Now we safely execute the workflow for this alert.
|
|
216
|
+
let existingIncidentId = null;
|
|
217
|
+
if (groupId) {
|
|
218
|
+
try {
|
|
219
|
+
const { db } = alertModel;
|
|
220
|
+
const groupRes = await db.execute(sql `SELECT incident_id FROM meyiconnect.insight_alarm_groups WHERE id = ${groupId}`);
|
|
221
|
+
if (groupRes.rows.length > 0 && groupRes.rows[0].incident_id) {
|
|
222
|
+
existingIncidentId = groupRes.rows[0].incident_id;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (e) {
|
|
226
|
+
console.error("[AlarmPipelineWorker] Failed to fetch existing group incident:", e);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Always link to existing incident if one exists for the group
|
|
230
|
+
if (existingIncidentId) {
|
|
231
|
+
try {
|
|
232
|
+
const { db } = alertModel;
|
|
233
|
+
await db.execute(sql `UPDATE meyiconnect.insight_alerts SET status = 'converted', incident_id = ${existingIncidentId}, converted_incident_id = ${existingIncidentId} WHERE id = ${savedAlert.id}`);
|
|
234
|
+
// Refresh the incident title to reflect the updated member count
|
|
235
|
+
if (groupId) {
|
|
236
|
+
await groupingService.refreshIncidentTitle(groupId, existingIncidentId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (e) {
|
|
240
|
+
console.error("[AlarmPipelineWorker] Failed to link alert to existing incident:", e);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const isGroupedAlert = !!groupId;
|
|
244
|
+
// Note: The workflow service will check if the group already has an incident!
|
|
245
|
+
const execution = await workflowService.evaluateAndExecute(savedAlert, existingIncidentId, isGroupedAlert);
|
|
246
|
+
if (execution && Array.isArray(execution.actionsExecuted)) {
|
|
247
|
+
if (!existingIncidentId) {
|
|
248
|
+
const createIncidentAction = execution.actionsExecuted.find((a) => a.action === 'create_incident' && a.result?.status === 'success');
|
|
249
|
+
if (createIncidentAction?.result?.incidentId && groupId) {
|
|
250
|
+
// Update all members of the group to be linked to this incident.
|
|
251
|
+
const updatePayload = {
|
|
252
|
+
status: "converted",
|
|
253
|
+
incidentId: createIncidentAction.result.incidentId,
|
|
254
|
+
convertedIncidentId: createIncidentAction.result.incidentId,
|
|
255
|
+
};
|
|
256
|
+
try {
|
|
257
|
+
const { db } = alertModel;
|
|
258
|
+
await db.execute(sql `UPDATE meyiconnect.insight_alerts SET status = ${updatePayload.status}, incident_id = ${updatePayload.incidentId}, converted_incident_id = ${updatePayload.incidentId} WHERE group_id = ${groupId}`);
|
|
259
|
+
// Don't set group to flushed, it will be handled by the group-close sliding window job
|
|
260
|
+
await db.execute(sql `UPDATE meyiconnect.insight_alarm_groups SET incident_id = ${updatePayload.incidentId} WHERE id = ${groupId}`);
|
|
261
|
+
}
|
|
262
|
+
catch (e) {
|
|
263
|
+
console.error("[AlarmPipelineWorker] Failed to batch link incident:", e);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
if (lockKey && redis) {
|
|
271
|
+
await redis.del(lockKey).catch(() => { });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
console.warn("[AlarmPipelineWorker] Stage 5 workflow routing failed (non-fatal):", err?.message);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
await pipelineEventModel.append({
|
|
281
|
+
alarmId,
|
|
282
|
+
stage: "workflow",
|
|
283
|
+
status: "ok",
|
|
284
|
+
meta: { alarmId },
|
|
285
|
+
}).catch(() => { });
|
|
286
|
+
}, {
|
|
287
|
+
connection: {
|
|
288
|
+
...connOpts,
|
|
289
|
+
maxRetriesPerRequest: null,
|
|
290
|
+
enableReadyCheck: false,
|
|
291
|
+
// Give ioredis plenty of time to reconnect before giving up
|
|
292
|
+
retryStrategy: (times) => Math.min(times * 500, 10_000),
|
|
293
|
+
},
|
|
294
|
+
concurrency: PIPELINE_CONCURRENCY,
|
|
295
|
+
// Extend lock duration so jobs don't get marked stalled mid-processing
|
|
296
|
+
lockDuration: LOCK_DURATION_MS,
|
|
297
|
+
// Renew lock every 1/3 of lock duration
|
|
298
|
+
lockRenewTime: Math.floor(LOCK_DURATION_MS / 3),
|
|
299
|
+
// Check for stalled jobs every 15s so they're requeued quickly
|
|
300
|
+
stalledInterval: 15_000,
|
|
301
|
+
});
|
|
302
|
+
worker.on("completed", (job) => {
|
|
303
|
+
console.info(`[AlarmPipelineWorker] Job ${job.id} completed (source: ${job.data.sourceId})`);
|
|
304
|
+
});
|
|
305
|
+
worker.on("failed", async (job, err) => {
|
|
306
|
+
const errorMsg = err?.message ?? String(err);
|
|
307
|
+
const errorStack = err?.stack ?? "";
|
|
308
|
+
console.error(`[AlarmPipelineWorker] Job ${job?.id} failed (attempt ${job?.attemptsMade ?? "?"}/${job?.opts?.attempts ?? "?"}): ${errorMsg}`, errorStack ? `\n${errorStack}` : "");
|
|
309
|
+
// Record DLQ event for observability
|
|
310
|
+
await pipelineEventModel.append({
|
|
311
|
+
alarmId: null,
|
|
312
|
+
stage: "dlq",
|
|
313
|
+
status: "error",
|
|
314
|
+
meta: {
|
|
315
|
+
jobId: job?.id,
|
|
316
|
+
error: errorMsg,
|
|
317
|
+
attemptsMade: job?.attemptsMade,
|
|
318
|
+
sourceId: job?.data?.sourceId,
|
|
319
|
+
sourceType: job?.data?.sourceType,
|
|
320
|
+
receivedAt: job?.data?.receivedAt,
|
|
321
|
+
},
|
|
322
|
+
}).catch(() => { });
|
|
323
|
+
});
|
|
324
|
+
worker.on("error", (err) => {
|
|
325
|
+
// These fire on Redis connection issues — the worker auto-reconnects.
|
|
326
|
+
// Log the full error so we can distinguish connection errors from logic errors.
|
|
327
|
+
const errorMsg = err?.message ?? String(err);
|
|
328
|
+
if (errorMsg) {
|
|
329
|
+
console.error("[AlarmPipelineWorker] Worker connection error:", errorMsg);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
// BullMQ emits empty-message errors during internal reconnect cycles — suppress noise
|
|
333
|
+
console.debug("[AlarmPipelineWorker] Worker connection event (reconnecting)");
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
worker.on("stalled", (jobId) => {
|
|
337
|
+
console.warn(`[AlarmPipelineWorker] Job ${jobId} stalled — will be requeued automatically`);
|
|
338
|
+
});
|
|
339
|
+
console.info(`[AlarmPipelineWorker] Started with concurrency=${PIPELINE_CONCURRENCY}, lockDuration=${LOCK_DURATION_MS}ms`);
|
|
340
|
+
return worker;
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=AlarmPipelineWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlarmPipelineWorker.js","sourceRoot":"","sources":["../../src/pipeline/AlarmPipelineWorker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const AlarmStateSchema: z.ZodEnum<{
|
|
3
|
+
unknown: "unknown";
|
|
4
|
+
resolved: "resolved";
|
|
5
|
+
firing: "firing";
|
|
6
|
+
}>;
|
|
7
|
+
export type AlarmState = z.infer<typeof AlarmStateSchema>;
|
|
8
|
+
export declare const CanonicalAlarmSchema: z.ZodObject<{
|
|
9
|
+
source: z.ZodString;
|
|
10
|
+
tenantId: z.ZodDefault<z.ZodString>;
|
|
11
|
+
resourceId: z.ZodString;
|
|
12
|
+
resourceName: z.ZodString;
|
|
13
|
+
resourceType: z.ZodString;
|
|
14
|
+
alertName: z.ZodString;
|
|
15
|
+
severity: z.ZodString;
|
|
16
|
+
description: z.ZodOptional<z.ZodString>;
|
|
17
|
+
state: z.ZodEnum<{
|
|
18
|
+
unknown: "unknown";
|
|
19
|
+
resolved: "resolved";
|
|
20
|
+
firing: "firing";
|
|
21
|
+
}>;
|
|
22
|
+
metricName: z.ZodOptional<z.ZodString>;
|
|
23
|
+
metricValue: z.ZodOptional<z.ZodString>;
|
|
24
|
+
metricUnit: z.ZodOptional<z.ZodString>;
|
|
25
|
+
tags: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
26
|
+
labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
27
|
+
accountId: z.ZodOptional<z.ZodString>;
|
|
28
|
+
accountName: z.ZodOptional<z.ZodString>;
|
|
29
|
+
fingerprint: z.ZodString;
|
|
30
|
+
downTime: z.ZodString;
|
|
31
|
+
rawPayload: z.ZodOptional<z.ZodUnknown>;
|
|
32
|
+
sourceId: z.ZodOptional<z.ZodString>;
|
|
33
|
+
sourceName: z.ZodOptional<z.ZodString>;
|
|
34
|
+
additionalConfiguration: z.ZodOptional<z.ZodUnknown>;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
export type CanonicalAlarm = z.infer<typeof CanonicalAlarmSchema>;
|
|
37
|
+
/**
|
|
38
|
+
* Build the human-readable fingerprint shown in the Alarm list UI.
|
|
39
|
+
* Format: <source_prefix>|<resource_id>|<metric_name>|<state>
|
|
40
|
+
* Example: cw|i-0abc12|cpu_utilization|firing
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildFingerprint(alarm: {
|
|
43
|
+
source?: string;
|
|
44
|
+
resourceId?: string;
|
|
45
|
+
metricName?: string;
|
|
46
|
+
alertName?: string;
|
|
47
|
+
state?: string;
|
|
48
|
+
}): string;
|
|
49
|
+
export declare const PipelineJobDataSchema: z.ZodObject<{
|
|
50
|
+
sourceId: z.ZodString;
|
|
51
|
+
sourceType: z.ZodString;
|
|
52
|
+
sourceName: z.ZodOptional<z.ZodString>;
|
|
53
|
+
tenantId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
54
|
+
rawPayload: z.ZodUnknown;
|
|
55
|
+
receivedAt: z.ZodString;
|
|
56
|
+
token: z.ZodOptional<z.ZodString>;
|
|
57
|
+
}, z.core.$strip>;
|
|
58
|
+
export type PipelineJobData = z.infer<typeof PipelineJobDataSchema>;
|
|
59
|
+
//# sourceMappingURL=CanonicalAlarm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanonicalAlarm.d.ts","sourceRoot":"","sources":["../../src/pipeline/CanonicalAlarm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;EAA4C,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAU1D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2C/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAeT;AAOD,eAAO,MAAM,qBAAqB;;;;;;;;iBAQhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ─── Canonical Alarm State ────────────────────────────────────────────────────
|
|
3
|
+
export const AlarmStateSchema = z.enum(["firing", "resolved", "unknown"]);
|
|
4
|
+
// ─── Canonical Alarm Envelope ─────────────────────────────────────────────────
|
|
5
|
+
//
|
|
6
|
+
// The contract between Stage 2 (Normalization) and every downstream stage
|
|
7
|
+
// (Dedup, Grouping, Workflow Routing). Every alarm, regardless of source,
|
|
8
|
+
// must produce this structure after normalization.
|
|
9
|
+
//
|
|
10
|
+
// Fingerprint format shown in UI: cw|i-0abc12|cpu_utilization|firing
|
|
11
|
+
export const CanonicalAlarmSchema = z.object({
|
|
12
|
+
// Source identification
|
|
13
|
+
source: z.string(), // source type: 'cloudwatch' | 'grafana' | 'datadog' | 'prometheus' | etc.
|
|
14
|
+
tenantId: z.string().default("default"), // Single-tenant now — placeholder for future multi-tenancy (Q2)
|
|
15
|
+
// Resource
|
|
16
|
+
resourceId: z.string(),
|
|
17
|
+
resourceName: z.string(),
|
|
18
|
+
resourceType: z.string(),
|
|
19
|
+
// Alert metadata
|
|
20
|
+
alertName: z.string(),
|
|
21
|
+
severity: z.string(), // 'critical' | 'high' | 'medium' | 'low'
|
|
22
|
+
description: z.string().optional(),
|
|
23
|
+
state: AlarmStateSchema, // 'firing' | 'resolved' | 'unknown'
|
|
24
|
+
// Metric details (optional — not all sources provide these)
|
|
25
|
+
metricName: z.string().optional(),
|
|
26
|
+
metricValue: z.string().optional(),
|
|
27
|
+
metricUnit: z.string().optional(),
|
|
28
|
+
// Generic key-value tags
|
|
29
|
+
tags: z.record(z.string(), z.string()).default({}),
|
|
30
|
+
labels: z.record(z.string(), z.string()).optional(),
|
|
31
|
+
// AWS Account ID & Name
|
|
32
|
+
accountId: z.string().optional(),
|
|
33
|
+
accountName: z.string().optional(),
|
|
34
|
+
// Fingerprint — display format e.g. "cw|i-0abc12|cpu_utilization|firing"
|
|
35
|
+
// Built by buildFingerprint() below. Used in the Alarm list UI.
|
|
36
|
+
fingerprint: z.string(),
|
|
37
|
+
// Timing
|
|
38
|
+
downTime: z.string(), // ISO 8601
|
|
39
|
+
// Raw payload preserved for audit / fallback normalization
|
|
40
|
+
rawPayload: z.unknown().optional(),
|
|
41
|
+
// Pipeline metadata (set by the worker, not normalization)
|
|
42
|
+
sourceId: z.string().optional(),
|
|
43
|
+
sourceName: z.string().optional(),
|
|
44
|
+
additionalConfiguration: z.unknown().optional(),
|
|
45
|
+
});
|
|
46
|
+
// ─── Fingerprint Builder ──────────────────────────────────────────────────────
|
|
47
|
+
/**
|
|
48
|
+
* Build the human-readable fingerprint shown in the Alarm list UI.
|
|
49
|
+
* Format: <source_prefix>|<resource_id>|<metric_name>|<state>
|
|
50
|
+
* Example: cw|i-0abc12|cpu_utilization|firing
|
|
51
|
+
*/
|
|
52
|
+
export function buildFingerprint(alarm) {
|
|
53
|
+
const src = String(alarm.source || "unknown").trim();
|
|
54
|
+
const prefix = src.slice(0, 2).toLowerCase() || "un";
|
|
55
|
+
const resource = String(alarm.resourceId || "unknown")
|
|
56
|
+
.trim()
|
|
57
|
+
.replace(/[\s/\\:]+/g, "_")
|
|
58
|
+
.toLowerCase()
|
|
59
|
+
.slice(0, 40);
|
|
60
|
+
const metric = String(alarm.metricName ?? alarm.alertName ?? "unknown")
|
|
61
|
+
.trim()
|
|
62
|
+
.replace(/[\s/\\:]+/g, "_")
|
|
63
|
+
.toLowerCase()
|
|
64
|
+
.slice(0, 40);
|
|
65
|
+
const state = String(alarm.state || "firing").trim().toLowerCase();
|
|
66
|
+
return `${prefix}|${resource}|${metric}|${state}`;
|
|
67
|
+
}
|
|
68
|
+
// ─── Pipeline Job Payload ─────────────────────────────────────────────────────
|
|
69
|
+
//
|
|
70
|
+
// Shape of the BullMQ job data enqueued by the webhook handler (Stage 0).
|
|
71
|
+
// The worker deserialises this and passes it through the pipeline stages.
|
|
72
|
+
export const PipelineJobDataSchema = z.object({
|
|
73
|
+
sourceId: z.string(),
|
|
74
|
+
sourceType: z.string(),
|
|
75
|
+
sourceName: z.string().optional(),
|
|
76
|
+
tenantId: z.string().nullish(), // Propagated from source so pipeline alerts have the right tenant
|
|
77
|
+
rawPayload: z.unknown(),
|
|
78
|
+
receivedAt: z.string(), // ISO 8601
|
|
79
|
+
token: z.string().optional(), // For fallback error logging
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=CanonicalAlarm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanonicalAlarm.js","sourceRoot":"","sources":["../../src/pipeline/CanonicalAlarm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { DedupConfigModel } from "../models/dedup-config.model.js";
|
|
2
|
+
import type { PipelineEventModel } from "../models/pipeline-event.model.js";
|
|
3
|
+
import type { CanonicalAlarm } from "./CanonicalAlarm.js";
|
|
4
|
+
export interface DedupResult {
|
|
5
|
+
suppressed: boolean;
|
|
6
|
+
dedupKey: string;
|
|
7
|
+
configId?: string;
|
|
8
|
+
reason: string;
|
|
9
|
+
mainAlarmId?: string;
|
|
10
|
+
flapState?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class DedupService {
|
|
13
|
+
private dedupConfigModel;
|
|
14
|
+
private pipelineEventModel;
|
|
15
|
+
constructor(dedupConfigModel: DedupConfigModel, pipelineEventModel: PipelineEventModel);
|
|
16
|
+
/**
|
|
17
|
+
* Stage 3: Check whether this alarm is a duplicate.
|
|
18
|
+
*
|
|
19
|
+
* Returns { suppressed: true } if it is — the caller stops processing.
|
|
20
|
+
* Returns { suppressed: false } if it's fresh — the caller continues to grouping.
|
|
21
|
+
*
|
|
22
|
+
* P7 fix: suppressed alarms are NOT passed to GroupingService.
|
|
23
|
+
*/
|
|
24
|
+
check(alarm: CanonicalAlarm, alarmId: string): Promise<DedupResult>;
|
|
25
|
+
private checkViaRedis;
|
|
26
|
+
private recordFlapIfNeeded;
|
|
27
|
+
private checkViaDb;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=DedupService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DedupService.d.ts","sourceRoot":"","sources":["../../src/pipeline/DedupService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAQ1D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IAErB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,kBAAkB;gBADlB,gBAAgB,EAAE,gBAAgB,EAClC,kBAAkB,EAAE,kBAAkB;IAGhD;;;;;;;OAOG;IACG,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAwD3D,aAAa;YAsEb,kBAAkB;YA0BlB,UAAU;CA8CzB"}
|