@wizeworks/lens-hub 0.3.0-alpha.3 → 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.
Files changed (190) hide show
  1. package/dist/alerts/api.d.ts +5 -0
  2. package/dist/alerts/api.d.ts.map +1 -0
  3. package/dist/alerts/api.js +87 -0
  4. package/dist/alerts/api.js.map +1 -0
  5. package/dist/alerts/deliver.d.ts +54 -0
  6. package/dist/alerts/deliver.d.ts.map +1 -0
  7. package/dist/alerts/deliver.js +66 -0
  8. package/dist/alerts/deliver.js.map +1 -0
  9. package/dist/alerts/evaluate.d.ts +16 -0
  10. package/dist/alerts/evaluate.d.ts.map +1 -0
  11. package/dist/alerts/evaluate.js +76 -0
  12. package/dist/alerts/evaluate.js.map +1 -0
  13. package/dist/alerts/loop.d.ts +10 -0
  14. package/dist/alerts/loop.d.ts.map +1 -0
  15. package/dist/alerts/loop.js +27 -0
  16. package/dist/alerts/loop.js.map +1 -0
  17. package/dist/alerts/store.d.ts +32 -0
  18. package/dist/alerts/store.d.ts.map +1 -0
  19. package/dist/alerts/store.js +38 -0
  20. package/dist/alerts/store.js.map +1 -0
  21. package/dist/alerts/target.d.ts +3 -0
  22. package/dist/alerts/target.d.ts.map +1 -0
  23. package/dist/alerts/target.js +23 -0
  24. package/dist/alerts/target.js.map +1 -0
  25. package/dist/api.d.ts +5 -0
  26. package/dist/api.d.ts.map +1 -1
  27. package/dist/api.js +38 -4
  28. package/dist/api.js.map +1 -1
  29. package/dist/body.d.ts +2 -2
  30. package/dist/body.d.ts.map +1 -1
  31. package/dist/body.js +4 -4
  32. package/dist/body.js.map +1 -1
  33. package/dist/cli-args.d.ts +1 -1
  34. package/dist/cli-args.d.ts.map +1 -1
  35. package/dist/cli-args.js +32 -1
  36. package/dist/cli-args.js.map +1 -1
  37. package/dist/data.js +1 -1
  38. package/dist/data.js.map +1 -1
  39. package/dist/hub.d.ts.map +1 -1
  40. package/dist/hub.js +15 -3
  41. package/dist/hub.js.map +1 -1
  42. package/dist/infra-read.d.ts +11 -0
  43. package/dist/infra-read.d.ts.map +1 -0
  44. package/dist/infra-read.js +30 -0
  45. package/dist/infra-read.js.map +1 -0
  46. package/dist/ingest.d.ts.map +1 -1
  47. package/dist/ingest.js +14 -3
  48. package/dist/ingest.js.map +1 -1
  49. package/dist/issues.d.ts +10 -0
  50. package/dist/issues.d.ts.map +1 -0
  51. package/dist/issues.js +34 -0
  52. package/dist/issues.js.map +1 -0
  53. package/dist/kit.d.ts +6 -0
  54. package/dist/kit.d.ts.map +1 -1
  55. package/dist/kit.js +4 -0
  56. package/dist/kit.js.map +1 -1
  57. package/dist/list-search.d.ts +10 -0
  58. package/dist/list-search.d.ts.map +1 -0
  59. package/dist/list-search.js +13 -0
  60. package/dist/list-search.js.map +1 -0
  61. package/dist/mcp.d.ts +3 -2
  62. package/dist/mcp.d.ts.map +1 -1
  63. package/dist/mcp.js +57 -11
  64. package/dist/mcp.js.map +1 -1
  65. package/dist/metrics-read.js +1 -1
  66. package/dist/metrics-read.js.map +1 -1
  67. package/dist/models-api.d.ts +11 -1
  68. package/dist/models-api.d.ts.map +1 -1
  69. package/dist/models-api.js +41 -15
  70. package/dist/models-api.js.map +1 -1
  71. package/dist/options.d.ts +23 -2
  72. package/dist/options.d.ts.map +1 -1
  73. package/dist/options.js +10 -1
  74. package/dist/options.js.map +1 -1
  75. package/dist/otlp/db-params.d.ts +7 -0
  76. package/dist/otlp/db-params.d.ts.map +1 -0
  77. package/dist/otlp/db-params.js +74 -0
  78. package/dist/otlp/db-params.js.map +1 -0
  79. package/dist/otlp/logs.d.ts +1 -1
  80. package/dist/otlp/logs.d.ts.map +1 -1
  81. package/dist/otlp/logs.js +8 -7
  82. package/dist/otlp/logs.js.map +1 -1
  83. package/dist/otlp/metrics.d.ts +3 -3
  84. package/dist/otlp/metrics.d.ts.map +1 -1
  85. package/dist/otlp/metrics.js +7 -6
  86. package/dist/otlp/metrics.js.map +1 -1
  87. package/dist/otlp/nested.d.ts +4 -0
  88. package/dist/otlp/nested.d.ts.map +1 -0
  89. package/dist/otlp/nested.js +19 -0
  90. package/dist/otlp/nested.js.map +1 -0
  91. package/dist/otlp/semconv.d.ts +17 -0
  92. package/dist/otlp/semconv.d.ts.map +1 -0
  93. package/dist/otlp/semconv.js +68 -0
  94. package/dist/otlp/semconv.js.map +1 -0
  95. package/dist/otlp/spans.d.ts +3 -3
  96. package/dist/otlp/spans.d.ts.map +1 -1
  97. package/dist/otlp/spans.js +15 -7
  98. package/dist/otlp/spans.js.map +1 -1
  99. package/dist/otlp/values.d.ts +5 -10
  100. package/dist/otlp/values.d.ts.map +1 -1
  101. package/dist/otlp/values.js +32 -24
  102. package/dist/otlp/values.js.map +1 -1
  103. package/dist/saved.d.ts +7 -0
  104. package/dist/saved.d.ts.map +1 -0
  105. package/dist/saved.js +49 -0
  106. package/dist/saved.js.map +1 -0
  107. package/dist/scale-exec.d.ts +2 -2
  108. package/dist/scale-exec.d.ts.map +1 -1
  109. package/dist/scale-exec.js +4 -4
  110. package/dist/scale-exec.js.map +1 -1
  111. package/dist/schema-saved.d.ts +15 -0
  112. package/dist/schema-saved.d.ts.map +1 -0
  113. package/dist/schema-saved.js +43 -0
  114. package/dist/schema-saved.js.map +1 -0
  115. package/dist/schema-scale.d.ts.map +1 -1
  116. package/dist/schema-scale.js +11 -1
  117. package/dist/schema-scale.js.map +1 -1
  118. package/dist/schema.d.ts +2 -2
  119. package/dist/schema.d.ts.map +1 -1
  120. package/dist/schema.js +20 -1
  121. package/dist/schema.js.map +1 -1
  122. package/dist/search-api.d.ts +1 -1
  123. package/dist/search-api.d.ts.map +1 -1
  124. package/dist/search-api.js +7 -5
  125. package/dist/search-api.js.map +1 -1
  126. package/dist/settings-prune.d.ts +12 -0
  127. package/dist/settings-prune.d.ts.map +1 -0
  128. package/dist/settings-prune.js +15 -0
  129. package/dist/settings-prune.js.map +1 -0
  130. package/dist/settings.d.ts +27 -0
  131. package/dist/settings.d.ts.map +1 -0
  132. package/dist/settings.js +64 -0
  133. package/dist/settings.js.map +1 -0
  134. package/dist/settle.d.ts +3 -3
  135. package/dist/settle.d.ts.map +1 -1
  136. package/dist/settle.js +12 -6
  137. package/dist/settle.js.map +1 -1
  138. package/dist/slos.d.ts +14 -0
  139. package/dist/slos.d.ts.map +1 -0
  140. package/dist/slos.js +73 -0
  141. package/dist/slos.js.map +1 -0
  142. package/dist/sourcemaps-api.d.ts +15 -0
  143. package/dist/sourcemaps-api.d.ts.map +1 -0
  144. package/dist/sourcemaps-api.js +55 -0
  145. package/dist/sourcemaps-api.js.map +1 -0
  146. package/dist/sourcemaps.d.ts +10 -0
  147. package/dist/sourcemaps.d.ts.map +1 -0
  148. package/dist/sourcemaps.js +41 -0
  149. package/dist/sourcemaps.js.map +1 -0
  150. package/dist/store-read.d.ts +2 -0
  151. package/dist/store-read.d.ts.map +1 -1
  152. package/dist/store-read.js +3 -1
  153. package/dist/store-read.js.map +1 -1
  154. package/dist/store.d.ts +13 -3
  155. package/dist/store.d.ts.map +1 -1
  156. package/dist/store.js +35 -10
  157. package/dist/store.js.map +1 -1
  158. package/dist/tags-api.d.ts +5 -0
  159. package/dist/tags-api.d.ts.map +1 -0
  160. package/dist/tags-api.js +94 -0
  161. package/dist/tags-api.js.map +1 -0
  162. package/dist/tags.d.ts +11 -0
  163. package/dist/tags.d.ts.map +1 -0
  164. package/dist/tags.js +31 -0
  165. package/dist/tags.js.map +1 -0
  166. package/dist/uptime/api.d.ts +5 -0
  167. package/dist/uptime/api.d.ts.map +1 -0
  168. package/dist/uptime/api.js +78 -0
  169. package/dist/uptime/api.js.map +1 -0
  170. package/dist/uptime/cert.d.ts +5 -0
  171. package/dist/uptime/cert.d.ts.map +1 -0
  172. package/dist/uptime/cert.js +26 -0
  173. package/dist/uptime/cert.js.map +1 -0
  174. package/dist/uptime/guard.d.ts +13 -0
  175. package/dist/uptime/guard.d.ts.map +1 -0
  176. package/dist/uptime/guard.js +38 -0
  177. package/dist/uptime/guard.js.map +1 -0
  178. package/dist/uptime/run.d.ts +11 -0
  179. package/dist/uptime/run.d.ts.map +1 -0
  180. package/dist/uptime/run.js +96 -0
  181. package/dist/uptime/run.js.map +1 -0
  182. package/dist/uptime/schedule.d.ts +15 -0
  183. package/dist/uptime/schedule.d.ts.map +1 -0
  184. package/dist/uptime/schedule.js +26 -0
  185. package/dist/uptime/schedule.js.map +1 -0
  186. package/dist/uptime/store.d.ts +25 -0
  187. package/dist/uptime/store.d.ts.map +1 -0
  188. package/dist/uptime/store.js +80 -0
  189. package/dist/uptime/store.js.map +1 -0
  190. package/package.json +4 -4
