@wizeworks/lens-cloud 0.3.0-alpha.1 → 0.3.0-alpha.3
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 +58 -5
- package/dist/alerts/evaluate.d.ts.map +1 -1
- package/dist/alerts/evaluate.js +20 -6
- package/dist/alerts/evaluate.js.map +1 -1
- package/dist/alerts/notify.d.ts +13 -2
- package/dist/alerts/notify.d.ts.map +1 -1
- package/dist/alerts/notify.js +22 -16
- package/dist/alerts/notify.js.map +1 -1
- package/dist/app.d.ts +16 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/auth/auth.d.ts +51 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +63 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/bridge.d.ts +7 -0
- package/dist/auth/bridge.d.ts.map +1 -0
- package/dist/auth/bridge.js +39 -0
- package/dist/auth/bridge.js.map +1 -0
- package/dist/auth/crypto.d.ts +0 -5
- package/dist/auth/crypto.d.ts.map +1 -1
- package/dist/auth/crypto.js +3 -20
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/delete-user.d.ts +16 -0
- package/dist/auth/delete-user.d.ts.map +1 -0
- package/dist/auth/delete-user.js +21 -0
- package/dist/auth/delete-user.js.map +1 -0
- package/dist/auth/deps.d.ts +27 -0
- package/dist/auth/deps.d.ts.map +1 -0
- package/dist/auth/deps.js +3 -0
- package/dist/auth/deps.js.map +1 -0
- package/dist/auth/email-token.d.ts +8 -0
- package/dist/auth/email-token.d.ts.map +1 -0
- package/dist/auth/email-token.js +15 -0
- package/dist/auth/email-token.js.map +1 -0
- package/dist/auth/hooks.d.ts +4 -0
- package/dist/auth/hooks.d.ts.map +1 -0
- package/dist/auth/hooks.js +143 -0
- package/dist/auth/hooks.js.map +1 -0
- 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 +17 -0
- package/dist/auth/join-scope.js.map +1 -0
- package/dist/auth/options.d.ts +17 -0
- package/dist/auth/options.d.ts.map +1 -0
- package/dist/auth/options.js +98 -0
- package/dist/auth/options.js.map +1 -0
- package/dist/auth/password.d.ts +10 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +22 -0
- package/dist/auth/password.js.map +1 -0
- package/dist/auth/plugins.d.ts +4 -0
- package/dist/auth/plugins.d.ts.map +1 -0
- package/dist/auth/plugins.js +45 -0
- package/dist/auth/plugins.js.map +1 -0
- package/dist/auth/principal.d.ts +8 -3
- package/dist/auth/principal.d.ts.map +1 -1
- package/dist/auth/principal.js +13 -8
- package/dist/auth/principal.js.map +1 -1
- package/dist/auth/roles.d.ts +43 -3
- package/dist/auth/roles.d.ts.map +1 -1
- package/dist/auth/roles.js +15 -6
- package/dist/auth/roles.js.map +1 -1
- package/dist/auth/schema-names.d.ts +130 -0
- package/dist/auth/schema-names.d.ts.map +1 -0
- package/dist/auth/schema-names.js +53 -0
- package/dist/auth/schema-names.js.map +1 -0
- package/dist/auth/secret.d.ts +12 -0
- package/dist/auth/secret.d.ts.map +1 -0
- package/dist/auth/secret.js +32 -0
- package/dist/auth/secret.js.map +1 -0
- package/dist/auth/security-notices.d.ts +34 -0
- package/dist/auth/security-notices.d.ts.map +1 -0
- package/dist/auth/security-notices.js +81 -0
- package/dist/auth/security-notices.js.map +1 -0
- package/dist/auth/signup.d.ts +23 -0
- package/dist/auth/signup.d.ts.map +1 -0
- package/dist/auth/signup.js +61 -0
- package/dist/auth/signup.js.map +1 -0
- package/dist/auth/sso.d.ts +21 -0
- package/dist/auth/sso.d.ts.map +1 -0
- package/dist/auth/sso.js +35 -0
- package/dist/auth/sso.js.map +1 -0
- package/dist/auth/wire.d.ts +16 -0
- package/dist/auth/wire.d.ts.map +1 -0
- package/dist/auth/wire.js +47 -0
- package/dist/auth/wire.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 +66 -14
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +22 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +30 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +37 -0
- 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 +7 -2
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +28 -10
- package/dist/db/db.js.map +1 -1
- package/dist/db/migrate.d.ts +2 -2
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +15 -5
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema-auth.d.ts +2 -0
- package/dist/db/schema-auth.d.ts.map +1 -0
- package/dist/db/schema-auth.js +93 -0
- package/dist/db/schema-auth.js.map +1 -0
- package/dist/db/schema-mail.d.ts +2 -0
- package/dist/db/schema-mail.d.ts.map +1 -0
- package/dist/db/schema-mail.js +8 -0
- package/dist/db/schema-mail.js.map +1 -0
- package/dist/db/schema-notify.d.ts +2 -0
- package/dist/db/schema-notify.d.ts.map +1 -0
- package/dist/db/schema-notify.js +26 -0
- package/dist/db/schema-notify.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-sso.d.ts +2 -0
- package/dist/db/schema-sso.d.ts.map +1 -0
- package/dist/db/schema-sso.js +17 -0
- package/dist/db/schema-sso.js.map +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +10 -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 +2 -0
- package/dist/http/http.d.ts.map +1 -1
- package/dist/http/http.js +7 -3
- 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 -11
- package/dist/jobs.js.map +1 -1
- package/dist/mail/blocks.d.ts +14 -0
- package/dist/mail/blocks.d.ts.map +1 -0
- package/dist/mail/blocks.js +35 -0
- package/dist/mail/blocks.js.map +1 -0
- package/dist/mail/content.d.ts +68 -0
- package/dist/mail/content.d.ts.map +1 -0
- package/dist/mail/content.js +6 -0
- package/dist/mail/content.js.map +1 -0
- package/dist/mail/emails-digest.d.ts +10 -0
- package/dist/mail/emails-digest.d.ts.map +1 -0
- package/dist/mail/emails-digest.js +55 -0
- package/dist/mail/emails-digest.js.map +1 -0
- package/dist/mail/emails-health.d.ts +6 -0
- package/dist/mail/emails-health.d.ts.map +1 -0
- package/dist/mail/emails-health.js +36 -0
- package/dist/mail/emails-health.js.map +1 -0
- package/dist/mail/emails-security.d.ts +14 -0
- package/dist/mail/emails-security.d.ts.map +1 -0
- package/dist/mail/emails-security.js +27 -0
- package/dist/mail/emails-security.js.map +1 -0
- package/dist/mail/emails-team.d.ts +11 -0
- package/dist/mail/emails-team.d.ts.map +1 -0
- package/dist/mail/emails-team.js +45 -0
- package/dist/mail/emails-team.js.map +1 -0
- package/dist/mail/emails.d.ts +9 -0
- package/dist/mail/emails.d.ts.map +1 -0
- package/dist/mail/emails.js +49 -0
- package/dist/mail/emails.js.map +1 -0
- package/dist/mail/layout.d.ts +6 -0
- package/dist/mail/layout.d.ts.map +1 -0
- package/dist/mail/layout.js +10 -0
- package/dist/mail/layout.js.map +1 -0
- package/dist/mail/mailer.d.ts +25 -0
- package/dist/mail/mailer.d.ts.map +1 -0
- package/dist/mail/mailer.js +50 -0
- package/dist/mail/mailer.js.map +1 -0
- package/dist/mail/preview.d.ts +6 -0
- package/dist/mail/preview.d.ts.map +1 -0
- package/dist/mail/preview.js +26 -0
- package/dist/mail/preview.js.map +1 -0
- package/dist/mail/resend.d.ts +13 -0
- package/dist/mail/resend.d.ts.map +1 -0
- package/dist/mail/resend.js +34 -0
- package/dist/mail/resend.js.map +1 -0
- package/dist/mail/samples.d.ts +3 -0
- package/dist/mail/samples.d.ts.map +1 -0
- package/dist/mail/samples.js +63 -0
- package/dist/mail/samples.js.map +1 -0
- package/dist/mail/stop-route.d.ts +4 -0
- package/dist/mail/stop-route.d.ts.map +1 -0
- package/dist/mail/stop-route.js +41 -0
- package/dist/mail/stop-route.js.map +1 -0
- package/dist/mail/svix.d.ts +8 -0
- package/dist/mail/svix.d.ts.map +1 -0
- package/dist/mail/svix.js +17 -0
- package/dist/mail/svix.js.map +1 -0
- package/dist/mail/templates.d.ts +12 -0
- package/dist/mail/templates.d.ts.map +1 -0
- package/dist/mail/templates.js +18 -0
- package/dist/mail/templates.js.map +1 -0
- package/dist/mail/text.d.ts +4 -0
- package/dist/mail/text.d.ts.map +1 -0
- package/dist/mail/text.js +17 -0
- package/dist/mail/text.js.map +1 -0
- package/dist/mail/theme.d.ts +32 -0
- package/dist/mail/theme.d.ts.map +1 -0
- package/dist/mail/theme.js +27 -0
- package/dist/mail/theme.js.map +1 -0
- package/dist/mail/unsubscribe.d.ts +14 -0
- package/dist/mail/unsubscribe.d.ts.map +1 -0
- package/dist/mail/unsubscribe.js +39 -0
- package/dist/mail/unsubscribe.js.map +1 -0
- package/dist/mail/webhook.d.ts +5 -0
- package/dist/mail/webhook.d.ts.map +1 -0
- package/dist/mail/webhook.js +41 -0
- package/dist/mail/webhook.js.map +1 -0
- package/dist/notify/digest-data.d.ts +32 -0
- package/dist/notify/digest-data.d.ts.map +1 -0
- package/dist/notify/digest-data.js +31 -0
- package/dist/notify/digest-data.js.map +1 -0
- package/dist/notify/digest.d.ts +17 -0
- package/dist/notify/digest.d.ts.map +1 -0
- package/dist/notify/digest.js +76 -0
- package/dist/notify/digest.js.map +1 -0
- package/dist/notify/health.d.ts +6 -0
- package/dist/notify/health.d.ts.map +1 -0
- package/dist/notify/health.js +42 -0
- package/dist/notify/health.js.map +1 -0
- package/dist/notify/team-describe.d.ts +22 -0
- package/dist/notify/team-describe.d.ts.map +1 -0
- package/dist/notify/team-describe.js +67 -0
- package/dist/notify/team-describe.js.map +1 -0
- package/dist/notify/team.d.ts +6 -0
- package/dist/notify/team.d.ts.map +1 -0
- package/dist/notify/team.js +56 -0
- package/dist/notify/team.js.map +1 -0
- package/dist/repo/alerts.d.ts +6 -2
- package/dist/repo/alerts.d.ts.map +1 -1
- package/dist/repo/alerts.js.map +1 -1
- package/dist/repo/auth-prune.d.ts +4 -0
- package/dist/repo/auth-prune.d.ts.map +1 -0
- package/dist/repo/auth-prune.js +8 -0
- package/dist/repo/auth-prune.js.map +1 -0
- package/dist/repo/mail-prefs.d.ts +35 -0
- package/dist/repo/mail-prefs.d.ts.map +1 -0
- package/dist/repo/mail-prefs.js +34 -0
- package/dist/repo/mail-prefs.js.map +1 -0
- package/dist/repo/orgs.d.ts +15 -25
- package/dist/repo/orgs.d.ts.map +1 -1
- package/dist/repo/orgs.js +18 -60
- package/dist/repo/orgs.js.map +1 -1
- package/dist/repo/services.d.ts +6 -0
- package/dist/repo/services.d.ts.map +1 -0
- package/dist/repo/services.js +16 -0
- package/dist/repo/services.js.map +1 -0
- package/dist/repo/suppressions.d.ts +8 -0
- package/dist/repo/suppressions.d.ts.map +1 -0
- package/dist/repo/suppressions.js +16 -0
- package/dist/repo/suppressions.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 +8 -3
- package/dist/repo/trace-read.js.map +1 -1
- package/dist/repo/trace-write.d.ts +5 -1
- package/dist/repo/trace-write.d.ts.map +1 -1
- package/dist/repo/trace-write.js +11 -2
- package/dist/repo/trace-write.js.map +1 -1
- package/dist/repo/users.d.ts +5 -16
- package/dist/repo/users.d.ts.map +1 -1
- package/dist/repo/users.js +2 -60
- package/dist/repo/users.js.map +1 -1
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +23 -6
- package/dist/routes/alerts.js.map +1 -1
- 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 +24 -9
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +8 -2
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/ingest.d.ts.map +1 -1
- package/dist/routes/ingest.js +7 -2
- package/dist/routes/ingest.js.map +1 -1
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +42 -25
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/me.d.ts +4 -0
- package/dist/routes/me.d.ts.map +1 -0
- package/dist/routes/me.js +37 -0
- package/dist/routes/me.js.map +1 -0
- package/dist/routes/metrics.d.ts +2 -2
- package/dist/routes/metrics.d.ts.map +1 -1
- package/dist/routes/metrics.js +2 -3
- package/dist/routes/metrics.js.map +1 -1
- package/dist/routes/models.d.ts +2 -0
- package/dist/routes/models.d.ts.map +1 -1
- package/dist/routes/models.js +10 -5
- package/dist/routes/models.js.map +1 -1
- package/dist/routes/notify.d.ts +4 -0
- package/dist/routes/notify.d.ts.map +1 -0
- package/dist/routes/notify.js +55 -0
- package/dist/routes/notify.js.map +1 -0
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +34 -53
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +5 -3
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/search.d.ts +4 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +33 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/shares.d.ts.map +1 -1
- package/dist/routes/shares.js +8 -5
- package/dist/routes/shares.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +59 -16
- package/dist/server.js.map +1 -1
- package/dist/settle.d.ts +7 -6
- package/dist/settle.d.ts.map +1 -1
- package/dist/settle.js +30 -13
- 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 +10 -0
- package/dist/telemetry/ch/admin.d.ts.map +1 -0
- package/dist/telemetry/ch/admin.js +65 -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 +34 -0
- package/dist/telemetry/ch/queue.d.ts.map +1 -0
- package/dist/telemetry/ch/queue.js +79 -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 +72 -0
- package/dist/telemetry/ch/read.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 +49 -0
- package/dist/telemetry/ch/schema-facts.js.map +1 -0
- package/dist/telemetry/ch/schema-raw.d.ts +8 -0
- package/dist/telemetry/ch/schema-raw.d.ts.map +1 -0
- package/dist/telemetry/ch/schema-raw.js +35 -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-rows.d.ts +13 -0
- package/dist/telemetry/ch/settle-rows.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-rows.js +67 -0
- package/dist/telemetry/ch/settle-rows.js.map +1 -0
- package/dist/telemetry/ch/settle.d.ts +7 -0
- package/dist/telemetry/ch/settle.d.ts.map +1 -0
- package/dist/telemetry/ch/settle.js +96 -0
- package/dist/telemetry/ch/settle.js.map +1 -0
- package/dist/telemetry/ch/store.d.ts +16 -0
- package/dist/telemetry/ch/store.d.ts.map +1 -0
- package/dist/telemetry/ch/store.js +65 -0
- package/dist/telemetry/ch/store.js.map +1 -0
- package/dist/telemetry/ch/util.d.ts +20 -0
- package/dist/telemetry/ch/util.d.ts.map +1 -0
- package/dist/telemetry/ch/util.js +45 -0
- package/dist/telemetry/ch/util.js.map +1 -0
- package/dist/telemetry/ch/write.d.ts +11 -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 +11 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +21 -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 +78 -0
- package/dist/telemetry/pg-store.js.map +1 -0
- package/dist/telemetry/store.d.ts +74 -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/package.json +20 -6
- package/dist/routes/auth.d.ts +0 -4
- package/dist/routes/auth.d.ts.map +0 -1
- package/dist/routes/auth.js +0 -106
- package/dist/routes/auth.js.map +0 -1
package/dist/server.js
CHANGED
|
@@ -2,6 +2,10 @@ import { createRequire } from "node:module";
|
|
|
2
2
|
import { createServer } from "node:http";
|
|
3
3
|
import { otlpSignalOf } from "@wizeworks/lens-hub/kit";
|
|
4
4
|
import { resolveUiDir, serveUi } from "@wizeworks/lens-node/kit";
|
|
5
|
+
import { authHandler } from "./auth/bridge.js";
|
|
6
|
+
import { AUTH_BASE_PATH } from "./auth/options.js";
|
|
7
|
+
import { wireAuth } from "./auth/wire.js";
|
|
8
|
+
import { Changes } from "./changes.js";
|
|
5
9
|
import { resolveConfig } from "./config.js";
|
|
6
10
|
import { openDb } from "./db/db.js";
|
|
7
11
|
import { migrate } from "./db/migrate.js";
|
|
@@ -9,9 +13,14 @@ import { HttpError, sendJson } from "./http/http.js";
|
|
|
9
13
|
import { RateLimiter } from "./http/limiter.js";
|
|
10
14
|
import { Router } from "./http/router.js";
|
|
11
15
|
import { startJobs } from "./jobs.js";
|
|
12
|
-
import {
|
|
16
|
+
import { createMailer } from "./mail/mailer.js";
|
|
17
|
+
import { stopRoute } from "./mail/stop-route.js";
|
|
18
|
+
import { UNSUBSCRIBE_PATH } from "./mail/unsubscribe.js";
|
|
19
|
+
import { RESEND_WEBHOOK_PATH, resendWebhook } from "./mail/webhook.js";
|
|
20
|
+
import { openTelemetry } from "./telemetry/index.js";
|
|
13
21
|
import { allRoutes } from "./routes/index.js";
|
|
14
22
|
import { ingestBatch, ingestOtlp } from "./routes/ingest.js";
|
|
23
|
+
import { forgetModels } from "./routes/models.js";
|
|
15
24
|
const require = createRequire(import.meta.url);
|
|
16
25
|
export const CLOUD_VERSION = require("../package.json").version;
|
|
17
26
|
const BASE = "/_wizelens";
|
|
@@ -21,6 +30,12 @@ async function routeBase(p, ctx, sub) {
|
|
|
21
30
|
const { req, res } = ctx;
|
|
22
31
|
if (sub === "api/ingest" && req.method === "POST")
|
|
23
32
|
return ingestBatch(ctx, p.ingest);
|
|
33
|
+
// Resend signs its webhook, so it needs no dashboard header.
|
|
34
|
+
if (sub === RESEND_WEBHOOK_PATH && req.method === "POST")
|
|
35
|
+
return resendWebhook(ctx);
|
|
36
|
+
// Stop links come from mail apps (RFC 8058 one-click POST), with the signed token as the only proof.
|
|
37
|
+
if (sub === UNSUBSCRIBE_PATH && (req.method === "GET" || req.method === "POST"))
|
|
38
|
+
return stopRoute(ctx);
|
|
24
39
|
if (needsClientHeader(req, sub) && req.headers["x-wizelens-client"] !== "dashboard")
|
|
25
40
|
throw new HttpError(403, "Missing the X-WizeLens-Client header.");
|
|
26
41
|
const m = p.router.match(req.method ?? "GET", sub);
|
|
@@ -40,6 +55,8 @@ async function route(p, req, res) {
|
|
|
40
55
|
return void res.writeHead(200, { "Content-Type": "text/plain" }).end("ok");
|
|
41
56
|
if (path === "/" || path === BASE)
|
|
42
57
|
return void res.writeHead(302, { Location: `${BASE}/${url.search}` }).end();
|
|
58
|
+
if (path.startsWith(`${AUTH_BASE_PATH}/`))
|
|
59
|
+
return p.auth()(req, res);
|
|
43
60
|
const signal = otlpSignalOf(path);
|
|
44
61
|
if (signal && req.method === "POST")
|
|
45
62
|
return ingestOtlp(ctx, signal, p.ingest);
|
|
@@ -55,39 +72,65 @@ function onError(err, res) {
|
|
|
55
72
|
console.error("[wizelens-cloud]", err);
|
|
56
73
|
sendJson(res, 500, { error: "Something went wrong on the server." });
|
|
57
74
|
}
|
|
58
|
-
|
|
75
|
+
/** The database (migrated), the telemetry store (its stats rebuilt when the facts version changed), and the new-data signal. */
|
|
76
|
+
async function openStores(config) {
|
|
77
|
+
const db = await openDb(config.database);
|
|
78
|
+
await migrate(db);
|
|
79
|
+
const telemetry = await openTelemetry(config, db);
|
|
80
|
+
await telemetry.checkFactsVersion();
|
|
81
|
+
const changes = new Changes();
|
|
82
|
+
changes.onAny(forgetModels);
|
|
83
|
+
return { db, telemetry, changes };
|
|
84
|
+
}
|
|
85
|
+
/** Open the database, bring its schema up to date, and build the server. Call `listen()` to start. */
|
|
86
|
+
export async function createCloud(options = {}) {
|
|
59
87
|
const config = resolveConfig(options);
|
|
60
|
-
|
|
61
|
-
|
|
88
|
+
const stores = await openStores(config);
|
|
89
|
+
const { db, telemetry } = stores;
|
|
90
|
+
const mailer = await createMailer(config, db);
|
|
91
|
+
const wiring = await wireAuth(db, config, mailer);
|
|
92
|
+
let auth;
|
|
93
|
+
let handler;
|
|
94
|
+
let listenUrl = config.publicUrl ?? `http://localhost:${config.port}`;
|
|
95
|
+
const app = {
|
|
96
|
+
...stores,
|
|
62
97
|
config,
|
|
63
98
|
version: CLOUD_VERSION,
|
|
64
99
|
startedMs: config.now(),
|
|
65
|
-
|
|
100
|
+
mailer,
|
|
101
|
+
secrets: wiring.secrets,
|
|
102
|
+
get auth() {
|
|
103
|
+
if (!auth)
|
|
104
|
+
throw new Error("The cloud is not listening yet.");
|
|
105
|
+
return auth;
|
|
106
|
+
},
|
|
107
|
+
baseUrl: () => config.publicUrl ?? listenUrl,
|
|
66
108
|
};
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
await migrate(db);
|
|
72
|
-
await checkFactsVersion(db);
|
|
73
|
-
const app = makeApp(db, options);
|
|
74
|
-
const parts = { app, router: allRoutes(), ingest: new RateLimiter(app.config.ingestPerMinute, 60_000, app.config.now), uiDir: resolveUiDir(app.config.uiDir) };
|
|
109
|
+
const ready = (url) => ((listenUrl = url), (auth = wiring.start(url)), (handler = authHandler(auth, config.trustProxy)));
|
|
110
|
+
if (config.publicUrl)
|
|
111
|
+
ready(config.publicUrl);
|
|
112
|
+
const parts = { app, router: allRoutes(), ingest: new RateLimiter(config.ingestPerMinute, 60_000, config.now), uiDir: resolveUiDir(config.uiDir), auth: () => handler };
|
|
75
113
|
const server = createServer((req, res) => void route(parts, req, res).catch((err) => onError(err, res)));
|
|
76
|
-
const stopJobs = startJobs(app);
|
|
114
|
+
const stopJobs = config.jobs ? startJobs(app) : () => { };
|
|
77
115
|
return {
|
|
78
116
|
server,
|
|
79
117
|
app,
|
|
118
|
+
setupLink: wiring.setupLink,
|
|
80
119
|
listen: () => new Promise((resolve, reject) => {
|
|
81
120
|
server.once("error", reject);
|
|
82
|
-
server.listen(
|
|
121
|
+
server.listen(config.port, config.host, () => {
|
|
83
122
|
const { port } = server.address();
|
|
84
|
-
|
|
123
|
+
if (!config.publicUrl)
|
|
124
|
+
ready(`http://localhost:${port}`);
|
|
125
|
+
resolve(config.publicUrl ?? `http://localhost:${port}`);
|
|
85
126
|
});
|
|
86
127
|
}),
|
|
87
128
|
close: async () => {
|
|
88
129
|
stopJobs();
|
|
89
130
|
server.closeAllConnections?.();
|
|
90
131
|
await new Promise((resolve) => server.close(() => resolve()));
|
|
132
|
+
await mailer.close();
|
|
133
|
+
await telemetry.close();
|
|
91
134
|
await db.close();
|
|
92
135
|
},
|
|
93
136
|
};
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AAEjG,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/settle.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Statement, type TraceState } from "@wizeworks/lens-core";
|
|
2
2
|
import type { Db, Queryable } from "./db/db.js";
|
|
3
|
+
import type { SettleOptions } from "./telemetry/store.js";
|
|
3
4
|
/** Fact, rollup, and hist tables: everything settling builds. */
|
|
4
5
|
export declare const STATS_TABLES: string[];
|
|
5
6
|
export interface TraceStateRow {
|
|
@@ -14,13 +15,13 @@ export interface TraceStateRow {
|
|
|
14
15
|
export declare function runStatements(q: Queryable, statements: readonly Statement[]): Promise<void>;
|
|
15
16
|
export declare const stateOf: (r: TraceStateRow, defaultDays: number) => TraceState;
|
|
16
17
|
/** Settle dirty traces in batches until none are left or the budget is spent. Returns how many settled. */
|
|
17
|
-
export declare function settleCloud(db: Db, now: number, o?:
|
|
18
|
-
defaultRetentionDays?: number;
|
|
19
|
-
batch?: number;
|
|
20
|
-
budgetMs?: number;
|
|
21
|
-
}): Promise<number>;
|
|
18
|
+
export declare function settleCloud(db: Db, now: number, o?: SettleOptions): Promise<number>;
|
|
22
19
|
/** Age out rollup buckets: 10 s and 5 min by their keep time, 1 h by each organization's retention. */
|
|
23
20
|
export declare function pruneRollups(q: Queryable, now: number, empties?: boolean): Promise<void>;
|
|
24
|
-
/**
|
|
21
|
+
/** True when the stats were built by another facts version (or never). */
|
|
22
|
+
export declare function factsStale(db: Db): Promise<boolean>;
|
|
23
|
+
/** Clear the stats and mark every trace unsettled, in batches that commit; a restart starts it again and the version is written last. */
|
|
24
|
+
export declare function resetFacts(db: Db): Promise<void>;
|
|
25
|
+
/** When the facts version changed, clear the stats so settling rebuilds them. Returns true when it did. */
|
|
25
26
|
export declare function checkFactsVersion(db: Db): Promise<boolean>;
|
|
26
27
|
//# sourceMappingURL=settle.d.ts.map
|
package/dist/settle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,KAAK,SAAS,EAAuB,KAAK,UAAU,EAAc,MAAM,sBAAsB,CAAC;AAClK,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,KAAK,SAAS,EAAuB,KAAK,UAAU,EAAc,MAAM,sBAAsB,CAAC;AAClK,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAU1D,iEAAiE;AACjE,eAAO,MAAM,YAAY,UAAwF,CAAC;AAElH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,8DAA8D;AAC9D,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjG;AAED,eAAO,MAAM,OAAO,MAAO,aAAa,eAAe,MAAM,KAAG,UAO9D,CAAC;AA6BH,2GAA2G;AAC3G,wBAAsB,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7F;AAED,uGAAuG;AACvG,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5F;AAED,0EAA0E;AAC1E,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzD;AAED,yIAAyI;AACzI,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAetD;AAED,2GAA2G;AAC3G,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAIhE"}
|
package/dist/settle.js
CHANGED
|
@@ -7,6 +7,7 @@ const QUIET_MS = 5_000;
|
|
|
7
7
|
const BUSY_MS = 30_000;
|
|
8
8
|
const LOCK = 4711;
|
|
9
9
|
const DAY_MS = 86_400_000;
|
|
10
|
+
const RESET_BATCH = 5_000;
|
|
10
11
|
/** Fact, rollup, and hist tables: everything settling builds. */
|
|
11
12
|
export const STATS_TABLES = [...FACT_TABLES, ...["10s", "5m", "1h"].flatMap((t) => [`rollup_${t}`, `hist_${t}`])];
|
|
12
13
|
/** Run statements one by one, in the caller's transaction. */
|
|
@@ -37,16 +38,16 @@ async function settleBatch(db, now, batch, defaultDays) {
|
|
|
37
38
|
return db.tx(async (q) => {
|
|
38
39
|
const [lock] = await q.query("SELECT pg_try_advisory_xact_lock($1) AS ok", [LOCK]);
|
|
39
40
|
if (!lock?.ok)
|
|
40
|
-
return -1;
|
|
41
|
+
return { n: -1, projects: [] };
|
|
41
42
|
const rows = await q.query(`SELECT t.project_id, t.trace_id, t.env, t.updated_ms, t.contrib, o.retention_days FROM traces t
|
|
42
43
|
LEFT JOIN projects p ON p.id = t.project_id LEFT JOIN orgs o ON o.id = p.org_id
|
|
43
44
|
WHERE t.settled_ms < t.updated_ms AND (t.updated_ms <= $1 OR t.settled_ms <= $2) ORDER BY t.start_ms DESC LIMIT $3`, [now - QUIET_MS, now - BUSY_MS, batch]);
|
|
44
45
|
if (!rows.length)
|
|
45
|
-
return 0;
|
|
46
|
+
return { n: 0, projects: [] };
|
|
46
47
|
const traces = await loadAll(q, rows);
|
|
47
48
|
const work = rows.map((r) => ({ state: stateOf(r, defaultDays), trace: traces.get(`${r.project_id} ${r.trace_id}`) }));
|
|
48
49
|
await runStatements(q, settleStatements(PG_DIALECT, work, now, true));
|
|
49
|
-
return rows.length;
|
|
50
|
+
return { n: rows.length, projects: [...new Set(rows.map((r) => r.project_id))] };
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
53
|
/** Settle dirty traces in batches until none are left or the budget is spent. Returns how many settled. */
|
|
@@ -55,9 +56,11 @@ export async function settleCloud(db, now, o = {}) {
|
|
|
55
56
|
const batch = o.batch ?? BATCH;
|
|
56
57
|
let total = 0;
|
|
57
58
|
for (;;) {
|
|
58
|
-
const n = await settleBatch(db, now, batch, o.defaultRetentionDays ?? 30);
|
|
59
|
+
const { n, projects } = await settleBatch(db, now, batch, o.defaultRetentionDays ?? 30);
|
|
59
60
|
if (n > 0)
|
|
60
61
|
total += n;
|
|
62
|
+
for (const p of projects)
|
|
63
|
+
o.onSettled?.(p);
|
|
61
64
|
if (n < batch || Date.now() - start >= (o.budgetMs ?? BUDGET_MS))
|
|
62
65
|
return total;
|
|
63
66
|
}
|
|
@@ -69,17 +72,31 @@ export async function pruneRollups(q, now, empties = false) {
|
|
|
69
72
|
await q.query(`DELETE FROM ${t} r USING projects p, orgs o WHERE p.id = r.project_id AND o.id = p.org_id AND r.bucket_ms <= $1 - o.retention_days * 86400000.0`, [now - 3_600_000]);
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
|
-
/**
|
|
73
|
-
export async function
|
|
75
|
+
/** True when the stats were built by another facts version (or never). */
|
|
76
|
+
export async function factsStale(db) {
|
|
74
77
|
const [row] = await db.query("SELECT value FROM scale_meta WHERE key = 'facts'");
|
|
75
|
-
|
|
78
|
+
return row?.value !== String(FACTS_VERSION);
|
|
79
|
+
}
|
|
80
|
+
/** Clear the stats and mark every trace unsettled, in batches that commit; a restart starts it again and the version is written last. */
|
|
81
|
+
export async function resetFacts(db) {
|
|
82
|
+
await db.query(`TRUNCATE ${STATS_TABLES.join(", ")}`);
|
|
83
|
+
const mark = "UPDATE traces SET settled_ms = 0, contrib = NULL WHERE (project_id, trace_id) > ($1, $2)";
|
|
84
|
+
let after = ["", ""];
|
|
85
|
+
for (;;) {
|
|
86
|
+
const [end] = await db.query(`SELECT project_id, trace_id FROM traces WHERE (project_id, trace_id) > ($1, $2) ORDER BY project_id, trace_id OFFSET ${RESET_BATCH - 1} LIMIT 1`, after);
|
|
87
|
+
if (!end)
|
|
88
|
+
break;
|
|
89
|
+
await db.query(`${mark} AND (project_id, trace_id) <= ($3, $4)`, [...after, end.project_id, end.trace_id]);
|
|
90
|
+
after = [end.project_id, end.trace_id];
|
|
91
|
+
}
|
|
92
|
+
await db.query(mark, after);
|
|
93
|
+
await db.query("INSERT INTO scale_meta (key, value) VALUES ('facts', $1) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value", [String(FACTS_VERSION)]);
|
|
94
|
+
}
|
|
95
|
+
/** When the facts version changed, clear the stats so settling rebuilds them. Returns true when it did. */
|
|
96
|
+
export async function checkFactsVersion(db) {
|
|
97
|
+
if (!(await factsStale(db)))
|
|
76
98
|
return false;
|
|
77
|
-
await db
|
|
78
|
-
for (const t of STATS_TABLES)
|
|
79
|
-
await q.query(`DELETE FROM ${t}`);
|
|
80
|
-
await q.query("UPDATE traces SET settled_ms = 0, contrib = NULL");
|
|
81
|
-
await q.query("INSERT INTO scale_meta (key, value) VALUES ('facts', $1) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value", [String(FACTS_VERSION)]);
|
|
82
|
-
});
|
|
99
|
+
await resetFacts(db);
|
|
83
100
|
return true;
|
|
84
101
|
}
|
|
85
102
|
//# sourceMappingURL=settle.js.map
|
package/dist/settle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAkB,mBAAmB,EAA+B,MAAM,sBAAsB,CAAC;AAElK,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TelemetryStore } from "./store.js";
|
|
2
|
+
interface Memo<T> {
|
|
3
|
+
get(key: string): Promise<T>;
|
|
4
|
+
drop(key: string): void;
|
|
5
|
+
}
|
|
6
|
+
/** One call per key at a time, and its answer kept for `ttlMs`; a failed call is not kept. */
|
|
7
|
+
export declare function memo<T>(fn: (key: string) => Promise<T>, now: () => number, ttlMs?: number): Memo<T>;
|
|
8
|
+
/** The store with project counts and environments shared between callers for a minute (new data shows within it); clearing a project drops them. */
|
|
9
|
+
export declare function withCachedCounts(store: TelemetryStore, now: () => number): TelemetryStore;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=cached.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cached.d.ts","sourceRoot":"","sources":["../../src/telemetry/cached.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,UAAU,IAAI,CAAC,CAAC;IACd,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,8FAA8F;AAC9F,wBAAgB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,MAAM,EAAE,KAAK,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAanG;AAED,oJAAoJ;AACpJ,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,cAAc,CASzF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Every page asks for a project's counts and environments; each answer scans the project's rows, so it is shared for a minute.
|
|
2
|
+
const TTL_MS = 60_000;
|
|
3
|
+
/** One call per key at a time, and its answer kept for `ttlMs`; a failed call is not kept. */
|
|
4
|
+
export function memo(fn, now, ttlMs = TTL_MS) {
|
|
5
|
+
const entries = new Map();
|
|
6
|
+
return {
|
|
7
|
+
get(key) {
|
|
8
|
+
const hit = entries.get(key);
|
|
9
|
+
if (hit && now() - hit.at < ttlMs)
|
|
10
|
+
return hit.value;
|
|
11
|
+
const value = fn(key);
|
|
12
|
+
entries.set(key, { at: now(), value });
|
|
13
|
+
value.catch(() => entries.get(key)?.value === value && entries.delete(key));
|
|
14
|
+
return value;
|
|
15
|
+
},
|
|
16
|
+
drop: (key) => void entries.delete(key),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** The store with project counts and environments shared between callers for a minute (new data shows within it); clearing a project drops them. */
|
|
20
|
+
export function withCachedCounts(store, now) {
|
|
21
|
+
const counts = memo((id) => store.counts(id), now);
|
|
22
|
+
const envs = memo((id) => store.traceEnvs(id), now);
|
|
23
|
+
return {
|
|
24
|
+
...store,
|
|
25
|
+
counts: (id) => counts.get(id),
|
|
26
|
+
traceEnvs: (id) => envs.get(id),
|
|
27
|
+
clearProject: (id) => (counts.drop(id), envs.drop(id), store.clearProject(id)),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=cached.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cached.js","sourceRoot":"","sources":["../../src/telemetry/cached.ts"],"names":[],"mappings":"AAEA,+HAA+H;AAC/H,MAAM,MAAM,GAAG,MAAM,CAAC;AAOtB,8FAA8F;AAC9F,MAAM,UAAU,IAAI,CAAI,EAA+B,EAAE,GAAiB,EAAE,KAAK,GAAG,MAAM;IACxF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6C,CAAC;IACrE,OAAO;QACL,GAAG,CAAC,GAAG;YACL,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,KAAK;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC;YACpD,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,oJAAoJ;AACpJ,MAAM,UAAU,gBAAgB,CAAC,KAAqB,EAAE,GAAiB;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO;QACL,GAAG,KAAK;QACR,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;KAC/E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RetentionOf } from "../store.js";
|
|
2
|
+
import type { ChClient } from "./http.js";
|
|
3
|
+
import type { SettleQueue } from "./queue.js";
|
|
4
|
+
/** When the facts version changed: empty the stats and queue every trace again. True when it did. */
|
|
5
|
+
export declare function checkFactsVersionCh(ch: ChClient, queue: SettleQueue): Promise<boolean>;
|
|
6
|
+
/** Delete every row of a project, in every table. */
|
|
7
|
+
export declare function clearProjectCh(ch: ChClient, queue: SettleQueue, projectId: string): Promise<void>;
|
|
8
|
+
/** Retention runs out by TTL. Here: drop projects deleted in Postgres, and follow retention changes. */
|
|
9
|
+
export declare function syncProjects(ch: ChClient, queue: SettleQueue, retentionOf: RetentionOf, now: number): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ch/admin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkB9C,qGAAqG;AACrG,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5F;AAED,qDAAqD;AACrD,wBAAsB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvG;AAiBD,wGAAwG;AACxG,wBAAsB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYzH"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// ClickHouse upkeep: the facts version, clearing projects, retention changes, and projects that no longer exist.
|
|
2
|
+
import { FACTS_VERSION, TIERS } from "@wizeworks/lens-core";
|
|
3
|
+
import { PROJECT_TABLES } from "./schema.js";
|
|
4
|
+
import { DAY_MS, nextVer } from "./util.js";
|
|
5
|
+
/** Tables built by settling: emptied when the facts version changes. */
|
|
6
|
+
const STATS = [
|
|
7
|
+
...["fact_requests", "fact_traces", "fact_logs", "fact_critical", "fact_search", "fact_attrs"].map((t) => `${t}_t`),
|
|
8
|
+
...TIERS.flatMap((t) => [`${t.table}_t`, `${t.hist}_t`]),
|
|
9
|
+
"settle_state",
|
|
10
|
+
];
|
|
11
|
+
/** The time each table's expiry counts from, for retention changes. */
|
|
12
|
+
const EXPIRE_FROM = {
|
|
13
|
+
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",
|
|
14
|
+
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",
|
|
15
|
+
rollup_1h_t: "bucket_ms", hist_1h_t: "bucket_ms", metric_1h_t: "bucket_ms",
|
|
16
|
+
};
|
|
17
|
+
/** When the facts version changed: empty the stats and queue every trace again. True when it did. */
|
|
18
|
+
export async function checkFactsVersionCh(ch, queue) {
|
|
19
|
+
await ch.command("CREATE TABLE IF NOT EXISTS ch_meta (key String, value String, ver UInt64) ENGINE = ReplacingMergeTree(ver) ORDER BY key");
|
|
20
|
+
const [row] = await ch.query("SELECT value FROM ch_meta FINAL WHERE key = 'facts'");
|
|
21
|
+
if (row?.value === String(FACTS_VERSION))
|
|
22
|
+
return false;
|
|
23
|
+
for (const t of STATS)
|
|
24
|
+
await ch.command(`TRUNCATE TABLE IF EXISTS ${t}`);
|
|
25
|
+
await queue.requeueAll(ch);
|
|
26
|
+
await ch.insert("ch_meta", [{ key: "facts", value: String(FACTS_VERSION), ver: nextVer(Date.now()) }]);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/** Delete every row of a project, in every table. */
|
|
30
|
+
export async function clearProjectCh(ch, queue, projectId) {
|
|
31
|
+
queue.clear(projectId);
|
|
32
|
+
for (const t of PROJECT_TABLES)
|
|
33
|
+
await ch.command(`DELETE FROM ${t} WHERE project_id = {p1:String}`, [projectId], { lightweight_deletes_sync: "0" });
|
|
34
|
+
}
|
|
35
|
+
/** Projects with telemetry here, with the retention their rows were written with. */
|
|
36
|
+
async function knownProjects(ch) {
|
|
37
|
+
const ids = await ch.query("SELECT DISTINCT project_id FROM trace_heads UNION DISTINCT SELECT DISTINCT project_id FROM metric_series_t");
|
|
38
|
+
const kept = await ch.query("SELECT project_id, days FROM project_retention FINAL");
|
|
39
|
+
const days = new Map(kept.map((r) => [r.project_id, r.days]));
|
|
40
|
+
return new Map(ids.map((r) => [r.project_id, days.get(r.project_id) ?? null]));
|
|
41
|
+
}
|
|
42
|
+
/** A new retention for a project's existing rows: their expiry moves (a mutation, run in the background). */
|
|
43
|
+
async function moveExpiry(ch, projectId, days) {
|
|
44
|
+
for (const [table, col] of Object.entries(EXPIRE_FROM)) {
|
|
45
|
+
await ch.command(`ALTER TABLE ${table} UPDATE expire_ms = ${col} + {p2:Float64} WHERE project_id = {p1:String}`, [projectId, days * DAY_MS]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Retention runs out by TTL. Here: drop projects deleted in Postgres, and follow retention changes. */
|
|
49
|
+
export async function syncProjects(ch, queue, retentionOf, now) {
|
|
50
|
+
const known = await knownProjects(ch);
|
|
51
|
+
if (!known.size)
|
|
52
|
+
return;
|
|
53
|
+
const current = await retentionOf([...known.keys()]);
|
|
54
|
+
for (const [id, had] of known) {
|
|
55
|
+
const days = current.get(id);
|
|
56
|
+
if (days === undefined)
|
|
57
|
+
await clearProjectCh(ch, queue, id);
|
|
58
|
+
else if (had !== days) {
|
|
59
|
+
if (had !== null)
|
|
60
|
+
await moveExpiry(ch, id, days);
|
|
61
|
+
await ch.insert("project_retention", [{ project_id: id, days, ver: nextVer(now) }]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# 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"}
|