@marinoscar/platform-api 0.1.0-next.19 → 0.1.0-next.20
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 +16 -0
- package/README.md +1 -0
- package/dist/alerts/alerts-admin.controller.d.ts +40 -0
- package/dist/alerts/alerts-admin.controller.d.ts.map +1 -0
- package/dist/alerts/alerts-admin.controller.js +297 -0
- package/dist/alerts/alerts-admin.controller.js.map +1 -0
- package/dist/alerts/alerts-context.service.d.ts +64 -0
- package/dist/alerts/alerts-context.service.d.ts.map +1 -0
- package/dist/alerts/alerts-context.service.js +190 -0
- package/dist/alerts/alerts-context.service.js.map +1 -0
- package/dist/alerts/alerts-dispatch.service.d.ts +53 -0
- package/dist/alerts/alerts-dispatch.service.d.ts.map +1 -0
- package/dist/alerts/alerts-dispatch.service.js +135 -0
- package/dist/alerts/alerts-dispatch.service.js.map +1 -0
- package/dist/alerts/alerts-evaluation.service.d.ts +88 -0
- package/dist/alerts/alerts-evaluation.service.d.ts.map +1 -0
- package/dist/alerts/alerts-evaluation.service.js +296 -0
- package/dist/alerts/alerts-evaluation.service.js.map +1 -0
- package/dist/alerts/alerts-event.listener.d.ts +22 -0
- package/dist/alerts/alerts-event.listener.d.ts.map +1 -0
- package/dist/alerts/alerts-event.listener.js +72 -0
- package/dist/alerts/alerts-event.listener.js.map +1 -0
- package/dist/alerts/alerts-incidents.service.d.ts +86 -0
- package/dist/alerts/alerts-incidents.service.d.ts.map +1 -0
- package/dist/alerts/alerts-incidents.service.js +144 -0
- package/dist/alerts/alerts-incidents.service.js.map +1 -0
- package/dist/alerts/alerts-rules.service.d.ts +73 -0
- package/dist/alerts/alerts-rules.service.d.ts.map +1 -0
- package/dist/alerts/alerts-rules.service.js +205 -0
- package/dist/alerts/alerts-rules.service.js.map +1 -0
- package/dist/alerts/alerts-seed.service.d.ts +25 -0
- package/dist/alerts/alerts-seed.service.d.ts.map +1 -0
- package/dist/alerts/alerts-seed.service.js +82 -0
- package/dist/alerts/alerts-seed.service.js.map +1 -0
- package/dist/alerts/alerts.constants.d.ts +53 -0
- package/dist/alerts/alerts.constants.d.ts.map +1 -0
- package/dist/alerts/alerts.constants.js +57 -0
- package/dist/alerts/alerts.constants.js.map +1 -0
- package/dist/alerts/alerts.errors.d.ts +44 -0
- package/dist/alerts/alerts.errors.d.ts.map +1 -0
- package/dist/alerts/alerts.errors.js +47 -0
- package/dist/alerts/alerts.errors.js.map +1 -0
- package/dist/alerts/alerts.metrics.d.ts +60 -0
- package/dist/alerts/alerts.metrics.d.ts.map +1 -0
- package/dist/alerts/alerts.metrics.js +135 -0
- package/dist/alerts/alerts.metrics.js.map +1 -0
- package/dist/alerts/alerts.module.d.ts +35 -0
- package/dist/alerts/alerts.module.d.ts.map +1 -0
- package/dist/alerts/alerts.module.js +96 -0
- package/dist/alerts/alerts.module.js.map +1 -0
- package/dist/alerts/alerts.options.d.ts +64 -0
- package/dist/alerts/alerts.options.d.ts.map +1 -0
- package/dist/alerts/alerts.options.js +34 -0
- package/dist/alerts/alerts.options.js.map +1 -0
- package/dist/alerts/alerts.permissions.d.ts +27 -0
- package/dist/alerts/alerts.permissions.d.ts.map +1 -0
- package/dist/alerts/alerts.permissions.js +29 -0
- package/dist/alerts/alerts.permissions.js.map +1 -0
- package/dist/alerts/alerts.types.d.ts +182 -0
- package/dist/alerts/alerts.types.d.ts.map +1 -0
- package/dist/alerts/alerts.types.js +3 -0
- package/dist/alerts/alerts.types.js.map +1 -0
- package/dist/alerts/data/alerts-db.d.ts +169 -0
- package/dist/alerts/data/alerts-db.d.ts.map +1 -0
- package/dist/alerts/data/alerts-db.js +18 -0
- package/dist/alerts/data/alerts-db.js.map +1 -0
- package/dist/alerts/dto/alerts.dto.d.ts +132 -0
- package/dist/alerts/dto/alerts.dto.d.ts.map +1 -0
- package/dist/alerts/dto/alerts.dto.js +42 -0
- package/dist/alerts/dto/alerts.dto.js.map +1 -0
- package/dist/alerts/handlers/alerts-evaluate-event.handler.d.ts +23 -0
- package/dist/alerts/handlers/alerts-evaluate-event.handler.d.ts.map +1 -0
- package/dist/alerts/handlers/alerts-evaluate-event.handler.js +71 -0
- package/dist/alerts/handlers/alerts-evaluate-event.handler.js.map +1 -0
- package/dist/alerts/handlers/alerts-evaluate.handler.d.ts +25 -0
- package/dist/alerts/handlers/alerts-evaluate.handler.d.ts.map +1 -0
- package/dist/alerts/handlers/alerts-evaluate.handler.js +54 -0
- package/dist/alerts/handlers/alerts-evaluate.handler.js.map +1 -0
- package/dist/alerts/handlers/alerts-incidents-purge.handler.d.ts +29 -0
- package/dist/alerts/handlers/alerts-incidents-purge.handler.d.ts.map +1 -0
- package/dist/alerts/handlers/alerts-incidents-purge.handler.js +76 -0
- package/dist/alerts/handlers/alerts-incidents-purge.handler.js.map +1 -0
- package/dist/alerts/index.d.ts +45 -0
- package/dist/alerts/index.d.ts.map +1 -0
- package/dist/alerts/index.js +108 -0
- package/dist/alerts/index.js.map +1 -0
- package/dist/alerts/kinds/alert-kind.registry.d.ts +33 -0
- package/dist/alerts/kinds/alert-kind.registry.d.ts.map +1 -0
- package/dist/alerts/kinds/alert-kind.registry.js +63 -0
- package/dist/alerts/kinds/alert-kind.registry.js.map +1 -0
- package/dist/alerts/kinds/builtin-kinds.d.ts +18 -0
- package/dist/alerts/kinds/builtin-kinds.d.ts.map +1 -0
- package/dist/alerts/kinds/builtin-kinds.js +33 -0
- package/dist/alerts/kinds/builtin-kinds.js.map +1 -0
- package/dist/alerts/kinds/metric-threshold.kind.d.ts +11 -0
- package/dist/alerts/kinds/metric-threshold.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/metric-threshold.kind.js +63 -0
- package/dist/alerts/kinds/metric-threshold.kind.js.map +1 -0
- package/dist/alerts/kinds/metric-threshold.sql.d.ts +41 -0
- package/dist/alerts/kinds/metric-threshold.sql.d.ts.map +1 -0
- package/dist/alerts/kinds/metric-threshold.sql.js +124 -0
- package/dist/alerts/kinds/metric-threshold.sql.js.map +1 -0
- package/dist/alerts/kinds/node-event.kind.d.ts +44 -0
- package/dist/alerts/kinds/node-event.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/node-event.kind.js +113 -0
- package/dist/alerts/kinds/node-event.kind.js.map +1 -0
- package/dist/alerts/kinds/node-offline.kind.d.ts +11 -0
- package/dist/alerts/kinds/node-offline.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/node-offline.kind.js +41 -0
- package/dist/alerts/kinds/node-offline.kind.js.map +1 -0
- package/dist/alerts/kinds/telemetry-unavailable.kind.d.ts +11 -0
- package/dist/alerts/kinds/telemetry-unavailable.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/telemetry-unavailable.kind.js +40 -0
- package/dist/alerts/kinds/telemetry-unavailable.kind.js.map +1 -0
- package/dist/alerts/kinds/verdict.kind.d.ts +13 -0
- package/dist/alerts/kinds/verdict.kind.d.ts.map +1 -0
- package/dist/alerts/kinds/verdict.kind.js +34 -0
- package/dist/alerts/kinds/verdict.kind.js.map +1 -0
- package/dist/alerts/notifications/alerts.notifications.d.ts +77 -0
- package/dist/alerts/notifications/alerts.notifications.d.ts.map +1 -0
- package/dist/alerts/notifications/alerts.notifications.js +145 -0
- package/dist/alerts/notifications/alerts.notifications.js.map +1 -0
- package/dist/alerts/starter-rules.d.ts +21 -0
- package/dist/alerts/starter-rules.d.ts.map +1 -0
- package/dist/alerts/starter-rules.js +141 -0
- package/dist/alerts/starter-rules.js.map +1 -0
- package/dist/alerts/state/alert-state-machine.d.ts +92 -0
- package/dist/alerts/state/alert-state-machine.d.ts.map +1 -0
- package/dist/alerts/state/alert-state-machine.js +96 -0
- package/dist/alerts/state/alert-state-machine.js.map +1 -0
- package/dist/alerts/tasks/alerts-evaluate.task.d.ts +18 -0
- package/dist/alerts/tasks/alerts-evaluate.task.d.ts.map +1 -0
- package/dist/alerts/tasks/alerts-evaluate.task.js +61 -0
- package/dist/alerts/tasks/alerts-evaluate.task.js.map +1 -0
- package/dist/alerts/tasks/alerts-purge.task.d.ts +15 -0
- package/dist/alerts/tasks/alerts-purge.task.d.ts.map +1 -0
- package/dist/alerts/tasks/alerts-purge.task.js +58 -0
- package/dist/alerts/tasks/alerts-purge.task.js.map +1 -0
- package/dist/alerts/testing/conformance.d.ts +58 -0
- package/dist/alerts/testing/conformance.d.ts.map +1 -0
- package/dist/alerts/testing/conformance.js +198 -0
- package/dist/alerts/testing/conformance.js.map +1 -0
- package/dist/alerts/testing/fakes.d.ts +80 -0
- package/dist/alerts/testing/fakes.d.ts.map +1 -0
- package/dist/alerts/testing/fakes.js +230 -0
- package/dist/alerts/testing/fakes.js.map +1 -0
- package/dist/alerts/testing/index.d.ts +5 -0
- package/dist/alerts/testing/index.d.ts.map +1 -0
- package/dist/alerts/testing/index.js +15 -0
- package/dist/alerts/testing/index.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +8 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/net/ip-classify.d.ts +39 -0
- package/dist/core/net/ip-classify.d.ts.map +1 -0
- package/dist/core/net/ip-classify.js +196 -0
- package/dist/core/net/ip-classify.js.map +1 -0
- package/dist/credentials/testing/conformance.d.ts.map +1 -1
- package/dist/credentials/testing/conformance.js +1 -0
- package/dist/credentials/testing/conformance.js.map +1 -1
- package/dist/jobs/data/jobs-db.d.ts +26 -0
- package/dist/jobs/data/jobs-db.d.ts.map +1 -1
- package/dist/jobs/index.d.ts +1 -1
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/manifest/platform-model-ownership.d.ts +1 -1
- package/dist/manifest/platform-model-ownership.d.ts.map +1 -1
- package/dist/manifest/platform-model-ownership.js +30 -1
- package/dist/manifest/platform-model-ownership.js.map +1 -1
- package/dist/manifest/platform-permissions.d.ts +6 -2
- package/dist/manifest/platform-permissions.d.ts.map +1 -1
- package/dist/manifest/platform-permissions.js +56 -44
- package/dist/manifest/platform-permissions.js.map +1 -1
- package/dist/manifest/platform-user-owned-models.d.ts.map +1 -1
- package/dist/manifest/platform-user-owned-models.js +16 -0
- package/dist/manifest/platform-user-owned-models.js.map +1 -1
- package/dist/nodes/dto/node-admin.dto.d.ts +5 -0
- package/dist/nodes/dto/node-admin.dto.d.ts.map +1 -1
- package/dist/nodes/dto/node-admin.dto.js +19 -0
- package/dist/nodes/dto/node-admin.dto.js.map +1 -1
- package/dist/nodes/dto/node-control-plane.dto.d.ts +26 -0
- package/dist/nodes/dto/node-control-plane.dto.d.ts.map +1 -1
- package/dist/nodes/dto/node-event.dto.d.ts +100 -0
- package/dist/nodes/dto/node-event.dto.d.ts.map +1 -0
- package/dist/nodes/dto/node-event.dto.js +239 -0
- package/dist/nodes/dto/node-event.dto.js.map +1 -0
- package/dist/nodes/dto/node-response.dto.d.ts +21 -0
- package/dist/nodes/dto/node-response.dto.d.ts.map +1 -1
- package/dist/nodes/dto/node-response.dto.js +42 -1
- package/dist/nodes/dto/node-response.dto.js.map +1 -1
- package/dist/nodes/events/node-event.event.d.ts +41 -0
- package/dist/nodes/events/node-event.event.d.ts.map +1 -0
- package/dist/nodes/events/node-event.event.js +69 -0
- package/dist/nodes/events/node-event.event.js.map +1 -0
- package/dist/nodes/handlers/node-events-purge.handler.d.ts +31 -0
- package/dist/nodes/handlers/node-events-purge.handler.d.ts.map +1 -0
- package/dist/nodes/handlers/node-events-purge.handler.js +91 -0
- package/dist/nodes/handlers/node-events-purge.handler.js.map +1 -0
- package/dist/nodes/index.d.ts +11 -4
- package/dist/nodes/index.d.ts.map +1 -1
- package/dist/nodes/index.js +20 -1
- package/dist/nodes/index.js.map +1 -1
- package/dist/nodes/node-events.service.d.ts +87 -0
- package/dist/nodes/node-events.service.d.ts.map +1 -0
- package/dist/nodes/node-events.service.js +271 -0
- package/dist/nodes/node-events.service.js.map +1 -0
- package/dist/nodes/node-fleet-metrics.service.d.ts +10 -1
- package/dist/nodes/node-fleet-metrics.service.d.ts.map +1 -1
- package/dist/nodes/node-fleet-metrics.service.js +31 -0
- package/dist/nodes/node-fleet-metrics.service.js.map +1 -1
- package/dist/nodes/node-lifecycle.service.d.ts +16 -1
- package/dist/nodes/node-lifecycle.service.d.ts.map +1 -1
- package/dist/nodes/node-lifecycle.service.js +7 -0
- package/dist/nodes/node-lifecycle.service.js.map +1 -1
- package/dist/nodes/nodes-admin.controller.d.ts +5 -1
- package/dist/nodes/nodes-admin.controller.d.ts.map +1 -1
- package/dist/nodes/nodes-admin.controller.js +32 -2
- package/dist/nodes/nodes-admin.controller.js.map +1 -1
- package/dist/nodes/nodes.controller.d.ts +7 -3
- package/dist/nodes/nodes.controller.d.ts.map +1 -1
- package/dist/nodes/nodes.controller.js +46 -6
- package/dist/nodes/nodes.controller.js.map +1 -1
- package/dist/nodes/nodes.metrics.d.ts +23 -1
- package/dist/nodes/nodes.metrics.d.ts.map +1 -1
- package/dist/nodes/nodes.metrics.js +80 -1
- package/dist/nodes/nodes.metrics.js.map +1 -1
- package/dist/nodes/nodes.module.d.ts.map +1 -1
- package/dist/nodes/nodes.module.js +6 -0
- package/dist/nodes/nodes.module.js.map +1 -1
- package/dist/nodes/nodes.options.d.ts +17 -0
- package/dist/nodes/nodes.options.d.ts.map +1 -1
- package/dist/nodes/nodes.options.js +13 -2
- package/dist/nodes/nodes.options.js.map +1 -1
- package/dist/nodes/nodes.service.d.ts +3 -1
- package/dist/nodes/nodes.service.d.ts.map +1 -1
- package/dist/nodes/nodes.service.js +14 -3
- package/dist/nodes/nodes.service.js.map +1 -1
- package/dist/nodes/tasks/node-events-purge.task.d.ts +13 -0
- package/dist/nodes/tasks/node-events-purge.task.d.ts.map +1 -0
- package/dist/nodes/tasks/node-events-purge.task.js +73 -0
- package/dist/nodes/tasks/node-events-purge.task.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts +30 -8
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts.map +1 -1
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js +12 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js.map +1 -1
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts +15 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts.map +1 -1
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js +17 -2
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js.map +1 -1
- package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts +3 -3
- package/dist/telemetry/index.d.ts +4 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +4 -1
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts.map +1 -1
- package/dist/telemetry/metrics/groups/nodes.metric-group.js +77 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.js.map +1 -1
- package/dist/telemetry/metrics/metric-verdict.d.ts +1 -1
- package/dist/telemetry/metrics/metric-verdict.d.ts.map +1 -1
- package/dist/telemetry/metrics/metric-verdict.js +15 -1
- package/dist/telemetry/metrics/metric-verdict.js.map +1 -1
- package/dist/telemetry/query/telemetry-query-facade.d.ts +1 -1
- package/dist/telemetry/query/telemetry-query-facade.d.ts.map +1 -1
- package/dist/telemetry/query/telemetry-query-facade.js.map +1 -1
- package/dist/telemetry/query/telemetry-query.service.d.ts +2 -2
- package/dist/telemetry/query/telemetry-query.service.d.ts.map +1 -1
- package/dist/telemetry/query/telemetry-query.service.js +4 -0
- package/dist/telemetry/query/telemetry-query.service.js.map +1 -1
- package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts +1 -1
- package/dist/telemetry/telemetry-support-bundle.section.d.ts +4 -4
- package/dist/telemetry/telemetry.module.d.ts.map +1 -1
- package/dist/telemetry/telemetry.module.js +1 -0
- package/dist/telemetry/telemetry.module.js.map +1 -1
- package/dist/telemetry/testing/metric-schema.fixture.d.ts.map +1 -1
- package/dist/telemetry/testing/metric-schema.fixture.js +56 -0
- package/dist/telemetry/testing/metric-schema.fixture.js.map +1 -1
- package/dist/user-data/platform-user-data.d.ts.map +1 -1
- package/dist/user-data/platform-user-data.js +2 -0
- package/dist/user-data/platform-user-data.js.map +1 -1
- package/dist/webhooks/data/webhooks-db.d.ts +176 -0
- package/dist/webhooks/data/webhooks-db.d.ts.map +1 -0
- package/dist/webhooks/data/webhooks-db.js +14 -0
- package/dist/webhooks/data/webhooks-db.js.map +1 -0
- package/dist/webhooks/egress/egress-guard.d.ts +99 -0
- package/dist/webhooks/egress/egress-guard.d.ts.map +1 -0
- package/dist/webhooks/egress/egress-guard.js +172 -0
- package/dist/webhooks/egress/egress-guard.js.map +1 -0
- package/dist/webhooks/egress/transport.d.ts +58 -0
- package/dist/webhooks/egress/transport.d.ts.map +1 -0
- package/dist/webhooks/egress/transport.js +115 -0
- package/dist/webhooks/egress/transport.js.map +1 -0
- package/dist/webhooks/handlers/webhook-deliver.handler.d.ts +76 -0
- package/dist/webhooks/handlers/webhook-deliver.handler.d.ts.map +1 -0
- package/dist/webhooks/handlers/webhook-deliver.handler.js +332 -0
- package/dist/webhooks/handlers/webhook-deliver.handler.js.map +1 -0
- package/dist/webhooks/handlers/webhook-fanout.handler.d.ts +28 -0
- package/dist/webhooks/handlers/webhook-fanout.handler.d.ts.map +1 -0
- package/dist/webhooks/handlers/webhook-fanout.handler.js +73 -0
- package/dist/webhooks/handlers/webhook-fanout.handler.js.map +1 -0
- package/dist/webhooks/handlers/webhook-purge.handler.d.ts +33 -0
- package/dist/webhooks/handlers/webhook-purge.handler.d.ts.map +1 -0
- package/dist/webhooks/handlers/webhook-purge.handler.js +77 -0
- package/dist/webhooks/handlers/webhook-purge.handler.js.map +1 -0
- package/dist/webhooks/http/admin-webhooks.controller.d.ts +36 -0
- package/dist/webhooks/http/admin-webhooks.controller.d.ts.map +1 -0
- package/dist/webhooks/http/admin-webhooks.controller.js +250 -0
- package/dist/webhooks/http/admin-webhooks.controller.js.map +1 -0
- package/dist/webhooks/http/org-webhooks.controller.d.ts +36 -0
- package/dist/webhooks/http/org-webhooks.controller.d.ts.map +1 -0
- package/dist/webhooks/http/org-webhooks.controller.js +249 -0
- package/dist/webhooks/http/org-webhooks.controller.js.map +1 -0
- package/dist/webhooks/http/scope-context.d.ts +17 -0
- package/dist/webhooks/http/scope-context.d.ts.map +1 -0
- package/dist/webhooks/http/scope-context.js +28 -0
- package/dist/webhooks/http/scope-context.js.map +1 -0
- package/dist/webhooks/http/webhook.dto.d.ts +174 -0
- package/dist/webhooks/http/webhook.dto.d.ts.map +1 -0
- package/dist/webhooks/http/webhook.dto.js +58 -0
- package/dist/webhooks/http/webhook.dto.js.map +1 -0
- package/dist/webhooks/http/webhooks.controller.d.ts +36 -0
- package/dist/webhooks/http/webhooks.controller.d.ts.map +1 -0
- package/dist/webhooks/http/webhooks.controller.js +243 -0
- package/dist/webhooks/http/webhooks.controller.js.map +1 -0
- package/dist/webhooks/index.d.ts +43 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +147 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/listeners/webhook-event.listeners.d.ts +23 -0
- package/dist/webhooks/listeners/webhook-event.listeners.d.ts.map +1 -0
- package/dist/webhooks/listeners/webhook-event.listeners.js +120 -0
- package/dist/webhooks/listeners/webhook-event.listeners.js.map +1 -0
- package/dist/webhooks/notifications/webhook-notification.channel.d.ts +31 -0
- package/dist/webhooks/notifications/webhook-notification.channel.d.ts.map +1 -0
- package/dist/webhooks/notifications/webhook-notification.channel.js +127 -0
- package/dist/webhooks/notifications/webhook-notification.channel.js.map +1 -0
- package/dist/webhooks/notifications/webhook-notifications.d.ts +98 -0
- package/dist/webhooks/notifications/webhook-notifications.d.ts.map +1 -0
- package/dist/webhooks/notifications/webhook-notifications.js +150 -0
- package/dist/webhooks/notifications/webhook-notifications.js.map +1 -0
- package/dist/webhooks/ports.d.ts +29 -0
- package/dist/webhooks/ports.d.ts.map +1 -0
- package/dist/webhooks/ports.js +23 -0
- package/dist/webhooks/ports.js.map +1 -0
- package/dist/webhooks/registry/builtin-events.d.ts +57 -0
- package/dist/webhooks/registry/builtin-events.d.ts.map +1 -0
- package/dist/webhooks/registry/builtin-events.js +113 -0
- package/dist/webhooks/registry/builtin-events.js.map +1 -0
- package/dist/webhooks/registry/webhook-catalog.d.ts +63 -0
- package/dist/webhooks/registry/webhook-catalog.d.ts.map +1 -0
- package/dist/webhooks/registry/webhook-catalog.js +123 -0
- package/dist/webhooks/registry/webhook-catalog.js.map +1 -0
- package/dist/webhooks/registry/webhook-event.registry.d.ts +116 -0
- package/dist/webhooks/registry/webhook-event.registry.d.ts.map +1 -0
- package/dist/webhooks/registry/webhook-event.registry.js +152 -0
- package/dist/webhooks/registry/webhook-event.registry.js.map +1 -0
- package/dist/webhooks/signing.d.ts +31 -0
- package/dist/webhooks/signing.d.ts.map +1 -0
- package/dist/webhooks/signing.js +48 -0
- package/dist/webhooks/signing.js.map +1 -0
- package/dist/webhooks/tasks/webhook-purge.task.d.ts +17 -0
- package/dist/webhooks/tasks/webhook-purge.task.d.ts.map +1 -0
- package/dist/webhooks/tasks/webhook-purge.task.js +68 -0
- package/dist/webhooks/tasks/webhook-purge.task.js.map +1 -0
- package/dist/webhooks/testing/conformance.d.ts +61 -0
- package/dist/webhooks/testing/conformance.d.ts.map +1 -0
- package/dist/webhooks/testing/conformance.js +316 -0
- package/dist/webhooks/testing/conformance.js.map +1 -0
- package/dist/webhooks/testing/in-memory.d.ts +156 -0
- package/dist/webhooks/testing/in-memory.d.ts.map +1 -0
- package/dist/webhooks/testing/in-memory.js +323 -0
- package/dist/webhooks/testing/in-memory.js.map +1 -0
- package/dist/webhooks/testing/index.d.ts +7 -0
- package/dist/webhooks/testing/index.d.ts.map +1 -0
- package/dist/webhooks/testing/index.js +25 -0
- package/dist/webhooks/testing/index.js.map +1 -0
- package/dist/webhooks/testing/kit.d.ts +86 -0
- package/dist/webhooks/testing/kit.d.ts.map +1 -0
- package/dist/webhooks/testing/kit.js +113 -0
- package/dist/webhooks/testing/kit.js.map +1 -0
- package/dist/webhooks/webhook-endpoints.service.d.ts +142 -0
- package/dist/webhooks/webhook-endpoints.service.d.ts.map +1 -0
- package/dist/webhooks/webhook-endpoints.service.js +366 -0
- package/dist/webhooks/webhook-endpoints.service.js.map +1 -0
- package/dist/webhooks/webhook-envelope.d.ts +36 -0
- package/dist/webhooks/webhook-envelope.d.ts.map +1 -0
- package/dist/webhooks/webhook-envelope.js +46 -0
- package/dist/webhooks/webhook-envelope.js.map +1 -0
- package/dist/webhooks/webhook-secrets.service.d.ts +49 -0
- package/dist/webhooks/webhook-secrets.service.d.ts.map +1 -0
- package/dist/webhooks/webhook-secrets.service.js +118 -0
- package/dist/webhooks/webhook-secrets.service.js.map +1 -0
- package/dist/webhooks/webhook-views.d.ts +34 -0
- package/dist/webhooks/webhook-views.d.ts.map +1 -0
- package/dist/webhooks/webhook-views.js +83 -0
- package/dist/webhooks/webhook-views.js.map +1 -0
- package/dist/webhooks/webhooks.access.d.ts +28 -0
- package/dist/webhooks/webhooks.access.d.ts.map +1 -0
- package/dist/webhooks/webhooks.access.js +55 -0
- package/dist/webhooks/webhooks.access.js.map +1 -0
- package/dist/webhooks/webhooks.constants.d.ts +73 -0
- package/dist/webhooks/webhooks.constants.d.ts.map +1 -0
- package/dist/webhooks/webhooks.constants.js +100 -0
- package/dist/webhooks/webhooks.constants.js.map +1 -0
- package/dist/webhooks/webhooks.credentials.d.ts +28 -0
- package/dist/webhooks/webhooks.credentials.d.ts.map +1 -0
- package/dist/webhooks/webhooks.credentials.js +51 -0
- package/dist/webhooks/webhooks.credentials.js.map +1 -0
- package/dist/webhooks/webhooks.errors.d.ts +25 -0
- package/dist/webhooks/webhooks.errors.d.ts.map +1 -0
- package/dist/webhooks/webhooks.errors.js +65 -0
- package/dist/webhooks/webhooks.errors.js.map +1 -0
- package/dist/webhooks/webhooks.metrics.d.ts +24 -0
- package/dist/webhooks/webhooks.metrics.d.ts.map +1 -0
- package/dist/webhooks/webhooks.metrics.js +70 -0
- package/dist/webhooks/webhooks.metrics.js.map +1 -0
- package/dist/webhooks/webhooks.module.d.ts +29 -0
- package/dist/webhooks/webhooks.module.d.ts.map +1 -0
- package/dist/webhooks/webhooks.module.js +108 -0
- package/dist/webhooks/webhooks.module.js.map +1 -0
- package/dist/webhooks/webhooks.options.d.ts +119 -0
- package/dist/webhooks/webhooks.options.d.ts.map +1 -0
- package/dist/webhooks/webhooks.options.js +80 -0
- package/dist/webhooks/webhooks.options.js.map +1 -0
- package/dist/webhooks/webhooks.permissions.d.ts +47 -0
- package/dist/webhooks/webhooks.permissions.d.ts.map +1 -0
- package/dist/webhooks/webhooks.permissions.js +83 -0
- package/dist/webhooks/webhooks.permissions.js.map +1 -0
- package/dist/webhooks/webhooks.repository.d.ts +162 -0
- package/dist/webhooks/webhooks.repository.d.ts.map +1 -0
- package/dist/webhooks/webhooks.repository.js +246 -0
- package/dist/webhooks/webhooks.repository.js.map +1 -0
- package/dist/webhooks/webhooks.service.d.ts +91 -0
- package/dist/webhooks/webhooks.service.d.ts.map +1 -0
- package/dist/webhooks/webhooks.service.js +216 -0
- package/dist/webhooks/webhooks.service.js.map +1 -0
- package/package.json +19 -3
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BUILTIN_ALERT_KINDS = void 0;
|
|
4
|
+
exports.registerBuiltinAlertKinds = registerBuiltinAlertKinds;
|
|
5
|
+
const alert_kind_registry_1 = require("./alert-kind.registry");
|
|
6
|
+
const metric_threshold_kind_1 = require("./metric-threshold.kind");
|
|
7
|
+
const node_event_kind_1 = require("./node-event.kind");
|
|
8
|
+
const node_offline_kind_1 = require("./node-offline.kind");
|
|
9
|
+
const telemetry_unavailable_kind_1 = require("./telemetry-unavailable.kind");
|
|
10
|
+
const verdict_kind_1 = require("./verdict.kind");
|
|
11
|
+
/**
|
|
12
|
+
* The five kinds the slice ships, in registration order.
|
|
13
|
+
*
|
|
14
|
+
* @stability experimental
|
|
15
|
+
*/
|
|
16
|
+
exports.BUILTIN_ALERT_KINDS = [metric_threshold_kind_1.metricThresholdKind, node_event_kind_1.nodeEventKind, verdict_kind_1.verdictKind, node_offline_kind_1.nodeOfflineKind, telemetry_unavailable_kind_1.telemetryUnavailableKind];
|
|
17
|
+
/**
|
|
18
|
+
* Registers the built-in kinds. IDEMPOTENT: a kind already registered with the
|
|
19
|
+
* built-in definition is skipped (`AlertsModule.forRoot` and an app may both
|
|
20
|
+
* call it).
|
|
21
|
+
*
|
|
22
|
+
* @throws RegistryError `FROZEN` when something is left to register after the application bootstrapped.
|
|
23
|
+
*
|
|
24
|
+
* @stability experimental
|
|
25
|
+
*/
|
|
26
|
+
function registerBuiltinAlertKinds() {
|
|
27
|
+
for (const kind of exports.BUILTIN_ALERT_KINDS) {
|
|
28
|
+
if (alert_kind_registry_1.alertRuleKindRegistry.get(kind.id) === kind)
|
|
29
|
+
continue;
|
|
30
|
+
(0, alert_kind_registry_1.registerAlertRuleKind)(kind);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=builtin-kinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-kinds.js","sourceRoot":"","sources":["../../../src/alerts/kinds/builtin-kinds.ts"],"names":[],"mappings":";;;AAwBA,8DAKC;AA5BD,+DAAqF;AACrF,mEAA8D;AAC9D,uDAAkD;AAClD,2DAAsD;AACtD,6EAAwE;AACxE,iDAA6C;AAE7C;;;;GAIG;AACU,QAAA,mBAAmB,GAA6B,CAAC,2CAAmB,EAAE,+BAAa,EAAE,0BAAW,EAAE,mCAAe,EAAE,qDAAwB,CAAC,CAAC;AAE1J;;;;;;;;GAQG;AACH,SAAgB,yBAAyB;IACvC,KAAK,MAAM,IAAI,IAAI,2BAAmB,EAAE,CAAC;QACvC,IAAI,2CAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI;YAAE,SAAS;QAC1D,IAAA,2CAAqB,EAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type MetricThresholdConfig } from '@marinoscar/platform-contract/alerts';
|
|
2
|
+
import type { AlertRuleKind } from '../alerts.types';
|
|
3
|
+
/**
|
|
4
|
+
* `metric_threshold`: one aggregate of one telemetry metric over a window,
|
|
5
|
+
* compared to a threshold, per group. Runs ONE statement through the guarded
|
|
6
|
+
* telemetry facade; an unreachable store throws `AlertStoreUnavailableError`.
|
|
7
|
+
*
|
|
8
|
+
* @stability experimental
|
|
9
|
+
*/
|
|
10
|
+
export declare const metricThresholdKind: AlertRuleKind<MetricThresholdConfig>;
|
|
11
|
+
//# sourceMappingURL=metric-threshold.kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric-threshold.kind.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/metric-threshold.kind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsE,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAEtJ,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAuBpE;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,CAkCpE,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.metricThresholdKind = void 0;
|
|
4
|
+
const alerts_1 = require("@marinoscar/platform-contract/alerts");
|
|
5
|
+
const metric_threshold_sql_1 = require("./metric-threshold.sql");
|
|
6
|
+
/** Most label sets one evaluation reads. */
|
|
7
|
+
const MAX_GROUPS = 200;
|
|
8
|
+
const SYMBOL = {
|
|
9
|
+
gt: '>',
|
|
10
|
+
gte: '>=',
|
|
11
|
+
lt: '<',
|
|
12
|
+
lte: '<=',
|
|
13
|
+
eq: '=',
|
|
14
|
+
neq: '!=',
|
|
15
|
+
};
|
|
16
|
+
function describeConfig(config) {
|
|
17
|
+
return `${config.aggregation}(${config.metric}) over ${config.windowSeconds}s ${SYMBOL[config.comparator]} ${config.threshold}`;
|
|
18
|
+
}
|
|
19
|
+
function formatValue(value) {
|
|
20
|
+
return Number.isInteger(value) ? String(value) : value.toFixed(2);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `metric_threshold`: one aggregate of one telemetry metric over a window,
|
|
24
|
+
* compared to a threshold, per group. Runs ONE statement through the guarded
|
|
25
|
+
* telemetry facade; an unreachable store throws `AlertStoreUnavailableError`.
|
|
26
|
+
*
|
|
27
|
+
* @stability experimental
|
|
28
|
+
*/
|
|
29
|
+
exports.metricThresholdKind = {
|
|
30
|
+
id: alerts_1.ALERT_KIND_IDS.METRIC_THRESHOLD,
|
|
31
|
+
label: 'Metric threshold',
|
|
32
|
+
description: 'An aggregate of one telemetry metric over a time window compared to a threshold, per group.',
|
|
33
|
+
configSchema: alerts_1.metricThresholdConfigSchema,
|
|
34
|
+
async evaluate(ctx, rule) {
|
|
35
|
+
const { config } = rule;
|
|
36
|
+
const telemetry = await ctx.telemetry();
|
|
37
|
+
const table = (0, metric_threshold_sql_1.resolveMetricTable)(config.metric, telemetry.tables);
|
|
38
|
+
if (!table)
|
|
39
|
+
throw new Error(`The telemetry store has no table for the metric "${config.metric}" (yet).`);
|
|
40
|
+
const sql = (0, metric_threshold_sql_1.buildMetricThresholdSql)(config, table, telemetry.query, ctx.now);
|
|
41
|
+
const result = await telemetry.query.query(sql, { maxRows: MAX_GROUPS });
|
|
42
|
+
const groupBy = config.groupBy ?? [];
|
|
43
|
+
return result.rows.map((row) => {
|
|
44
|
+
const labels = {};
|
|
45
|
+
groupBy.forEach((column, index) => {
|
|
46
|
+
const raw = row[index];
|
|
47
|
+
labels[column] = raw === null || raw === undefined ? '' : String(raw);
|
|
48
|
+
});
|
|
49
|
+
const raw = row[groupBy.length];
|
|
50
|
+
const value = raw === null || raw === undefined ? Number.NaN : Number(raw);
|
|
51
|
+
const known = Number.isFinite(value);
|
|
52
|
+
const where = Object.keys(labels).length > 0 ? ` for ${Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(', ')}` : '';
|
|
53
|
+
return {
|
|
54
|
+
labels,
|
|
55
|
+
value: known ? value : null,
|
|
56
|
+
breached: known && (0, metric_threshold_sql_1.compareValue)(value, config.comparator, config.threshold),
|
|
57
|
+
summary: `${rule.name}: ${config.aggregation} of ${config.metric} is ${known ? formatValue(value) : 'unknown'}${where} (${SYMBOL[config.comparator]} ${config.threshold})`.slice(0, 500),
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
describe: (rule) => describeConfig(rule.config),
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=metric-threshold.kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric-threshold.kind.js","sourceRoot":"","sources":["../../../src/alerts/kinds/metric-threshold.kind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AlertComparator, MetricThresholdConfig } from '@marinoscar/platform-contract/alerts';
|
|
2
|
+
import type { TelemetryQueryFacade } from '../../telemetry/index';
|
|
3
|
+
import type { AlertMetricTable } from '../alerts.types';
|
|
4
|
+
/** The suffixes the store appends to a metric's table name, by unit or kind. */
|
|
5
|
+
export declare const METRIC_TABLE_SUFFIXES: readonly ["", "_total", "_bytes", "_seconds", "_ratio", "_percent"];
|
|
6
|
+
/**
|
|
7
|
+
* The table a metric name or table name resolves to: the name with `.` turned
|
|
8
|
+
* into `_`, as is, or with one of the store's unit suffixes.
|
|
9
|
+
*
|
|
10
|
+
* @param metric - a dotted metric name (`app.jobs.settled`) or a table name.
|
|
11
|
+
* @param tables - the store's metric tables.
|
|
12
|
+
* @returns the table, or `null` when the store has none.
|
|
13
|
+
*
|
|
14
|
+
* @stability experimental
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveMetricTable(metric: string, tables: ReadonlyMap<string, AlertMetricTable>): AlertMetricTable | null;
|
|
17
|
+
/**
|
|
18
|
+
* Whether `value` breaches `threshold` under `comparator`.
|
|
19
|
+
*
|
|
20
|
+
* @param value - the observed value.
|
|
21
|
+
* @param comparator - the rule's comparator.
|
|
22
|
+
* @param threshold - the rule's threshold.
|
|
23
|
+
* @returns the verdict.
|
|
24
|
+
*
|
|
25
|
+
* @stability experimental
|
|
26
|
+
*/
|
|
27
|
+
export declare function compareValue(value: number, comparator: AlertComparator, threshold: number): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Builds the statement for one rule over one table. Throws when a named
|
|
30
|
+
* column is not a column of the table.
|
|
31
|
+
*
|
|
32
|
+
* @param config - the rule's parsed config.
|
|
33
|
+
* @param table - the resolved metric table.
|
|
34
|
+
* @param query - the facade (its builders quote; its dialect spells the columns).
|
|
35
|
+
* @param now - the end of the window.
|
|
36
|
+
* @returns one SELECT. The result columns are the `groupBy` columns (as text), then `value`.
|
|
37
|
+
*
|
|
38
|
+
* @stability experimental
|
|
39
|
+
*/
|
|
40
|
+
export declare function buildMetricThresholdSql(config: MetricThresholdConfig, table: AlertMetricTable, query: Pick<TelemetryQueryFacade, 'sql' | 'dialect'>, now: Date): string;
|
|
41
|
+
//# sourceMappingURL=metric-threshold.sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric-threshold.sql.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/metric-threshold.sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAEnG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAcxD,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,qEAAsE,CAAC;AAEzG;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC5C,gBAAgB,GAAG,IAAI,CAOzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAenG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,SAAS,CAAC,EACpD,GAAG,EAAE,IAAI,GACR,MAAM,CAwDR"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.METRIC_TABLE_SUFFIXES = void 0;
|
|
4
|
+
exports.resolveMetricTable = resolveMetricTable;
|
|
5
|
+
exports.compareValue = compareValue;
|
|
6
|
+
exports.buildMetricThresholdSql = buildMetricThresholdSql;
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// The one statement a `metric_threshold` rule runs (issue #1047)
|
|
9
|
+
// =============================================================================
|
|
10
|
+
//
|
|
11
|
+
// EVERY value that reaches the SQL goes through the facade's builders
|
|
12
|
+
// (`sql.ident` for a column, `sql.literal` for a filter value, `sql.timestamp`
|
|
13
|
+
// for the window): nothing from a rule's config is concatenated. The only
|
|
14
|
+
// other interpolated numbers are integers this file computes itself from the
|
|
15
|
+
// validated window. Column names a rule names (`groupBy`, a filter's `attr`)
|
|
16
|
+
// are additionally required to be columns of the resolved table.
|
|
17
|
+
// =============================================================================
|
|
18
|
+
/** The suffixes the store appends to a metric's table name, by unit or kind. */
|
|
19
|
+
exports.METRIC_TABLE_SUFFIXES = ['', '_total', '_bytes', '_seconds', '_ratio', '_percent'];
|
|
20
|
+
/**
|
|
21
|
+
* The table a metric name or table name resolves to: the name with `.` turned
|
|
22
|
+
* into `_`, as is, or with one of the store's unit suffixes.
|
|
23
|
+
*
|
|
24
|
+
* @param metric - a dotted metric name (`app.jobs.settled`) or a table name.
|
|
25
|
+
* @param tables - the store's metric tables.
|
|
26
|
+
* @returns the table, or `null` when the store has none.
|
|
27
|
+
*
|
|
28
|
+
* @stability experimental
|
|
29
|
+
*/
|
|
30
|
+
function resolveMetricTable(metric, tables) {
|
|
31
|
+
const base = metric.replace(/\./g, '_');
|
|
32
|
+
for (const suffix of exports.METRIC_TABLE_SUFFIXES) {
|
|
33
|
+
const table = tables.get(`${base}${suffix}`);
|
|
34
|
+
if (table)
|
|
35
|
+
return table;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Whether `value` breaches `threshold` under `comparator`.
|
|
41
|
+
*
|
|
42
|
+
* @param value - the observed value.
|
|
43
|
+
* @param comparator - the rule's comparator.
|
|
44
|
+
* @param threshold - the rule's threshold.
|
|
45
|
+
* @returns the verdict.
|
|
46
|
+
*
|
|
47
|
+
* @stability experimental
|
|
48
|
+
*/
|
|
49
|
+
function compareValue(value, comparator, threshold) {
|
|
50
|
+
switch (comparator) {
|
|
51
|
+
case 'gt':
|
|
52
|
+
return value > threshold;
|
|
53
|
+
case 'gte':
|
|
54
|
+
return value >= threshold;
|
|
55
|
+
case 'lt':
|
|
56
|
+
return value < threshold;
|
|
57
|
+
case 'lte':
|
|
58
|
+
return value <= threshold;
|
|
59
|
+
case 'eq':
|
|
60
|
+
return value === threshold;
|
|
61
|
+
case 'neq':
|
|
62
|
+
return value !== threshold;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Builds the statement for one rule over one table. Throws when a named
|
|
67
|
+
* column is not a column of the table.
|
|
68
|
+
*
|
|
69
|
+
* @param config - the rule's parsed config.
|
|
70
|
+
* @param table - the resolved metric table.
|
|
71
|
+
* @param query - the facade (its builders quote; its dialect spells the columns).
|
|
72
|
+
* @param now - the end of the window.
|
|
73
|
+
* @returns one SELECT. The result columns are the `groupBy` columns (as text), then `value`.
|
|
74
|
+
*
|
|
75
|
+
* @stability experimental
|
|
76
|
+
*/
|
|
77
|
+
function buildMetricThresholdSql(config, table, query, now) {
|
|
78
|
+
const { sql, dialect } = query;
|
|
79
|
+
const groupBy = config.groupBy ?? [];
|
|
80
|
+
const filters = config.filters ?? [];
|
|
81
|
+
for (const column of [...groupBy, ...filters.map((f) => f.attr)]) {
|
|
82
|
+
if (!table.columns.has(column)) {
|
|
83
|
+
throw new Error(`The metric table "${table.name}" has no column "${column}".`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (!Number.isInteger(config.windowSeconds) || config.windowSeconds < 1) {
|
|
87
|
+
throw new RangeError('windowSeconds must be a positive integer');
|
|
88
|
+
}
|
|
89
|
+
const from = new Date(now.getTime() - config.windowSeconds * 1000);
|
|
90
|
+
const ts = dialect.timestampColumn;
|
|
91
|
+
const value = sql.ident(dialect.valueColumn);
|
|
92
|
+
const where = [
|
|
93
|
+
sql.between(ts, from, now),
|
|
94
|
+
...filters.map((f) => `${sql.ident(f.attr)} ${f.op === 'eq' ? '=' : '<>'} ${sql.literal(f.value)}`),
|
|
95
|
+
].join(' AND ');
|
|
96
|
+
const groupSelect = groupBy.map((column) => `${dialect.castText(sql.ident(column))} AS ${sql.ident(column)}`);
|
|
97
|
+
const groupRef = groupBy.map((column) => sql.ident(column));
|
|
98
|
+
const tail = groupRef.length > 0 ? ` GROUP BY ${groupRef.join(', ')}` : '';
|
|
99
|
+
if (config.aggregation === 'rate') {
|
|
100
|
+
// A counter's increase per series (max - min over the window), summed across
|
|
101
|
+
// the series that share the group, per minute. Resets inside the window are
|
|
102
|
+
// not corrected for: a reset reads as a smaller increase, never a false one.
|
|
103
|
+
const seriesColumns = [...new Set([...table.tags, ...groupBy])];
|
|
104
|
+
const inner = `SELECT ${[...seriesColumns.map((c) => sql.ident(c)), `MAX(${value}) - MIN(${value}) AS ${sql.ident('inc')}`].join(', ')} ` +
|
|
105
|
+
`FROM ${sql.ident(table.name)} WHERE ${where}` +
|
|
106
|
+
(seriesColumns.length > 0 ? ` GROUP BY ${seriesColumns.map((c) => sql.ident(c)).join(', ')}` : '');
|
|
107
|
+
const minutes = config.windowSeconds / 60;
|
|
108
|
+
const outerSelect = [
|
|
109
|
+
...groupBy.map((column) => `${dialect.castText(sql.ident(column))} AS ${sql.ident(column)}`),
|
|
110
|
+
`SUM(${sql.ident('inc')}) / ${minutes} AS ${sql.ident('value')}`,
|
|
111
|
+
];
|
|
112
|
+
return `SELECT ${outerSelect.join(', ')} FROM (${inner}) AS ${sql.ident('series')}${tail}`;
|
|
113
|
+
}
|
|
114
|
+
const aggregate = {
|
|
115
|
+
avg: `AVG(${value})`,
|
|
116
|
+
max: `MAX(${value})`,
|
|
117
|
+
min: `MIN(${value})`,
|
|
118
|
+
sum: `SUM(${value})`,
|
|
119
|
+
last: `last_value(${value} ORDER BY ${sql.ident(ts)})`,
|
|
120
|
+
}[config.aggregation];
|
|
121
|
+
return (`SELECT ${[...groupSelect, `${aggregate} AS ${sql.ident('value')}`].join(', ')} ` +
|
|
122
|
+
`FROM ${sql.ident(table.name)} WHERE ${where}${tail}`);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=metric-threshold.sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric-threshold.sql.js","sourceRoot":"","sources":["../../../src/alerts/kinds/metric-threshold.sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type NodeEventConfig } from '@marinoscar/platform-contract/alerts';
|
|
2
|
+
import type { AlertRuleKind } from '../alerts.types';
|
|
3
|
+
/**
|
|
4
|
+
* Whether a dotted event type matches one pattern: exact, or `prefix.*`.
|
|
5
|
+
*
|
|
6
|
+
* @param pattern - `power.battery_low` or `power.*`.
|
|
7
|
+
* @param type - the event type.
|
|
8
|
+
* @returns whether it matches.
|
|
9
|
+
*
|
|
10
|
+
* @stability experimental
|
|
11
|
+
*/
|
|
12
|
+
export declare function eventTypeMatches(pattern: string, type: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* How a node event relates to a rule: it triggers it, recovers it, or is unrelated (`null`).
|
|
15
|
+
*
|
|
16
|
+
* @stability experimental
|
|
17
|
+
*/
|
|
18
|
+
export type NodeEventClassification = 'trigger' | 'recovery' | null;
|
|
19
|
+
/**
|
|
20
|
+
* Classifies one event against a rule's config.
|
|
21
|
+
*
|
|
22
|
+
* @param config - the rule's parsed config.
|
|
23
|
+
* @param event - the event (type, severity, attrs, node).
|
|
24
|
+
* @returns `trigger`, `recovery` or `null`.
|
|
25
|
+
*
|
|
26
|
+
* @stability experimental
|
|
27
|
+
*/
|
|
28
|
+
export declare function classifyNodeEvent(config: NodeEventConfig, event: {
|
|
29
|
+
nodeId: string;
|
|
30
|
+
type: string;
|
|
31
|
+
severity: string;
|
|
32
|
+
attrs: unknown;
|
|
33
|
+
}): NodeEventClassification;
|
|
34
|
+
/**
|
|
35
|
+
* `node_event`: a worker node reported a matching event. Reads the
|
|
36
|
+
* `worker_node_events` table (not the telemetry store), so it works with
|
|
37
|
+
* telemetry off. Per node the NEWEST classified event inside
|
|
38
|
+
* `resolveAfterSeconds` decides: a trigger breaches, a recovery clears, and a
|
|
39
|
+
* node with no such event inside the window is absent (clear).
|
|
40
|
+
*
|
|
41
|
+
* @stability experimental
|
|
42
|
+
*/
|
|
43
|
+
export declare const nodeEventKind: AlertRuleKind<NodeEventConfig>;
|
|
44
|
+
//# sourceMappingURL=node-event.kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-event.kind.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/node-event.kind.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,EAAyB,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAO3F;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvE;AAYD;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC;AAEpE;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACxE,uBAAuB,CAazB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,eAAe,CAsDxD,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nodeEventKind = void 0;
|
|
4
|
+
exports.eventTypeMatches = eventTypeMatches;
|
|
5
|
+
exports.classifyNodeEvent = classifyNodeEvent;
|
|
6
|
+
const alerts_1 = require("@marinoscar/platform-contract/alerts");
|
|
7
|
+
const SEVERITY_RANK = { info: 0, warning: 1, critical: 2 };
|
|
8
|
+
/** Most events one evaluation reads. */
|
|
9
|
+
const MAX_EVENTS = 2_000;
|
|
10
|
+
/**
|
|
11
|
+
* Whether a dotted event type matches one pattern: exact, or `prefix.*`.
|
|
12
|
+
*
|
|
13
|
+
* @param pattern - `power.battery_low` or `power.*`.
|
|
14
|
+
* @param type - the event type.
|
|
15
|
+
* @returns whether it matches.
|
|
16
|
+
*
|
|
17
|
+
* @stability experimental
|
|
18
|
+
*/
|
|
19
|
+
function eventTypeMatches(pattern, type) {
|
|
20
|
+
return pattern.endsWith('.*') ? type.startsWith(pattern.slice(0, -1)) : pattern === type;
|
|
21
|
+
}
|
|
22
|
+
function typeIn(patterns, type) {
|
|
23
|
+
return patterns.some((pattern) => eventTypeMatches(pattern, type));
|
|
24
|
+
}
|
|
25
|
+
function attrsMatch(wanted, attrs) {
|
|
26
|
+
if (!wanted)
|
|
27
|
+
return true;
|
|
28
|
+
const have = (attrs && typeof attrs === 'object' ? attrs : {});
|
|
29
|
+
return Object.entries(wanted).every(([key, value]) => String(have[key]) === String(value));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Classifies one event against a rule's config.
|
|
33
|
+
*
|
|
34
|
+
* @param config - the rule's parsed config.
|
|
35
|
+
* @param event - the event (type, severity, attrs, node).
|
|
36
|
+
* @returns `trigger`, `recovery` or `null`.
|
|
37
|
+
*
|
|
38
|
+
* @stability experimental
|
|
39
|
+
*/
|
|
40
|
+
function classifyNodeEvent(config, event) {
|
|
41
|
+
if (config.nodeIds && config.nodeIds.length > 0 && !config.nodeIds.includes(event.nodeId))
|
|
42
|
+
return null;
|
|
43
|
+
if (typeIn(config.eventTypes, event.type) &&
|
|
44
|
+
(SEVERITY_RANK[event.severity] ?? 0) >= (SEVERITY_RANK[config.minSeverity ?? 'info'] ?? 0) &&
|
|
45
|
+
attrsMatch(config.attrs, event.attrs)) {
|
|
46
|
+
return 'trigger';
|
|
47
|
+
}
|
|
48
|
+
if (config.recovery && typeIn(config.recovery.eventTypes, event.type) && attrsMatch(config.recovery.attrs, event.attrs)) {
|
|
49
|
+
return 'recovery';
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* `node_event`: a worker node reported a matching event. Reads the
|
|
55
|
+
* `worker_node_events` table (not the telemetry store), so it works with
|
|
56
|
+
* telemetry off. Per node the NEWEST classified event inside
|
|
57
|
+
* `resolveAfterSeconds` decides: a trigger breaches, a recovery clears, and a
|
|
58
|
+
* node with no such event inside the window is absent (clear).
|
|
59
|
+
*
|
|
60
|
+
* @stability experimental
|
|
61
|
+
*/
|
|
62
|
+
exports.nodeEventKind = {
|
|
63
|
+
id: alerts_1.ALERT_KIND_IDS.NODE_EVENT,
|
|
64
|
+
label: 'Node event',
|
|
65
|
+
description: 'A worker node reported a matching event (for example it switched to battery). Clears on a recovery event or after a set time.',
|
|
66
|
+
configSchema: alerts_1.nodeEventConfigSchema,
|
|
67
|
+
eventDriven: true,
|
|
68
|
+
async evaluate(ctx, rule) {
|
|
69
|
+
const { config } = rule;
|
|
70
|
+
const since = new Date(ctx.now.getTime() - config.resolveAfterSeconds * 1000);
|
|
71
|
+
const patterns = [...config.eventTypes, ...(config.recovery?.eventTypes ?? [])];
|
|
72
|
+
const exact = patterns.filter((p) => !p.endsWith('.*'));
|
|
73
|
+
const prefixes = patterns.filter((p) => p.endsWith('.*')).map((p) => p.slice(0, -1));
|
|
74
|
+
const events = await ctx.db.workerNodeEvent.findMany({
|
|
75
|
+
where: {
|
|
76
|
+
receivedAt: { gte: since },
|
|
77
|
+
OR: [...(exact.length > 0 ? [{ type: { in: exact } }] : []), ...prefixes.map((prefix) => ({ type: { startsWith: prefix } }))],
|
|
78
|
+
},
|
|
79
|
+
orderBy: { receivedAt: 'asc' },
|
|
80
|
+
take: MAX_EVENTS,
|
|
81
|
+
});
|
|
82
|
+
const latest = new Map();
|
|
83
|
+
for (const event of events) {
|
|
84
|
+
const kind = classifyNodeEvent(config, event);
|
|
85
|
+
if (kind)
|
|
86
|
+
latest.set(event.nodeId, { kind, type: event.type });
|
|
87
|
+
}
|
|
88
|
+
if (latest.size === 0)
|
|
89
|
+
return [];
|
|
90
|
+
const nodes = await ctx.db.workerNode.findMany({ where: { id: { in: [...latest.keys()] } }, select: { id: true, name: true } });
|
|
91
|
+
const names = new Map(nodes.map((node) => [node.id, node.name]));
|
|
92
|
+
return [...latest.entries()].map(([nodeId, state]) => {
|
|
93
|
+
const name = names.get(nodeId) ?? nodeId;
|
|
94
|
+
return {
|
|
95
|
+
labels: { 'node.id': nodeId, 'node.name': name },
|
|
96
|
+
value: null,
|
|
97
|
+
breached: state.kind === 'trigger',
|
|
98
|
+
summary: state.kind === 'trigger'
|
|
99
|
+
? `${rule.name}: node ${name} reported ${state.type}`
|
|
100
|
+
: `${rule.name}: node ${name} recovered (${state.type})`,
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
matchesEvent(config, event) {
|
|
105
|
+
return classifyNodeEvent(config, event) !== null;
|
|
106
|
+
},
|
|
107
|
+
describe: (rule) => {
|
|
108
|
+
const { config } = rule;
|
|
109
|
+
const recovery = config.recovery ? `; clears on ${config.recovery.eventTypes.join(', ')}` : '';
|
|
110
|
+
return `A node reports ${config.eventTypes.join(', ')}${recovery}; otherwise clears after ${config.resolveAfterSeconds}s`;
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=node-event.kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-event.kind.js","sourceRoot":"","sources":["../../../src/alerts/kinds/node-event.kind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AlertRuleKind } from '../alerts.types';
|
|
2
|
+
/**
|
|
3
|
+
* `node_offline`: a worker node is stale or offline, by the same rule the
|
|
4
|
+
* fleet page uses (`deriveNodeHealth`). A node an operator DISABLED is left
|
|
5
|
+
* out (disabling is intent, not failure). A node that deregistered gracefully
|
|
6
|
+
* is `offline` too and alerts until the fleet's offline retention prunes it.
|
|
7
|
+
*
|
|
8
|
+
* @stability experimental
|
|
9
|
+
*/
|
|
10
|
+
export declare const nodeOfflineKind: AlertRuleKind<Record<string, never>>;
|
|
11
|
+
//# sourceMappingURL=node-offline.kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-offline.kind.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/node-offline.kind.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CA8BhE,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nodeOfflineKind = void 0;
|
|
4
|
+
const alerts_1 = require("@marinoscar/platform-contract/alerts");
|
|
5
|
+
const index_1 = require("../../nodes/index");
|
|
6
|
+
/**
|
|
7
|
+
* `node_offline`: a worker node is stale or offline, by the same rule the
|
|
8
|
+
* fleet page uses (`deriveNodeHealth`). A node an operator DISABLED is left
|
|
9
|
+
* out (disabling is intent, not failure). A node that deregistered gracefully
|
|
10
|
+
* is `offline` too and alerts until the fleet's offline retention prunes it.
|
|
11
|
+
*
|
|
12
|
+
* @stability experimental
|
|
13
|
+
*/
|
|
14
|
+
exports.nodeOfflineKind = {
|
|
15
|
+
id: alerts_1.ALERT_KIND_IDS.NODE_OFFLINE,
|
|
16
|
+
label: 'Node offline',
|
|
17
|
+
description: 'A worker node stopped heartbeating (stale) or was marked offline.',
|
|
18
|
+
configSchema: alerts_1.emptyAlertConfigSchema,
|
|
19
|
+
async evaluate(ctx, rule) {
|
|
20
|
+
const staleSeconds = await ctx.staleHeartbeatSeconds();
|
|
21
|
+
const nodes = await ctx.db.workerNode.findMany({
|
|
22
|
+
where: { status: { not: 'disabled' } },
|
|
23
|
+
select: { id: true, name: true, status: true, lastHeartbeatAt: true },
|
|
24
|
+
take: 1_000,
|
|
25
|
+
});
|
|
26
|
+
return nodes.map((node) => {
|
|
27
|
+
const health = (0, index_1.deriveNodeHealth)({ status: node.status, lastHeartbeatAt: node.lastHeartbeatAt }, staleSeconds, ctx.now);
|
|
28
|
+
const breached = health !== 'healthy';
|
|
29
|
+
return {
|
|
30
|
+
labels: { 'node.id': node.id, 'node.name': node.name },
|
|
31
|
+
value: breached ? 1 : 0,
|
|
32
|
+
breached,
|
|
33
|
+
summary: breached
|
|
34
|
+
? `${rule.name}: node ${node.name} is ${health}${node.lastHeartbeatAt ? ` (last heartbeat ${node.lastHeartbeatAt.toISOString()})` : ' (never sent a heartbeat)'}`
|
|
35
|
+
: `${rule.name}: node ${node.name} is healthy`,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
describe: () => 'A worker node is stale or offline',
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=node-offline.kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-offline.kind.js","sourceRoot":"","sources":["../../../src/alerts/kinds/node-offline.kind.ts"],"names":[],"mappings":";;;AAAA,iEAAqH;AAGrH,6CAAqD;AAErD;;;;;;;GAOG;AACU,QAAA,eAAe,GAAyC;IACnE,EAAE,EAAE,uBAAc,CAAC,YAAY;IAC/B,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,mEAAmE;IAChF,YAAY,EAAE,+BAAyF;IACvG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI;QACtB,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;YACtC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;YACrE,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAoB,EAAE;YAC1C,MAAM,MAAM,GAAG,IAAA,wBAAgB,EAC7B,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,EAC9D,YAAY,EACZ,GAAG,CAAC,GAAG,CACR,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC;YACtC,OAAO;gBACL,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;gBACtD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvB,QAAQ;gBACR,OAAO,EAAE,QAAQ;oBACf,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,OAAO,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,2BAA2B,EAAE;oBACjK,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,aAAa;aACjD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,QAAQ,EAAE,GAAG,EAAE,CAAC,mCAAmC;CACpD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AlertRuleKind } from '../alerts.types';
|
|
2
|
+
/**
|
|
3
|
+
* `telemetry_unavailable`: the telemetry store cannot be queried. It probes
|
|
4
|
+
* with `SELECT 1`; a failure is the BREACH here rather than an evaluation
|
|
5
|
+
* error. Pair it with `forSeconds` (the starter rule waits three minutes) so a
|
|
6
|
+
* blip does not flap.
|
|
7
|
+
*
|
|
8
|
+
* @stability experimental
|
|
9
|
+
*/
|
|
10
|
+
export declare const telemetryUnavailableKind: AlertRuleKind<Record<string, never>>;
|
|
11
|
+
//# sourceMappingURL=telemetry-unavailable.kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-unavailable.kind.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/telemetry-unavailable.kind.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAuBzE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.telemetryUnavailableKind = void 0;
|
|
4
|
+
const alerts_1 = require("@marinoscar/platform-contract/alerts");
|
|
5
|
+
const alerts_errors_1 = require("../alerts.errors");
|
|
6
|
+
/**
|
|
7
|
+
* `telemetry_unavailable`: the telemetry store cannot be queried. It probes
|
|
8
|
+
* with `SELECT 1`; a failure is the BREACH here rather than an evaluation
|
|
9
|
+
* error. Pair it with `forSeconds` (the starter rule waits three minutes) so a
|
|
10
|
+
* blip does not flap.
|
|
11
|
+
*
|
|
12
|
+
* @stability experimental
|
|
13
|
+
*/
|
|
14
|
+
exports.telemetryUnavailableKind = {
|
|
15
|
+
id: alerts_1.ALERT_KIND_IDS.TELEMETRY_UNAVAILABLE,
|
|
16
|
+
label: 'Telemetry store unavailable',
|
|
17
|
+
description: 'The telemetry store cannot be queried (not configured, disabled, unreachable or timing out).',
|
|
18
|
+
configSchema: alerts_1.emptyAlertConfigSchema,
|
|
19
|
+
async evaluate(ctx, rule) {
|
|
20
|
+
try {
|
|
21
|
+
const telemetry = await ctx.telemetry();
|
|
22
|
+
await telemetry.query.query('SELECT 1', { maxRows: 1 });
|
|
23
|
+
return [{ labels: {}, value: 0, breached: false, summary: `${rule.name}: the telemetry store answers` }];
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (!(error instanceof alerts_errors_1.AlertStoreUnavailableError) && !(error instanceof Error))
|
|
27
|
+
throw error;
|
|
28
|
+
return [
|
|
29
|
+
{
|
|
30
|
+
labels: {},
|
|
31
|
+
value: 1,
|
|
32
|
+
breached: true,
|
|
33
|
+
summary: `${rule.name}: the telemetry store cannot be queried (${error.message})`.slice(0, 500),
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
describe: () => 'The telemetry store cannot be queried',
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=telemetry-unavailable.kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-unavailable.kind.js","sourceRoot":"","sources":["../../../src/alerts/kinds/telemetry-unavailable.kind.ts"],"names":[],"mappings":";;;AAAA,iEAAqH;AAErH,oDAA8D;AAG9D;;;;;;;GAOG;AACU,QAAA,wBAAwB,GAAyC;IAC5E,EAAE,EAAE,uBAAc,CAAC,qBAAqB;IACxC,KAAK,EAAE,6BAA6B;IACpC,WAAW,EAAE,8FAA8F;IAC3G,YAAY,EAAE,+BAAyF;IACvG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI;QACtB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,+BAA+B,EAAE,CAAC,CAAC;QAC3G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,0CAA0B,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YAC7F,OAAO;gBACL;oBACE,MAAM,EAAE,EAAE;oBACV,KAAK,EAAE,CAAC;oBACR,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,4CAA4C,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;iBAChG;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,QAAQ,EAAE,GAAG,EAAE,CAAC,uCAAuC;CACxD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { emptyAlertConfigSchema, type VerdictConfig } from '@marinoscar/platform-contract/alerts';
|
|
2
|
+
import type { AlertRuleKind } from '../alerts.types';
|
|
3
|
+
/**
|
|
4
|
+
* `verdict`: the telemetry dashboard verdict is at or past a level. Computed
|
|
5
|
+
* in-process by the dashboard's own service, so it can never disagree with the
|
|
6
|
+
* banner an administrator sees. `no_data` and `healthy` never breach.
|
|
7
|
+
*
|
|
8
|
+
* @stability experimental
|
|
9
|
+
*/
|
|
10
|
+
export declare const verdictKind: AlertRuleKind<VerdictConfig>;
|
|
11
|
+
/** The config schema `node_offline` and `telemetry_unavailable` share (an empty object). */
|
|
12
|
+
export { emptyAlertConfigSchema };
|
|
13
|
+
//# sourceMappingURL=verdict.kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.kind.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/verdict.kind.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAGtB,KAAK,aAAa,EACnB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,aAAa,CAmBpD,CAAC;AAEF,4FAA4F;AAC5F,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|