@wizeworks/lens-hub 0.3.0-alpha.2 → 0.3.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alerts/api.d.ts +5 -0
- package/dist/alerts/api.d.ts.map +1 -0
- package/dist/alerts/api.js +87 -0
- package/dist/alerts/api.js.map +1 -0
- package/dist/alerts/deliver.d.ts +54 -0
- package/dist/alerts/deliver.d.ts.map +1 -0
- package/dist/alerts/deliver.js +66 -0
- package/dist/alerts/deliver.js.map +1 -0
- package/dist/alerts/evaluate.d.ts +16 -0
- package/dist/alerts/evaluate.d.ts.map +1 -0
- package/dist/alerts/evaluate.js +76 -0
- package/dist/alerts/evaluate.js.map +1 -0
- package/dist/alerts/loop.d.ts +10 -0
- package/dist/alerts/loop.d.ts.map +1 -0
- package/dist/alerts/loop.js +27 -0
- package/dist/alerts/loop.js.map +1 -0
- package/dist/alerts/store.d.ts +32 -0
- package/dist/alerts/store.d.ts.map +1 -0
- package/dist/alerts/store.js +38 -0
- package/dist/alerts/store.js.map +1 -0
- package/dist/alerts/target.d.ts +3 -0
- package/dist/alerts/target.d.ts.map +1 -0
- package/dist/alerts/target.js +23 -0
- package/dist/alerts/target.js.map +1 -0
- package/dist/api.d.ts +5 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +46 -4
- package/dist/api.js.map +1 -1
- package/dist/body.d.ts +2 -2
- package/dist/body.d.ts.map +1 -1
- package/dist/body.js +4 -4
- package/dist/body.js.map +1 -1
- package/dist/changes-api.d.ts +5 -0
- package/dist/changes-api.d.ts.map +1 -0
- package/dist/changes-api.js +21 -0
- package/dist/changes-api.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 +32 -1
- package/dist/cli-args.js.map +1 -1
- package/dist/data.js +1 -1
- package/dist/data.js.map +1 -1
- package/dist/hub.d.ts.map +1 -1
- package/dist/hub.js +15 -3
- package/dist/hub.js.map +1 -1
- package/dist/infra-read.d.ts +11 -0
- package/dist/infra-read.d.ts.map +1 -0
- package/dist/infra-read.js +30 -0
- package/dist/infra-read.js.map +1 -0
- package/dist/ingest.d.ts.map +1 -1
- package/dist/ingest.js +14 -3
- package/dist/ingest.js.map +1 -1
- package/dist/issues.d.ts +10 -0
- package/dist/issues.d.ts.map +1 -0
- package/dist/issues.js +34 -0
- package/dist/issues.js.map +1 -0
- package/dist/kit.d.ts +6 -0
- package/dist/kit.d.ts.map +1 -1
- package/dist/kit.js +4 -0
- package/dist/kit.js.map +1 -1
- package/dist/list-search.d.ts +10 -0
- package/dist/list-search.d.ts.map +1 -0
- package/dist/list-search.js +13 -0
- package/dist/list-search.js.map +1 -0
- package/dist/mcp.d.ts +3 -2
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +59 -8
- package/dist/mcp.js.map +1 -1
- package/dist/metrics-read.js +1 -1
- package/dist/metrics-read.js.map +1 -1
- package/dist/models-api.d.ts +11 -1
- package/dist/models-api.d.ts.map +1 -1
- package/dist/models-api.js +41 -15
- package/dist/models-api.js.map +1 -1
- package/dist/options.d.ts +23 -2
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +10 -1
- package/dist/options.js.map +1 -1
- package/dist/otlp/db-params.d.ts +7 -0
- package/dist/otlp/db-params.d.ts.map +1 -0
- package/dist/otlp/db-params.js +74 -0
- package/dist/otlp/db-params.js.map +1 -0
- package/dist/otlp/logs.d.ts +1 -1
- package/dist/otlp/logs.d.ts.map +1 -1
- package/dist/otlp/logs.js +8 -7
- package/dist/otlp/logs.js.map +1 -1
- package/dist/otlp/metrics.d.ts +3 -3
- package/dist/otlp/metrics.d.ts.map +1 -1
- package/dist/otlp/metrics.js +7 -6
- package/dist/otlp/metrics.js.map +1 -1
- package/dist/otlp/nested.d.ts +4 -0
- package/dist/otlp/nested.d.ts.map +1 -0
- package/dist/otlp/nested.js +19 -0
- package/dist/otlp/nested.js.map +1 -0
- package/dist/otlp/semconv.d.ts +17 -0
- package/dist/otlp/semconv.d.ts.map +1 -0
- package/dist/otlp/semconv.js +68 -0
- package/dist/otlp/semconv.js.map +1 -0
- package/dist/otlp/spans.d.ts +3 -3
- package/dist/otlp/spans.d.ts.map +1 -1
- package/dist/otlp/spans.js +15 -7
- package/dist/otlp/spans.js.map +1 -1
- package/dist/otlp/values.d.ts +5 -10
- package/dist/otlp/values.d.ts.map +1 -1
- package/dist/otlp/values.js +32 -24
- package/dist/otlp/values.js.map +1 -1
- package/dist/saved.d.ts +7 -0
- package/dist/saved.d.ts.map +1 -0
- package/dist/saved.js +49 -0
- package/dist/saved.js.map +1 -0
- package/dist/scale-exec.d.ts +2 -2
- package/dist/scale-exec.d.ts.map +1 -1
- package/dist/scale-exec.js +4 -4
- package/dist/scale-exec.js.map +1 -1
- package/dist/schema-fts.d.ts +4 -0
- package/dist/schema-fts.d.ts.map +1 -0
- package/dist/schema-fts.js +20 -0
- package/dist/schema-fts.js.map +1 -0
- package/dist/schema-saved.d.ts +15 -0
- package/dist/schema-saved.d.ts.map +1 -0
- package/dist/schema-saved.js +43 -0
- package/dist/schema-saved.js.map +1 -0
- package/dist/schema-scale.d.ts.map +1 -1
- package/dist/schema-scale.js +27 -2
- package/dist/schema-scale.js.map +1 -1
- package/dist/schema.d.ts +2 -2
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +20 -1
- package/dist/schema.js.map +1 -1
- package/dist/search-api.d.ts +7 -0
- package/dist/search-api.d.ts.map +1 -0
- package/dist/search-api.js +25 -0
- package/dist/search-api.js.map +1 -0
- package/dist/settings-prune.d.ts +12 -0
- package/dist/settings-prune.d.ts.map +1 -0
- package/dist/settings-prune.js +15 -0
- package/dist/settings-prune.js.map +1 -0
- package/dist/settings.d.ts +27 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +64 -0
- package/dist/settings.js.map +1 -0
- package/dist/settle.d.ts +3 -3
- package/dist/settle.d.ts.map +1 -1
- package/dist/settle.js +12 -6
- package/dist/settle.js.map +1 -1
- package/dist/slos.d.ts +14 -0
- package/dist/slos.d.ts.map +1 -0
- package/dist/slos.js +73 -0
- package/dist/slos.js.map +1 -0
- package/dist/sourcemaps-api.d.ts +15 -0
- package/dist/sourcemaps-api.d.ts.map +1 -0
- package/dist/sourcemaps-api.js +55 -0
- package/dist/sourcemaps-api.js.map +1 -0
- package/dist/sourcemaps.d.ts +10 -0
- package/dist/sourcemaps.d.ts.map +1 -0
- package/dist/sourcemaps.js +41 -0
- package/dist/sourcemaps.js.map +1 -0
- package/dist/store-read.d.ts +2 -0
- package/dist/store-read.d.ts.map +1 -1
- package/dist/store-read.js +3 -1
- package/dist/store-read.js.map +1 -1
- package/dist/store.d.ts +13 -3
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +35 -10
- package/dist/store.js.map +1 -1
- package/dist/tags-api.d.ts +5 -0
- package/dist/tags-api.d.ts.map +1 -0
- package/dist/tags-api.js +94 -0
- package/dist/tags-api.js.map +1 -0
- package/dist/tags.d.ts +11 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.js +31 -0
- package/dist/tags.js.map +1 -0
- package/dist/uptime/api.d.ts +5 -0
- package/dist/uptime/api.d.ts.map +1 -0
- package/dist/uptime/api.js +78 -0
- package/dist/uptime/api.js.map +1 -0
- package/dist/uptime/cert.d.ts +5 -0
- package/dist/uptime/cert.d.ts.map +1 -0
- package/dist/uptime/cert.js +26 -0
- package/dist/uptime/cert.js.map +1 -0
- package/dist/uptime/guard.d.ts +13 -0
- package/dist/uptime/guard.d.ts.map +1 -0
- package/dist/uptime/guard.js +38 -0
- package/dist/uptime/guard.js.map +1 -0
- package/dist/uptime/run.d.ts +11 -0
- package/dist/uptime/run.d.ts.map +1 -0
- package/dist/uptime/run.js +96 -0
- package/dist/uptime/run.js.map +1 -0
- package/dist/uptime/schedule.d.ts +15 -0
- package/dist/uptime/schedule.d.ts.map +1 -0
- package/dist/uptime/schedule.js +26 -0
- package/dist/uptime/schedule.js.map +1 -0
- package/dist/uptime/store.d.ts +25 -0
- package/dist/uptime/store.d.ts.map +1 -0
- package/dist/uptime/store.js +80 -0
- package/dist/uptime/store.js.map +1 -0
- package/package.json +5 -4
package/dist/scale-exec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scale-exec.d.ts","sourceRoot":"","sources":["../src/scale-exec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"scale-exec.d.ts","sourceRoot":"","sources":["../src/scale-exec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,KAAK,QAAQ,EAAoC,KAAK,SAAS,EAAe,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEnI,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,qDAAqD;AACrD,eAAO,MAAM,YAAY,OAAQ,YAAY,KAAG,SAE9C,CAAC;AAEH,yHAAyH;AACzH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAE,QAAa,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,QAAQ,CAQvH;AAED,+IAA+I;AAC/I,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAE,QAAa,EAAE,QAAQ,SAAmB,GAAG,MAAM,GAAG,IAAI,CAE7G"}
|
package/dist/scale-exec.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SQLITE_DIALECT, sqlExecutor } from "@wizeworks/lens-core";
|
|
1
|
+
import { SETTLE_BEHIND_MS, SQLITE_DIALECT, sqlExecutor } from "@wizeworks/lens-core";
|
|
2
2
|
import { settlingCount } from "./settle.js";
|
|
3
3
|
import { getStoredTrace } from "./store-read.js";
|
|
4
4
|
/** Reads for the SQL executor, on the hub's file. */
|
|
@@ -15,8 +15,8 @@ export function hubExecutor(store, scope = {}, keepRemote) {
|
|
|
15
15
|
loadTrace: (id) => getStoredTrace(store.db, id, keepRemote) ?? null,
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
-
/** Traces in the scope
|
|
19
|
-
export function hubSettling(store, scope = {}) {
|
|
20
|
-
return settlingCount(store.db, scope) || null;
|
|
18
|
+
/** Traces in the scope whose stats run behind (written over `behindMs` ago, not settled), for `pageContext(..., settling)`. Null when none. */
|
|
19
|
+
export function hubSettling(store, scope = {}, behindMs = SETTLE_BEHIND_MS) {
|
|
20
|
+
return settlingCount(store.db, scope, store.now() - behindMs) || null;
|
|
21
21
|
}
|
|
22
22
|
//# sourceMappingURL=scale-exec.js.map
|
package/dist/scale-exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scale-exec.js","sourceRoot":"","sources":["../src/scale-exec.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,cAAc,EAAkB,WAAW,EAAiB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"scale-exec.js","sourceRoot":"","sources":["../src/scale-exec.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,gBAAgB,EAAE,cAAc,EAAkB,WAAW,EAAiB,MAAM,sBAAsB,CAAC;AACnI,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,qDAAqD;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAgB,EAAa,EAAE,CAAC,CAAC;IAC5D,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAI,MAA0B,CAA8B;CAC7G,CAAC,CAAC;AAEH,yHAAyH;AACzH,MAAM,UAAU,WAAW,CAAC,KAAe,EAAE,KAAK,GAAa,EAAE,EAAE,UAA0C;IAC3G,OAAO,WAAW,CAAC;QACjB,CAAC,EAAE,cAAc;QACjB,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK;QACL,WAAW,EAAE,KAAK,CAAC,QAAQ;QAC3B,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,IAAI;KACpE,CAAC,CAAC;AACL,CAAC;AAED,+IAA+I;AAC/I,MAAM,UAAU,WAAW,CAAC,KAAe,EAAE,KAAK,GAAa,EAAE,EAAE,QAAQ,GAAG,gBAAgB;IAC5F,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-fts.d.ts","sourceRoot":"","sources":["../src/schema-fts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAchD,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAMjD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Trigram indexes (docs/SEARCH-PLAN.md, "Hub"): "contains" searches of 3 or more characters read these, not the whole time window.
|
|
2
|
+
const FTS_COLUMNS = { fact_search: "text", fact_requests: "search", fact_traces: "search", fact_logs: "search" };
|
|
3
|
+
/** An index over `table.col`, kept in step with the table by triggers. */
|
|
4
|
+
const ftsSql = (t, col) => `
|
|
5
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS ${t}_fts USING fts5(${col}, content='${t}', content_rowid='rowid', tokenize='trigram case_sensitive 1');
|
|
6
|
+
CREATE TRIGGER IF NOT EXISTS ${t}_fts_ai AFTER INSERT ON ${t} BEGIN INSERT INTO ${t}_fts (rowid, ${col}) VALUES (new.rowid, new.${col}); END;
|
|
7
|
+
CREATE TRIGGER IF NOT EXISTS ${t}_fts_ad AFTER DELETE ON ${t} BEGIN INSERT INTO ${t}_fts (${t}_fts, rowid, ${col}) VALUES ('delete', old.rowid, old.${col}); END;
|
|
8
|
+
CREATE TRIGGER IF NOT EXISTS ${t}_fts_au AFTER UPDATE ON ${t} BEGIN
|
|
9
|
+
INSERT INTO ${t}_fts (${t}_fts, rowid, ${col}) VALUES ('delete', old.rowid, old.${col}); INSERT INTO ${t}_fts (rowid, ${col}) VALUES (new.rowid, new.${col});
|
|
10
|
+
END;`;
|
|
11
|
+
/** Add the indexes; a file that had rows before them fills them once. */
|
|
12
|
+
export function upgradeFts(db) {
|
|
13
|
+
for (const [t, col] of Object.entries(FTS_COLUMNS)) {
|
|
14
|
+
const had = db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(`${t}_fts`);
|
|
15
|
+
db.exec(ftsSql(t, col));
|
|
16
|
+
if (!had)
|
|
17
|
+
db.exec(`INSERT INTO ${t}_fts (${t}_fts) VALUES ('rebuild')`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=schema-fts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-fts.js","sourceRoot":"","sources":["../src/schema-fts.ts"],"names":[],"mappings":"AAEA,mIAAmI;AACnI,MAAM,WAAW,GAA2B,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAEzI,0EAA0E;AAC1E,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE,CAAC;qCACN,CAAC,mBAAmB,GAAG,cAAc,CAAC;+BAC5C,CAAC,2BAA2B,CAAC,sBAAsB,CAAC,gBAAgB,GAAG,4BAA4B,GAAG;+BACtG,CAAC,2BAA2B,CAAC,sBAAsB,CAAC,SAAS,CAAC,gBAAgB,GAAG,sCAAsC,GAAG;+BAC1H,CAAC,2BAA2B,CAAC;gBAC5C,CAAC,SAAS,CAAC,gBAAgB,GAAG,sCAAsC,GAAG,kBAAkB,CAAC,gBAAgB,GAAG,4BAA4B,GAAG;KACvJ,CAAC;AAEN,yEAAyE;AACzE,MAAM,UAAU,UAAU,CAAC,EAAgB;IACzC,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG;YAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { type SavedItem } from "@wizeworks/lens-core";
|
|
3
|
+
interface OldRow {
|
|
4
|
+
id: string;
|
|
5
|
+
project: string;
|
|
6
|
+
name: string;
|
|
7
|
+
params: string;
|
|
8
|
+
created_ms: number;
|
|
9
|
+
}
|
|
10
|
+
/** The saved item an old log search becomes: shared, as every hub item is, and drawn as a chart. */
|
|
11
|
+
export declare const itemOfOldSearch: (r: OldRow) => SavedItem;
|
|
12
|
+
/** Move every old log search into `saved`, then drop `saved_searches`. Nothing to do when the table is gone. */
|
|
13
|
+
export declare function moveSavedSearches(db: DatabaseSync): void;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=schema-saved.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-saved.d.ts","sourceRoot":"","sources":["../src/schema-saved.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGrE,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,oGAAoG;AACpG,eAAO,MAAM,eAAe,MAAO,MAAM,KAAG,SAa1C,CAAC;AAEH,gHAAgH;AAChH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAaxD"}
|
|
@@ -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;
|
|
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"}
|
package/dist/schema-scale.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { FACTS_VERSION } from "@wizeworks/lens-core";
|
|
2
|
+
import { moveSavedSearches } from "./schema-saved.js";
|
|
3
|
+
import { upgradeFts } from "./schema-fts.js";
|
|
2
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";
|
|
3
7
|
// Stats tables (docs/CONTRACT.md, "Hub storage"): facts per trace, rollups per tier, and metric rollups. The tiers are identical.
|
|
4
8
|
const TIERS = ["10s", "5m", "1h"];
|
|
5
9
|
const rollupTable = (t) => `
|
|
@@ -45,7 +49,7 @@ CREATE INDEX IF NOT EXISTS ix_fact_traces_project ON fact_traces (project, start
|
|
|
45
49
|
CREATE TABLE IF NOT EXISTS fact_logs (
|
|
46
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,
|
|
47
51
|
level TEXT NOT NULL, level_rank INTEGER NOT NULL, service TEXT NOT NULL, category TEXT NOT NULL, message TEXT NOT NULL,
|
|
48
|
-
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)
|
|
49
53
|
);
|
|
50
54
|
CREATE INDEX IF NOT EXISTS ix_fact_logs_time ON fact_logs (time_ms);
|
|
51
55
|
CREATE INDEX IF NOT EXISTS ix_fact_logs_project ON fact_logs (project, time_ms);
|
|
@@ -55,6 +59,19 @@ CREATE TABLE IF NOT EXISTS fact_critical (
|
|
|
55
59
|
);
|
|
56
60
|
CREATE INDEX IF NOT EXISTS ix_fact_critical_time ON fact_critical (start_ms);
|
|
57
61
|
CREATE INDEX IF NOT EXISTS ix_fact_critical_project ON fact_critical (project, start_ms);
|
|
62
|
+
CREATE TABLE IF NOT EXISTS fact_search (
|
|
63
|
+
project TEXT NOT NULL DEFAULT '', kind TEXT NOT NULL, trace_id TEXT NOT NULL, owner TEXT NOT NULL, env TEXT NOT NULL DEFAULT '', time_ms REAL NOT NULL,
|
|
64
|
+
span_id TEXT, service TEXT NOT NULL, name TEXT, method TEXT, path TEXT, route TEXT, status INTEGER, outcome TEXT, duration_ms REAL,
|
|
65
|
+
level_rank INTEGER, category TEXT, span_kind TEXT, end_user TEXT, error INTEGER NOT NULL, message TEXT, text TEXT NOT NULL,
|
|
66
|
+
PRIMARY KEY (kind, trace_id, owner)
|
|
67
|
+
);
|
|
68
|
+
CREATE INDEX IF NOT EXISTS ix_fact_search_time ON fact_search (kind, time_ms);
|
|
69
|
+
CREATE INDEX IF NOT EXISTS ix_fact_search_project ON fact_search (project, kind, time_ms);
|
|
70
|
+
CREATE TABLE IF NOT EXISTS fact_attrs (
|
|
71
|
+
project TEXT NOT NULL DEFAULT '', trace_id TEXT NOT NULL, src TEXT NOT NULL, owner TEXT NOT NULL, key TEXT NOT NULL, value TEXT NOT NULL, num REAL
|
|
72
|
+
);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS ix_fact_attrs_trace ON fact_attrs (trace_id, src, owner, key);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS ix_fact_attrs_key ON fact_attrs (key, value);
|
|
58
75
|
CREATE TABLE IF NOT EXISTS metric_series (
|
|
59
76
|
project TEXT NOT NULL DEFAULT '', env TEXT NOT NULL DEFAULT '', series_key TEXT NOT NULL, name TEXT NOT NULL, service TEXT NOT NULL,
|
|
60
77
|
kind TEXT NOT NULL, unit TEXT NOT NULL, description TEXT NOT NULL, monotonic INTEGER NOT NULL, temporality TEXT NOT NULL,
|
|
@@ -65,7 +82,7 @@ CREATE INDEX IF NOT EXISTS ix_metric_series_project ON metric_series (project, n
|
|
|
65
82
|
${TIERS.map(rollupTable).join("\n")}
|
|
66
83
|
`;
|
|
67
84
|
/** Tables the stats rebuild clears. */
|
|
68
|
-
export const STATS_TABLES = ["fact_requests", "fact_traces", "fact_logs", "fact_critical", ...TIERS.flatMap((t) => [`rollup_${t}`, `hist_${t}`])];
|
|
85
|
+
export const STATS_TABLES = ["fact_requests", "fact_traces", "fact_logs", "fact_critical", "fact_search", "fact_attrs", ...TIERS.flatMap((t) => [`rollup_${t}`, `hist_${t}`])];
|
|
69
86
|
const setMeta = (db, key, value) => db.prepare("INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)").run(key, value);
|
|
70
87
|
/** Clear facts and rollups and mark every trace unsettled, so the settle job rebuilds them. */
|
|
71
88
|
function rebuildStats(db) {
|
|
@@ -91,6 +108,14 @@ export function upgradeHubSchema(db) {
|
|
|
91
108
|
if (!cols.has("contrib"))
|
|
92
109
|
db.exec("ALTER TABLE traces ADD COLUMN contrib TEXT");
|
|
93
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)");
|
|
118
|
+
upgradeFts(db);
|
|
94
119
|
const facts = db.prepare("SELECT value FROM meta WHERE key = 'facts'").get();
|
|
95
120
|
if (facts?.value !== String(FACTS_VERSION))
|
|
96
121
|
rebuildStats(db);
|
package/dist/schema-scale.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-scale.js","sourceRoot":"","sources":["../src/schema-scale.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
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
|
-
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;
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -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,
|
|
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 = "
|
|
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 {
|
package/dist/schema.js.map
CHANGED
|
@@ -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
|
|
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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
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; `tag:` reads the hub's tags. */
|
|
4
|
+
export declare function sendSearch(c: ApiContext, p: URLSearchParams, res: ServerResponse): Promise<void>;
|
|
5
|
+
/** `GET api/search/suggest?field=&prefix=&range=&project=&limit=`. */
|
|
6
|
+
export declare function sendSuggest(c: ApiContext, p: URLSearchParams, res: ServerResponse): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=search-api.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { activeTags, expandQuery, searchRequestOf, searchSql, SQLITE_DIALECT, suggestRequestOf, suggestSql, suggestTags } from "@wizeworks/lens-core";
|
|
2
|
+
import { sendJson } from "@wizeworks/lens-node/kit";
|
|
3
|
+
import { hubSettling, sqliteRunner } from "./scale-exec.js";
|
|
4
|
+
import { hubTags } from "./tags.js";
|
|
5
|
+
// The hub's search API (docs/SEARCH-PLAN.md): one page of results, and autocomplete. `project` narrows both.
|
|
6
|
+
const sourceOf = (c, p) => ({ d: SQLITE_DIALECT, run: sqliteRunner(c.data.store.db), scope: { project: p.get("project") || undefined } });
|
|
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. */
|
|
8
|
+
export async function sendSearch(c, p, res) {
|
|
9
|
+
const r = searchRequestOf(p, c.o.now(), c.data.store.maxAgeMs);
|
|
10
|
+
if (!r.ok)
|
|
11
|
+
return sendJson(res, 400, r);
|
|
12
|
+
const t0 = performance.now();
|
|
13
|
+
const src = sourceOf(c, p);
|
|
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 });
|
|
17
|
+
}
|
|
18
|
+
/** `GET api/search/suggest?field=&prefix=&range=&project=&limit=`. */
|
|
19
|
+
export async function sendSuggest(c, p, res) {
|
|
20
|
+
const r = suggestRequestOf(p, c.o.now(), c.data.store.maxAgeMs);
|
|
21
|
+
if (!r.ok)
|
|
22
|
+
return sendJson(res, 400, r);
|
|
23
|
+
sendJson(res, 200, { items: suggestTags(r.request, hubTags(c.data.store.db)) ?? (await suggestSql(sourceOf(c, p), r.request)) });
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=search-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/dist/settings.js
ADDED
|
@@ -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":"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"}
|
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,
|
|
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,
|
|
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
|
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,KAAK,EAAE,YAAY,EAAgC,MAAM,aAAa,CAAC;AAC9E,OAAO,
|
|
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.
|
|
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,
|
|
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 <=
|
|
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,
|
|
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)
|
package/dist/settle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAkB,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAmB,MAAM,sBAAsB,CAAC;
|
|
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
|