@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,52 @@
|
|
|
1
|
+
// The heavy part of a settle batch for one project: read its traces, build facts and deltas, and write them. Runs in a worker thread or in the main thread.
|
|
2
|
+
import { compact, factRows, FACT_TABLES, isLooseTraceId, mergeDeltas, settleDelta, storedOf, traceFacts, withoutTop } from "@wizeworks/lens-core";
|
|
3
|
+
import { loadTraces } from "./read.js";
|
|
4
|
+
import { factKeepOf, factObjects, tombstones, writeDeltas } from "./settle-rows.js";
|
|
5
|
+
const hasData = (t) => !!t && t.spanCount + t.logs.length > 0;
|
|
6
|
+
/** Stored contributions of some traces, by trace id. */
|
|
7
|
+
async function storedContribs(ch, project, ids) {
|
|
8
|
+
const rows = await ch.query("SELECT trace_id, contrib FROM settle_state FINAL WHERE project_id = {p1:String} AND has({p2:Array(String)}, trace_id)", [project, ids]);
|
|
9
|
+
return new Map(rows.map((r) => [r.trace_id, r.contrib]));
|
|
10
|
+
}
|
|
11
|
+
/** Facts, deltas, and new settle states for one project's dirty traces. */
|
|
12
|
+
async function projectWork(ch, t) {
|
|
13
|
+
const { project, items, now, retentionMs, logRetentionMs, ver } = t;
|
|
14
|
+
const keep = { ms: retentionMs, logMs: logRetentionMs };
|
|
15
|
+
const ids = items.map((d) => d.traceId);
|
|
16
|
+
const [traces, stored] = await Promise.all([loadTraces(ch, [project], ids), storedContribs(ch, project, ids)]);
|
|
17
|
+
const raw = Object.fromEntries(FACT_TABLES.map((t) => [t, []]));
|
|
18
|
+
const work = { facts: {}, deltas: [], states: [], resettled: [] };
|
|
19
|
+
items.forEach((d, i) => {
|
|
20
|
+
const trace = traces[i];
|
|
21
|
+
const scope = { project, env: d.env };
|
|
22
|
+
const facts = hasData(trace) ? traceFacts(trace, t.facts) : null;
|
|
23
|
+
const next = facts ? compact(facts, scope) : null;
|
|
24
|
+
const old = stored.get(d.traceId);
|
|
25
|
+
if (old !== undefined)
|
|
26
|
+
work.resettled.push(d.traceId);
|
|
27
|
+
work.deltas.push(settleDelta(storedOf(old || null), next, now, retentionMs, logRetentionMs));
|
|
28
|
+
if (facts)
|
|
29
|
+
for (const [t, rows] of Object.entries(factRows(facts, scope, trace)))
|
|
30
|
+
raw[t].push(...rows);
|
|
31
|
+
const start = trace?.startMs ?? now;
|
|
32
|
+
const stateKeep = isLooseTraceId(d.traceId) ? logRetentionMs : retentionMs;
|
|
33
|
+
work.states.push({ project_id: project, trace_id: d.traceId, settled_ms: d.updatedMs, contrib: next ? JSON.stringify(withoutTop(next)) : "", ver, expire_ms: start + stateKeep });
|
|
34
|
+
});
|
|
35
|
+
const timeOf = (r) => Number(r.start_ms ?? r.time_ms ?? now);
|
|
36
|
+
work.facts = factObjects(raw, ver, (r, table) => timeOf(r) + factKeepOf(table, r, keep));
|
|
37
|
+
return work;
|
|
38
|
+
}
|
|
39
|
+
/** Write one project's work: facts (with tombstones) and rollups at once, then the settle states, so a failed write settles again. */
|
|
40
|
+
async function writeWork(ch, t, w) {
|
|
41
|
+
// The same token on a retry lets ClickHouse keep one copy.
|
|
42
|
+
const label = (table) => ({ insert_deduplication_token: `${t.ver}:${t.project}:${table}` });
|
|
43
|
+
const dead = await tombstones(ch, t.project, w.resettled, w.facts, t.ver);
|
|
44
|
+
const facts = FACT_TABLES.map((f) => ch.insert(`${f}_t`, [...dead[f], ...w.facts[f]], label(f)));
|
|
45
|
+
await Promise.all([...facts, writeDeltas(ch, mergeDeltas(w.deltas), () => ({ ms: t.retentionMs, logMs: t.logRetentionMs }), label)]);
|
|
46
|
+
await ch.insert("settle_state", w.states, label("settle_state"));
|
|
47
|
+
}
|
|
48
|
+
/** Settle one project's part of a batch. */
|
|
49
|
+
export async function settleProject(ch, t) {
|
|
50
|
+
await writeWork(ch, t, await projectWork(ch, t));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=settle-work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle-work.js","sourceRoot":"","sources":["../../../src/telemetry/ch/settle-work.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle-worker.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/settle-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// A settle worker thread: settles the project tasks the main thread sends, on its own ClickHouse client.
|
|
2
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
3
|
+
import { chClient } from "./http.js";
|
|
4
|
+
import { settleProject } from "./settle-work.js";
|
|
5
|
+
const port = parentPort;
|
|
6
|
+
const ch = chClient({ url: workerData.url });
|
|
7
|
+
port.on("message", (job) => {
|
|
8
|
+
settleProject(ch, job.task).then(() => port.postMessage({ id: job.id }), (err) => port.postMessage({ id: job.id, error: err instanceof Error ? err.message : String(err) }));
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=settle-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle-worker.js","sourceRoot":"","sources":["../../../src/telemetry/ch/settle-worker.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAoB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOnE,MAAM,IAAI,GAAG,UAAW,CAAC;AACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAG,UAA8B,CAAC,GAAG,EAAE,CAAC,CAAC;AAElE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAQ,EAAE,EAAE;IAC9B,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAC9B,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EACtC,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAC5G,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ProjectSettings } from "@wizeworks/lens-core";
|
|
2
|
+
import type { SettleOptions } from "../store.js";
|
|
3
|
+
import type { SettleQueue } from "./queue.js";
|
|
4
|
+
import type { ProjectRunner } from "./settle-work.js";
|
|
5
|
+
import { type RetentionCache } from "./util.js";
|
|
6
|
+
export interface Settler {
|
|
7
|
+
queue: SettleQueue;
|
|
8
|
+
retention: RetentionCache;
|
|
9
|
+
logRetention: RetentionCache;
|
|
10
|
+
/** A project's own settings, for its thresholds. */
|
|
11
|
+
settingsOf?: (projectId: string) => Promise<ProjectSettings>;
|
|
12
|
+
/** Settles one project task: in a worker thread, or in this thread. */
|
|
13
|
+
run: ProjectRunner;
|
|
14
|
+
/** Batches at once: one reads and computes while others wait on their writes. */
|
|
15
|
+
depth: number;
|
|
16
|
+
/** Queues the next page of a stats rebuild, when one runs. */
|
|
17
|
+
refill?: () => Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/** Settle due traces until none are left or the budget is spent, with up to `depth` batches at once. */
|
|
20
|
+
export declare function settleClickHouse(s: Settler, now: number, o?: SettleOptions): Promise<number>;
|
|
21
|
+
//# sourceMappingURL=settle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/settle.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAS,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAKpE,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,cAAc,CAAC;IAC1B,YAAY,EAAE,cAAc,CAAC;IAC7B,oDAAoD;IACpD,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7D,uEAAuE;IACvE,GAAG,EAAE,aAAa,CAAC;IACnB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAqBD,wGAAwG;AACxG,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBtG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Settling on ClickHouse: the same facts and deltas as Postgres, written as inserts. One process settles, so no lock is needed.
|
|
2
|
+
import { factOptionsOf } from "@wizeworks/lens-core";
|
|
3
|
+
import { byProject, nextVer } from "./util.js";
|
|
4
|
+
const BATCH = 2_000;
|
|
5
|
+
const BUDGET_MS = 2_000;
|
|
6
|
+
/** Settle one batch of taken traces, one project at a time. A failure releases the ones not written yet. */
|
|
7
|
+
async function settleItems(s, now, due, o) {
|
|
8
|
+
let left = [...due];
|
|
9
|
+
try {
|
|
10
|
+
const days = await s.retention.daysOf(due.map((d) => d.project));
|
|
11
|
+
const logDays = await s.logRetention.daysOf(due.map((d) => d.project));
|
|
12
|
+
for (const [project, items] of byProject(due)) {
|
|
13
|
+
const facts = { ...o.defaultFacts, ...factOptionsOf(await s.settingsOf?.(project)) };
|
|
14
|
+
await s.run({ project, items: [...items], now, retentionMs: days.get(project) * 86_400_000, logRetentionMs: logDays.get(project) * 86_400_000, facts, ver: nextVer(now) });
|
|
15
|
+
for (const d of items)
|
|
16
|
+
s.queue.settled(d, d.updatedMs);
|
|
17
|
+
left = left.filter((d) => d.project !== project);
|
|
18
|
+
o.onSettled?.(project);
|
|
19
|
+
}
|
|
20
|
+
return due.length;
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
s.queue.release(left);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Settle due traces until none are left or the budget is spent, with up to `depth` batches at once. */
|
|
27
|
+
export async function settleClickHouse(s, now, o = {}) {
|
|
28
|
+
const start = Date.now();
|
|
29
|
+
const batch = o.batch ?? BATCH;
|
|
30
|
+
const running = [];
|
|
31
|
+
const started = [];
|
|
32
|
+
let total = 0;
|
|
33
|
+
await s.refill?.();
|
|
34
|
+
try {
|
|
35
|
+
for (;;) {
|
|
36
|
+
const due = s.queue.take(now, batch);
|
|
37
|
+
if (due.length) {
|
|
38
|
+
const run = settleItems(s, now, due, o);
|
|
39
|
+
// Handled now, awaited in turn: a batch that fails while another is awaited must not end the process.
|
|
40
|
+
run.catch(() => undefined);
|
|
41
|
+
running.push(run);
|
|
42
|
+
started.push(run);
|
|
43
|
+
}
|
|
44
|
+
const last = !due.length || due.length < batch || Date.now() - start >= (o.budgetMs ?? BUDGET_MS);
|
|
45
|
+
while (running.length && (last || running.length >= s.depth))
|
|
46
|
+
total += await running.shift();
|
|
47
|
+
if (last)
|
|
48
|
+
return total;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
await Promise.allSettled(started);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=settle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../../src/telemetry/ch/settle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type ProjectSettings, type SqlRunner } from "@wizeworks/lens-core";
|
|
2
|
+
import type { RetentionOf, TelemetryStore } from "../store.js";
|
|
3
|
+
import { type ChClient } from "./http.js";
|
|
4
|
+
import { type SettlePoolOptions } from "./settle-pool.js";
|
|
5
|
+
export interface ChStoreOptions {
|
|
6
|
+
url: string;
|
|
7
|
+
retentionOf: RetentionOf;
|
|
8
|
+
/** Log retention days per project; the trace retention when absent. */
|
|
9
|
+
logRetentionOf?: RetentionOf;
|
|
10
|
+
/** A project's own settings, for the thresholds its traces settle with. */
|
|
11
|
+
settingsOf?: (projectId: string) => Promise<ProjectSettings>;
|
|
12
|
+
defaultRetentionDays: number;
|
|
13
|
+
/** The clock for recovery on start. */
|
|
14
|
+
now: () => number;
|
|
15
|
+
/** False leaves the TTLs out (tests on a fixed clock). Default true. */
|
|
16
|
+
ttl?: boolean;
|
|
17
|
+
/** Worker threads for settle. Default 0: settle in this thread. */
|
|
18
|
+
settleWorkers?: number;
|
|
19
|
+
/** For tests: traces per page of a stats rebuild. */
|
|
20
|
+
rebuildPage?: number;
|
|
21
|
+
/** For tests: the worker file and its Node flags. */
|
|
22
|
+
worker?: Pick<SettlePoolOptions, "entry" | "execArgv">;
|
|
23
|
+
}
|
|
24
|
+
export declare const chRunner: (ch: ChClient) => SqlRunner;
|
|
25
|
+
/** Create the schema, rebuild the settle queue, and return the store. */
|
|
26
|
+
export declare function openClickHouse(o: ChStoreOptions): Promise<TelemetryStore>;
|
|
27
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwF,KAAK,eAAe,EAA0C,KAAK,SAAS,EAAc,MAAM,sBAAsB,CAAC;AACtN,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,WAAW,CAAC;AAQpD,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAKtE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,WAAW,CAAC;IACzB,uEAAuE;IACvE,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uCAAuC;IACvC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,wEAAwE;IACxE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,MAAM,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;CACxD;AAkBD,eAAO,MAAM,QAAQ,OAAQ,QAAQ,KAAG,SAAuF,CAAC;AAWhI,yEAAyE;AACzE,wBAAsB,cAAc,CAAC,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAQ/E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Scale mode: telemetry in ClickHouse. Reads go through views with the Postgres names, so the shared SQL answers pages and searches.
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { alignNow, CH_DIALECT, infraSteps, metricAlertSteps, metricPageSteps, runMetricAsync, searchSql, sqlExecutor, suggestSql } from "@wizeworks/lens-core";
|
|
5
|
+
import { checkFactsVersionCh, clearProjectCh, syncProjects } from "./admin.js";
|
|
6
|
+
import { chClient } from "./http.js";
|
|
7
|
+
import { MetricWriter } from "./metrics.js";
|
|
8
|
+
import { activeHours, counts, lastTraceMs, slowestEndpoints, traceEnvs } from "./queries.js";
|
|
9
|
+
import { SettleQueue } from "./queue.js";
|
|
10
|
+
import { Rebuild } from "./rebuild.js";
|
|
11
|
+
import { findTraceIds, getTrace, joinedTrace, loadTraces } from "./read.js";
|
|
12
|
+
import { migrateClickHouse } from "./schema.js";
|
|
13
|
+
import { settleClickHouse } from "./settle.js";
|
|
14
|
+
import { SettlePool } from "./settle-pool.js";
|
|
15
|
+
import { settleProject } from "./settle-work.js";
|
|
16
|
+
import { RetentionCache } from "./util.js";
|
|
17
|
+
import { writeRaw } from "./write.js";
|
|
18
|
+
const DEPTH = 3;
|
|
19
|
+
const DEFAULT_WORKER = new URL("./settle-worker.js", import.meta.url);
|
|
20
|
+
/** Settle in worker threads when there are any and the worker file is built (it is not when tests run the sources), else here. */
|
|
21
|
+
function settlerOf(ch, o, queue, rebuild) {
|
|
22
|
+
const refill = () => rebuild.refill();
|
|
23
|
+
const retention = new RetentionCache(o.retentionOf, o.defaultRetentionDays);
|
|
24
|
+
const logRetention = new RetentionCache(o.logRetentionOf ?? o.retentionOf, o.defaultRetentionDays);
|
|
25
|
+
const entry = o.worker?.entry ?? DEFAULT_WORKER;
|
|
26
|
+
const size = existsSync(fileURLToPath(entry)) ? Math.max(0, o.settleWorkers ?? 0) : 0;
|
|
27
|
+
const settingsOf = o.settingsOf;
|
|
28
|
+
if (!size)
|
|
29
|
+
return { settler: { queue, retention, logRetention, settingsOf, run: (t) => settleProject(ch, t), depth: DEPTH, refill }, pool: null, rebuild };
|
|
30
|
+
const pool = new SettlePool({ url: o.url, size, ...o.worker });
|
|
31
|
+
return { settler: { queue, retention, logRetention, settingsOf, run: pool.run, depth: Math.max(DEPTH, size * 2), refill }, pool, rebuild };
|
|
32
|
+
}
|
|
33
|
+
export const chRunner = (ch) => ({ all: (sql, params) => ch.query(sql, params) });
|
|
34
|
+
/** ClickHouse may still be starting (a deploy starts both at once): wait up to two minutes. */
|
|
35
|
+
async function waitReady(ch) {
|
|
36
|
+
for (let i = 0; i < 60; i++) {
|
|
37
|
+
if (await ch.ping())
|
|
38
|
+
return;
|
|
39
|
+
await new Promise((r) => setTimeout(r, 2_000));
|
|
40
|
+
}
|
|
41
|
+
throw new Error("ClickHouse did not answer /ping for two minutes. Check --clickhouse and that the server runs.");
|
|
42
|
+
}
|
|
43
|
+
/** Create the schema, rebuild the settle queue, and return the store. */
|
|
44
|
+
export async function openClickHouse(o) {
|
|
45
|
+
const ch = chClient({ url: o.url });
|
|
46
|
+
await waitReady(ch);
|
|
47
|
+
await migrateClickHouse(o.url, ch, { ttl: o.ttl });
|
|
48
|
+
const queue = new SettleQueue();
|
|
49
|
+
await queue.recover(ch, o.now());
|
|
50
|
+
const rebuild = await Rebuild.open(ch, queue, o.rebuildPage);
|
|
51
|
+
return chTelemetry(ch, settlerOf(ch, o, queue, rebuild), { days: o.retentionOf, logDays: o.logRetentionOf ?? o.retentionOf });
|
|
52
|
+
}
|
|
53
|
+
function chTelemetry(ch, { settler, pool, rebuild }, retentionOf) {
|
|
54
|
+
const { queue, retention, logRetention } = settler;
|
|
55
|
+
const src = (projectId) => ({ d: CH_DIALECT, run: chRunner(ch), scope: { project: projectId } });
|
|
56
|
+
const metrics = new MetricWriter(ch);
|
|
57
|
+
const runMetric = (s) => ch.query(s.sql, s.args);
|
|
58
|
+
// One settle at a time: the queue hands each trace to one run, so a second call waits for the first rather than return before its traces are written.
|
|
59
|
+
let settled = Promise.resolve();
|
|
60
|
+
return {
|
|
61
|
+
kind: "clickhouse",
|
|
62
|
+
async write(projectId, w, now) {
|
|
63
|
+
const retentionMs = await retention.msOf(projectId);
|
|
64
|
+
await writeRaw(ch, queue, projectId, w, now, { ms: retentionMs, logMs: await logRetention.msOf(projectId) });
|
|
65
|
+
await metrics.write(projectId, w.sender.environment ?? "", w.metrics ?? [], now, retentionMs);
|
|
66
|
+
},
|
|
67
|
+
traces: async (t) => loadTraces(ch, [t.projectId], await findTraceIds(ch, t, Date.now())),
|
|
68
|
+
trace: (projectId, traceId) => getTrace(ch, [projectId], traceId),
|
|
69
|
+
joinedTrace: (primaryId, scope, traceId) => joinedTrace(ch, primaryId, scope, traceId),
|
|
70
|
+
counts: (projectId) => counts(ch, projectId),
|
|
71
|
+
traceEnvs: (projectId) => traceEnvs(ch, projectId),
|
|
72
|
+
activeHours: (projectId, from, to) => activeHours(ch, projectId, from, to),
|
|
73
|
+
lastTraceMs: () => lastTraceMs(ch, Date.now()),
|
|
74
|
+
executor: (projectId, retentionMs, env) => sqlExecutor({ ...src(projectId), scope: { project: projectId, env }, retentionMs, loadTrace: (id) => getTrace(ch, [projectId], id).then((t) => t ?? null) }),
|
|
75
|
+
settling: async (projectId, o = {}) => queue.count(projectId, o.env, o.before) || null,
|
|
76
|
+
search: (projectId, q) => searchSql(src(projectId), q),
|
|
77
|
+
suggest: (projectId, r) => suggestSql(src(projectId), r),
|
|
78
|
+
slowestEndpoints: (projectId, w, minCount, limit) => slowestEndpoints(ch, projectId, w, minCount, limit),
|
|
79
|
+
metricData: (m, range, params, now) => runMetricAsync(metricPageSteps("ch", { project: m.projectId, env: m.env }, range, alignNow(now), params), runMetric),
|
|
80
|
+
metricAlertData: (m, name, w, now) => runMetricAsync(metricAlertSteps("ch", { project: m.projectId, env: m.env, service: m.service }, name, w, now), runMetric),
|
|
81
|
+
infraData: (m, range, params, now) => runMetricAsync(infraSteps("ch", { project: m.projectId, env: m.env }, range, alignNow(now), params), runMetric),
|
|
82
|
+
settle(now, o) {
|
|
83
|
+
const run = settled.then(() => settleClickHouse(settler, now, o));
|
|
84
|
+
settled = run.catch(() => undefined);
|
|
85
|
+
return run;
|
|
86
|
+
},
|
|
87
|
+
prune: (now) => syncProjects(ch, queue, retentionOf, now),
|
|
88
|
+
pruneRollups: async () => undefined,
|
|
89
|
+
checkFactsVersion: () => checkFactsVersionCh(ch, rebuild),
|
|
90
|
+
clearProject: (projectId) => clearProjectCh(ch, queue, projectId),
|
|
91
|
+
close: async () => pool?.close(),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/telemetry/ch/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RetentionOf } from "../store.js";
|
|
2
|
+
declare const DAY_MS = 86400000;
|
|
3
|
+
/** A row version that only grows: ms times 1000, plus a counter within the same ms. */
|
|
4
|
+
export declare function nextVer(now: number): number;
|
|
5
|
+
/** Retention days per project, from Postgres, cached for a minute. */
|
|
6
|
+
export declare class RetentionCache {
|
|
7
|
+
private readonly lookup;
|
|
8
|
+
private readonly defaultDays;
|
|
9
|
+
private readonly cache;
|
|
10
|
+
constructor(lookup: RetentionOf, defaultDays: number);
|
|
11
|
+
daysOf(projectIds: readonly string[]): Promise<Map<string, number>>;
|
|
12
|
+
msOf(projectId: string): Promise<number>;
|
|
13
|
+
}
|
|
14
|
+
/** How long a project keeps trace rows and log rows, in ms. */
|
|
15
|
+
export interface Keep {
|
|
16
|
+
ms: number;
|
|
17
|
+
logMs: number;
|
|
18
|
+
}
|
|
19
|
+
/** How long a log line is kept: the log retention outside a request; in one, never past its trace. */
|
|
20
|
+
export declare const logKeepOf: (traceId: string, keep: Keep) => number;
|
|
21
|
+
/** A row object from a column list and values in the same order. */
|
|
22
|
+
export declare function rowOf(cols: readonly string[], values: readonly unknown[]): Record<string, unknown>;
|
|
23
|
+
export declare const byProject: <T extends {
|
|
24
|
+
project: string;
|
|
25
|
+
}>(items: readonly T[]) => Map<string, T[]>;
|
|
26
|
+
export { DAY_MS };
|
|
27
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/util.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,QAAA,MAAM,MAAM,WAAa,CAAC;AAK1B,uFAAuF;AACvF,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED,sEAAsE;AACtE,qBAAa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqD;IAE3E,YACmB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EAClC;IAEE,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQxE;IAEK,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7C;CACF;AAED,+DAA+D;AAC/D,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,sGAAsG;AACtG,eAAO,MAAM,SAAS,YAAa,MAAM,QAAQ,IAAI,KAAG,MAAgF,CAAC;AAEzI,oEAAoE;AACpE,wBAAgB,KAAK,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIlG;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,SAAS,SAAS,CAAC,EAAE,KAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAI7F,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Shared bits of the ClickHouse store: row versions, retention lookups, and row objects from column lists.
|
|
2
|
+
import { isLooseTraceId } from "@wizeworks/lens-core";
|
|
3
|
+
const DAY_MS = 86_400_000;
|
|
4
|
+
const RETENTION_CACHE_MS = 60_000;
|
|
5
|
+
let lastVer = 0;
|
|
6
|
+
/** A row version that only grows: ms times 1000, plus a counter within the same ms. */
|
|
7
|
+
export function nextVer(now) {
|
|
8
|
+
lastVer = Math.max(lastVer + 1, Math.floor(now) * 1000);
|
|
9
|
+
return lastVer;
|
|
10
|
+
}
|
|
11
|
+
/** Retention days per project, from Postgres, cached for a minute. */
|
|
12
|
+
export class RetentionCache {
|
|
13
|
+
lookup;
|
|
14
|
+
defaultDays;
|
|
15
|
+
cache = new Map();
|
|
16
|
+
constructor(lookup, defaultDays) {
|
|
17
|
+
this.lookup = lookup;
|
|
18
|
+
this.defaultDays = defaultDays;
|
|
19
|
+
}
|
|
20
|
+
async daysOf(projectIds) {
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
const missing = [...new Set(projectIds)].filter((id) => !this.cache.has(id) || now - this.cache.get(id).atMs > RETENTION_CACHE_MS);
|
|
23
|
+
if (missing.length) {
|
|
24
|
+
const found = await this.lookup(missing);
|
|
25
|
+
for (const id of missing)
|
|
26
|
+
this.cache.set(id, { days: found.get(id) ?? this.defaultDays, atMs: now });
|
|
27
|
+
}
|
|
28
|
+
return new Map(projectIds.map((id) => [id, this.cache.get(id).days]));
|
|
29
|
+
}
|
|
30
|
+
async msOf(projectId) {
|
|
31
|
+
return (await this.daysOf([projectId])).get(projectId) * DAY_MS;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** How long a log line is kept: the log retention outside a request; in one, never past its trace. */
|
|
35
|
+
export const logKeepOf = (traceId, keep) => (isLooseTraceId(traceId) ? keep.logMs : Math.min(keep.ms, keep.logMs));
|
|
36
|
+
/** A row object from a column list and values in the same order. */
|
|
37
|
+
export function rowOf(cols, values) {
|
|
38
|
+
const out = {};
|
|
39
|
+
cols.forEach((c, i) => (out[c] = values[i] ?? null));
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
export const byProject = (items) => {
|
|
43
|
+
const out = new Map();
|
|
44
|
+
for (const it of items)
|
|
45
|
+
out.set(it.project, [...(out.get(it.project) ?? []), it]);
|
|
46
|
+
return out;
|
|
47
|
+
};
|
|
48
|
+
export { DAY_MS };
|
|
49
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/telemetry/ch/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HubWrite } from "@wizeworks/lens-hub/kit";
|
|
2
|
+
import type { ChClient } from "./http.js";
|
|
3
|
+
import type { SettleQueue } from "./queue.js";
|
|
4
|
+
import { type Keep } from "./util.js";
|
|
5
|
+
/** Small batches from many add-ons: ClickHouse buffers them into one part, and answers once they are written. */
|
|
6
|
+
export declare const ASYNC: {
|
|
7
|
+
async_insert: string;
|
|
8
|
+
wait_for_async_insert: string;
|
|
9
|
+
};
|
|
10
|
+
/** Save one batch's raw telemetry and queue its traces for settling. Metric rollups are written by the caller. */
|
|
11
|
+
export declare function writeRaw(ch: ChClient, queue: SettleQueue, projectId: string, w: HubWrite, now: number, keep: Keep): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/write.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,KAAK,IAAI,EAAsB,MAAM,WAAW,CAAC;AAE1D,iHAAiH;AACjH,eAAO,MAAM,KAAK;IAAK,YAAY;IAAO,qBAAqB;CAAO,CAAC;AA0CvE,kHAAkH;AAClH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAavI"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Ingest into ClickHouse: raw spans, logs, trace bounds, the update log, and metric points. Server-side async inserts batch the small writes.
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { ATTR_BROWSER_SESSION, isLooseTraceId, logKey, seriesKeyOf } from "@wizeworks/lens-core";
|
|
4
|
+
import { logKeepOf, nextVer } from "./util.js";
|
|
5
|
+
/** Small batches from many add-ons: ClickHouse buffers them into one part, and answers once they are written. */
|
|
6
|
+
export const ASYNC = { async_insert: "1", wait_for_async_insert: "1" };
|
|
7
|
+
const sha1 = (text) => createHash("sha1").update(text).digest("hex");
|
|
8
|
+
const sessionOf = (s) => {
|
|
9
|
+
const v = s.attributes[ATTR_BROWSER_SESSION];
|
|
10
|
+
return typeof v === "string" && v ? v : null;
|
|
11
|
+
};
|
|
12
|
+
/** One bounds row per trace in the batch: its earliest start and latest end here. */
|
|
13
|
+
function headRows(w, projectId, now, keep) {
|
|
14
|
+
const bounds = new Map();
|
|
15
|
+
const touch = (id, start, end) => {
|
|
16
|
+
const b = bounds.get(id);
|
|
17
|
+
bounds.set(id, b ? [Math.min(b[0], start), Math.max(b[1], end)] : [start, end]);
|
|
18
|
+
};
|
|
19
|
+
for (const s of w.spans)
|
|
20
|
+
touch(s.traceId, s.startMs, s.startMs + s.durationMs);
|
|
21
|
+
for (const { traceId, log } of w.logs)
|
|
22
|
+
touch(traceId, log.timeMs, log.timeMs);
|
|
23
|
+
const env = w.sender.environment ?? "";
|
|
24
|
+
return [...bounds].map(([trace_id, [start, end]]) => ({ project_id: projectId, trace_id, start_ms: start, end_ms: end, updated_ms: now, env, expire_ms: start + (isLooseTraceId(trace_id) ? keep.logMs : keep.ms) }));
|
|
25
|
+
}
|
|
26
|
+
function spanRows(w, projectId, ver, expire) {
|
|
27
|
+
return w.spans.map((s) => ({
|
|
28
|
+
project_id: projectId, trace_id: s.traceId, span_id: s.spanId, service: s.service, start_ms: s.startMs, duration_ms: s.durationMs,
|
|
29
|
+
session: sessionOf(s), json: JSON.stringify(s), ver, expire_ms: expire(s.startMs),
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
function logRows(w, projectId, ver, keep) {
|
|
33
|
+
return w.logs.map(({ traceId, log }) => ({
|
|
34
|
+
project_id: projectId, trace_id: traceId, key: sha1(logKey(log)), time_ms: log.timeMs, json: JSON.stringify(log), ver, expire_ms: log.timeMs + logKeepOf(traceId, keep),
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
function pointRows(w, projectId, expire) {
|
|
38
|
+
const env = w.sender.environment ?? "";
|
|
39
|
+
return (w.metrics ?? []).map((p) => ({
|
|
40
|
+
project_id: projectId, time_ms: p.timeMs, env, service: p.service, name: p.name, series_key: sha1(seriesKeyOf(p)), json: JSON.stringify(p), expire_ms: expire(p.timeMs),
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
/** Save one batch's raw telemetry and queue its traces for settling. Metric rollups are written by the caller. */
|
|
44
|
+
export async function writeRaw(ch, queue, projectId, w, now, keep) {
|
|
45
|
+
const expire = (ms) => ms + keep.ms;
|
|
46
|
+
const ver = nextVer(now);
|
|
47
|
+
const heads = headRows(w, projectId, now, keep);
|
|
48
|
+
await Promise.all([
|
|
49
|
+
ch.insert("spans_raw", spanRows(w, projectId, ver, expire), ASYNC),
|
|
50
|
+
ch.insert("logs_raw", logRows(w, projectId, ver, keep), ASYNC),
|
|
51
|
+
ch.insert("metric_points_raw", pointRows(w, projectId, expire), ASYNC),
|
|
52
|
+
]);
|
|
53
|
+
// Bounds and the update log go last, so a settle never sees a trace before its parts.
|
|
54
|
+
const updates = heads.map((h) => ({ project_id: h.project_id, trace_id: h.trace_id, updated_ms: now, env: h.env }));
|
|
55
|
+
await Promise.all([ch.insert("trace_heads", heads, ASYNC), ch.insert("trace_updates", updates, ASYNC)]);
|
|
56
|
+
for (const h of heads)
|
|
57
|
+
queue.touch(projectId, h.trace_id, h.env, now);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/telemetry/ch/write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Db } from "../db/db.js";
|
|
2
|
+
import type { TelemetryStore } from "./store.js";
|
|
3
|
+
export interface CopyResult {
|
|
4
|
+
traces: number;
|
|
5
|
+
points: number;
|
|
6
|
+
}
|
|
7
|
+
/** Copy everything (the target settles it later); projects the target has are skipped, else rollups count twice; `force` copies them too, after the switch. */
|
|
8
|
+
export declare function copyTelemetry(db: Db, to: TelemetryStore, now: number, log?: (line: string) => void, force?: boolean): Promise<CopyResult>;
|
|
9
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/telemetry/copy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAoDD,+JAA+J;AAC/J,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAe,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAcvJ"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const PAGE = 500;
|
|
2
|
+
/** One page of a project's traces, newest first, after the (start, id) cursor. */
|
|
3
|
+
async function tracePage(db, projectId, after) {
|
|
4
|
+
const cursor = after ? "AND (start_ms < $2 OR (start_ms = $2 AND trace_id > $3))" : "";
|
|
5
|
+
return db.query(`SELECT trace_id, start_ms, env FROM traces WHERE project_id = $1 ${cursor} ORDER BY start_ms DESC, trace_id LIMIT ${PAGE}`, after ? [projectId, after[0], after[1]] : [projectId]);
|
|
6
|
+
}
|
|
7
|
+
async function partsOf(db, projectId, ids) {
|
|
8
|
+
const spans = await db.query("SELECT trace_id, json FROM spans WHERE project_id = $1 AND trace_id = ANY($2)", [projectId, [...ids]]);
|
|
9
|
+
const logs = await db.query("SELECT trace_id, json FROM logs WHERE project_id = $1 AND trace_id = ANY($2)", [projectId, [...ids]]);
|
|
10
|
+
return { spans, logs };
|
|
11
|
+
}
|
|
12
|
+
/** Every trace of a project, written one trace at a time so each keeps its environment. */
|
|
13
|
+
async function copyTraces(db, to, projectId, now) {
|
|
14
|
+
let after = null;
|
|
15
|
+
let n = 0;
|
|
16
|
+
for (;;) {
|
|
17
|
+
const page = await tracePage(db, projectId, after);
|
|
18
|
+
if (!page.length)
|
|
19
|
+
return n;
|
|
20
|
+
const { spans, logs } = await partsOf(db, projectId, page.map((t) => t.trace_id));
|
|
21
|
+
for (const t of page) {
|
|
22
|
+
const s = spans.filter((r) => r.trace_id === t.trace_id).map((r) => JSON.parse(r.json));
|
|
23
|
+
const l = logs.filter((r) => r.trace_id === t.trace_id).map((r) => ({ traceId: t.trace_id, log: JSON.parse(r.json) }));
|
|
24
|
+
await to.write(projectId, { sender: { service: s[0]?.service ?? "copy", environment: t.env }, via: "addon", spans: s, logs: l, remotes: [] }, now);
|
|
25
|
+
}
|
|
26
|
+
n += page.length;
|
|
27
|
+
after = [page[page.length - 1].start_ms, page[page.length - 1].trace_id];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Every metric point of a project, oldest first, in batches of one environment, so counters and rates come out as at ingest. */
|
|
31
|
+
async function copyPoints(db, to, projectId, now) {
|
|
32
|
+
let n = 0;
|
|
33
|
+
for (let offset = 0;; offset += PAGE * 10) {
|
|
34
|
+
const rows = await db.query(`SELECT env, json FROM metric_points WHERE project_id = $1 ORDER BY time_ms, series_key LIMIT ${PAGE * 10} OFFSET ${offset}`, [projectId]);
|
|
35
|
+
if (!rows.length)
|
|
36
|
+
return n;
|
|
37
|
+
for (const env of [...new Set(rows.map((r) => r.env))]) {
|
|
38
|
+
const metrics = rows.filter((r) => r.env === env).map((r) => JSON.parse(r.json));
|
|
39
|
+
await to.write(projectId, { sender: { service: "copy", environment: env }, via: "otlp", spans: [], logs: [], remotes: [], metrics }, now);
|
|
40
|
+
}
|
|
41
|
+
n += rows.length;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Copy everything (the target settles it later); projects the target has are skipped, else rollups count twice; `force` copies them too, after the switch. */
|
|
45
|
+
export async function copyTelemetry(db, to, now, log = () => { }, force = false) {
|
|
46
|
+
const out = { traces: 0, points: 0 };
|
|
47
|
+
for (const { id } of await db.query("SELECT id FROM projects ORDER BY id")) {
|
|
48
|
+
if (!force && (await to.counts(id)).traces > 0) {
|
|
49
|
+
log(` ${id}: already copied, skipped`);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const traces = await copyTraces(db, to, id, now);
|
|
53
|
+
const points = await copyPoints(db, to, id, now);
|
|
54
|
+
log(` ${id}: ${traces} traces, ${points} metric points`);
|
|
55
|
+
out.traces += traces;
|
|
56
|
+
out.points += points;
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/telemetry/copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CloudConfig } from "../config.js";
|
|
2
|
+
import type { Db } from "../db/db.js";
|
|
3
|
+
import type { RetentionOf, TelemetryStore } from "./store.js";
|
|
4
|
+
import { type SettingsCache } from "../repo/settings.js";
|
|
5
|
+
export type { MetricQuery, SettleOptions, TelemetryStore, TraceQuery } from "./store.js";
|
|
6
|
+
/** Retention days of the projects that still exist; deleted projects are left out. */
|
|
7
|
+
export declare const pgRetentionOf: (db: Db) => RetentionOf;
|
|
8
|
+
/** Log retention days of the projects that still exist: their own, else their organization's. */
|
|
9
|
+
export declare const pgLogRetentionOf: (db: Db) => RetentionOf;
|
|
10
|
+
/** The telemetry store for this cloud: ClickHouse (scale mode) when a URL is set, else the cloud's own database. */
|
|
11
|
+
export declare function openTelemetry(config: CloudConfig, db: Db, settings?: SettingsCache): Promise<TelemetryStore>;
|
|
12
|
+
/** Drop the telemetry of projects that were deleted (or cleared) in Postgres. */
|
|
13
|
+
export declare function clearProjects(t: TelemetryStore, projectIds: readonly string[]): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAKtC,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzF,sFAAsF;AACtF,eAAO,MAAM,aAAa,OAAQ,EAAE,KAAG,WAGtC,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,gBAAgB,OAAQ,EAAE,KAAG,WAA0C,CAAC;AAErF,oHAAoH;AACpH,wBAAsB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAMlH;AAED,iFAAiF;AACjF,wBAAsB,aAAa,CAAC,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnG"}
|