@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,82 @@
|
|
|
1
|
+
// ClickHouse upkeep: the facts version, clearing projects, retention changes, and projects that no longer exist.
|
|
2
|
+
import { FACTS_VERSION, LOG_KINDS_SQL, LOOSE_TRACE_PREFIX, TIERS } from "@wizeworks/lens-core";
|
|
3
|
+
import { ensureMeta } from "./rebuild.js";
|
|
4
|
+
import { PROJECT_TABLES } from "./schema.js";
|
|
5
|
+
import { DAY_MS, nextVer } from "./util.js";
|
|
6
|
+
/** Tables built by settling: emptied when the facts version changes. */
|
|
7
|
+
const STATS = [
|
|
8
|
+
...["fact_requests", "fact_traces", "fact_logs", "fact_critical", "fact_search", "fact_attrs"].map((t) => `${t}_t`),
|
|
9
|
+
...TIERS.flatMap((t) => [`${t.table}_t`, `${t.hist}_t`]),
|
|
10
|
+
"settle_state",
|
|
11
|
+
];
|
|
12
|
+
/** The time each table's expiry counts from, for retention changes. */
|
|
13
|
+
const EXPIRE_FROM = {
|
|
14
|
+
spans_raw: "start_ms", logs_raw: "time_ms", trace_heads: "start_ms", settle_state: "settled_ms", metric_points_raw: "time_ms", metric_series_t: "last_ms",
|
|
15
|
+
fact_requests_t: "start_ms", fact_traces_t: "start_ms", fact_logs_t: "time_ms", fact_critical_t: "start_ms", fact_search_t: "time_ms", fact_attrs_t: "time_ms",
|
|
16
|
+
rollup_1h_t: "bucket_ms", hist_1h_t: "bucket_ms", metric_1h_t: "bucket_ms",
|
|
17
|
+
};
|
|
18
|
+
/** When the facts version changed: empty the stats and settle every trace again, a page at a time. True when it did. */
|
|
19
|
+
export async function checkFactsVersionCh(ch, rebuild) {
|
|
20
|
+
await ensureMeta(ch);
|
|
21
|
+
const [row] = await ch.query("SELECT value FROM ch_meta FINAL WHERE key = 'facts'");
|
|
22
|
+
if (row?.value === String(FACTS_VERSION))
|
|
23
|
+
return false;
|
|
24
|
+
for (const t of STATS)
|
|
25
|
+
await ch.command(`TRUNCATE TABLE IF EXISTS ${t}`);
|
|
26
|
+
await rebuild.start();
|
|
27
|
+
await ch.insert("ch_meta", [{ key: "facts", value: String(FACTS_VERSION), ver: nextVer(Date.now()) }]);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
/** Delete every row of a project, in every table. */
|
|
31
|
+
export async function clearProjectCh(ch, queue, projectId) {
|
|
32
|
+
queue.clear(projectId);
|
|
33
|
+
for (const t of PROJECT_TABLES)
|
|
34
|
+
await ch.command(`DELETE FROM ${t} WHERE project_id = {p1:String}`, [projectId], { lightweight_deletes_sync: "0" });
|
|
35
|
+
}
|
|
36
|
+
/** Projects with telemetry here, with the retention (trace and log days) their rows were written with. */
|
|
37
|
+
async function knownProjects(ch) {
|
|
38
|
+
const ids = await ch.query("SELECT DISTINCT project_id FROM trace_heads UNION DISTINCT SELECT DISTINCT project_id FROM metric_series_t");
|
|
39
|
+
const kept = await ch.query("SELECT project_id, days, if(log_days = 0, days, log_days) AS log_days FROM project_retention FINAL");
|
|
40
|
+
const days = new Map(kept.map((r) => [r.project_id, { days: Number(r.days), logDays: Number(r.log_days) }]));
|
|
41
|
+
return new Map(ids.map((r) => [r.project_id, days.get(r.project_id) ?? null]));
|
|
42
|
+
}
|
|
43
|
+
const LOOSE = `startsWith(trace_id, '${LOOSE_TRACE_PREFIX}')`;
|
|
44
|
+
const LOG_ROW = { logs_raw: "1", fact_logs_t: "1", fact_search_t: "kind = 'logs'", fact_attrs_t: "src = 'l'" };
|
|
45
|
+
/** The days a table's row is kept, as SQL: log rows by the log days (never past their trace in a request), loose batches and log kinds by the log days. */
|
|
46
|
+
function daysSql(table) {
|
|
47
|
+
if (table in LOG_ROW)
|
|
48
|
+
return `if(${LOOSE}, {p3:Float64}, if(${LOG_ROW[table]}, least({p2:Float64}, {p3:Float64}), {p2:Float64}))`;
|
|
49
|
+
if (table === "trace_heads" || table === "settle_state" || table.startsWith("fact_"))
|
|
50
|
+
return `if(${LOOSE}, {p3:Float64}, {p2:Float64})`;
|
|
51
|
+
if (table === "rollup_1h_t" || table === "hist_1h_t")
|
|
52
|
+
return `if(kind IN (${LOG_KINDS_SQL}), {p3:Float64}, {p2:Float64})`;
|
|
53
|
+
return "{p2:Float64}";
|
|
54
|
+
}
|
|
55
|
+
/** A new retention for a project's existing rows: their expiry moves (a mutation, run in the background). */
|
|
56
|
+
async function moveExpiry(ch, projectId, k) {
|
|
57
|
+
for (const [table, col] of Object.entries(EXPIRE_FROM)) {
|
|
58
|
+
await ch.command(`ALTER TABLE ${table} UPDATE expire_ms = ${col} + ${daysSql(table)} WHERE project_id = {p1:String}`, [projectId, k.days * DAY_MS, k.logDays * DAY_MS]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Retention runs out by TTL. Here: drop projects deleted in Postgres, and follow retention changes (traces and logs). */
|
|
62
|
+
export async function syncProjects(ch, queue, retentionOf, now) {
|
|
63
|
+
const known = await knownProjects(ch);
|
|
64
|
+
if (!known.size)
|
|
65
|
+
return;
|
|
66
|
+
const current = await retentionOf.days([...known.keys()]);
|
|
67
|
+
const currentLog = await retentionOf.logDays([...known.keys()]);
|
|
68
|
+
for (const [id, had] of known) {
|
|
69
|
+
const days = current.get(id);
|
|
70
|
+
if (days === undefined)
|
|
71
|
+
await clearProjectCh(ch, queue, id);
|
|
72
|
+
else {
|
|
73
|
+
const k = { days, logDays: currentLog.get(id) ?? days };
|
|
74
|
+
if (had && had.days === k.days && had.logDays === k.logDays)
|
|
75
|
+
continue;
|
|
76
|
+
if (had)
|
|
77
|
+
await moveExpiry(ch, id, k);
|
|
78
|
+
await ch.insert("project_retention", [{ project_id: id, days: k.days, log_days: k.logDays, ver: nextVer(now) }]);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/telemetry/ch/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ChOptions {
|
|
2
|
+
/** `http(s)://user:password@host:8123/database`. */
|
|
3
|
+
url: string;
|
|
4
|
+
/** Per call. Default 30 s. */
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ChClient {
|
|
8
|
+
readonly database: string;
|
|
9
|
+
/** Rows of a SELECT. `params` are p1, p2, ... in order, for `{pN:Type}` placeholders. */
|
|
10
|
+
query<T = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Promise<T[]>;
|
|
11
|
+
/** A statement without rows (DDL, DELETE, INSERT ... SELECT). */
|
|
12
|
+
command(sql: string, params?: readonly unknown[], settings?: Record<string, string>): Promise<void>;
|
|
13
|
+
/** Rows as JSON lines into `INSERT INTO <target> FORMAT JSONEachRow`; the target may be `t SELECT ... FROM input(...)`. With an `insert_deduplication_token`, a dropped call is sent again and ClickHouse keeps one copy. */
|
|
14
|
+
insert(target: string, rows: readonly object[], settings?: Record<string, string>): Promise<void>;
|
|
15
|
+
ping(): Promise<boolean>;
|
|
16
|
+
}
|
|
17
|
+
/** A client for one database. Nothing connects until the first call. */
|
|
18
|
+
export declare function chClient(o: ChOptions): ChClient;
|
|
19
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/http.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yFAAyF;IACzF,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3F,iEAAiE;IACjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpG,6NAA6N;IAC7N,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAoED,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,GAAG,QAAQ,CAyB/C"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// A small ClickHouse client over its HTTP interface: queries with typed parameters, commands, and JSON-rows inserts.
|
|
2
|
+
/** A parameter as ClickHouse reads it from the URL: arrays as ClickHouse literals, null as \N. */
|
|
3
|
+
function paramText(v) {
|
|
4
|
+
if (v === null || v === undefined)
|
|
5
|
+
return "\\N";
|
|
6
|
+
if (Array.isArray(v))
|
|
7
|
+
return `[${v.map((x) => (typeof x === "number" ? String(x) : `'${String(x).replace(/[\\']/g, (c) => `\\${c}`)}'`)).join(",")}]`;
|
|
8
|
+
if (typeof v === "boolean")
|
|
9
|
+
return v ? "true" : "false";
|
|
10
|
+
return String(v);
|
|
11
|
+
}
|
|
12
|
+
function endpointOf(url) {
|
|
13
|
+
const u = new URL(url);
|
|
14
|
+
const database = decodeURIComponent(u.pathname.replace(/^\//, "")) || "default";
|
|
15
|
+
const headers = { "X-ClickHouse-User": decodeURIComponent(u.username || "default"), "X-ClickHouse-Database": database };
|
|
16
|
+
if (u.password)
|
|
17
|
+
headers["X-ClickHouse-Key"] = decodeURIComponent(u.password);
|
|
18
|
+
return { base: `${u.protocol}//${u.host}/`, headers, database };
|
|
19
|
+
}
|
|
20
|
+
// Column statistics stay off: they gave nothing here, and one read failed with UNKNOWN_CODEC while loading them under load.
|
|
21
|
+
const SETTINGS = {
|
|
22
|
+
prefer_column_name_to_alias: "1", output_format_json_quote_64bit_integers: "0", output_format_json_quote_denormals: "0", date_time_output_format: "iso",
|
|
23
|
+
use_statistics: "0", use_statistics_for_part_pruning: "0", allow_statistics_optimize: "0",
|
|
24
|
+
};
|
|
25
|
+
const codeOf = (err) => err.cause?.code;
|
|
26
|
+
const refused = (err) => codeOf(err) === "ECONNREFUSED";
|
|
27
|
+
/** The server closed a kept-alive connection as the call went out: the call may or may not have run. */
|
|
28
|
+
const dropped = (err) => ["UND_ERR_SOCKET", "ECONNRESET", "EPIPE"].includes(codeOf(err) ?? "");
|
|
29
|
+
/** One fetch with a timer that is always cleared, so no timer outlives the call. */
|
|
30
|
+
async function fetchOnce(url, init, timeoutMs) {
|
|
31
|
+
const ctl = new AbortController();
|
|
32
|
+
const timer = setTimeout(() => ctl.abort(new Error(`ClickHouse did not answer in ${timeoutMs} ms`)), timeoutMs);
|
|
33
|
+
try {
|
|
34
|
+
const res = await fetch(url, { ...init, signal: ctl.signal });
|
|
35
|
+
return { status: res.status, ok: res.ok, text: await res.text() };
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** A refused connection never reached the server, so even an insert is safe to send again; a dropped one only when `again` (reads, and inserts with a deduplication token). */
|
|
42
|
+
async function send(url, init, timeoutMs, again = false) {
|
|
43
|
+
for (let attempt = 0;; attempt++) {
|
|
44
|
+
try {
|
|
45
|
+
return await fetchOnce(url, init, timeoutMs);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (!(refused(err) || (again && dropped(err))) || attempt >= 3)
|
|
49
|
+
throw err;
|
|
50
|
+
await new Promise((r) => setTimeout(r, 200 * (attempt + 1)));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function call(e, body, query, timeoutMs, again = false) {
|
|
55
|
+
const qs = new URLSearchParams({ ...SETTINGS, ...query });
|
|
56
|
+
const res = await send(`${e.base}?${qs.toString()}`, { method: "POST", headers: e.headers, body }, timeoutMs, again);
|
|
57
|
+
if (!res.ok)
|
|
58
|
+
throw new Error(`ClickHouse ${res.status}: ${res.text.slice(0, 500)}`);
|
|
59
|
+
return res.text;
|
|
60
|
+
}
|
|
61
|
+
const paramsOf = (params) => Object.fromEntries(params.map((v, i) => [`param_p${i + 1}`, paramText(v)]));
|
|
62
|
+
/** A client for one database. Nothing connects until the first call. */
|
|
63
|
+
export function chClient(o) {
|
|
64
|
+
const e = endpointOf(o.url);
|
|
65
|
+
const timeout = o.timeoutMs ?? 30_000;
|
|
66
|
+
return {
|
|
67
|
+
database: e.database,
|
|
68
|
+
async query(sql, params = []) {
|
|
69
|
+
const text = await call(e, `${sql}\nFORMAT JSONEachRow`, paramsOf(params), timeout, true);
|
|
70
|
+
return text.split("\n").filter(Boolean).map((line) => JSON.parse(line));
|
|
71
|
+
},
|
|
72
|
+
async command(sql, params = [], settings = {}) {
|
|
73
|
+
await call(e, sql, { ...paramsOf(params), ...settings }, timeout);
|
|
74
|
+
},
|
|
75
|
+
async insert(target, rows, settings = {}) {
|
|
76
|
+
if (rows.length === 0)
|
|
77
|
+
return;
|
|
78
|
+
const body = rows.map((r) => JSON.stringify(r)).join("\n");
|
|
79
|
+
await call(e, body, { query: `INSERT INTO ${target} FORMAT JSONEachRow`, ...settings }, timeout, !!settings.insert_deduplication_token);
|
|
80
|
+
},
|
|
81
|
+
async ping() {
|
|
82
|
+
try {
|
|
83
|
+
return (await fetchOnce(`${e.base}ping`, {}, 5_000)).ok;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/telemetry/ch/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type MetricPoint } from "@wizeworks/lens-core";
|
|
2
|
+
import type { ChClient } from "./http.js";
|
|
3
|
+
/** Metric writes one at a time: each reads the series state it then advances. */
|
|
4
|
+
export declare class MetricWriter {
|
|
5
|
+
private readonly ch;
|
|
6
|
+
private chain;
|
|
7
|
+
constructor(ch: ChClient);
|
|
8
|
+
write(project: string, env: string, points: readonly MetricPoint[], now: number, retentionMs: number): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/metrics.ts"],"names":[],"mappings":"AAEA,OAAO,EAC8F,KAAK,WAAW,EAEpH,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAkD1C,iFAAiF;AACjF,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,EAAE;IAF/B,OAAO,CAAC,KAAK,CAAoC;IAEjD,YAA6B,EAAE,EAAE,QAAQ,EAAI;IAE7C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnH;CACF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Metric rollups on ClickHouse: the same series state and tier rows as Postgres, merged by the tables instead of upserts.
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { groupMetricSeries, mergeStoredHists, metricBatchWrites, metricHistOfColumns, METRIC_SERIES_COLUMNS, METRIC_TIER_COLUMNS, metricSeriesValues, metricStateOfColumns, metricTierValues, seriesKeyOf, TIERS, } from "@wizeworks/lens-core";
|
|
4
|
+
import { nextVer, rowOf } from "./util.js";
|
|
5
|
+
const sha1 = (text) => createHash("sha1").update(text).digest("hex");
|
|
6
|
+
const cols = (list) => list.map((c) => (c === "project" ? "project_id" : c));
|
|
7
|
+
const TIER_INPUT = [
|
|
8
|
+
"project_id String, env String, series_key String, name String, bucket_ms Float64, cnt Float64, vsum Float64, vmin Nullable(Float64)",
|
|
9
|
+
"vmax Nullable(Float64), first_ms Float64, first_v Nullable(Float64), last_ms Float64, last_v Nullable(Float64), rate_delta Float64, rate_ms Float64",
|
|
10
|
+
"h_count Float64, h_sum Float64, h_min Nullable(Float64), h_max Nullable(Float64), h_bounds Nullable(String), h_counts Nullable(String), ver UInt64, expire_ms Float64",
|
|
11
|
+
].join(", ");
|
|
12
|
+
/** Sums add, extremes keep extremes, first and last follow time, and histogram counts follow the newest write that had some. */
|
|
13
|
+
const tierInsert = (table) => `${table}_t SELECT project_id, env, series_key, name, bucket_ms, sum(cnt), sum(vsum), min(vmin), max(vmax),
|
|
14
|
+
min(first_ms), argMinState(first_v, first_ms), max(last_ms), argMaxState(last_v, last_ms), sum(rate_delta), sum(rate_ms), sum(h_count), sum(h_sum),
|
|
15
|
+
min(h_min), max(h_max), argMaxState(h_bounds, ver), argMaxState(h_counts, ver), max(expire_ms) FROM input('${TIER_INPUT}')
|
|
16
|
+
GROUP BY project_id, env, series_key, name, bucket_ms`;
|
|
17
|
+
/** Stored histograms of the buckets this batch adds counts to. */
|
|
18
|
+
async function storedHists(ch, project, env, tiers) {
|
|
19
|
+
const stored = new Map();
|
|
20
|
+
for (const tier of TIERS) {
|
|
21
|
+
const mine = tiers.filter((t) => t.tier === tier && t.row.hist);
|
|
22
|
+
if (!mine.length)
|
|
23
|
+
continue;
|
|
24
|
+
const sql = `SELECT series_key, bucket_ms, h_count, h_sum, h_min, h_max, h_bounds, h_counts FROM metric_${tier.name}
|
|
25
|
+
WHERE project_id = {p1:String} AND env = {p2:String} AND has({p3:Array(String)}, series_key) AND has({p4:Array(Float64)}, bucket_ms) AND h_count > 0`;
|
|
26
|
+
const rows = await ch.query(sql, [project, env, [...new Set(mine.map((t) => t.key))], [...new Set(mine.map((t) => t.bucket))]]);
|
|
27
|
+
for (const r of rows)
|
|
28
|
+
stored.set(`${tier.name} ${r.series_key} ${Number(r.bucket_ms)}`, metricHistOfColumns(r));
|
|
29
|
+
}
|
|
30
|
+
return (t) => stored.get(`${t.tier.name} ${t.key} ${t.bucket}`) ?? null;
|
|
31
|
+
}
|
|
32
|
+
async function writeOnce(ch, project, env, points, now, retentionMs) {
|
|
33
|
+
const groups = groupMetricSeries(points, (p) => sha1(seriesKeyOf(p)));
|
|
34
|
+
const states = await ch.query("SELECT series_key, last_ms, last_value, last_hist FROM metric_series WHERE project_id = {p1:String} AND env = {p2:String} AND has({p3:Array(String)}, series_key)", [project, env, [...groups.keys()]]);
|
|
35
|
+
const { series, tiers } = metricBatchWrites(groups, new Map(states.map((r) => [String(r.series_key), metricStateOfColumns(r)])), now);
|
|
36
|
+
mergeStoredHists(tiers, await storedHists(ch, project, env, tiers));
|
|
37
|
+
const ver = nextVer(now);
|
|
38
|
+
const tierCols = cols(METRIC_TIER_COLUMNS);
|
|
39
|
+
for (const tier of TIERS) {
|
|
40
|
+
const rows = tiers.filter((t) => t.tier === tier).map((t) => ({ ...rowOf(tierCols, metricTierValues("ch", project, env, t)), ver, expire_ms: t.bucket + retentionMs }));
|
|
41
|
+
await ch.insert(tierInsert(`metric_${tier.name}`), rows);
|
|
42
|
+
}
|
|
43
|
+
const seriesRows = series.map((s) => ({ ...rowOf(cols(METRIC_SERIES_COLUMNS), metricSeriesValues("ch", project, env, s)), ver, expire_ms: s.state.lastMs + retentionMs }));
|
|
44
|
+
await ch.insert("metric_series_t", seriesRows);
|
|
45
|
+
}
|
|
46
|
+
/** Metric writes one at a time: each reads the series state it then advances. */
|
|
47
|
+
export class MetricWriter {
|
|
48
|
+
ch;
|
|
49
|
+
chain = Promise.resolve();
|
|
50
|
+
constructor(ch) {
|
|
51
|
+
this.ch = ch;
|
|
52
|
+
}
|
|
53
|
+
write(project, env, points, now, retentionMs) {
|
|
54
|
+
if (!points.length)
|
|
55
|
+
return Promise.resolve();
|
|
56
|
+
const run = this.chain.then(() => writeOnce(this.ch, project, env, points, now, retentionMs));
|
|
57
|
+
this.chain = run.catch(() => undefined);
|
|
58
|
+
return run;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/telemetry/ch/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { TimeWindow } from "@wizeworks/lens-core";
|
|
2
|
+
import type { ChClient } from "./http.js";
|
|
3
|
+
/** Traces and spans of a project. */
|
|
4
|
+
export declare function counts(ch: ChClient, projectId: string): Promise<{
|
|
5
|
+
traces: number;
|
|
6
|
+
spans: number;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function traceEnvs(ch: ChClient, projectId: string): Promise<string[]>;
|
|
9
|
+
/** Distinct hours with a trace start in (from, to]. */
|
|
10
|
+
export declare function activeHours(ch: ChClient, projectId: string, from: number, to: number): Promise<number>;
|
|
11
|
+
/** The newest trace start per project, over the last month (older projects count as quiet). */
|
|
12
|
+
export declare function lastTraceMs(ch: ChClient, now: number): Promise<Map<string, number>>;
|
|
13
|
+
/** The slowest endpoints by p95 (interpolated, like Postgres percentile_cont) with at least `minCount` requests. */
|
|
14
|
+
export declare function slowestEndpoints(ch: ChClient, projectId: string, w: TimeWindow, minCount: number, limit: number): Promise<{
|
|
15
|
+
endpoint: string;
|
|
16
|
+
p95Ms: number;
|
|
17
|
+
count: number;
|
|
18
|
+
}[]>;
|
|
19
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/queries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI1C,qCAAqC;AACrC,wBAAsB,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAIxG;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAElF;AAED,uDAAuD;AACvD,wBAAsB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5G;AAED,+FAA+F;AAC/F,wBAAsB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAOzF;AAED,oHAAoH;AACpH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;KAQrH"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const MONTH_MS = 30 * 86_400_000;
|
|
2
|
+
/** Traces and spans of a project. */
|
|
3
|
+
export async function counts(ch, projectId) {
|
|
4
|
+
const [t] = await ch.query("SELECT uniqExact(trace_id) AS n FROM trace_heads WHERE project_id = {p1:String}", [projectId]);
|
|
5
|
+
const [s] = await ch.query("SELECT count() AS n FROM spans_raw FINAL WHERE project_id = {p1:String}", [projectId]);
|
|
6
|
+
return { traces: Number(t?.n ?? 0), spans: Number(s?.n ?? 0) };
|
|
7
|
+
}
|
|
8
|
+
export async function traceEnvs(ch, projectId) {
|
|
9
|
+
return (await ch.query("SELECT DISTINCT env FROM trace_heads WHERE project_id = {p1:String}", [projectId])).map((r) => r.env);
|
|
10
|
+
}
|
|
11
|
+
/** Distinct hours with a trace start in (from, to]. */
|
|
12
|
+
export async function activeHours(ch, projectId, from, to) {
|
|
13
|
+
const [row] = await ch.query(`SELECT uniqExact(intDiv(toInt64(s), 3600000)) AS n FROM (SELECT min(start_ms) AS s FROM trace_heads WHERE project_id = {p1:String}
|
|
14
|
+
AND start_ms <= {p3:Float64} GROUP BY trace_id) WHERE s > {p2:Float64} AND s <= {p3:Float64}`, [projectId, from, to]);
|
|
15
|
+
return Number(row?.n ?? 0);
|
|
16
|
+
}
|
|
17
|
+
/** The newest trace start per project, over the last month (older projects count as quiet). */
|
|
18
|
+
export async function lastTraceMs(ch, now) {
|
|
19
|
+
const rows = await ch.query(`SELECT project_id, max(s) AS s FROM (SELECT project_id, trace_id, min(start_ms) AS s FROM trace_heads WHERE start_ms > {p1:Float64}
|
|
20
|
+
GROUP BY project_id, trace_id) GROUP BY project_id`, [now - MONTH_MS]);
|
|
21
|
+
return new Map(rows.map((r) => [r.project_id, Number(r.s)]));
|
|
22
|
+
}
|
|
23
|
+
/** The slowest endpoints by p95 (interpolated, like Postgres percentile_cont) with at least `minCount` requests. */
|
|
24
|
+
export async function slowestEndpoints(ch, projectId, w, minCount, limit) {
|
|
25
|
+
const rows = await ch.query(`SELECT endpoint, quantileExactInclusive(0.95)(duration_ms) AS p95, count() AS n FROM fact_requests
|
|
26
|
+
WHERE project_id = {p1:String} AND start_ms >= {p2:Float64} AND start_ms < {p3:Float64} GROUP BY endpoint HAVING n >= {p4:Float64}
|
|
27
|
+
ORDER BY p95 DESC LIMIT ${Math.max(0, Math.floor(limit))}`, [projectId, w.from, w.to, minCount]);
|
|
28
|
+
return rows.map((r) => ({ endpoint: r.endpoint, p95Ms: Number(r.p95), count: Number(r.n) }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/telemetry/ch/queries.ts"],"names":[],"mappings":"AAIA,MAAM,QAAQ,GAAG,EAAE,GAAG,UAAU,CAAC;AAEjC,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,EAAY,EAAE,SAAiB;IAC1D,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAgB,iFAAiF,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1I,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAgB,yEAAyE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAClI,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAY,EAAE,SAAiB;IAC7D,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,CAAkB,qEAAqE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACjJ,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAY,EAAE,SAAiB,EAAE,IAAY,EAAE,EAAU;IACzF,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAC1B;kGAC8F,EAC9F,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CACtB,CAAC;IACF,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAY,EAAE,GAAW;IACzD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CACzB;wDACoD,EACpD,CAAC,GAAG,GAAG,QAAQ,CAAC,CACjB,CAAC;IACF,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,oHAAoH;AACpH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAY,EAAE,SAAiB,EAAE,CAAa,EAAE,QAAgB,EAAE,KAAa;IACpH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CACzB;;+BAE2B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAC3D,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CACpC,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ChClient } from "./http.js";
|
|
2
|
+
export interface Dirty {
|
|
3
|
+
project: string;
|
|
4
|
+
traceId: string;
|
|
5
|
+
env: string;
|
|
6
|
+
/** The newest write. */
|
|
7
|
+
updatedMs: number;
|
|
8
|
+
/** When it last settled; 0 when never. */
|
|
9
|
+
settledMs: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class SettleQueue {
|
|
12
|
+
private readonly items;
|
|
13
|
+
/** Keys a settle batch holds, so an overlapping batch skips them. */
|
|
14
|
+
private readonly busy;
|
|
15
|
+
/** A trace got new parts. */
|
|
16
|
+
touch(project: string, traceId: string, env: string, now: number): void;
|
|
17
|
+
/** Traces quiet for a while, or busy ones not settled for long: newest first. */
|
|
18
|
+
due(now: number, limit: number): Dirty[];
|
|
19
|
+
/** Due traces for one batch, held until settled or released. Copies, so a write that lands meanwhile keeps its trace dirty. */
|
|
20
|
+
take(now: number, limit: number): Dirty[];
|
|
21
|
+
/** A failed batch: its traces wait for the next run. */
|
|
22
|
+
release(items: readonly Dirty[]): void;
|
|
23
|
+
/** Settled as of `updatedMs`: done unless something newer came in since. */
|
|
24
|
+
settled(d: Dirty, updatedMs: number): void;
|
|
25
|
+
/** How many traces of a project (optionally one environment, last written at or before `before`) still wait. */
|
|
26
|
+
count(project: string, env?: string, before?: number): number;
|
|
27
|
+
clear(project?: string): void;
|
|
28
|
+
get size(): number;
|
|
29
|
+
/** On start: traces written lately that never settled (or changed after), from the update log. */
|
|
30
|
+
recover(ch: ChClient, now: number): Promise<number>;
|
|
31
|
+
/** A trace whose stats are rebuilt from scratch (see `Rebuild`). Returns its key. */
|
|
32
|
+
requeue(project: string, traceId: string, env: string, updatedMs: number): string;
|
|
33
|
+
/** The trace with this key still waits. */
|
|
34
|
+
has(key: string): boolean;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;IAClD,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAE1C,6BAA6B;IAC7B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAKtE;IAED,iFAAiF;IACjF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAGvC;IAED,+HAA+H;IAC/H,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAIxC;IAED,wDAAwD;IACxD,OAAO,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,GAAG,IAAI,CAErC;IAED,4EAA4E;IAC5E,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOzC;IAED,gHAAgH;IAChH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,MAAM,CAI9D;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAE5B;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,kGAAkG;IAC5F,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASxD;IAED,qFAAqF;IACrF,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhF;IAED,2CAA2C;IAC3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExB;CACF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
const QUIET_MS = 5_000;
|
|
2
|
+
const BUSY_MS = 30_000;
|
|
3
|
+
const RECOVER_MS = 6 * 3_600_000;
|
|
4
|
+
export class SettleQueue {
|
|
5
|
+
items = new Map();
|
|
6
|
+
/** Keys a settle batch holds, so an overlapping batch skips them. */
|
|
7
|
+
busy = new Set();
|
|
8
|
+
/** A trace got new parts. */
|
|
9
|
+
touch(project, traceId, env, now) {
|
|
10
|
+
const k = `${project} ${traceId}`;
|
|
11
|
+
const it = this.items.get(k);
|
|
12
|
+
if (it)
|
|
13
|
+
(it.updatedMs = now), (it.env ||= env);
|
|
14
|
+
else
|
|
15
|
+
this.items.set(k, { project, traceId, env, updatedMs: now, settledMs: 0 });
|
|
16
|
+
}
|
|
17
|
+
/** Traces quiet for a while, or busy ones not settled for long: newest first. */
|
|
18
|
+
due(now, limit) {
|
|
19
|
+
const ready = [...this.items.entries()].filter(([k, d]) => !this.busy.has(k) && d.settledMs < d.updatedMs && (d.updatedMs <= now - QUIET_MS || d.settledMs <= now - BUSY_MS));
|
|
20
|
+
return ready.map(([, d]) => d).sort((a, b) => b.updatedMs - a.updatedMs).slice(0, limit);
|
|
21
|
+
}
|
|
22
|
+
/** Due traces for one batch, held until settled or released. Copies, so a write that lands meanwhile keeps its trace dirty. */
|
|
23
|
+
take(now, limit) {
|
|
24
|
+
const out = this.due(now, limit).map((d) => ({ ...d }));
|
|
25
|
+
for (const d of out)
|
|
26
|
+
this.busy.add(`${d.project} ${d.traceId}`);
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
/** A failed batch: its traces wait for the next run. */
|
|
30
|
+
release(items) {
|
|
31
|
+
for (const d of items)
|
|
32
|
+
this.busy.delete(`${d.project} ${d.traceId}`);
|
|
33
|
+
}
|
|
34
|
+
/** Settled as of `updatedMs`: done unless something newer came in since. */
|
|
35
|
+
settled(d, updatedMs) {
|
|
36
|
+
const k = `${d.project} ${d.traceId}`;
|
|
37
|
+
this.busy.delete(k);
|
|
38
|
+
const it = this.items.get(k);
|
|
39
|
+
if (!it)
|
|
40
|
+
return;
|
|
41
|
+
if (it.updatedMs <= updatedMs)
|
|
42
|
+
this.items.delete(k);
|
|
43
|
+
else
|
|
44
|
+
it.settledMs = updatedMs;
|
|
45
|
+
}
|
|
46
|
+
/** How many traces of a project (optionally one environment, last written at or before `before`) still wait. */
|
|
47
|
+
count(project, env, before = Infinity) {
|
|
48
|
+
let n = 0;
|
|
49
|
+
for (const d of this.items.values())
|
|
50
|
+
if (d.project === project && (!env || d.env === env) && d.updatedMs <= before)
|
|
51
|
+
n++;
|
|
52
|
+
return n;
|
|
53
|
+
}
|
|
54
|
+
clear(project) {
|
|
55
|
+
for (const [k, d] of this.items)
|
|
56
|
+
if (!project || d.project === project)
|
|
57
|
+
(this.items.delete(k), this.busy.delete(k));
|
|
58
|
+
}
|
|
59
|
+
get size() {
|
|
60
|
+
return this.items.size;
|
|
61
|
+
}
|
|
62
|
+
/** On start: traces written lately that never settled (or changed after), from the update log. */
|
|
63
|
+
async recover(ch, now) {
|
|
64
|
+
const rows = await ch.query(`SELECT u.project_id, u.trace_id, any(u.env) AS env, max(u.updated_ms) AS u, any(s.settled_ms) AS s FROM trace_updates u
|
|
65
|
+
LEFT JOIN (SELECT project_id, trace_id, settled_ms FROM settle_state FINAL) s ON s.project_id = u.project_id AND s.trace_id = u.trace_id
|
|
66
|
+
WHERE u.updated_ms > {p1:Float64} GROUP BY u.project_id, u.trace_id HAVING u > s`, [now - RECOVER_MS]);
|
|
67
|
+
for (const r of rows)
|
|
68
|
+
this.items.set(`${r.project_id} ${r.trace_id}`, { project: r.project_id, traceId: r.trace_id, env: r.env, updatedMs: r.u, settledMs: r.s });
|
|
69
|
+
return rows.length;
|
|
70
|
+
}
|
|
71
|
+
/** A trace whose stats are rebuilt from scratch (see `Rebuild`). Returns its key. */
|
|
72
|
+
requeue(project, traceId, env, updatedMs) {
|
|
73
|
+
const k = `${project} ${traceId}`;
|
|
74
|
+
const it = this.items.get(k);
|
|
75
|
+
this.items.set(k, { project, traceId, env: it?.env || env, updatedMs: Math.max(it?.updatedMs ?? 0, updatedMs), settledMs: 0 });
|
|
76
|
+
return k;
|
|
77
|
+
}
|
|
78
|
+
/** The trace with this key still waits. */
|
|
79
|
+
has(key) {
|
|
80
|
+
return this.items.has(key);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/telemetry/ch/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Trace } from "@wizeworks/lens-core";
|
|
2
|
+
import type { TraceQuery } from "../store.js";
|
|
3
|
+
import type { ChClient } from "./http.js";
|
|
4
|
+
/** Newest traces that match, widening the lookback until enough are found. */
|
|
5
|
+
export declare function findTraceIds(ch: ChClient, t: TraceQuery, now: number): Promise<string[]>;
|
|
6
|
+
/** Whole traces of some projects, in the order of `ids`. Spans that two projects both sent count once. */
|
|
7
|
+
export declare function loadTraces(ch: ChClient, projects: readonly string[], ids: readonly string[]): Promise<Trace[]>;
|
|
8
|
+
/** One trace, or undefined when nothing of it is stored. */
|
|
9
|
+
export declare function getTrace(ch: ChClient, projects: readonly string[], traceId: string): Promise<Trace | undefined>;
|
|
10
|
+
/** The primary project's trace joined with its parts from `scope`; undefined when the primary project has none. */
|
|
11
|
+
export declare function joinedTrace(ch: ChClient, primaryId: string, scope: readonly string[], traceId: string): Promise<Trace | undefined>;
|
|
12
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/read.ts"],"names":[],"mappings":"AACA,OAAO,EAA6D,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAyB1C,8EAA8E;AAC9E,wBAAsB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM9F;AAWD,0GAA0G;AAC1G,wBAAsB,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CASpH;AAED,4DAA4D;AAC5D,wBAAsB,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAGrH;AAED,mHAAmH;AACnH,wBAAsB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAIxI"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Trace reads on ClickHouse: lists from the bounds table, whole traces from the raw spans and logs.
|
|
2
|
+
import { buildTrace, LOOSE_TRACE_PREFIX } from "@wizeworks/lens-core";
|
|
3
|
+
const CHUNK = 500;
|
|
4
|
+
/** Lists look back this far first, and further only when they find too few traces. */
|
|
5
|
+
const LOOKBACKS_MS = [3_600_000, 86_400_000, 7 * 86_400_000, Number.POSITIVE_INFINITY];
|
|
6
|
+
/** Trace ids, newest start first, for one lookback. Row filters narrow before grouping; HAVING checks the merged bounds. */
|
|
7
|
+
async function idsWithin(ch, t, now, backMs) {
|
|
8
|
+
const params = [t.projectId];
|
|
9
|
+
const p = (v, type) => (params.push(v), `{p${params.length}:${type}}`);
|
|
10
|
+
const rows = ["project_id = {p1:String}"];
|
|
11
|
+
if (Number.isFinite(backMs))
|
|
12
|
+
rows.push(`start_ms >= ${p(now - backMs, "Float64")}`);
|
|
13
|
+
if (t.since !== undefined)
|
|
14
|
+
rows.push(`updated_ms >= ${p(t.since, "Float64")}`);
|
|
15
|
+
if (t.before !== undefined)
|
|
16
|
+
rows.push(`start_ms < ${p(t.before, "Float64")}`);
|
|
17
|
+
if (t.session)
|
|
18
|
+
rows.push(`trace_id IN (SELECT trace_id FROM spans_raw WHERE project_id = {p1:String} AND session = ${p(t.session, "String")})`);
|
|
19
|
+
if (t.noLoose)
|
|
20
|
+
rows.push(`NOT startsWith(trace_id, ${p(LOOSE_TRACE_PREFIX, "String")})`);
|
|
21
|
+
const having = ["1"];
|
|
22
|
+
if (t.from !== undefined)
|
|
23
|
+
having.push(`s >= ${p(t.from, "Float64")}`);
|
|
24
|
+
if (t.before !== undefined)
|
|
25
|
+
having.push(`s < ${p(t.before, "Float64")}`);
|
|
26
|
+
if (t.env)
|
|
27
|
+
having.push(`e = ${p(t.env, "String")}`);
|
|
28
|
+
const sql = `SELECT trace_id, min(start_ms) AS s, max(env) AS e FROM trace_heads WHERE ${rows.join(" AND ")} GROUP BY trace_id
|
|
29
|
+
HAVING ${having.join(" AND ")} ORDER BY s DESC, trace_id LIMIT ${Math.max(1, Math.floor(t.limit))}`;
|
|
30
|
+
return (await ch.query(sql, params)).map((r) => r.trace_id);
|
|
31
|
+
}
|
|
32
|
+
/** Newest traces that match, widening the lookback until enough are found. */
|
|
33
|
+
export async function findTraceIds(ch, t, now) {
|
|
34
|
+
for (const back of LOOKBACKS_MS) {
|
|
35
|
+
const ids = await idsWithin(ch, t, now, back);
|
|
36
|
+
if (ids.length >= t.limit || !Number.isFinite(back))
|
|
37
|
+
return ids;
|
|
38
|
+
}
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
async function jsonOf(ch, table, projects, ids) {
|
|
42
|
+
const out = new Map();
|
|
43
|
+
for (let i = 0; i < ids.length; i += CHUNK) {
|
|
44
|
+
const sql = `SELECT trace_id, json FROM ${table} FINAL WHERE has({p1:Array(String)}, project_id) AND has({p2:Array(String)}, trace_id)`;
|
|
45
|
+
for (const r of await ch.query(sql, [projects, ids.slice(i, i + CHUNK)]))
|
|
46
|
+
out.set(r.trace_id, [...(out.get(r.trace_id) ?? []), r.json]);
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
/** Whole traces of some projects, in the order of `ids`. Spans that two projects both sent count once. */
|
|
51
|
+
export async function loadTraces(ch, projects, ids) {
|
|
52
|
+
if (ids.length === 0)
|
|
53
|
+
return [];
|
|
54
|
+
const [spans, logs] = await Promise.all([jsonOf(ch, "spans_raw", projects, ids), jsonOf(ch, "logs_raw", projects, ids)]);
|
|
55
|
+
return ids.map((id) => {
|
|
56
|
+
const seen = new Set();
|
|
57
|
+
const s = (spans.get(id) ?? []).map((j) => JSON.parse(j)).filter((x) => !seen.has(x.spanId) && seen.add(x.spanId));
|
|
58
|
+
const l = (logs.get(id) ?? []).map((j) => JSON.parse(j)).sort((a, b) => a.timeMs - b.timeMs);
|
|
59
|
+
return buildTrace(id, s, l, []);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** One trace, or undefined when nothing of it is stored. */
|
|
63
|
+
export async function getTrace(ch, projects, traceId) {
|
|
64
|
+
const [t] = await loadTraces(ch, projects, [traceId]);
|
|
65
|
+
return t && t.spanCount + t.logs.length > 0 ? t : undefined;
|
|
66
|
+
}
|
|
67
|
+
/** The primary project's trace joined with its parts from `scope`; undefined when the primary project has none. */
|
|
68
|
+
export async function joinedTrace(ch, primaryId, scope, traceId) {
|
|
69
|
+
const own = await getTrace(ch, [primaryId], traceId);
|
|
70
|
+
if (!own || scope.every((id) => id === primaryId))
|
|
71
|
+
return own;
|
|
72
|
+
return getTrace(ch, [...new Set([primaryId, ...scope])], traceId);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/telemetry/ch/read.ts"],"names":[],"mappings":"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"}
|