@wizeworks/lens-cloud 0.3.0-alpha.2 → 0.3.0-alpha.4
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/README.md +4 -0
- package/dist/alerts/evaluate.d.ts +6 -5
- package/dist/alerts/evaluate.d.ts.map +1 -1
- package/dist/alerts/evaluate.js +60 -28
- package/dist/alerts/evaluate.js.map +1 -1
- package/dist/alerts/problem-link.d.ts +12 -0
- package/dist/alerts/problem-link.d.ts.map +1 -0
- package/dist/alerts/problem-link.js +31 -0
- package/dist/alerts/problem-link.js.map +1 -0
- package/dist/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/auth/auth.d.ts +8 -2
- package/dist/auth/auth.d.ts.map +1 -1
- package/dist/auth/auth.js +25 -2
- package/dist/auth/auth.js.map +1 -1
- package/dist/auth/billing-hooks.d.ts +9 -0
- package/dist/auth/billing-hooks.d.ts.map +1 -0
- package/dist/auth/billing-hooks.js +49 -0
- package/dist/auth/billing-hooks.js.map +1 -0
- package/dist/auth/bridge.js +2 -2
- package/dist/auth/bridge.js.map +1 -1
- package/dist/auth/crypto.d.ts +2 -0
- package/dist/auth/crypto.d.ts.map +1 -1
- package/dist/auth/crypto.js +2 -2
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/deps.d.ts +7 -0
- package/dist/auth/deps.d.ts.map +1 -1
- package/dist/auth/deps.js.map +1 -1
- package/dist/auth/hooks.d.ts.map +1 -1
- package/dist/auth/hooks.js +8 -1
- package/dist/auth/hooks.js.map +1 -1
- package/dist/auth/join-scope.d.ts +7 -0
- package/dist/auth/join-scope.d.ts.map +1 -0
- package/dist/auth/join-scope.js +21 -0
- package/dist/auth/join-scope.js.map +1 -0
- package/dist/auth/oauth-access.d.ts +8 -0
- package/dist/auth/oauth-access.d.ts.map +1 -0
- package/dist/auth/oauth-access.js +31 -0
- package/dist/auth/oauth-access.js.map +1 -0
- package/dist/auth/oauth-grant.d.ts +5 -0
- package/dist/auth/oauth-grant.d.ts.map +1 -0
- package/dist/auth/oauth-grant.js +79 -0
- package/dist/auth/oauth-grant.js.map +1 -0
- package/dist/auth/oauth-names.d.ts +104 -0
- package/dist/auth/oauth-names.d.ts.map +1 -0
- package/dist/auth/oauth-names.js +72 -0
- package/dist/auth/oauth-names.js.map +1 -0
- package/dist/auth/oauth.d.ts +17 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +47 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/options.d.ts.map +1 -1
- package/dist/auth/options.js +2 -0
- package/dist/auth/options.js.map +1 -1
- package/dist/auth/plugins.d.ts.map +1 -1
- package/dist/auth/plugins.js +15 -1
- package/dist/auth/plugins.js.map +1 -1
- package/dist/auth/principal.d.ts +10 -1
- package/dist/auth/principal.d.ts.map +1 -1
- package/dist/auth/principal.js +8 -7
- package/dist/auth/principal.js.map +1 -1
- package/dist/auth/roles.d.ts +5 -2
- package/dist/auth/roles.d.ts.map +1 -1
- package/dist/auth/roles.js +1 -0
- package/dist/auth/roles.js.map +1 -1
- package/dist/auth/schema-names.d.ts +33 -0
- package/dist/auth/schema-names.d.ts.map +1 -1
- package/dist/auth/schema-names.js +23 -0
- package/dist/auth/schema-names.js.map +1 -1
- package/dist/auth/scim.d.ts +6 -0
- package/dist/auth/scim.d.ts.map +1 -0
- package/dist/auth/scim.js +56 -0
- package/dist/auth/scim.js.map +1 -0
- package/dist/auth/signup.d.ts.map +1 -1
- package/dist/auth/signup.js +5 -2
- package/dist/auth/signup.js.map +1 -1
- package/dist/auth/wire.d.ts +2 -1
- package/dist/auth/wire.d.ts.map +1 -1
- package/dist/auth/wire.js +4 -1
- package/dist/auth/wire.js.map +1 -1
- package/dist/billing/cli.d.ts +6 -0
- package/dist/billing/cli.d.ts.map +1 -0
- package/dist/billing/cli.js +54 -0
- package/dist/billing/cli.js.map +1 -0
- package/dist/billing/gate.d.ts +13 -0
- package/dist/billing/gate.d.ts.map +1 -0
- package/dist/billing/gate.js +27 -0
- package/dist/billing/gate.js.map +1 -0
- package/dist/billing/limits.d.ts +29 -0
- package/dist/billing/limits.d.ts.map +1 -0
- package/dist/billing/limits.js +69 -0
- package/dist/billing/limits.js.map +1 -0
- package/dist/billing/notices.d.ts +4 -0
- package/dist/billing/notices.d.ts.map +1 -0
- package/dist/billing/notices.js +40 -0
- package/dist/billing/notices.js.map +1 -0
- package/dist/billing/options.d.ts +37 -0
- package/dist/billing/options.d.ts.map +1 -0
- package/dist/billing/options.js +33 -0
- package/dist/billing/options.js.map +1 -0
- package/dist/billing/plans.d.ts +50 -0
- package/dist/billing/plans.d.ts.map +1 -0
- package/dist/billing/plans.js +47 -0
- package/dist/billing/plans.js.map +1 -0
- package/dist/billing/report.d.ts +26 -0
- package/dist/billing/report.d.ts.map +1 -0
- package/dist/billing/report.js +53 -0
- package/dist/billing/report.js.map +1 -0
- package/dist/billing/service.d.ts +20 -0
- package/dist/billing/service.d.ts.map +1 -0
- package/dist/billing/service.js +29 -0
- package/dist/billing/service.js.map +1 -0
- package/dist/billing/stripe-plugin.d.ts +14 -0
- package/dist/billing/stripe-plugin.d.ts.map +1 -0
- package/dist/billing/stripe-plugin.js +39 -0
- package/dist/billing/stripe-plugin.js.map +1 -0
- package/dist/billing/stripe-setup.d.ts +15 -0
- package/dist/billing/stripe-setup.d.ts.map +1 -0
- package/dist/billing/stripe-setup.js +73 -0
- package/dist/billing/stripe-setup.js.map +1 -0
- package/dist/billing/summary.d.ts +59 -0
- package/dist/billing/summary.d.ts.map +1 -0
- package/dist/billing/summary.js +50 -0
- package/dist/billing/summary.js.map +1 -0
- package/dist/billing/sync.d.ts +5 -0
- package/dist/billing/sync.d.ts.map +1 -0
- package/dist/billing/sync.js +35 -0
- package/dist/billing/sync.js.map +1 -0
- package/dist/billing/usage-sub.d.ts +17 -0
- package/dist/billing/usage-sub.d.ts.map +1 -0
- package/dist/billing/usage-sub.js +47 -0
- package/dist/billing/usage-sub.js.map +1 -0
- package/dist/billing/usage.d.ts +28 -0
- package/dist/billing/usage.d.ts.map +1 -0
- package/dist/billing/usage.js +80 -0
- package/dist/billing/usage.js.map +1 -0
- package/dist/billing/webhook.d.ts +6 -0
- package/dist/billing/webhook.d.ts.map +1 -0
- package/dist/billing/webhook.js +41 -0
- package/dist/billing/webhook.js.map +1 -0
- package/dist/changes.d.ts +15 -0
- package/dist/changes.d.ts.map +1 -0
- package/dist/changes.js +45 -0
- package/dist/changes.js.map +1 -0
- package/dist/cli-args.d.ts +1 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +44 -2
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +19 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -1
- package/dist/config.js.map +1 -1
- package/dist/copy-cli.d.ts +3 -0
- package/dist/copy-cli.d.ts.map +1 -0
- package/dist/copy-cli.js +24 -0
- package/dist/copy-cli.js.map +1 -0
- package/dist/db/db.d.ts +2 -0
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +15 -4
- package/dist/db/db.js.map +1 -1
- package/dist/db/schema-alerts.d.ts +2 -0
- package/dist/db/schema-alerts.d.ts.map +1 -0
- package/dist/db/schema-alerts.js +15 -0
- package/dist/db/schema-alerts.js.map +1 -0
- package/dist/db/schema-billing.d.ts +2 -0
- package/dist/db/schema-billing.d.ts.map +1 -0
- package/dist/db/schema-billing.js +38 -0
- package/dist/db/schema-billing.js.map +1 -0
- package/dist/db/schema-issues.d.ts +2 -0
- package/dist/db/schema-issues.d.ts.map +1 -0
- package/dist/db/schema-issues.js +9 -0
- package/dist/db/schema-issues.js.map +1 -0
- package/dist/db/schema-logs.d.ts +2 -0
- package/dist/db/schema-logs.d.ts.map +1 -0
- package/dist/db/schema-logs.js +13 -0
- package/dist/db/schema-logs.js.map +1 -0
- package/dist/db/schema-oauth.d.ts +2 -0
- package/dist/db/schema-oauth.d.ts.map +1 -0
- package/dist/db/schema-oauth.js +69 -0
- package/dist/db/schema-oauth.js.map +1 -0
- package/dist/db/schema-saved-move.d.ts +2 -0
- package/dist/db/schema-saved-move.d.ts.map +1 -0
- package/dist/db/schema-saved-move.js +13 -0
- package/dist/db/schema-saved-move.js.map +1 -0
- package/dist/db/schema-saved.d.ts +2 -0
- package/dist/db/schema-saved.d.ts.map +1 -0
- package/dist/db/schema-saved.js +13 -0
- package/dist/db/schema-saved.js.map +1 -0
- package/dist/db/schema-scim.d.ts +2 -0
- package/dist/db/schema-scim.d.ts.map +1 -0
- package/dist/db/schema-scim.js +28 -0
- package/dist/db/schema-scim.js.map +1 -0
- package/dist/db/schema-search.d.ts +2 -0
- package/dist/db/schema-search.d.ts.map +1 -0
- package/dist/db/schema-search.js +16 -0
- package/dist/db/schema-search.js.map +1 -0
- package/dist/db/schema-slos.d.ts +2 -0
- package/dist/db/schema-slos.d.ts.map +1 -0
- package/dist/db/schema-slos.js +12 -0
- package/dist/db/schema-slos.js.map +1 -0
- package/dist/db/schema-sourcemaps.d.ts +2 -0
- package/dist/db/schema-sourcemaps.d.ts.map +1 -0
- package/dist/db/schema-sourcemaps.js +9 -0
- package/dist/db/schema-sourcemaps.js.map +1 -0
- package/dist/db/schema-tags.d.ts +2 -0
- package/dist/db/schema-tags.d.ts.map +1 -0
- package/dist/db/schema-tags.js +12 -0
- package/dist/db/schema-tags.js.map +1 -0
- package/dist/db/schema-team.d.ts +2 -0
- package/dist/db/schema-team.d.ts.map +1 -0
- package/dist/db/schema-team.js +15 -0
- package/dist/db/schema-team.js.map +1 -0
- package/dist/db/schema-uptime.d.ts +2 -0
- package/dist/db/schema-uptime.d.ts.map +1 -0
- package/dist/db/schema-uptime.js +22 -0
- package/dist/db/schema-uptime.js.map +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +32 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/db/trigram.d.ts +4 -0
- package/dist/db/trigram.d.ts.map +1 -0
- package/dist/db/trigram.js +34 -0
- package/dist/db/trigram.js.map +1 -0
- package/dist/http/http.d.ts +5 -1
- package/dist/http/http.d.ts.map +1 -1
- package/dist/http/http.js +5 -1
- package/dist/http/http.js.map +1 -1
- package/dist/jobs.d.ts +1 -1
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +23 -9
- package/dist/jobs.js.map +1 -1
- package/dist/mail/blocks.d.ts +1 -1
- package/dist/mail/blocks.js +2 -2
- package/dist/mail/blocks.js.map +1 -1
- package/dist/mail/emails-billing.d.ts +17 -0
- package/dist/mail/emails-billing.d.ts.map +1 -0
- package/dist/mail/emails-billing.js +36 -0
- package/dist/mail/emails-billing.js.map +1 -0
- package/dist/mail/emails.d.ts +1 -1
- package/dist/mail/emails.d.ts.map +1 -1
- package/dist/mail/emails.js +7 -4
- package/dist/mail/emails.js.map +1 -1
- package/dist/mail/layout.d.ts +1 -1
- package/dist/mail/layout.d.ts.map +1 -1
- package/dist/mail/layout.js +2 -2
- package/dist/mail/layout.js.map +1 -1
- package/dist/mail/mailer.d.ts +1 -1
- package/dist/mail/mailer.d.ts.map +1 -1
- package/dist/mail/mailer.js +4 -3
- package/dist/mail/mailer.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -0
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +1 -1
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/samples.d.ts.map +1 -1
- package/dist/mail/samples.js +17 -0
- package/dist/mail/samples.js.map +1 -1
- package/dist/mail/templates.d.ts +1 -1
- package/dist/mail/templates.d.ts.map +1 -1
- package/dist/mail/theme.d.ts +7 -1
- package/dist/mail/theme.d.ts.map +1 -1
- package/dist/mail/theme.js +7 -1
- package/dist/mail/theme.js.map +1 -1
- package/dist/notify/digest-data.d.ts +2 -1
- package/dist/notify/digest-data.d.ts.map +1 -1
- package/dist/notify/digest-data.js +5 -11
- package/dist/notify/digest-data.js.map +1 -1
- package/dist/notify/digest.d.ts.map +1 -1
- package/dist/notify/digest.js +5 -2
- package/dist/notify/digest.js.map +1 -1
- package/dist/notify/health.d.ts.map +1 -1
- package/dist/notify/health.js +4 -5
- package/dist/notify/health.js.map +1 -1
- package/dist/notify/team-describe.d.ts.map +1 -1
- package/dist/notify/team-describe.js +14 -0
- package/dist/notify/team-describe.js.map +1 -1
- package/dist/repo/alert-events.d.ts +38 -0
- package/dist/repo/alert-events.d.ts.map +1 -0
- package/dist/repo/alert-events.js +29 -0
- package/dist/repo/alert-events.js.map +1 -0
- package/dist/repo/alerts.d.ts +14 -44
- package/dist/repo/alerts.d.ts.map +1 -1
- package/dist/repo/alerts.js +35 -13
- package/dist/repo/alerts.js.map +1 -1
- package/dist/repo/audit.d.ts +19 -1
- package/dist/repo/audit.d.ts.map +1 -1
- package/dist/repo/audit.js +24 -2
- package/dist/repo/audit.js.map +1 -1
- package/dist/repo/auth-prune.d.ts +1 -1
- package/dist/repo/auth-prune.d.ts.map +1 -1
- package/dist/repo/auth-prune.js +13 -1
- package/dist/repo/auth-prune.js.map +1 -1
- package/dist/repo/billing.d.ts +30 -0
- package/dist/repo/billing.d.ts.map +1 -0
- package/dist/repo/billing.js +47 -0
- package/dist/repo/billing.js.map +1 -0
- package/dist/repo/grants.d.ts +30 -0
- package/dist/repo/grants.d.ts.map +1 -0
- package/dist/repo/grants.js +57 -0
- package/dist/repo/grants.js.map +1 -0
- package/dist/repo/issues.d.ts +15 -0
- package/dist/repo/issues.d.ts.map +1 -0
- package/dist/repo/issues.js +31 -0
- package/dist/repo/issues.js.map +1 -0
- package/dist/repo/keys.d.ts +51 -0
- package/dist/repo/keys.d.ts.map +1 -0
- package/dist/repo/keys.js +58 -0
- package/dist/repo/keys.js.map +1 -0
- package/dist/repo/log-retention.d.ts +8 -0
- package/dist/repo/log-retention.d.ts.map +1 -0
- package/dist/repo/log-retention.js +20 -0
- package/dist/repo/log-retention.js.map +1 -0
- package/dist/repo/metric-read.d.ts +2 -0
- package/dist/repo/metric-read.d.ts.map +1 -1
- package/dist/repo/metric-read.js +5 -1
- package/dist/repo/metric-read.js.map +1 -1
- package/dist/repo/metric-write.d.ts.map +1 -1
- package/dist/repo/metric-write.js +3 -2
- package/dist/repo/metric-write.js.map +1 -1
- package/dist/repo/orgs.d.ts +2 -0
- package/dist/repo/orgs.d.ts.map +1 -1
- package/dist/repo/orgs.js +5 -1
- package/dist/repo/orgs.js.map +1 -1
- package/dist/repo/project-roles.d.ts +28 -0
- package/dist/repo/project-roles.d.ts.map +1 -0
- package/dist/repo/project-roles.js +39 -0
- package/dist/repo/project-roles.js.map +1 -0
- package/dist/repo/projects.d.ts +3 -22
- package/dist/repo/projects.d.ts.map +1 -1
- package/dist/repo/projects.js +4 -29
- package/dist/repo/projects.js.map +1 -1
- package/dist/repo/saved.d.ts +9 -0
- package/dist/repo/saved.d.ts.map +1 -0
- package/dist/repo/saved.js +29 -0
- package/dist/repo/saved.js.map +1 -0
- package/dist/repo/scim-tokens.d.ts +20 -0
- package/dist/repo/scim-tokens.d.ts.map +1 -0
- package/dist/repo/scim-tokens.js +32 -0
- package/dist/repo/scim-tokens.js.map +1 -0
- package/dist/repo/services.d.ts +6 -0
- package/dist/repo/services.d.ts.map +1 -0
- package/dist/repo/services.js +17 -0
- package/dist/repo/services.js.map +1 -0
- package/dist/repo/settings.d.ts +30 -0
- package/dist/repo/settings.d.ts.map +1 -0
- package/dist/repo/settings.js +55 -0
- package/dist/repo/settings.js.map +1 -0
- package/dist/repo/slos.d.ts +10 -0
- package/dist/repo/slos.d.ts.map +1 -0
- package/dist/repo/slos.js +27 -0
- package/dist/repo/slos.js.map +1 -0
- package/dist/repo/sourcemaps.d.ts +9 -0
- package/dist/repo/sourcemaps.d.ts.map +1 -0
- package/dist/repo/sourcemaps.js +34 -0
- package/dist/repo/sourcemaps.js.map +1 -0
- package/dist/repo/tags.d.ts +11 -0
- package/dist/repo/tags.d.ts.map +1 -0
- package/dist/repo/tags.js +33 -0
- package/dist/repo/tags.js.map +1 -0
- package/dist/repo/trace-join.d.ts +9 -0
- package/dist/repo/trace-join.d.ts.map +1 -0
- package/dist/repo/trace-join.js +35 -0
- package/dist/repo/trace-join.js.map +1 -0
- package/dist/repo/trace-read.d.ts +6 -13
- package/dist/repo/trace-read.d.ts.map +1 -1
- package/dist/repo/trace-read.js +11 -4
- package/dist/repo/trace-read.js.map +1 -1
- package/dist/repo/trace-write.d.ts +6 -2
- package/dist/repo/trace-write.d.ts.map +1 -1
- package/dist/repo/trace-write.js +22 -7
- package/dist/repo/trace-write.js.map +1 -1
- package/dist/repo/uptime.d.ts +21 -0
- package/dist/repo/uptime.d.ts.map +1 -0
- package/dist/repo/uptime.js +53 -0
- package/dist/repo/uptime.js.map +1 -0
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +65 -66
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/apps.d.ts +20 -0
- package/dist/routes/apps.d.ts.map +1 -0
- package/dist/routes/apps.js +53 -0
- package/dist/routes/apps.js.map +1 -0
- package/dist/routes/billing.d.ts +4 -0
- package/dist/routes/billing.d.ts.map +1 -0
- package/dist/routes/billing.js +51 -0
- package/dist/routes/billing.js.map +1 -0
- package/dist/routes/changes.d.ts +4 -0
- package/dist/routes/changes.d.ts.map +1 -0
- package/dist/routes/changes.js +19 -0
- package/dist/routes/changes.js.map +1 -0
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +38 -14
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +28 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/ingest.d.ts +3 -1
- package/dist/routes/ingest.d.ts.map +1 -1
- package/dist/routes/ingest.js +60 -14
- package/dist/routes/ingest.js.map +1 -1
- package/dist/routes/issues.d.ts +4 -0
- package/dist/routes/issues.d.ts.map +1 -0
- package/dist/routes/issues.js +34 -0
- package/dist/routes/issues.js.map +1 -0
- package/dist/routes/keys.d.ts +4 -0
- package/dist/routes/keys.d.ts.map +1 -0
- package/dist/routes/keys.js +70 -0
- package/dist/routes/keys.js.map +1 -0
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +85 -31
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/me.d.ts.map +1 -1
- package/dist/routes/me.js +15 -5
- package/dist/routes/me.js.map +1 -1
- package/dist/routes/metrics.d.ts +2 -2
- package/dist/routes/metrics.d.ts.map +1 -1
- package/dist/routes/metrics.js +3 -4
- package/dist/routes/metrics.js.map +1 -1
- package/dist/routes/models.d.ts +9 -1
- package/dist/routes/models.d.ts.map +1 -1
- package/dist/routes/models.js +62 -21
- package/dist/routes/models.js.map +1 -1
- package/dist/routes/notify.d.ts.map +1 -1
- package/dist/routes/notify.js +3 -1
- package/dist/routes/notify.js.map +1 -1
- package/dist/routes/oauth-meta.d.ts +7 -0
- package/dist/routes/oauth-meta.d.ts.map +1 -0
- package/dist/routes/oauth-meta.js +52 -0
- package/dist/routes/oauth-meta.js.map +1 -0
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +27 -7
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +32 -22
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/saved.d.ts +4 -0
- package/dist/routes/saved.d.ts.map +1 -0
- package/dist/routes/saved.js +56 -0
- package/dist/routes/saved.js.map +1 -0
- package/dist/routes/scim.d.ts +4 -0
- package/dist/routes/scim.d.ts.map +1 -0
- package/dist/routes/scim.js +37 -0
- package/dist/routes/scim.js.map +1 -0
- package/dist/routes/search.d.ts +4 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +36 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/settings.d.ts +4 -0
- package/dist/routes/settings.d.ts.map +1 -0
- package/dist/routes/settings.js +39 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/routes/shares.d.ts +3 -0
- package/dist/routes/shares.d.ts.map +1 -1
- package/dist/routes/shares.js +34 -18
- package/dist/routes/shares.js.map +1 -1
- package/dist/routes/slos.d.ts +4 -0
- package/dist/routes/slos.d.ts.map +1 -0
- package/dist/routes/slos.js +76 -0
- package/dist/routes/slos.js.map +1 -0
- package/dist/routes/sourcemaps.d.ts +9 -0
- package/dist/routes/sourcemaps.d.ts.map +1 -0
- package/dist/routes/sourcemaps.js +54 -0
- package/dist/routes/sourcemaps.js.map +1 -0
- package/dist/routes/status.d.ts +4 -0
- package/dist/routes/status.d.ts.map +1 -0
- package/dist/routes/status.js +60 -0
- package/dist/routes/status.js.map +1 -0
- package/dist/routes/tags.d.ts +4 -0
- package/dist/routes/tags.d.ts.map +1 -0
- package/dist/routes/tags.js +81 -0
- package/dist/routes/tags.js.map +1 -0
- package/dist/routes/uptime.d.ts +4 -0
- package/dist/routes/uptime.d.ts.map +1 -0
- package/dist/routes/uptime.js +71 -0
- package/dist/routes/uptime.js.map +1 -0
- package/dist/scale-exec.d.ts +3 -2
- package/dist/scale-exec.d.ts.map +1 -1
- package/dist/scale-exec.js +5 -4
- package/dist/scale-exec.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +45 -10
- package/dist/server.js.map +1 -1
- package/dist/settle.d.ts +13 -9
- package/dist/settle.d.ts.map +1 -1
- package/dist/settle.js +40 -20
- package/dist/settle.js.map +1 -1
- package/dist/telemetry/cached.d.ts +11 -0
- package/dist/telemetry/cached.d.ts.map +1 -0
- package/dist/telemetry/cached.js +30 -0
- package/dist/telemetry/cached.js.map +1 -0
- package/dist/telemetry/ch/admin.d.ts +14 -0
- package/dist/telemetry/ch/admin.d.ts.map +1 -0
- package/dist/telemetry/ch/admin.js +82 -0
- package/dist/telemetry/ch/admin.js.map +1 -0
- package/dist/telemetry/ch/http.d.ts +19 -0
- package/dist/telemetry/ch/http.d.ts.map +1 -0
- package/dist/telemetry/ch/http.js +91 -0
- package/dist/telemetry/ch/http.js.map +1 -0
- package/dist/telemetry/ch/metrics.d.ts +10 -0
- package/dist/telemetry/ch/metrics.d.ts.map +1 -0
- package/dist/telemetry/ch/metrics.js +61 -0
- package/dist/telemetry/ch/metrics.js.map +1 -0
- package/dist/telemetry/ch/queries.d.ts +19 -0
- package/dist/telemetry/ch/queries.d.ts.map +1 -0
- package/dist/telemetry/ch/queries.js +30 -0
- package/dist/telemetry/ch/queries.js.map +1 -0
- package/dist/telemetry/ch/queue.d.ts +36 -0
- package/dist/telemetry/ch/queue.d.ts.map +1 -0
- package/dist/telemetry/ch/queue.js +83 -0
- package/dist/telemetry/ch/queue.js.map +1 -0
- package/dist/telemetry/ch/read.d.ts +12 -0
- package/dist/telemetry/ch/read.d.ts.map +1 -0
- package/dist/telemetry/ch/read.js +74 -0
- package/dist/telemetry/ch/read.js.map +1 -0
- package/dist/telemetry/ch/rebuild.d.ts +23 -0
- package/dist/telemetry/ch/rebuild.d.ts.map +1 -0
- package/dist/telemetry/ch/rebuild.js +65 -0
- package/dist/telemetry/ch/rebuild.js.map +1 -0
- package/dist/telemetry/ch/schema-facts.d.ts +6 -0
- package/dist/telemetry/ch/schema-facts.d.ts.map +1 -0
- package/dist/telemetry/ch/schema-facts.js +55 -0
- package/dist/telemetry/ch/schema-facts.js.map +1 -0
- package/dist/telemetry/ch/schema-raw.d.ts +10 -0
- package/dist/telemetry/ch/schema-raw.d.ts.map +1 -0
- package/dist/telemetry/ch/schema-raw.js +37 -0
- package/dist/telemetry/ch/schema-raw.js.map +1 -0
- package/dist/telemetry/ch/schema-rollups.d.ts +2 -0
- package/dist/telemetry/ch/schema-rollups.d.ts.map +1 -0
- package/dist/telemetry/ch/schema-rollups.js +61 -0
- package/dist/telemetry/ch/schema-rollups.js.map +1 -0
- package/dist/telemetry/ch/schema.d.ts +12 -0
- package/dist/telemetry/ch/schema.d.ts.map +1 -0
- package/dist/telemetry/ch/schema.js +25 -0
- package/dist/telemetry/ch/schema.js.map +1 -0
- package/dist/telemetry/ch/settle-pool.d.ts +24 -0
- package/dist/telemetry/ch/settle-pool.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-pool.js +58 -0
- package/dist/telemetry/ch/settle-pool.js.map +1 -0
- package/dist/telemetry/ch/settle-rows.d.ts +16 -0
- package/dist/telemetry/ch/settle-rows.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-rows.js +74 -0
- package/dist/telemetry/ch/settle-rows.js.map +1 -0
- package/dist/telemetry/ch/settle-work.d.ts +21 -0
- package/dist/telemetry/ch/settle-work.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-work.js +52 -0
- package/dist/telemetry/ch/settle-work.js.map +1 -0
- package/dist/telemetry/ch/settle-worker.d.ts +2 -0
- package/dist/telemetry/ch/settle-worker.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-worker.js +10 -0
- package/dist/telemetry/ch/settle-worker.js.map +1 -0
- package/dist/telemetry/ch/settle.d.ts +21 -0
- package/dist/telemetry/ch/settle.d.ts.map +1 -0
- package/dist/telemetry/ch/settle.js +55 -0
- package/dist/telemetry/ch/settle.js.map +1 -0
- package/dist/telemetry/ch/store.d.ts +27 -0
- package/dist/telemetry/ch/store.d.ts.map +1 -0
- package/dist/telemetry/ch/store.js +94 -0
- package/dist/telemetry/ch/store.js.map +1 -0
- package/dist/telemetry/ch/util.d.ts +27 -0
- package/dist/telemetry/ch/util.d.ts.map +1 -0
- package/dist/telemetry/ch/util.js +49 -0
- package/dist/telemetry/ch/util.js.map +1 -0
- package/dist/telemetry/ch/write.d.ts +12 -0
- package/dist/telemetry/ch/write.d.ts.map +1 -0
- package/dist/telemetry/ch/write.js +59 -0
- package/dist/telemetry/ch/write.js.map +1 -0
- package/dist/telemetry/copy.d.ts +9 -0
- package/dist/telemetry/copy.d.ts.map +1 -0
- package/dist/telemetry/copy.js +60 -0
- package/dist/telemetry/copy.js.map +1 -0
- package/dist/telemetry/index.d.ts +14 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +26 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/pg-store.d.ts +5 -0
- package/dist/telemetry/pg-store.d.ts.map +1 -0
- package/dist/telemetry/pg-store.js +83 -0
- package/dist/telemetry/pg-store.js.map +1 -0
- package/dist/telemetry/store.d.ts +85 -0
- package/dist/telemetry/store.d.ts.map +1 -0
- package/dist/telemetry/store.js +2 -0
- package/dist/telemetry/store.js.map +1 -0
- package/dist/uptime/headers.d.ts +6 -0
- package/dist/uptime/headers.d.ts.map +1 -0
- package/dist/uptime/headers.js +25 -0
- package/dist/uptime/headers.js.map +1 -0
- package/dist/uptime/run.d.ts +9 -0
- package/dist/uptime/run.d.ts.map +1 -0
- package/dist/uptime/run.js +40 -0
- package/dist/uptime/run.js.map +1 -0
- package/package.json +10 -5
- package/dist/alerts/notify.d.ts +0 -28
- package/dist/alerts/notify.d.ts.map +0 -1
- package/dist/alerts/notify.js +0 -52
- package/dist/alerts/notify.js.map +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BUILT_IN_PREFIX, isBuiltInName, tagList } from "@wizeworks/lens-core";
|
|
2
|
+
import { newId } from "../auth/crypto.js";
|
|
3
|
+
/** Built-ins first (minus those the project turned off), then its rules by name. */
|
|
4
|
+
export async function projectTags(q, projectId) {
|
|
5
|
+
const rows = await q.query("SELECT id, name, color, query FROM tag_rules WHERE project_id = $1", [projectId]);
|
|
6
|
+
const off = await q.query("SELECT name FROM tag_builtins WHERE project_id = $1 AND NOT enabled", [projectId]);
|
|
7
|
+
const rules = rows.map((r) => ({ id: r.id, name: r.name, color: r.color, query: r.query, builtIn: false, enabled: true }));
|
|
8
|
+
return tagList(rules, new Set(off.map((r) => r.name)));
|
|
9
|
+
}
|
|
10
|
+
export async function createTag(q, projectId, input, actor, now) {
|
|
11
|
+
const id = newId();
|
|
12
|
+
const sql = "INSERT INTO tag_rules (project_id, id, name, color, query, created_by, created_ms, updated_ms) VALUES ($1, $2, $3, $4, $5, $6, $7, $7)";
|
|
13
|
+
await q.query(sql, [projectId, id, input.name, input.color, input.query, actor, now]);
|
|
14
|
+
return { id, ...input, builtIn: false, enabled: true };
|
|
15
|
+
}
|
|
16
|
+
export async function updateTag(q, projectId, id, input, now) {
|
|
17
|
+
const sql = "UPDATE tag_rules SET name = $3, color = $4, query = $5, updated_ms = $6 WHERE project_id = $1 AND id = $2";
|
|
18
|
+
await q.query(sql, [projectId, id, input.name, input.color, input.query, now]);
|
|
19
|
+
}
|
|
20
|
+
/** False when the project has no rule with this id. */
|
|
21
|
+
export async function deleteTag(q, projectId, id) {
|
|
22
|
+
return (await q.query("DELETE FROM tag_rules WHERE project_id = $1 AND id = $2 RETURNING id", [projectId, id])).length > 0;
|
|
23
|
+
}
|
|
24
|
+
/** Turn a built-in on or off for one project; false when `id` is not a built-in. */
|
|
25
|
+
export async function setBuiltIn(q, projectId, id, enabled) {
|
|
26
|
+
const name = id.startsWith(BUILT_IN_PREFIX) ? id.slice(BUILT_IN_PREFIX.length) : "";
|
|
27
|
+
if (!isBuiltInName(name))
|
|
28
|
+
return false;
|
|
29
|
+
const sql = "INSERT INTO tag_builtins (project_id, name, enabled) VALUES ($1, $2, $3) ON CONFLICT (project_id, name) DO UPDATE SET enabled = EXCLUDED.enabled";
|
|
30
|
+
await q.query(sql, [projectId, name, enabled]);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/repo/tags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Trace } from "@wizeworks/lens-core";
|
|
2
|
+
import type { Queryable } from "../db/db.js";
|
|
3
|
+
/** Every project of one organization. */
|
|
4
|
+
export declare function orgProjectIds(q: Queryable, orgId: string): Promise<string[]>;
|
|
5
|
+
/** The projects of `ids` that belong to `orgId`. Anything outside the organization is dropped. */
|
|
6
|
+
export declare function inOrg(q: Queryable, orgId: string, ids: readonly string[]): Promise<string[]>;
|
|
7
|
+
/** One trace with its parts from the projects in `scope` (already checked: same organization, readable by the caller). Undefined when the primary project has no part. */
|
|
8
|
+
export declare function getJoinedTrace(q: Queryable, primaryId: string, scope: readonly string[], traceId: string): Promise<Trace | undefined>;
|
|
9
|
+
//# sourceMappingURL=trace-join.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-join.d.ts","sourceRoot":"","sources":["../../src/repo/trace-join.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,yCAAyC;AACzC,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGlF;AAED,kGAAkG;AAClG,wBAAsB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIlG;AASD,0KAA0K;AAC1K,wBAAsB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAU3I"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { buildTrace } from "@wizeworks/lens-core";
|
|
2
|
+
import { getTrace } from "./trace-read.js";
|
|
3
|
+
/** Every project of one organization. */
|
|
4
|
+
export async function orgProjectIds(q, orgId) {
|
|
5
|
+
const rows = await q.query("SELECT id FROM projects WHERE org_id = $1", [orgId]);
|
|
6
|
+
return rows.map((r) => r.id);
|
|
7
|
+
}
|
|
8
|
+
/** The projects of `ids` that belong to `orgId`. Anything outside the organization is dropped. */
|
|
9
|
+
export async function inOrg(q, orgId, ids) {
|
|
10
|
+
if (ids.length === 0)
|
|
11
|
+
return [];
|
|
12
|
+
const rows = await q.query("SELECT id FROM projects WHERE org_id = $1 AND id = ANY($2)", [orgId, [...ids]]);
|
|
13
|
+
return rows.map((r) => r.id);
|
|
14
|
+
}
|
|
15
|
+
async function partsOf(q, projectIds, traceId) {
|
|
16
|
+
const ids = [...projectIds];
|
|
17
|
+
const spans = await q.query("SELECT json FROM spans WHERE project_id = ANY($1) AND trace_id = $2", [ids, traceId]);
|
|
18
|
+
const logs = await q.query("SELECT json FROM logs WHERE project_id = ANY($1) AND trace_id = $2", [ids, traceId]);
|
|
19
|
+
return { spans: spans.map((r) => JSON.parse(r.json)), logs: logs.map((r) => JSON.parse(r.json)) };
|
|
20
|
+
}
|
|
21
|
+
/** One trace with its parts from the projects in `scope` (already checked: same organization, readable by the caller). Undefined when the primary project has no part. */
|
|
22
|
+
export async function getJoinedTrace(q, primaryId, scope, traceId) {
|
|
23
|
+
const own = await getTrace(q, primaryId, traceId);
|
|
24
|
+
const others = scope.filter((id) => id !== primaryId);
|
|
25
|
+
if (!own || others.length === 0)
|
|
26
|
+
return own;
|
|
27
|
+
const extra = await partsOf(q, others, traceId);
|
|
28
|
+
if (extra.spans.length + extra.logs.length === 0)
|
|
29
|
+
return own;
|
|
30
|
+
const seen = new Set(own.spans.map((s) => s.spanId));
|
|
31
|
+
const spans = [...own.spans, ...extra.spans.filter((s) => !seen.has(s.spanId) && seen.add(s.spanId))];
|
|
32
|
+
const logs = [...own.logs, ...extra.logs].sort((a, b) => a.timeMs - b.timeMs);
|
|
33
|
+
return buildTrace(traceId, spans, logs, []);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=trace-join.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-join.js","sourceRoot":"","sources":["../../src/repo/trace-join.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
import { type HubService, type Trace } from "@wizeworks/lens-core";
|
|
2
2
|
import type { Queryable } from "../db/db.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/** Changed at or after (server clock). */
|
|
6
|
-
since?: number;
|
|
7
|
-
/** Started before. For paging back. */
|
|
8
|
-
before?: number;
|
|
9
|
-
/** Started at or after. For time windows. */
|
|
10
|
-
from?: number;
|
|
11
|
-
env?: string;
|
|
12
|
-
session?: string;
|
|
13
|
-
limit: number;
|
|
14
|
-
}
|
|
3
|
+
import type { TraceQuery } from "../telemetry/store.js";
|
|
4
|
+
export type { TraceQuery };
|
|
15
5
|
export declare function findTraceIds(q: Queryable, t: TraceQuery): Promise<string[]>;
|
|
16
6
|
/** Full traces, in the order of `ids`. */
|
|
17
7
|
export declare function loadTraces(q: Queryable, projectId: string, ids: readonly string[]): Promise<Trace[]>;
|
|
@@ -20,7 +10,10 @@ export declare function getTrace(q: Queryable, projectId: string, traceId: strin
|
|
|
20
10
|
/** How many traces started in [from, to). */
|
|
21
11
|
export declare function countTraces(q: Queryable, projectId: string, from: number, to: number, env?: string): Promise<number>;
|
|
22
12
|
export declare function listServices(q: Queryable, projectId: string, now: number): Promise<HubService[]>;
|
|
23
|
-
|
|
13
|
+
/** Environments of the project's services, plus those seen on traces (from the telemetry store). */
|
|
14
|
+
export declare function environmentsOf(q: Queryable, projectId: string, traceEnvs: readonly string[]): Promise<string[]>;
|
|
15
|
+
/** Environments seen on a project's traces (Postgres store). */
|
|
16
|
+
export declare function traceEnvsPg(q: Queryable, projectId: string): Promise<string[]>;
|
|
24
17
|
export declare function countRows(q: Queryable, projectId: string): Promise<{
|
|
25
18
|
traces: number;
|
|
26
19
|
spans: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-read.d.ts","sourceRoot":"","sources":["../../src/repo/trace-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"trace-read.d.ts","sourceRoot":"","sources":["../../src/repo/trace-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,UAAU,EAAiD,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7J,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,YAAY,EAAE,UAAU,EAAE,CAAC;AAI3B,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBjF;AAmBD,0CAA0C;AAC1C,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAS1G;AAED,eAAO,MAAM,WAAW,MAAa,SAAS,KAAK,UAAU,KAAG,OAAO,CAAC,KAAK,EAAE,CAAyD,CAAC;AAEzI,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAG3G;AAED,6CAA6C;AAC7C,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1H;AASD,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGtG;AAED,oGAAoG;AACpG,wBAAsB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGrH;AAED,gEAAgE;AAChE,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEpF;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3G"}
|
package/dist/repo/trace-read.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildTrace, HUB_ONLINE_MS } from "@wizeworks/lens-core";
|
|
1
|
+
import { buildTrace, HUB_ONLINE_MS, LOOSE_TRACE_PREFIX } from "@wizeworks/lens-core";
|
|
2
2
|
const CHUNK = 500;
|
|
3
3
|
export async function findTraceIds(q, t) {
|
|
4
4
|
const where = ["project_id = $1"];
|
|
@@ -17,6 +17,8 @@ export async function findTraceIds(q, t) {
|
|
|
17
17
|
add("env = ?", t.env);
|
|
18
18
|
if (t.session)
|
|
19
19
|
add("trace_id IN (SELECT trace_id FROM spans WHERE project_id = $1 AND session = ?)", t.session);
|
|
20
|
+
if (t.noLoose)
|
|
21
|
+
add("substr(trace_id, 1, 16) <> ?", LOOSE_TRACE_PREFIX);
|
|
20
22
|
args.push(t.limit);
|
|
21
23
|
const rows = await q.query(`SELECT trace_id FROM traces WHERE ${where.join(" AND ")} ORDER BY start_ms DESC LIMIT $${args.length}`, args);
|
|
22
24
|
return rows.map((r) => r.trace_id);
|
|
@@ -65,9 +67,14 @@ export async function listServices(q, projectId, now) {
|
|
|
65
67
|
const rows = await q.query("SELECT via, info, first_seen, last_seen FROM services WHERE project_id = $1 ORDER BY last_seen DESC", [projectId]);
|
|
66
68
|
return rows.map((r) => ({ ...JSON.parse(r.info), via: r.via, firstSeenMs: r.first_seen, lastSeenMs: r.last_seen, online: now - r.last_seen <= HUB_ONLINE_MS }));
|
|
67
69
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
/** Environments of the project's services, plus those seen on traces (from the telemetry store). */
|
|
71
|
+
export async function environmentsOf(q, projectId, traceEnvs) {
|
|
72
|
+
const rows = await q.query("SELECT DISTINCT environment AS e FROM services WHERE project_id = $1", [projectId]);
|
|
73
|
+
return [...new Set([...rows.map((r) => r.e), ...traceEnvs])].filter(Boolean).sort();
|
|
74
|
+
}
|
|
75
|
+
/** Environments seen on a project's traces (Postgres store). */
|
|
76
|
+
export async function traceEnvsPg(q, projectId) {
|
|
77
|
+
return (await q.query("SELECT DISTINCT env AS e FROM traces WHERE project_id = $1", [projectId])).map((r) => r.e);
|
|
71
78
|
}
|
|
72
79
|
export async function countRows(q, projectId) {
|
|
73
80
|
const n = async (table) => (await q.query(`SELECT count(*)::int AS n FROM ${table} WHERE project_id = $1`, [projectId]))[0]?.n ?? 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-read.js","sourceRoot":"","sources":["../../src/repo/trace-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"trace-read.js","sourceRoot":"","sources":["../../src/repo/trace-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAmD,kBAAkB,EAAyB,MAAM,sBAAsB,CAAC;AAO7J,MAAM,KAAK,GAAG,GAAG,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAY,EAAE,CAAa;IAC5D,MAAM,KAAK,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAClC,MAAM,IAAI,GAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,CAAU,EAAE,EAAE;QACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,GAAG;QAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,OAAO;QAAE,GAAG,CAAC,gFAAgF,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAChH,IAAI,CAAC,CAAC,OAAO;QAAE,GAAG,CAAC,8BAA8B,EAAE,kBAAkB,CAAC,CAAC;IACvE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAuB,qCAAqC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,kCAAkC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;IAChK,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,KAAuB,EAAE,SAAiB,EAAE,GAAsB;IACzG,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAqC,8BAA8B,KAAK,+CAA+C,EAAE;YACjJ,SAAS;YACT,IAAI;SACL,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;;gBACvB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAY,EAAE,SAAiB,EAAE,GAAsB;IACtF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACpB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAS,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1G,OAAO,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,CAAY,EAAE,CAAa,EAAoB,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzI,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,CAAY,EAAE,SAAiB,EAAE,OAAe;IAC7E,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,6CAA6C;AAC7C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,SAAiB,EAAE,IAAY,EAAE,EAAU,EAAE,GAAY;IACvG,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CACzB,wIAAwI,EACxI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CACjC,CAAC;IACF,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAY,EAAE,SAAiB,EAAE,GAAW;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAa,qGAAqG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3J,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAe,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC;AACjL,CAAC;AAED,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,CAAY,EAAE,SAAiB,EAAE,SAA4B;IAChG,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAgB,sEAAsE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/H,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACtF,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,SAAiB;IAC/D,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAgB,4DAA4D,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnI,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,SAAiB;IAC7D,MAAM,CAAC,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAgB,kCAAkC,KAAK,wBAAwB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3J,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { HubWrite } from "@wizeworks/lens-hub/kit";
|
|
2
2
|
import type { Queryable } from "../db/db.js";
|
|
3
|
-
/**
|
|
3
|
+
/** Record the sender in the project's service registry (Postgres, whatever keeps the telemetry). */
|
|
4
|
+
export declare function writeService(q: Queryable, projectId: string, w: HubWrite, now: number): Promise<void>;
|
|
5
|
+
/** Save one batch for one project: registry and telemetry, in the caller's transaction (Postgres small mode, and tests). */
|
|
4
6
|
export declare function writeBatch(q: Queryable, projectId: string, w: HubWrite, now: number): Promise<void>;
|
|
7
|
+
/** Save one batch's spans, logs, trace bounds, and metrics to Postgres, in the caller's transaction. */
|
|
8
|
+
export declare function writeTelemetry(q: Queryable, projectId: string, w: HubWrite, now: number): Promise<void>;
|
|
5
9
|
/** Drop metric points older than each organization's retention. */
|
|
6
10
|
export declare function pruneMetricsByRetention(q: Queryable, now: number): Promise<void>;
|
|
7
|
-
/** Drop traces older than each organization's retention. Returns how many
|
|
11
|
+
/** Drop traces older than each organization's retention, and loose batches (lines outside a request) older than the log retention. Returns how many were dropped. */
|
|
8
12
|
export declare function pruneByRetention(q: Queryable, now: number): Promise<number>;
|
|
9
13
|
//# sourceMappingURL=trace-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-write.d.ts","sourceRoot":"","sources":["../../src/repo/trace-write.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAM,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"trace-write.d.ts","sourceRoot":"","sources":["../../src/repo/trace-write.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAM,SAAS,EAAE,MAAM,aAAa,CAAC;AAsCjD,oGAAoG;AACpG,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3G;AAED,4HAA4H;AAC5H,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzG;AAED,wGAAwG;AACxG,wBAAsB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7G;AASD,mEAAmE;AACnE,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtF;AAED,qKAAqK;AACrK,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBjF"}
|
package/dist/repo/trace-write.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { ATTR_BROWSER_SESSION, logKey, PG_DIALECT, pruneStatements, seriesKeyOf } from "@wizeworks/lens-core";
|
|
2
|
+
import { ATTR_BROWSER_SESSION, INFRA_SERVICE, logKey, LOOSE_TRACE_PREFIX, PG_DIALECT, pruneStatements, seriesKeyOf } from "@wizeworks/lens-core";
|
|
3
3
|
import { runStatements, stateOf } from "../settle.js";
|
|
4
|
+
import { LOG_DAYS_SQL } from "./log-retention.js";
|
|
4
5
|
import { pruneMetricRollups, writeMetricRollups } from "./metric-write.js";
|
|
6
|
+
import { KEEP_DAYS } from "./settings.js";
|
|
5
7
|
const CHUNK = 200;
|
|
6
8
|
/** `INSERT ... VALUES ($1, $2), ($3, $4) ... <tail>` for many rows at once. */
|
|
7
9
|
async function insertMany(q, head, rows, tail) {
|
|
@@ -31,11 +33,23 @@ function traceRows(w, projectId, now) {
|
|
|
31
33
|
const env = w.sender.environment ?? "";
|
|
32
34
|
return [...bounds].map(([id, [start, end]]) => [projectId, id, start, end, now, env]);
|
|
33
35
|
}
|
|
34
|
-
/**
|
|
35
|
-
export async function
|
|
36
|
+
/** Record the sender in the project's service registry (Postgres, whatever keeps the telemetry). */
|
|
37
|
+
export async function writeService(q, projectId, w, now) {
|
|
36
38
|
const s = w.sender;
|
|
39
|
+
// The collector's host and Kubernetes receivers are not a service.
|
|
40
|
+
if (s.service === INFRA_SERVICE)
|
|
41
|
+
return;
|
|
37
42
|
await q.query(`INSERT INTO services (project_id, service, environment, host, via, info, first_seen, last_seen) VALUES ($1, $2, $3, $4, $5, $6, $7, $7)
|
|
38
43
|
ON CONFLICT (project_id, service, environment, host) DO UPDATE SET via = EXCLUDED.via, info = EXCLUDED.info, last_seen = EXCLUDED.last_seen`, [projectId, s.service, s.environment ?? "", s.host ?? "", w.via, JSON.stringify(s), now]);
|
|
44
|
+
}
|
|
45
|
+
/** Save one batch for one project: registry and telemetry, in the caller's transaction (Postgres small mode, and tests). */
|
|
46
|
+
export async function writeBatch(q, projectId, w, now) {
|
|
47
|
+
await writeService(q, projectId, w, now);
|
|
48
|
+
await writeTelemetry(q, projectId, w, now);
|
|
49
|
+
}
|
|
50
|
+
/** Save one batch's spans, logs, trace bounds, and metrics to Postgres, in the caller's transaction. */
|
|
51
|
+
export async function writeTelemetry(q, projectId, w, now) {
|
|
52
|
+
const s = w.sender;
|
|
39
53
|
await insertMany(q, "INSERT INTO traces (project_id, trace_id, start_ms, end_ms, updated_ms, env)", traceRows(w, projectId, now), `
|
|
40
54
|
ON CONFLICT (project_id, trace_id) DO UPDATE SET start_ms = LEAST(traces.start_ms, EXCLUDED.start_ms),
|
|
41
55
|
end_ms = GREATEST(traces.end_ms, EXCLUDED.end_ms), updated_ms = EXCLUDED.updated_ms,
|
|
@@ -61,14 +75,15 @@ function dedupe(items, key) {
|
|
|
61
75
|
/** Drop metric points older than each organization's retention. */
|
|
62
76
|
export async function pruneMetricsByRetention(q, now) {
|
|
63
77
|
await q.query(`DELETE FROM metric_points m USING projects p, orgs o WHERE p.id = m.project_id AND o.id = p.org_id
|
|
64
|
-
AND m.time_ms < $1 -
|
|
78
|
+
AND m.time_ms < $1 - ${KEEP_DAYS} * 86400000.0`, [now]);
|
|
65
79
|
await pruneMetricRollups(q, now);
|
|
66
80
|
}
|
|
67
|
-
/** Drop traces older than each organization's retention. Returns how many
|
|
81
|
+
/** Drop traces older than each organization's retention, and loose batches (lines outside a request) older than the log retention. Returns how many were dropped. */
|
|
68
82
|
export async function pruneByRetention(q, now) {
|
|
83
|
+
const loose = `substr(t.trace_id, 1, 16) = '${LOOSE_TRACE_PREFIX}'`;
|
|
69
84
|
const prune = async (x) => {
|
|
70
|
-
const doomed = await x.query(`SELECT t.project_id, t.trace_id, t.env, t.contrib,
|
|
71
|
-
WHERE t.start_ms < $1 -
|
|
85
|
+
const doomed = await x.query(`SELECT t.project_id, t.trace_id, t.env, t.contrib, ${KEEP_DAYS} AS retention_days, p.log_retention_days FROM traces t JOIN projects p ON p.id = t.project_id JOIN orgs o ON o.id = p.org_id
|
|
86
|
+
WHERE (NOT ${loose} AND t.start_ms < $1 - ${KEEP_DAYS} * 86400000.0) OR (${loose} AND t.start_ms < $1 - ${LOG_DAYS_SQL} * 86400000.0) LIMIT 5000`, [now]);
|
|
72
87
|
// Take their contributions out of the rollups and drop their facts first.
|
|
73
88
|
await runStatements(x, pruneStatements(PG_DIALECT, doomed.map((d) => stateOf(d, d.retention_days ?? 30)), now, true));
|
|
74
89
|
for (const table of ["spans", "logs", "traces"]) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-write.js","sourceRoot":"","sources":["../../src/repo/trace-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAa,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"trace-write.js","sourceRoot":"","sources":["../../src/repo/trace-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type UptimeCheck, type UptimeCheckInput, type UptimeIncident, type UptimeResult } from "@wizeworks/lens-core";
|
|
2
|
+
import type { AuthSecret } from "../auth/secret.js";
|
|
3
|
+
import type { Queryable } from "../db/db.js";
|
|
4
|
+
export type CloudCheck = UptimeCheck & {
|
|
5
|
+
projectId: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const listChecks: (q: Queryable, secrets: readonly AuthSecret[], projectId: string) => Promise<CloudCheck[]>;
|
|
8
|
+
export declare function checkById(q: Queryable, secrets: readonly AuthSecret[], projectId: string, id: string): Promise<CloudCheck | undefined>;
|
|
9
|
+
export declare const countChecks: (q: Queryable, projectId: string) => Promise<number>;
|
|
10
|
+
export declare function createCheck(q: Queryable, secrets: readonly AuthSecret[], projectId: string, c: UptimeCheckInput, by: string, now: number): Promise<string>;
|
|
11
|
+
/** Save a change. A shorter interval brings the next run closer; a check turned off ends its open incident and starts over as pending. */
|
|
12
|
+
export declare function updateCheck(q: Queryable, secrets: readonly AuthSecret[], current: CloudCheck, c: UptimeCheckInput, now: number): Promise<void>;
|
|
13
|
+
export declare function deleteCheck(q: Queryable, projectId: string, id: string): Promise<boolean>;
|
|
14
|
+
/** Take the checks that are due and push their next run out, in one step, so two cloud replicas never run the same check. */
|
|
15
|
+
export declare function claimDue(q: Queryable, secrets: readonly AuthSecret[], now: number, limit: number): Promise<CloudCheck[]>;
|
|
16
|
+
/** Keep a run's result on its check, and open or close an incident. */
|
|
17
|
+
export declare function saveRun(q: Queryable, c: CloudCheck, r: UptimeResult): Promise<void>;
|
|
18
|
+
/** A project's incidents still open or ended in the last 90 days. */
|
|
19
|
+
export declare const listIncidents: (q: Queryable, projectId: string, now: number) => Promise<UptimeIncident[]>;
|
|
20
|
+
export declare const pruneIncidents: (q: Queryable, now: number) => Promise<void>;
|
|
21
|
+
//# sourceMappingURL=uptime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uptime.d.ts","sourceRoot":"","sources":["../../src/repo/uptime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvK,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAS7D,eAAO,MAAM,UAAU,MAAa,SAAS,WAAW,SAAS,UAAU,EAAE,aAAa,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CACa,CAAC;AAErI,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAE5I;AAED,eAAO,MAAM,WAAW,MAAa,SAAS,aAAa,MAAM,KAAG,OAAO,CAAC,MAAM,CAC+C,CAAC;AAElI,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhK;AAED,0IAA0I;AAC1I,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpJ;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/F;AAED,6HAA6H;AAC7H,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQ9H;AAED,uEAAuE;AACvE,wBAAsB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzF;AAED,qEAAqE;AACrE,eAAO,MAAM,aAAa,MAAO,SAAS,aAAa,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,cAAc,EAAE,CAKlG,CAAC;AAEJ,eAAO,MAAM,cAAc,MAAa,SAAS,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAAmG,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { changeOf, lastRunOf, nextRunMs, UPTIME_KEEP_MS } from "@wizeworks/lens-core";
|
|
2
|
+
import { newId } from "../auth/crypto.js";
|
|
3
|
+
import { openHeaders, sealHeaders } from "../uptime/headers.js";
|
|
4
|
+
const COLUMNS = `id, project_id AS "projectId", name, url, method, headers, expect_status AS "expectStatus", expect_body AS "expectBody",
|
|
5
|
+
interval_min AS "intervalMin", timeout_ms AS "timeoutMs", env, enabled, created_ms AS "createdMs", state, last_run_ms AS "lastRunMs",
|
|
6
|
+
last_duration_ms AS "lastDurationMs", last_status AS "lastStatus", last_error AS "lastError", tls_expires_ms AS "tlsExpiresMs"`;
|
|
7
|
+
const toChecks = (secrets, rows) => Promise.all(rows.map(async (r) => ({ ...r, headers: await openHeaders(secrets, r.headers) })));
|
|
8
|
+
export const listChecks = async (q, secrets, projectId) => toChecks(secrets, await q.query(`SELECT ${COLUMNS} FROM uptime_checks WHERE project_id = $1 ORDER BY name, id`, [projectId]));
|
|
9
|
+
export async function checkById(q, secrets, projectId, id) {
|
|
10
|
+
return (await toChecks(secrets, await q.query(`SELECT ${COLUMNS} FROM uptime_checks WHERE project_id = $1 AND id = $2`, [projectId, id])))[0];
|
|
11
|
+
}
|
|
12
|
+
export const countChecks = async (q, projectId) => Number((await q.query("SELECT count(*) AS n FROM uptime_checks WHERE project_id = $1", [projectId]))[0]?.n ?? 0);
|
|
13
|
+
export async function createCheck(q, secrets, projectId, c, by, now) {
|
|
14
|
+
const id = newId();
|
|
15
|
+
await q.query(`INSERT INTO uptime_checks (id, project_id, name, url, method, headers, expect_status, expect_body, interval_min, timeout_ms, env, enabled, created_by, created_ms, next_ms)
|
|
16
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $14)`, [id, projectId, c.name, c.url, c.method, await sealHeaders(secrets, c.headers), c.expectStatus, c.expectBody, c.intervalMin, c.timeoutMs, c.env, c.enabled, by, now]);
|
|
17
|
+
return id;
|
|
18
|
+
}
|
|
19
|
+
/** Save a change. A shorter interval brings the next run closer; a check turned off ends its open incident and starts over as pending. */
|
|
20
|
+
export async function updateCheck(q, secrets, current, c, now) {
|
|
21
|
+
const next = Math.min(nextRunMs({ lastRunMs: current.lastRunMs, intervalMin: c.intervalMin }, now), now + c.intervalMin * 60_000);
|
|
22
|
+
await q.query(`UPDATE uptime_checks SET name = $2, url = $3, method = $4, headers = $5, expect_status = $6, expect_body = $7, interval_min = $8, timeout_ms = $9,
|
|
23
|
+
env = $10, enabled = $11, next_ms = $12, state = CASE WHEN $11 THEN state ELSE 'pending' END WHERE id = $1`, [current.id, c.name, c.url, c.method, await sealHeaders(secrets, c.headers), c.expectStatus, c.expectBody, c.intervalMin, c.timeoutMs, c.env, c.enabled, next]);
|
|
24
|
+
if (!c.enabled)
|
|
25
|
+
await q.query("UPDATE uptime_incidents SET end_ms = $2 WHERE check_id = $1 AND end_ms IS NULL", [current.id, now]);
|
|
26
|
+
}
|
|
27
|
+
export async function deleteCheck(q, projectId, id) {
|
|
28
|
+
return (await q.query("DELETE FROM uptime_checks WHERE project_id = $1 AND id = $2 RETURNING id", [projectId, id])).length > 0;
|
|
29
|
+
}
|
|
30
|
+
/** Take the checks that are due and push their next run out, in one step, so two cloud replicas never run the same check. */
|
|
31
|
+
export async function claimDue(q, secrets, now, limit) {
|
|
32
|
+
const rows = await q.query(`UPDATE uptime_checks SET next_ms = $1 + interval_min * 60000
|
|
33
|
+
WHERE id IN (SELECT id FROM uptime_checks WHERE enabled AND next_ms <= $1 ORDER BY next_ms LIMIT $2 FOR UPDATE SKIP LOCKED)
|
|
34
|
+
RETURNING ${COLUMNS}`, [now, limit]);
|
|
35
|
+
return toChecks(secrets, rows);
|
|
36
|
+
}
|
|
37
|
+
/** Keep a run's result on its check, and open or close an incident. */
|
|
38
|
+
export async function saveRun(q, c, r) {
|
|
39
|
+
const change = changeOf(c, r);
|
|
40
|
+
const last = lastRunOf(r);
|
|
41
|
+
await q.query("UPDATE uptime_checks SET state = $2, last_run_ms = $3, last_duration_ms = $4, last_status = $5, last_error = $6, tls_expires_ms = $7 WHERE id = $1", [
|
|
42
|
+
c.id, last.state, last.lastRunMs, last.lastDurationMs, last.lastStatus, last.lastError, last.tlsExpiresMs,
|
|
43
|
+
]);
|
|
44
|
+
if (change.open !== null)
|
|
45
|
+
await q.query("INSERT INTO uptime_incidents (id, check_id, project_id, start_ms, reason) VALUES ($1, $2, $3, $4, $5)", [newId(), c.id, c.projectId, r.startMs, change.open]);
|
|
46
|
+
if (change.closeAtMs !== null)
|
|
47
|
+
await q.query("UPDATE uptime_incidents SET end_ms = $2 WHERE check_id = $1 AND end_ms IS NULL", [c.id, change.closeAtMs]);
|
|
48
|
+
}
|
|
49
|
+
/** A project's incidents still open or ended in the last 90 days. */
|
|
50
|
+
export const listIncidents = (q, projectId, now) => q.query(`SELECT id, check_id AS "checkId", start_ms AS "startMs", end_ms AS "endMs", reason FROM uptime_incidents
|
|
51
|
+
WHERE project_id = $1 AND (end_ms IS NULL OR end_ms >= $2) ORDER BY start_ms DESC`, [projectId, now - UPTIME_KEEP_MS]);
|
|
52
|
+
export const pruneIncidents = async (q, now) => void (await q.query("DELETE FROM uptime_incidents WHERE end_ms < $1", [now - UPTIME_KEEP_MS]));
|
|
53
|
+
//# sourceMappingURL=uptime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uptime.js","sourceRoot":"","sources":["../../src/repo/uptime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAmF,MAAM,sBAAsB,CAAC;AACvK,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIhE,MAAM,OAAO,GAAG;;iIAEiH,CAAC;AAGlI,MAAM,QAAQ,GAAG,CAAC,OAA8B,EAAE,IAAW,EAAyB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAExL,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,CAAY,EAAE,OAA8B,EAAE,SAAiB,EAAyB,EAAE,CACzH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,CAAM,UAAU,OAAO,6DAA6D,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAErI,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,OAA8B,EAAE,SAAiB,EAAE,EAAU;IACzG,OAAO,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,CAAM,UAAU,OAAO,uDAAuD,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,CAAY,EAAE,SAAiB,EAAmB,EAAE,CACpF,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAgB,+DAA+D,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAElI,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,OAA8B,EAAE,SAAiB,EAAE,CAAmB,EAAE,EAAU,EAAE,GAAW;IAC7I,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,CAAC,CAAC,KAAK,CACX;+EAC2E,EAC3E,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CACrK,CAAC;IACF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,0IAA0I;AAC1I,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,OAA8B,EAAE,OAAmB,EAAE,CAAmB,EAAE,GAAW;IACnI,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC;IAClI,MAAM,CAAC,CAAC,KAAK,CACX;kHAC8G,EAC9G,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAC/J,CAAC;IACF,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,gFAAgF,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AACrI,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,SAAiB,EAAE,EAAU;IAC3E,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,0EAA0E,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACjI,CAAC;AAED,6HAA6H;AAC7H,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,CAAY,EAAE,OAA8B,EAAE,GAAW,EAAE,KAAa;IACrG,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CACxB;;iBAEa,OAAO,EAAE,EACtB,CAAC,GAAG,EAAE,KAAK,CAAC,CACb,CAAC;IACF,OAAO,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,CAAY,EAAE,CAAa,EAAE,CAAe;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,CAAC,KAAK,CAAC,oJAAoJ,EAAE;QAClK,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY;KAC1G,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,uGAAuG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACvM,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,gFAAgF,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3J,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAY,EAAE,SAAiB,EAAE,GAAW,EAA6B,EAAE,CACvG,CAAC,CAAC,KAAK,CACL;uFACmF,EACnF,CAAC,SAAS,EAAE,GAAG,GAAG,cAAc,CAAC,CAClC,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,CAAY,EAAE,GAAW,EAAiB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,gDAAgD,EAAE,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAwGhD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAShD"}
|
package/dist/routes/alerts.js
CHANGED
|
@@ -1,87 +1,50 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MUTED_FOREVER, parseAlertRule } from "@wizeworks/lens-core";
|
|
2
|
+
import { checkTarget } from "@wizeworks/lens-hub/kit";
|
|
2
3
|
import { notify } from "../alerts/evaluate.js";
|
|
3
|
-
import { checkTarget } from "../alerts/notify.js";
|
|
4
4
|
import { requireProject } from "../auth/principal.js";
|
|
5
|
-
import { fail, readJsonBody, sendJson
|
|
5
|
+
import { fail, readJsonBody, sendJson } from "../http/http.js";
|
|
6
|
+
import { addEvent, listEvents, ruleEvents, ruleValues } from "../repo/alert-events.js";
|
|
7
|
+
import { ackRule, createRule, deleteRule, listRules, muteRule, ruleById, updateRule } from "../repo/alerts.js";
|
|
8
|
+
import { sloById } from "../repo/slos.js";
|
|
6
9
|
import { memberEmails } from "../repo/users.js";
|
|
7
|
-
import { createRule, deleteRule, listEvents, listRules, ruleById, updateRule } from "../repo/alerts.js";
|
|
8
|
-
const WINDOWS = [5, 15, 60, 360, 1440].map((m) => m * 60_000);
|
|
9
|
-
const MAX_CHANNELS = 5;
|
|
10
10
|
const MAX_EMAILS = 20;
|
|
11
|
+
/** Who did it, in words: the person's name or email. Only people can mute and acknowledge. */
|
|
12
|
+
const whoOf = (a) => (a.principal.kind === "user" && a.principal.user ? a.principal.user.name || a.principal.user.email : "someone");
|
|
13
|
+
const DAY_MS = 86_400_000;
|
|
11
14
|
/** Email goes only to members of the organization with a confirmed address, so a rule cannot send mail to strangers. */
|
|
12
15
|
async function emailChannel(ctx, orgId, to) {
|
|
13
16
|
const allowed = new Set(await memberEmails(ctx.app.db, orgId, ctx.app.mailer.live));
|
|
14
17
|
const list = Array.isArray(to) ? [...new Set(to.filter((x) => typeof x === "string").map((x) => x.trim().toLowerCase()))] : [];
|
|
15
18
|
if (list.length === 0 || list.length > MAX_EMAILS)
|
|
16
|
-
|
|
19
|
+
return `Send to 1 to ${MAX_EMAILS} email addresses.`;
|
|
17
20
|
const stranger = list.find((e) => !allowed.has(e));
|
|
18
|
-
|
|
19
|
-
fail(400, `${stranger} is not a member of this organization with a confirmed email.`);
|
|
20
|
-
return { kind: "email", to: list };
|
|
21
|
-
}
|
|
22
|
-
async function channelsOf(ctx, orgId, raw) {
|
|
23
|
-
const list = Array.isArray(raw) ? raw.slice(0, MAX_CHANNELS) : [];
|
|
24
|
-
const out = [];
|
|
25
|
-
for (const c of list) {
|
|
26
|
-
if (c.kind === "email") {
|
|
27
|
-
out.push(await emailChannel(ctx, orgId, c.to));
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
if ((c.kind !== "webhook" && c.kind !== "slack") || typeof c.url !== "string")
|
|
31
|
-
return fail(400, "Each channel needs kind (webhook, slack, or email) and url (or to).");
|
|
32
|
-
const problem = await checkTarget(c.url, ctx.app.config.allowPrivateWebhooks);
|
|
33
|
-
if (problem)
|
|
34
|
-
fail(400, `${c.url}: ${problem}`);
|
|
35
|
-
out.push({ kind: c.kind, url: c.url });
|
|
36
|
-
}
|
|
37
|
-
return out;
|
|
38
|
-
}
|
|
39
|
-
/** The metric part of a rule: for "metric" rules, the OpenTelemetry metric to read. */
|
|
40
|
-
function metricPart(b) {
|
|
41
|
-
if (b.metric !== "metric") {
|
|
42
|
-
if (!isAlertMetric(b.metric))
|
|
43
|
-
fail(400, "Pick a metric: error_rate, p95_ms, avg_ms, requests, new_errors, slow_queries, or metric.");
|
|
44
|
-
return { metric: b.metric, metricName: "", metricStat: "", metricService: "" };
|
|
45
|
-
}
|
|
46
|
-
const name = typeof b.metricName === "string" ? b.metricName.trim() : "";
|
|
47
|
-
if (!name || name.length > MAX_METRIC_NAME)
|
|
48
|
-
fail(400, "Set metricName to the metric to watch, for example process.cpu.utilization.");
|
|
49
|
-
const stat = b.metricStat ?? "avg";
|
|
50
|
-
if (!isMetricAlertStat(stat))
|
|
51
|
-
fail(400, "Pick a metricStat: last, avg, max, p95, p99, or rate.");
|
|
52
|
-
const service = typeof b.metricService === "string" ? b.metricService.trim().slice(0, 100) : "";
|
|
53
|
-
return { metric: "metric", metricName: name, metricStat: stat, metricService: service };
|
|
21
|
+
return stranger ? `${stranger} is not a member of this organization with a confirmed email.` : { kind: "email", to: list };
|
|
54
22
|
}
|
|
55
23
|
/** Check a rule from the request body. A change sends only what it changes: the rest comes from `current`. */
|
|
56
|
-
async function ruleInput(ctx, orgId, current) {
|
|
24
|
+
async function ruleInput(ctx, orgId, projectId, current) {
|
|
57
25
|
const b = { ...current, ...(await readJsonBody(ctx.req)) };
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (!Number.isFinite(threshold))
|
|
63
|
-
fail(400, "Set a number for threshold.");
|
|
64
|
-
const windowMs = Number(b.windowMs ?? 5 * 60_000);
|
|
65
|
-
if (!WINDOWS.includes(windowMs))
|
|
66
|
-
fail(400, "Pick a window of 5, 15, 60, 360, or 1440 minutes.");
|
|
67
|
-
return {
|
|
68
|
-
name: str(b, "name").slice(0, 100),
|
|
69
|
-
...metric,
|
|
70
|
-
op: b.op,
|
|
71
|
-
threshold,
|
|
72
|
-
windowMs,
|
|
73
|
-
env: typeof b.env === "string" ? b.env.slice(0, 50) : "",
|
|
74
|
-
channels: await channelsOf(ctx, orgId, b.channels),
|
|
75
|
-
enabled: b.enabled !== false,
|
|
76
|
-
};
|
|
26
|
+
const allowPrivate = ctx.app.config.allowPrivateWebhooks;
|
|
27
|
+
const checkSlo = async (id) => ((await sloById(ctx.app.db, projectId, id)) ? null : "That SLO is not in this project.");
|
|
28
|
+
const r = await parseAlertRule(b, { checkUrl: (url) => checkTarget(url, allowPrivate), checkSlo, email: (to) => emailChannel(ctx, orgId, to) });
|
|
29
|
+
return typeof r === "string" ? fail(400, r) : r;
|
|
77
30
|
}
|
|
78
31
|
async function list(ctx) {
|
|
79
32
|
const { project } = await requireProject(ctx, ctx.params.project);
|
|
80
33
|
sendJson(ctx.res, 200, { rules: await listRules(ctx.app.db, project.id), events: await listEvents(ctx.app.db, project.id, 100) });
|
|
81
34
|
}
|
|
35
|
+
/** One rule: its events and its values over `from`..`to` (default the last day). */
|
|
36
|
+
async function one(ctx) {
|
|
37
|
+
const { project } = await requireProject(ctx, ctx.params.project);
|
|
38
|
+
const rule = await ruleById(ctx.app.db, project.id, ctx.params.id);
|
|
39
|
+
if (!rule)
|
|
40
|
+
return fail(404, "Alert rule not found.");
|
|
41
|
+
const to = Number(ctx.url.searchParams.get("to")) || ctx.app.config.now() + 1;
|
|
42
|
+
const from = Number(ctx.url.searchParams.get("from")) || to - DAY_MS;
|
|
43
|
+
sendJson(ctx.res, 200, { rule, events: await ruleEvents(ctx.app.db, rule.id, 100), values: await ruleValues(ctx.app.db, rule.id, from, to) });
|
|
44
|
+
}
|
|
82
45
|
async function create(ctx) {
|
|
83
46
|
const { project, actor } = await requireProject(ctx, ctx.params.project, "write");
|
|
84
|
-
const id = await createRule(ctx.app.db, project.id, await ruleInput(ctx, project.orgId), actor, ctx.app.config.now());
|
|
47
|
+
const id = await createRule(ctx.app.db, project.id, await ruleInput(ctx, project.orgId, project.id), actor, ctx.app.config.now());
|
|
85
48
|
sendJson(ctx.res, 201, await ruleById(ctx.app.db, project.id, id));
|
|
86
49
|
}
|
|
87
50
|
async function change(ctx) {
|
|
@@ -89,7 +52,7 @@ async function change(ctx) {
|
|
|
89
52
|
const current = await ruleById(ctx.app.db, project.id, ctx.params.id);
|
|
90
53
|
if (!current)
|
|
91
54
|
fail(404, "Alert rule not found.");
|
|
92
|
-
await updateRule(ctx.app.db, project.id, ctx.params.id, await ruleInput(ctx, project.orgId, current));
|
|
55
|
+
await updateRule(ctx.app.db, project.id, ctx.params.id, await ruleInput(ctx, project.orgId, project.id, current));
|
|
93
56
|
sendJson(ctx.res, 200, await ruleById(ctx.app.db, project.id, ctx.params.id));
|
|
94
57
|
}
|
|
95
58
|
async function remove(ctx) {
|
|
@@ -106,11 +69,47 @@ async function test(ctx) {
|
|
|
106
69
|
return fail(404, "Alert rule not found.");
|
|
107
70
|
sendJson(ctx.res, 200, { delivery: await notify(ctx.app, rule, "test", rule.lastValue, ctx.app.config.now()) });
|
|
108
71
|
}
|
|
72
|
+
/** `{ untilMs }`: no notices until then (`null` unmutes, `-1` mutes until unmuted). */
|
|
73
|
+
async function mute(ctx) {
|
|
74
|
+
const access = await requireProject(ctx, ctx.params.project, "write");
|
|
75
|
+
const { project } = access;
|
|
76
|
+
const actor = whoOf(access);
|
|
77
|
+
const rule = await ruleById(ctx.app.db, project.id, ctx.params.id);
|
|
78
|
+
if (!rule)
|
|
79
|
+
return fail(404, "Alert rule not found.");
|
|
80
|
+
const raw = (await readJsonBody(ctx.req)).untilMs;
|
|
81
|
+
const now = ctx.app.config.now();
|
|
82
|
+
const untilMs = raw === null ? null : raw === -1 ? MUTED_FOREVER : Number(raw);
|
|
83
|
+
if (untilMs !== null && (!Number.isFinite(untilMs) || untilMs <= now))
|
|
84
|
+
return fail(400, "Set untilMs to a future time, -1 for until unmuted, or null to unmute.");
|
|
85
|
+
await muteRule(ctx.app.db, project.id, rule.id, untilMs);
|
|
86
|
+
const message = untilMs === null ? `Unmuted by ${actor}` : untilMs === MUTED_FOREVER ? `Muted by ${actor} until unmuted` : `Muted by ${actor} until ${new Date(untilMs).toISOString().slice(0, 16).replace("T", " ")} UTC`;
|
|
87
|
+
await addEvent(ctx.app.db, rule, { kind: untilMs === null ? "unmute" : "mute", value: null, message, timeMs: now, delivery: "" });
|
|
88
|
+
sendJson(ctx.res, 200, await ruleById(ctx.app.db, project.id, rule.id));
|
|
89
|
+
}
|
|
90
|
+
/** Acknowledge a firing rule: reminders stop until it resolves. */
|
|
91
|
+
async function ack(ctx) {
|
|
92
|
+
const access = await requireProject(ctx, ctx.params.project, "write");
|
|
93
|
+
const { project } = access;
|
|
94
|
+
const actor = whoOf(access);
|
|
95
|
+
const rule = await ruleById(ctx.app.db, project.id, ctx.params.id);
|
|
96
|
+
if (!rule)
|
|
97
|
+
return fail(404, "Alert rule not found.");
|
|
98
|
+
if (rule.state !== "firing")
|
|
99
|
+
return fail(400, "Only a firing rule can be acknowledged.");
|
|
100
|
+
const now = ctx.app.config.now();
|
|
101
|
+
await ackRule(ctx.app.db, project.id, rule.id, now);
|
|
102
|
+
await addEvent(ctx.app.db, rule, { kind: "ack", value: rule.lastValue, message: `Acknowledged by ${actor}`, timeMs: now, delivery: "" });
|
|
103
|
+
sendJson(ctx.res, 200, await ruleById(ctx.app.db, project.id, rule.id));
|
|
104
|
+
}
|
|
109
105
|
export function alertRoutes(r) {
|
|
110
106
|
r.on("GET", "api/projects/:project/alerts", list)
|
|
111
107
|
.on("POST", "api/projects/:project/alerts", create)
|
|
108
|
+
.on("GET", "api/projects/:project/alerts/:id", one)
|
|
112
109
|
.on("PATCH", "api/projects/:project/alerts/:id", change)
|
|
113
110
|
.on("DELETE", "api/projects/:project/alerts/:id", remove)
|
|
114
|
-
.on("POST", "api/projects/:project/alerts/:id/test", test)
|
|
111
|
+
.on("POST", "api/projects/:project/alerts/:id/test", test)
|
|
112
|
+
.on("POST", "api/projects/:project/alerts/:id/mute", mute)
|
|
113
|
+
.on("POST", "api/projects/:project/alerts/:id/ack", ack);
|
|
115
114
|
}
|
|
116
115
|
//# sourceMappingURL=alerts.js.map
|