@@ -0,0 +1,43 @@
1
+ import { logSearchHref } from "@wizeworks/lens-core";
2
+ const paramsOf = (json) => {
3
+ try {
4
+ return JSON.parse(json);
5
+ }
6
+ catch {
7
+ return {};
8
+ }
9
+ };
10
+ /** The saved item an old log search becomes: shared, as every hub item is, and drawn as a chart. */
11
+ export const itemOfOldSearch = (r) => ({
12
+ id: r.id,
13
+ projectId: r.project,
14
+ kind: "search",
15
+ name: r.name,
16
+ href: logSearchHref(paramsOf(r.params)),
17
+ panels: [],
18
+ chart: true,
19
+ shared: true,
20
+ owner: "",
21
+ ownerName: "",
22
+ createdMs: r.created_ms,
23
+ updatedMs: r.created_ms,
24
+ });
25
+ /** Move every old log search into `saved`, then drop `saved_searches`. Nothing to do when the table is gone. */
26
+ export function moveSavedSearches(db) {
27
+ if (!db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'saved_searches'").get())
28
+ return;
29
+ const rows = db.prepare("SELECT id, project, name, params, created_ms FROM saved_searches ORDER BY created_ms, id").all();
30
+ const insert = db.prepare("INSERT INTO saved (id, project, kind, json, created_ms) VALUES (?, ?, ?, ?, ?) ON CONFLICT (id) DO NOTHING");
31
+ db.exec("BEGIN");
32
+ try {
33
+ for (const item of rows.map(itemOfOldSearch))
34
+ insert.run(item.id, item.projectId, item.kind, JSON.stringify(item), item.createdMs);
35
+ db.exec("DROP TABLE saved_searches");
36
+ db.exec("COMMIT");
37
+ }
38
+ catch (err) {
39
+ db.exec("ROLLBACK");
40
+ throw err;
41
+ }
42
+ }
43
+ //# sourceMappingURL=schema-saved.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-saved.js","sourceRoot":"","sources":["../src/schema-saved.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAkB,MAAM,sBAAsB,CAAC;AAWrE,MAAM,QAAQ,GAAG,CAAC,IAAY,EAA0B,EAAE;IACxD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,oGAAoG;AACpG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAS,EAAa,EAAE,CAAC,CAAC;IACxD,EAAE,EAAE,CAAC,CAAC,EAAE;IACR,SAAS,EAAE,CAAC,CAAC,OAAO;IACpB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,CAAC,CAAC,UAAU;IACvB,SAAS,EAAE,CAAC,CAAC,UAAU;CACxB,CAAC,CAAC;AAEH,gHAAgH;AAChH,MAAM,UAAU,iBAAiB,CAAC,EAAgB;IAChD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,EAAE;QAAE,OAAO;IAC9G,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,0FAA0F,CAAC,CAAC,GAAG,EAAyB,CAAC;IACjJ,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,4GAA4G,CAAC,CAAC;IACxI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnI,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema-scale.d.ts","sourceRoot":"","sources":["../src/schema-scale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA6BhD,eAAO,MAAM,gBAAgB,QAsD5B,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,YAAY,UAAqJ,CAAC;AAkB/K,uHAAuH;AACvH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAUvD"}
1
+ {"version":3,"file":"schema-scale.d.ts","sourceRoot":"","sources":["../src/schema-scale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgChD,eAAO,MAAM,gBAAgB,QAsD5B,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,YAAY,UAAqJ,CAAC;AAkB/K,uHAAuH;AACvH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgBvD"}
@@ -1,6 +1,9 @@
1
1
  import { FACTS_VERSION } from "@wizeworks/lens-core";
2
+ import { moveSavedSearches } from "./schema-saved.js";
2
3
  import { upgradeFts } from "./schema-fts.js";
3
4
  import { HUB_SCHEMA, HUB_SCHEMA_VERSION } from "./schema.js";
5
+ import { HUB_UPTIME_SCHEMA } from "./uptime/store.js";
6
+ import { SOURCEMAPS_SCHEMA } from "./sourcemaps.js";
4
7
  // Stats tables (docs/CONTRACT.md, "Hub storage"): facts per trace, rollups per tier, and metric rollups. The tiers are identical.
5
8
  const TIERS = ["10s", "5m", "1h"];
6
9
  const rollupTable = (t) => `
@@ -46,7 +49,7 @@ CREATE INDEX IF NOT EXISTS ix_fact_traces_project ON fact_traces (project, start
46
49
  CREATE TABLE IF NOT EXISTS fact_logs (
47
50
  project TEXT NOT NULL DEFAULT '', trace_id TEXT NOT NULL, idx INTEGER NOT NULL, env TEXT NOT NULL DEFAULT '', time_ms REAL NOT NULL,
48
51
  level TEXT NOT NULL, level_rank INTEGER NOT NULL, service TEXT NOT NULL, category TEXT NOT NULL, message TEXT NOT NULL,
49
- trace_name TEXT NOT NULL, span_id TEXT, attributes TEXT NOT NULL, search TEXT NOT NULL, PRIMARY KEY (trace_id, idx)
52
+ trace_name TEXT NOT NULL, span_id TEXT, attributes TEXT NOT NULL, search TEXT NOT NULL, pattern TEXT NOT NULL DEFAULT '', PRIMARY KEY (trace_id, idx)
50
53
  );
51
54
  CREATE INDEX IF NOT EXISTS ix_fact_logs_time ON fact_logs (time_ms);
52
55
  CREATE INDEX IF NOT EXISTS ix_fact_logs_project ON fact_logs (project, time_ms);
@@ -105,6 +108,13 @@ export function upgradeHubSchema(db) {
105
108
  if (!cols.has("contrib"))
106
109
  db.exec("ALTER TABLE traces ADD COLUMN contrib TEXT");
107
110
  db.exec(HUB_SCALE_SCHEMA);
111
+ db.exec(HUB_UPTIME_SCHEMA);
112
+ db.exec(SOURCEMAPS_SCHEMA);
113
+ moveSavedSearches(db);
114
+ const logCols = new Set(db.prepare("PRAGMA table_info(fact_logs)").all().map((c) => c.name));
115
+ if (!logCols.has("pattern"))
116
+ db.exec("ALTER TABLE fact_logs ADD COLUMN pattern TEXT NOT NULL DEFAULT ''");
117
+ db.exec("CREATE INDEX IF NOT EXISTS ix_fact_logs_pattern ON fact_logs (pattern, time_ms)");
108
118
  upgradeFts(db);
109
119
  const facts = db.prepare("SELECT value FROM meta WHERE key = 'facts'").get();
110
120
  if (facts?.value !== String(FACTS_VERSION))
@@ -1 +1 @@
1
- {"version":3,"file":"schema-scale.js","sourceRoot":"","sources":["../src/schema-scale.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-scale.js","sourceRoot":"","sources":["../src/schema-scale.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { DatabaseSync, StatementSync } from "node:sqlite";
2
- export declare const HUB_SCHEMA_VERSION = "3";
3
- export declare const HUB_SCHEMA = "\nCREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS traces (\n trace_id TEXT PRIMARY KEY, start_ms REAL NOT NULL, end_ms REAL NOT NULL, updated_ms REAL NOT NULL,\n env TEXT NOT NULL DEFAULT '', project TEXT NOT NULL DEFAULT ''\n);\nCREATE TABLE IF NOT EXISTS spans (\n trace_id TEXT NOT NULL, span_id TEXT NOT NULL, service TEXT NOT NULL, start_ms REAL NOT NULL,\n duration_ms REAL NOT NULL, session TEXT, json TEXT NOT NULL, PRIMARY KEY (trace_id, span_id)\n);\nCREATE TABLE IF NOT EXISTS logs (\n trace_id TEXT NOT NULL, key TEXT NOT NULL, time_ms REAL NOT NULL, json TEXT NOT NULL, PRIMARY KEY (trace_id, key)\n);\nCREATE TABLE IF NOT EXISTS remotes (trace_id TEXT NOT NULL, endpoint TEXT NOT NULL, PRIMARY KEY (trace_id, endpoint));\nCREATE TABLE IF NOT EXISTS services (\n project TEXT NOT NULL, service TEXT NOT NULL, environment TEXT NOT NULL, host TEXT NOT NULL, via TEXT NOT NULL, info TEXT NOT NULL,\n first_seen REAL NOT NULL, last_seen REAL NOT NULL, PRIMARY KEY (project, service, environment, host)\n);\nCREATE TABLE IF NOT EXISTS metrics (\n time_ms REAL NOT NULL, project TEXT NOT NULL DEFAULT '', env TEXT NOT NULL DEFAULT '', service TEXT NOT NULL,\n name TEXT NOT NULL, series_key TEXT NOT NULL, json TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS ix_metrics_time ON metrics(time_ms);\nCREATE INDEX IF NOT EXISTS ix_metrics_name ON metrics(name, time_ms);\nCREATE INDEX IF NOT EXISTS ix_metrics_project ON metrics(project, time_ms);\nCREATE INDEX IF NOT EXISTS ix_traces_updated ON traces(updated_ms);\nCREATE INDEX IF NOT EXISTS ix_traces_start ON traces(start_ms);\nCREATE INDEX IF NOT EXISTS ix_traces_env ON traces(env, start_ms);\nCREATE INDEX IF NOT EXISTS ix_traces_project ON traces(project, start_ms);\nCREATE INDEX IF NOT EXISTS ix_spans_session ON spans(session) WHERE session IS NOT NULL;\n";
2
+ export declare const HUB_SCHEMA_VERSION = "5";
3
+ export declare const HUB_SCHEMA = "\nCREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS traces (\n trace_id TEXT PRIMARY KEY, start_ms REAL NOT NULL, end_ms REAL NOT NULL, updated_ms REAL NOT NULL,\n env TEXT NOT NULL DEFAULT '', project TEXT NOT NULL DEFAULT ''\n);\nCREATE TABLE IF NOT EXISTS spans (\n trace_id TEXT NOT NULL, span_id TEXT NOT NULL, service TEXT NOT NULL, start_ms REAL NOT NULL,\n duration_ms REAL NOT NULL, session TEXT, json TEXT NOT NULL, PRIMARY KEY (trace_id, span_id)\n);\nCREATE TABLE IF NOT EXISTS logs (\n trace_id TEXT NOT NULL, key TEXT NOT NULL, time_ms REAL NOT NULL, json TEXT NOT NULL, PRIMARY KEY (trace_id, key)\n);\nCREATE TABLE IF NOT EXISTS remotes (trace_id TEXT NOT NULL, endpoint TEXT NOT NULL, PRIMARY KEY (trace_id, endpoint));\nCREATE TABLE IF NOT EXISTS services (\n project TEXT NOT NULL, service TEXT NOT NULL, environment TEXT NOT NULL, host TEXT NOT NULL, via TEXT NOT NULL, info TEXT NOT NULL,\n first_seen REAL NOT NULL, last_seen REAL NOT NULL, PRIMARY KEY (project, service, environment, host)\n);\nCREATE TABLE IF NOT EXISTS metrics (\n time_ms REAL NOT NULL, project TEXT NOT NULL DEFAULT '', env TEXT NOT NULL DEFAULT '', service TEXT NOT NULL,\n name TEXT NOT NULL, series_key TEXT NOT NULL, json TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS alert_rules (id TEXT PRIMARY KEY, project TEXT NOT NULL, json TEXT NOT NULL, created_ms REAL NOT NULL);\nCREATE TABLE IF NOT EXISTS alert_events (\n id TEXT PRIMARY KEY, rule_id TEXT NOT NULL, project TEXT NOT NULL, kind TEXT NOT NULL, value REAL, threshold REAL NOT NULL,\n message TEXT NOT NULL, time_ms REAL NOT NULL, delivery TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS ix_alert_events_project ON alert_events(project, time_ms);\nCREATE TABLE IF NOT EXISTS alert_values (rule_id TEXT NOT NULL, time_ms REAL NOT NULL, value REAL, PRIMARY KEY (rule_id, time_ms));\nCREATE TABLE IF NOT EXISTS slos (id TEXT PRIMARY KEY, project TEXT NOT NULL, json TEXT NOT NULL, created_ms REAL NOT NULL);\nCREATE TABLE IF NOT EXISTS apdex_targets (project TEXT PRIMARY KEY, json TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS project_settings (project TEXT PRIMARY KEY, json TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS saved (id TEXT PRIMARY KEY, project TEXT NOT NULL, kind TEXT NOT NULL, json TEXT NOT NULL, created_ms REAL NOT NULL);\nCREATE TABLE IF NOT EXISTS issues (\n project TEXT NOT NULL, kind TEXT NOT NULL, key TEXT NOT NULL, status TEXT NOT NULL, until_ms REAL, resolved_ms REAL,\n assignee TEXT, updated_ms REAL NOT NULL, PRIMARY KEY (project, kind, key)\n);\nCREATE INDEX IF NOT EXISTS ix_metrics_time ON metrics(time_ms);\nCREATE INDEX IF NOT EXISTS ix_metrics_name ON metrics(name, time_ms);\nCREATE INDEX IF NOT EXISTS ix_metrics_project ON metrics(project, time_ms);\nCREATE INDEX IF NOT EXISTS ix_traces_updated ON traces(updated_ms);\nCREATE INDEX IF NOT EXISTS ix_traces_start ON traces(start_ms);\nCREATE INDEX IF NOT EXISTS ix_traces_env ON traces(env, start_ms);\nCREATE INDEX IF NOT EXISTS ix_traces_project ON traces(project, start_ms);\nCREATE INDEX IF NOT EXISTS ix_spans_session ON spans(session) WHERE session IS NOT NULL;\nCREATE TABLE IF NOT EXISTS tag_rules (\n id TEXT PRIMARY KEY, name TEXT NOT NULL UNIQUE, color TEXT NOT NULL, query TEXT NOT NULL, created_ms REAL NOT NULL, updated_ms REAL NOT NULL\n);\nCREATE TABLE IF NOT EXISTS tag_builtins (name TEXT PRIMARY KEY, enabled INTEGER NOT NULL);\n";
4
4
  export interface HubStatements {
5
5
  upsertTrace: StatementSync;
6
6
  upsertSpan: StatementSync;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG/D,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,UAAU,i2DA8BtB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,aAAa,CAAC;IAC3B,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,aAAa,CAAC;IACzB,YAAY,EAAE,aAAa,CAAC;IAC5B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,aAAa,CAcpE"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG/D,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,UAAU,m4GAiDtB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,aAAa,CAAC;IAC3B,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,aAAa,CAAC;IACzB,YAAY,EAAE,aAAa,CAAC;IAC5B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,aAAa,CAcpE"}
package/dist/schema.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // The hub file (docs/CONTRACT.md, "Hub storage"). Empty strings stand for "unknown" so keys stay unique.
2
- export const HUB_SCHEMA_VERSION = "3";
2
+ export const HUB_SCHEMA_VERSION = "5";
3
3
  export const HUB_SCHEMA = `
4
4
  CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);
5
5
  CREATE TABLE IF NOT EXISTS traces (
@@ -22,6 +22,21 @@ CREATE TABLE IF NOT EXISTS metrics (
22
22
  time_ms REAL NOT NULL, project TEXT NOT NULL DEFAULT '', env TEXT NOT NULL DEFAULT '', service TEXT NOT NULL,
23
23
  name TEXT NOT NULL, series_key TEXT NOT NULL, json TEXT NOT NULL
24
24
  );
25
+ CREATE TABLE IF NOT EXISTS alert_rules (id TEXT PRIMARY KEY, project TEXT NOT NULL, json TEXT NOT NULL, created_ms REAL NOT NULL);
26
+ CREATE TABLE IF NOT EXISTS alert_events (
27
+ id TEXT PRIMARY KEY, rule_id TEXT NOT NULL, project TEXT NOT NULL, kind TEXT NOT NULL, value REAL, threshold REAL NOT NULL,
28
+ message TEXT NOT NULL, time_ms REAL NOT NULL, delivery TEXT NOT NULL
29
+ );
30
+ CREATE INDEX IF NOT EXISTS ix_alert_events_project ON alert_events(project, time_ms);
31
+ CREATE TABLE IF NOT EXISTS alert_values (rule_id TEXT NOT NULL, time_ms REAL NOT NULL, value REAL, PRIMARY KEY (rule_id, time_ms));
32
+ CREATE TABLE IF NOT EXISTS slos (id TEXT PRIMARY KEY, project TEXT NOT NULL, json TEXT NOT NULL, created_ms REAL NOT NULL);
33
+ CREATE TABLE IF NOT EXISTS apdex_targets (project TEXT PRIMARY KEY, json TEXT NOT NULL);
34
+ CREATE TABLE IF NOT EXISTS project_settings (project TEXT PRIMARY KEY, json TEXT NOT NULL);
35
+ CREATE TABLE IF NOT EXISTS saved (id TEXT PRIMARY KEY, project TEXT NOT NULL, kind TEXT NOT NULL, json TEXT NOT NULL, created_ms REAL NOT NULL);
36
+ CREATE TABLE IF NOT EXISTS issues (
37
+ project TEXT NOT NULL, kind TEXT NOT NULL, key TEXT NOT NULL, status TEXT NOT NULL, until_ms REAL, resolved_ms REAL,
38
+ assignee TEXT, updated_ms REAL NOT NULL, PRIMARY KEY (project, kind, key)
39
+ );
25
40
  CREATE INDEX IF NOT EXISTS ix_metrics_time ON metrics(time_ms);
26
41
  CREATE INDEX IF NOT EXISTS ix_metrics_name ON metrics(name, time_ms);
27
42
  CREATE INDEX IF NOT EXISTS ix_metrics_project ON metrics(project, time_ms);
@@ -30,6 +45,10 @@ CREATE INDEX IF NOT EXISTS ix_traces_start ON traces(start_ms);
30
45
  CREATE INDEX IF NOT EXISTS ix_traces_env ON traces(env, start_ms);
31
46
  CREATE INDEX IF NOT EXISTS ix_traces_project ON traces(project, start_ms);
32
47
  CREATE INDEX IF NOT EXISTS ix_spans_session ON spans(session) WHERE session IS NOT NULL;
48
+ CREATE TABLE IF NOT EXISTS tag_rules (
49
+ id TEXT PRIMARY KEY, name TEXT NOT NULL UNIQUE, color TEXT NOT NULL, query TEXT NOT NULL, created_ms REAL NOT NULL, updated_ms REAL NOT NULL
50
+ );
51
+ CREATE TABLE IF NOT EXISTS tag_builtins (name TEXT PRIMARY KEY, enabled INTEGER NOT NULL);
33
52
  `;
34
53
  export function prepareHubStatements(db) {
35
54
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,yGAAyG;AACzG,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BzB,CAAC;AAWF,MAAM,UAAU,oBAAoB,CAAC,EAAgB;IACnD,OAAO;QACL,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC;;;gFAGoD,CAAC;QAC7E,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC;mCACQ,CAAC;QAChC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,+EAA+E,CAAC;QACtG,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC;QAC5F,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,2GAA2G,CAAC;QACrI,aAAa,EAAE,EAAE,CAAC,OAAO,CAAC;8KACgJ,CAAC;KAC5K,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,yGAAyG;AACzG,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDzB,CAAC;AAWF,MAAM,UAAU,oBAAoB,CAAC,EAAgB;IACnD,OAAO;QACL,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC;;;gFAGoD,CAAC;QAC7E,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC;mCACQ,CAAC;QAChC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,+EAA+E,CAAC;QACtG,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC;QAC5F,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,2GAA2G,CAAC;QACrI,aAAa,EAAE,EAAE,CAAC,OAAO,CAAC;8KACgJ,CAAC;KAC5K,CAAC;AACJ,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ServerResponse } from "node:http";
2
2
  import type { ApiContext } from "./api.js";
3
- /** `GET api/search?q=&kind=&range=&env=&project=&limit=&cursor=`. A bad search answers 400 with the error's position. */
3
+ /** `GET api/search?q=&kind=&range=&env=&project=&limit=&cursor=`. A bad search answers 400 with the error's position; `tag:` reads the hub's tags. */
4
4
  export declare function sendSearch(c: ApiContext, p: URLSearchParams, res: ServerResponse): Promise<void>;
5
5
  /** `GET api/search/suggest?field=&prefix=&range=&project=&limit=`. */
6
6
  export declare function sendSuggest(c: ApiContext, p: URLSearchParams, res: ServerResponse): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"search-api.d.ts","sourceRoot":"","sources":["../src/search-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C,yHAAyH;AACzH,wBAAsB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtG;AAED,sEAAsE;AACtE,wBAAsB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvG"}
1
+ {"version":3,"file":"search-api.d.ts","sourceRoot":"","sources":["../src/search-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAO3C,sJAAsJ;AACtJ,wBAAsB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtG;AAED,sEAAsE;AACtE,wBAAsB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvG"}
@@ -1,23 +1,25 @@
1
- import { searchRequestOf, searchSql, SQLITE_DIALECT, suggestRequestOf, suggestSql } from "@wizeworks/lens-core";
1
+ import { activeTags, expandQuery, searchRequestOf, searchSql, SQLITE_DIALECT, suggestRequestOf, suggestSql, suggestTags } from "@wizeworks/lens-core";
2
2
  import { sendJson } from "@wizeworks/lens-node/kit";
3
3
  import { hubSettling, sqliteRunner } from "./scale-exec.js";
4
+ import { hubTags } from "./tags.js";
4
5
  // The hub's search API (docs/SEARCH-PLAN.md): one page of results, and autocomplete. `project` narrows both.
5
6
  const sourceOf = (c, p) => ({ d: SQLITE_DIALECT, run: sqliteRunner(c.data.store.db), scope: { project: p.get("project") || undefined } });
6
- /** `GET api/search?q=&kind=&range=&env=&project=&limit=&cursor=`. A bad search answers 400 with the error's position. */
7
+ /** `GET api/search?q=&kind=&range=&env=&project=&limit=&cursor=`. A bad search answers 400 with the error's position; `tag:` reads the hub's tags. */
7
8
  export async function sendSearch(c, p, res) {
8
9
  const r = searchRequestOf(p, c.o.now(), c.data.store.maxAgeMs);
9
10
  if (!r.ok)
10
11
  return sendJson(res, 400, r);
11
12
  const t0 = performance.now();
12
13
  const src = sourceOf(c, p);
13
- const page = await searchSql(src, r.query);
14
- sendJson(res, 200, { ...page, tookMs: Math.round(performance.now() - t0), settling: hubSettling(c.data.store, src.scope) });
14
+ const { query, unknownTags } = expandQuery(r.query, activeTags(hubTags(c.data.store.db)));
15
+ const page = await searchSql(src, query);
16
+ sendJson(res, 200, { ...page, tookMs: Math.round(performance.now() - t0), settling: hubSettling(c.data.store, src.scope), unknownTags });
15
17
  }
16
18
  /** `GET api/search/suggest?field=&prefix=&range=&project=&limit=`. */
17
19
  export async function sendSuggest(c, p, res) {
18
20
  const r = suggestRequestOf(p, c.o.now(), c.data.store.maxAgeMs);
19
21
  if (!r.ok)
20
22
  return sendJson(res, 400, r);
21
- sendJson(res, 200, { items: await suggestSql(sourceOf(c, p), r.request) });
23
+ sendJson(res, 200, { items: suggestTags(r.request, hubTags(c.data.store.db)) ?? (await suggestSql(sourceOf(c, p), r.request)) });
22
24
  }
23
25
  //# sourceMappingURL=search-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-api.js","sourceRoot":"","sources":["../src/search-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE5D,6GAA6G;AAC7G,MAAM,QAAQ,GAAG,CAAC,CAAa,EAAE,CAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,EAAE,CAAC,CAAC;AAEvK,yHAAyH;AACzH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAa,EAAE,CAAkB,EAAE,GAAmB;IACrF,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC9H,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAa,EAAE,CAAkB,EAAE,GAAmB;IACtF,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"search-api.js","sourceRoot":"","sources":["../src/search-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtJ,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,6GAA6G;AAC7G,MAAM,QAAQ,GAAG,CAAC,CAAa,EAAE,CAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,EAAE,CAAC,CAAC;AAEvK,sJAAsJ;AACtJ,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAa,EAAE,CAAkB,EAAE,GAAmB;IACrF,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;AAC3I,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAa,EAAE,CAAkB,EAAE,GAAmB;IACtF,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AACnI,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ /** Projects that keep data for less time than the hub, with how long. */
3
+ export declare function shorterKeeps(h: {
4
+ db: DatabaseSync;
5
+ maxAgeMs: number;
6
+ }): {
7
+ project: string;
8
+ keepMs: number;
9
+ }[];
10
+ /** In the prune transaction: a project's metric points, 1 h stat and metric buckets, and series past its keep. */
11
+ export declare function pruneProjectRows(db: DatabaseSync, project: string, now: number, keepMs: number): void;
12
+ //# sourceMappingURL=settings-prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-prune.d.ts","sourceRoot":"","sources":["../src/settings-prune.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,CAAC,EAAE;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAE7G;AAED,kHAAkH;AAClH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAKrG"}
@@ -0,0 +1,15 @@
1
+ import { tierByName, tierCutoff } from "@wizeworks/lens-core";
2
+ import { allSettings, keepMsOf } from "./settings.js";
3
+ /** Projects that keep data for less time than the hub, with how long. */
4
+ export function shorterKeeps(h) {
5
+ return [...allSettings(h.db).keys()].map((project) => ({ project, keepMs: keepMsOf(h, project) })).filter((s) => s.keepMs < h.maxAgeMs);
6
+ }
7
+ /** In the prune transaction: a project's metric points, 1 h stat and metric buckets, and series past its keep. */
8
+ export function pruneProjectRows(db, project, now, keepMs) {
9
+ db.prepare("DELETE FROM metrics WHERE project = ? AND time_ms < ?").run(project, now - keepMs);
10
+ const edge = tierCutoff(tierByName("1h"), now, keepMs);
11
+ for (const t of ["rollup_1h", "hist_1h", "metric_1h"])
12
+ db.prepare(`DELETE FROM ${t} WHERE project = ? AND bucket_ms <= ?`).run(project, edge);
13
+ db.prepare("DELETE FROM metric_series WHERE project = ? AND last_ms < ?").run(project, now - keepMs);
14
+ }
15
+ //# sourceMappingURL=settings-prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-prune.js","sourceRoot":"","sources":["../src/settings-prune.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEtD,yEAAyE;AACzE,MAAM,UAAU,YAAY,CAAC,CAAyC;IACpE,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC1I,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,gBAAgB,CAAC,EAAgB,EAAE,OAAe,EAAE,GAAW,EAAE,MAAc;IAC7F,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;QAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,uCAAuC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9I,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;AACvG,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { DatabaseSync } from "node:sqlite";
3
+ import { type FactOptions, type ProjectSettings, type SettingsDefaults } from "@wizeworks/lens-core";
4
+ export declare function allSettings(db: DatabaseSync): Map<string, ProjectSettings>;
5
+ export declare const projectSettings: (db: DatabaseSync, project: string) => ProjectSettings;
6
+ export declare function saveSettings(db: DatabaseSync, project: string, s: ProjectSettings): void;
7
+ /** What the hub keeps and how it judges, set by its start options. */
8
+ export interface HubSettingsHost {
9
+ db: DatabaseSync;
10
+ maxAgeMs: number;
11
+ slowQueryMs: number;
12
+ nPlusOneThreshold: number;
13
+ redactKeys: readonly string[];
14
+ }
15
+ /** The hub's own values. Retention is in whole days, at least 1. */
16
+ export declare const hubDefaults: (h: HubSettingsHost) => SettingsDefaults;
17
+ /** How long a project's traces stay: its own retention when shorter than the hub's. */
18
+ export declare function keepMsOf(h: Pick<HubSettingsHost, "db" | "maxAgeMs">, project: string): number;
19
+ /** How long a project's log lines stay: the hub's log age, or the project's own retention when shorter. */
20
+ export declare function logKeepMsOf(h: Pick<HubSettingsHost, "db"> & {
21
+ logMaxAgeMs: number;
22
+ }, project: string): number;
23
+ /** The thresholds a project's traces settle with. */
24
+ export declare const factsOf: (h: HubSettingsHost, project: string) => Partial<FactOptions>;
25
+ /** GET: the hub's values, the project's own, and the ones in effect. PUT: replace the project's own. */
26
+ export declare function handleSettings(h: HubSettingsHost, method: string, project: string, req: IncomingMessage, res: ServerResponse): Promise<void>;
27
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAqB,KAAK,WAAW,EAAgC,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAc,MAAM,sBAAsB,CAAC;AASlK,wBAAgB,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAO1E;AAED,eAAO,MAAM,eAAe,OAAQ,YAAY,WAAW,MAAM,KAAG,eAAqD,CAAC;AAE1H,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,GAAG,IAAI,CAIxF;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,YAAY,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAED,oEAAoE;AACpE,eAAO,MAAM,WAAW,MAAO,eAAe,KAAG,gBAK/C,CAAC;AAEH,uFAAuF;AACvF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED,2GAA2G;AAC3G,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG7G;AAED,qDAAqD;AACrD,eAAO,MAAM,OAAO,MAAO,eAAe,WAAW,MAAM,KAAG,OAAO,CAAC,WAAW,CAI/E,CAAC;AAEH,wGAAwG;AACxG,wBAAsB,cAAc,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAalJ"}
@@ -0,0 +1,64 @@
1
+ import { effectiveSettings, factOptionsOf, parseSettings, settingsOf } from "@wizeworks/lens-core";
2
+ import { sendJson } from "@wizeworks/lens-node/kit";
3
+ import { parseJson, readBody } from "./body.js";
4
+ const DAY_MS = 86_400_000;
5
+ /** The settings of every project, read again only after a change. */
6
+ const cache = new WeakMap();
7
+ export function allSettings(db) {
8
+ let map = cache.get(db);
9
+ if (!map) {
10
+ const rows = db.prepare("SELECT project, json FROM project_settings").all();
11
+ cache.set(db, (map = new Map(rows.map((r) => [r.project, settingsOf(r.json)]))));
12
+ }
13
+ return map;
14
+ }
15
+ export const projectSettings = (db, project) => allSettings(db).get(project) ?? {};
16
+ export function saveSettings(db, project, s) {
17
+ if (Object.keys(s).length)
18
+ db.prepare("INSERT INTO project_settings (project, json) VALUES (?, ?) ON CONFLICT (project) DO UPDATE SET json = excluded.json").run(project, JSON.stringify(s));
19
+ else
20
+ db.prepare("DELETE FROM project_settings WHERE project = ?").run(project);
21
+ cache.delete(db);
22
+ }
23
+ /** The hub's own values. Retention is in whole days, at least 1. */
24
+ export const hubDefaults = (h) => ({
25
+ slowQueryMs: h.slowQueryMs,
26
+ nPlusOneThreshold: h.nPlusOneThreshold,
27
+ redactKeys: h.redactKeys,
28
+ retentionDays: Math.max(1, Math.floor(h.maxAgeMs / DAY_MS)),
29
+ });
30
+ /** How long a project's traces stay: its own retention when shorter than the hub's. */
31
+ export function keepMsOf(h, project) {
32
+ const days = projectSettings(h.db, project).retentionDays;
33
+ return days ? Math.min(days * DAY_MS, h.maxAgeMs) : h.maxAgeMs;
34
+ }
35
+ /** How long a project's log lines stay: the hub's log age, or the project's own retention when shorter. */
36
+ export function logKeepMsOf(h, project) {
37
+ const days = projectSettings(h.db, project).retentionDays;
38
+ return days ? Math.min(days * DAY_MS, h.logMaxAgeMs) : h.logMaxAgeMs;
39
+ }
40
+ /** The thresholds a project's traces settle with. */
41
+ export const factsOf = (h, project) => ({
42
+ slowQueryMs: h.slowQueryMs,
43
+ nPlusOneThreshold: h.nPlusOneThreshold,
44
+ ...factOptionsOf(projectSettings(h.db, project)),
45
+ });
46
+ /** GET: the hub's values, the project's own, and the ones in effect. PUT: replace the project's own. */
47
+ export async function handleSettings(h, method, project, req, res) {
48
+ const defaults = hubDefaults(h);
49
+ const reply = (s) => sendJson(res, 200, { defaults, settings: s, effective: effectiveSettings(defaults, s) });
50
+ if (method === "GET")
51
+ return reply(projectSettings(h.db, project));
52
+ if (method !== "PUT")
53
+ return sendJson(res, 405, { error: "method not allowed" });
54
+ let next;
55
+ try {
56
+ next = parseSettings(parseJson(await readBody(req)), defaults.retentionDays);
57
+ }
58
+ catch (err) {
59
+ return sendJson(res, 400, { error: err instanceof Error ? err.message : "Invalid settings." });
60
+ }
61
+ saveSettings(h.db, project, next);
62
+ reply(next);
63
+ }
64
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAoB,aAAa,EAAE,aAAa,EAA+C,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClK,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,qEAAqE;AACrE,MAAM,KAAK,GAAG,IAAI,OAAO,EAA8C,CAAC;AAExE,MAAM,UAAU,WAAW,CAAC,EAAgB;IAC1C,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAAyC,CAAC;QACnH,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAgB,EAAE,OAAe,EAAmB,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAE1H,MAAM,UAAU,YAAY,CAAC,EAAgB,EAAE,OAAe,EAAE,CAAkB;IAChF,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;QAAE,EAAE,CAAC,OAAO,CAAC,qHAAqH,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;;QACxL,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/E,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACnB,CAAC;AAWD,oEAAoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAkB,EAAoB,EAAE,CAAC,CAAC;IACpE,WAAW,EAAE,CAAC,CAAC,WAAW;IAC1B,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;IACtC,UAAU,EAAE,CAAC,CAAC,UAAU;IACxB,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;CAC5D,CAAC,CAAC;AAEH,uFAAuF;AACvF,MAAM,UAAU,QAAQ,CAAC,CAA2C,EAAE,OAAe;IACnF,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC;IAC1D,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjE,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,WAAW,CAAC,CAAwD,EAAE,OAAe;IACnG,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC;IAC1D,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACvE,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAkB,EAAE,OAAe,EAAwB,EAAE,CAAC,CAAC;IACrF,WAAW,EAAE,CAAC,CAAC,WAAW;IAC1B,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;IACtC,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH,wGAAwG;AACxG,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,CAAkB,EAAE,MAAc,EAAE,OAAe,EAAE,GAAoB,EAAE,GAAmB;IACjI,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,CAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/H,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACjF,IAAI,IAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
package/dist/settle.d.ts CHANGED
@@ -18,11 +18,11 @@ export declare function settleHub(store: HubStore, o?: {
18
18
  }): number;
19
19
  /** The settle timer's job: errors are logged, never thrown into the timer. */
20
20
  export declare function settleQuietly(store: HubStore): void;
21
- /** In the prune transaction: take the doomed traces out of the rollups, drop their facts, and age out rollup buckets. */
21
+ /** In the prune transaction: take the doomed traces out of the rollups, drop their facts, age out rollup buckets, and drop log facts past the log age. */
22
22
  export declare function pruneStats(store: HubStore, doomed: readonly TraceStateRow[]): void;
23
- /** Traces whose stats are not built yet, for "Preparing stats". */
23
+ /** Traces whose stats are not built yet, optionally only those last written at or before `before`. */
24
24
  export declare function settlingCount(db: DatabaseSync, scope?: {
25
25
  project?: string;
26
26
  env?: string;
27
- }): number;
27
+ }, before?: number): number;
28
28
  //# sourceMappingURL=settle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgC,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAqD,KAAK,SAAS,EAAgE,MAAM,sBAAsB,CAAC;AAEvK,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAID,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAWtF;AAsCD,kHAAkH;AAClH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAWhG;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAMnD;AAED,yHAAyH;AACzH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI,CAOlF;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAMtG"}
1
+ {"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgC,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAwF,KAAK,SAAS,EAAgE,MAAM,sBAAsB,CAAC;AAG1M,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAID,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAWtF;AAwCD,kHAAkH;AAClH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAWhG;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAMnD;AAED,0JAA0J;AAC1J,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI,CAQlF;AAED,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOvH"}
package/dist/settle.js CHANGED
@@ -1,5 +1,6 @@
1
- import { pruneStatements, SQLITE_DIALECT, settleStatements, tierByName, tierCutoff, tierPruneStatements } from "@wizeworks/lens-core";
1
+ import { LOG_KINDS_SQL, logPruneStatements, pruneStatements, SQLITE_DIALECT, settleStatements, tierByName, tierCutoff, tierPruneStatements } from "@wizeworks/lens-core";
2
2
  import { loadTraces } from "./store-read.js";
3
+ import { factsOf, keepMsOf, logKeepMsOf } from "./settings.js";
3
4
  // Settling: traces quiet for a while get their facts and rollups rebuilt from the stored spans and logs (docs/CONTRACT.md).
4
5
  const BATCH = 200;
5
6
  const BUDGET_MS = 150;
@@ -39,7 +40,9 @@ const stateOf = (store, r) => ({
39
40
  env: r.env,
40
41
  updatedMs: r.updated_ms ?? 0,
41
42
  contrib: r.contrib,
42
- retentionMs: store.maxAgeMs,
43
+ retentionMs: keepMsOf(store, r.project),
44
+ logRetentionMs: logKeepMsOf(store, r.project),
45
+ facts: factsOf(store, r.project),
43
46
  });
44
47
  /** Settle one batch of dirty traces, newest first. Returns how many. */
45
48
  function settleBatch(store, batch) {
@@ -79,21 +82,24 @@ export function settleQuietly(store) {
79
82
  console.error("[wizelens-hub] settle failed:", err);
80
83
  }
81
84
  }
82
- /** In the prune transaction: take the doomed traces out of the rollups, drop their facts, and age out rollup buckets. */
85
+ /** In the prune transaction: take the doomed traces out of the rollups, drop their facts, age out rollup buckets, and drop log facts past the log age. */
83
86
  export function pruneStats(store, doomed) {
84
87
  const now = store.now();
85
88
  runStatements(store.db, pruneStatements(SQLITE_DIALECT, doomed.map((r) => stateOf(store, r)), now, false));
86
89
  runStatements(store.db, tierPruneStatements(now, true));
87
90
  const cutoff = tierCutoff(tierByName("1h"), now, store.maxAgeMs);
88
91
  for (const t of ["rollup_1h", "hist_1h"])
89
- store.db.prepare(`DELETE FROM ${t} WHERE bucket_ms <= ?`).run(cutoff);
92
+ store.db.prepare(`DELETE FROM ${t} WHERE bucket_ms <= ? AND kind NOT IN (${LOG_KINDS_SQL})`).run(cutoff);
93
+ runStatements(store.db, logPruneStatements(SQLITE_DIALECT, null, now, store.logMaxAgeMs));
90
94
  if (doomed.length)
91
95
  store.settleGen++;
92
96
  }
93
- /** Traces whose stats are not built yet, for "Preparing stats". */
94
- export function settlingCount(db, scope = {}) {
97
+ /** Traces whose stats are not built yet, optionally only those last written at or before `before`. */
98
+ export function settlingCount(db, scope = {}, before) {
95
99
  const where = ["settled_ms < updated_ms"];
96
100
  const args = [];
101
+ if (before !== undefined)
102
+ where.push("updated_ms <= ?"), args.push(before);
97
103
  if (scope.project)
98
104
  where.push("project = ?"), args.push(scope.project);
99
105
  if (scope.env)
@@ -1 +1 @@
1
- {"version":3,"file":"settle.js","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settle.js","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"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"}
package/dist/slos.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { DatabaseSync } from "node:sqlite";
3
+ import { type ApdexTargets, type Slo } from "@wizeworks/lens-core";
4
+ import type { HubStore } from "./store.js";
5
+ export declare const apdexVersion: () => number;
6
+ export declare const listSlos: (db: DatabaseSync, project: string) => Slo[];
7
+ export declare const sloById: (db: DatabaseSync, project: string, id: string) => Slo | undefined;
8
+ /** A project's Apdex targets (service to ms). */
9
+ export declare function apdexTargets(db: DatabaseSync, project: string): ApdexTargets;
10
+ /** `GET api/apdex?project=`: the targets. `PUT`: replace them with `{ apdex: { service: ms } }`. */
11
+ export declare function handleApdex(db: DatabaseSync, method: string, project: string, req: IncomingMessage, res: ServerResponse): Promise<void>;
12
+ /** `api/slos?project=`: list (with reports) and create; `api/slos/:id`: one report, change, delete. */
13
+ export declare function handleSlos(store: HubStore, sub: string, req: IncomingMessage, res: ServerResponse, url: URL, now: number): Promise<void>;
14
+ //# sourceMappingURL=slos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slos.d.ts","sourceRoot":"","sources":["../src/slos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,KAAK,YAAY,EAA+B,KAAK,GAAG,EAAa,MAAM,sBAAsB,CAAC;AAI3G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,eAAO,MAAM,YAAY,QAAO,MAAkB,CAAC;AAInD,eAAO,MAAM,QAAQ,OAAQ,YAAY,WAAW,MAAM,KAAG,GAAG,EAAoG,CAAC;AAErK,eAAO,MAAM,OAAO,OAAQ,YAAY,WAAW,MAAM,MAAM,MAAM,KAAG,GAAG,GAAG,SAAyG,CAAC;AAMxL,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAG5E;AAID,oGAAoG;AACpG,wBAAsB,WAAW,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7I;AAgBD,uGAAuG;AACvG,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9I"}
package/dist/slos.js ADDED
@@ -0,0 +1,73 @@
1
+ // SLOs and Apdex targets on the hub, per project ("" for all): `api/slos` and `api/apdex`.
2
+ import { randomUUID } from "node:crypto";
3
+ import { parseApdexTargets, parseSlo, sloReport } from "@wizeworks/lens-core";
4
+ import { sendJson } from "@wizeworks/lens-node/kit";
5
+ import { parseJson, readBody } from "./body.js";
6
+ import { hubExecutor } from "./scale-exec.js";
7
+ /** Bumps when Apdex targets change, so cached page models are not reused. */
8
+ let apdexGen = 0;
9
+ export const apdexVersion = () => apdexGen;
10
+ const slosOf = (rows) => rows.map((r) => JSON.parse(r.json));
11
+ export const listSlos = (db, project) => slosOf(db.prepare("SELECT json FROM slos WHERE project = ? ORDER BY created_ms").all(project));
12
+ export const sloById = (db, project, id) => slosOf(db.prepare("SELECT json FROM slos WHERE project = ? AND id = ?").all(project, id))[0];
13
+ function saveSlo(db, s, now) {
14
+ db.prepare("INSERT INTO slos (id, project, json, created_ms) VALUES (?, ?, ?, ?) ON CONFLICT (id) DO UPDATE SET json = excluded.json").run(s.id, s.projectId, JSON.stringify(s), now);
15
+ }
16
+ /** A project's Apdex targets (service to ms). */
17
+ export function apdexTargets(db, project) {
18
+ const row = db.prepare("SELECT json FROM apdex_targets WHERE project = ?").get(project);
19
+ return row ? JSON.parse(row.json) : {};
20
+ }
21
+ const body = async (req) => (parseJson(await readBody(req)) ?? {});
22
+ /** `GET api/apdex?project=`: the targets. `PUT`: replace them with `{ apdex: { service: ms } }`. */
23
+ export async function handleApdex(db, method, project, req, res) {
24
+ if (method === "GET")
25
+ return sendJson(res, 200, { apdex: apdexTargets(db, project) });
26
+ if (method !== "PUT")
27
+ return sendJson(res, 405, { error: "method not allowed" });
28
+ const t = parseApdexTargets((await body(req)).apdex);
29
+ if (typeof t === "string")
30
+ return sendJson(res, 400, { error: t });
31
+ db.prepare("INSERT INTO apdex_targets (project, json) VALUES (?, ?) ON CONFLICT (project) DO UPDATE SET json = excluded.json").run(project, JSON.stringify(t));
32
+ apdexGen++;
33
+ sendJson(res, 200, { apdex: t });
34
+ }
35
+ async function onSlo(store, method, project, id, req, res, now) {
36
+ const db = store.db;
37
+ const slo = sloById(db, project, id);
38
+ if (!slo)
39
+ return sendJson(res, 404, { error: "SLO not found." });
40
+ if (method === "GET")
41
+ return sendJson(res, 200, await sloReport(slo, hubExecutor(store, { project: project || undefined }), now));
42
+ if (method === "DELETE")
43
+ return (db.prepare("DELETE FROM slos WHERE id = ?").run(id), sendJson(res, 200, { ok: true }));
44
+ if (method !== "PATCH")
45
+ return sendJson(res, 405, { error: "method not allowed" });
46
+ const input = parseSlo({ ...slo, ...(await body(req)) });
47
+ if (typeof input === "string")
48
+ return sendJson(res, 400, { error: input });
49
+ const next = { ...slo, ...input };
50
+ saveSlo(db, next, now);
51
+ sendJson(res, 200, next);
52
+ }
53
+ /** `api/slos?project=`: list (with reports) and create; `api/slos/:id`: one report, change, delete. */
54
+ export async function handleSlos(store, sub, req, res, url, now) {
55
+ const method = req.method ?? "GET";
56
+ const project = url.searchParams.get("project") ?? "";
57
+ const id = sub.split("/")[2];
58
+ if (id)
59
+ return onSlo(store, method, project, decodeURIComponent(id), req, res, now);
60
+ if (method === "GET") {
61
+ const ex = hubExecutor(store, { project: project || undefined });
62
+ return sendJson(res, 200, { slos: await Promise.all(listSlos(store.db, project).map((s) => sloReport(s, ex, now))), apdex: apdexTargets(store.db, project) });
63
+ }
64
+ if (method !== "POST")
65
+ return sendJson(res, 405, { error: "method not allowed" });
66
+ const input = parseSlo(await body(req));
67
+ if (typeof input === "string")
68
+ return sendJson(res, 400, { error: input });
69
+ const slo = { ...input, id: randomUUID(), projectId: project };
70
+ saveSlo(store.db, slo, now);
71
+ sendJson(res, 201, slo);
72
+ }
73
+ //# sourceMappingURL=slos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slos.js","sourceRoot":"","sources":["../src/slos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { DatabaseSync } from "node:sqlite";
3
+ import { type MapLoader } from "@wizeworks/lens-core";
4
+ import { type SourceMapOptions } from "@wizeworks/lens-node/kit";
5
+ /** The map loader for one project: its uploads first, then build folders and dev servers. */
6
+ export type HubMaps = (project: string) => MapLoader;
7
+ /** One loader per project, made on first use. */
8
+ export declare function hubMaps(db: DatabaseSync, options: SourceMapOptions | false | undefined): HubMaps;
9
+ /** `POST api/sourcemaps?release=&file=[&project=]`: one map, body the map JSON (gzip allowed). */
10
+ export declare function uploadSourceMap(db: DatabaseSync, now: number, req: IncomingMessage, res: ServerResponse, url: URL): Promise<void>;
11
+ /** `GET api/sourcemaps[?release=&project=]`: the stored maps, newest first. */
12
+ export declare function listMaps(db: DatabaseSync, res: ServerResponse, url: URL): void;
13
+ /** `POST api/sourcemaps/resolve[?project=]` with `{stack, release, traceId?, spanId?}`. */
14
+ export declare function resolveMaps(maps: HubMaps, db: DatabaseSync, req: IncomingMessage, res: ServerResponse, url: URL): Promise<void>;
15
+ //# sourceMappingURL=sourcemaps-api.d.ts.map