@rudderhq/server 0.7.0 → 0.7.1
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/bootstrap/register-api-routes.js +1 -1
- package/dist/bootstrap/register-api-routes.js.map +1 -1
- package/dist/bundled-plugins/plugin-linear/dist/worker.js +3 -1
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
- package/dist/product-analytics-collector-config.d.ts +33 -0
- package/dist/product-analytics-collector-config.d.ts.map +1 -0
- package/dist/product-analytics-collector-config.js +67 -0
- package/dist/product-analytics-collector-config.js.map +1 -0
- package/dist/product-analytics-collector-server.d.ts +26 -0
- package/dist/product-analytics-collector-server.d.ts.map +1 -0
- package/dist/product-analytics-collector-server.js +150 -0
- package/dist/product-analytics-collector-server.js.map +1 -0
- package/dist/routes/instance-settings.d.ts +1 -0
- package/dist/routes/instance-settings.d.ts.map +1 -1
- package/dist/routes/instance-settings.js +58 -0
- package/dist/routes/instance-settings.js.map +1 -1
- package/dist/routes/product-analytics-collector-report.d.ts +7 -0
- package/dist/routes/product-analytics-collector-report.d.ts.map +1 -0
- package/dist/routes/product-analytics-collector-report.js +159 -0
- package/dist/routes/product-analytics-collector-report.js.map +1 -0
- package/dist/routes/product-analytics-collector.d.ts +14 -2
- package/dist/routes/product-analytics-collector.d.ts.map +1 -1
- package/dist/routes/product-analytics-collector.js +141 -4
- package/dist/routes/product-analytics-collector.js.map +1 -1
- package/dist/routes/product-analytics.d.ts.map +1 -1
- package/dist/routes/product-analytics.js +40 -3
- package/dist/routes/product-analytics.js.map +1 -1
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +4 -0
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/product-analytics-collector-maintenance.d.ts +25 -0
- package/dist/services/product-analytics-collector-maintenance.d.ts.map +1 -0
- package/dist/services/product-analytics-collector-maintenance.js +309 -0
- package/dist/services/product-analytics-collector-maintenance.js.map +1 -0
- package/dist/services/product-analytics-collector-maintenance.test.d.ts +2 -0
- package/dist/services/product-analytics-collector-maintenance.test.d.ts.map +1 -0
- package/dist/services/product-analytics-collector-maintenance.test.js +14 -0
- package/dist/services/product-analytics-collector-maintenance.test.js.map +1 -0
- package/dist/services/product-analytics-collector.d.ts +75 -3
- package/dist/services/product-analytics-collector.d.ts.map +1 -1
- package/dist/services/product-analytics-collector.js +363 -12
- package/dist/services/product-analytics-collector.js.map +1 -1
- package/dist/services/product-analytics-collector.test.js +25 -0
- package/dist/services/product-analytics-collector.test.js.map +1 -1
- package/dist/services/product-analytics-fixture.d.ts +7 -0
- package/dist/services/product-analytics-fixture.d.ts.map +1 -0
- package/dist/services/product-analytics-fixture.js +65 -0
- package/dist/services/product-analytics-fixture.js.map +1 -0
- package/dist/services/product-analytics-prd-gates.test.d.ts +2 -0
- package/dist/services/product-analytics-prd-gates.test.d.ts.map +1 -0
- package/dist/services/product-analytics-prd-gates.test.js +135 -0
- package/dist/services/product-analytics-prd-gates.test.js.map +1 -0
- package/dist/services/product-analytics.d.ts +17 -5
- package/dist/services/product-analytics.d.ts.map +1 -1
- package/dist/services/product-analytics.js +94 -12
- package/dist/services/product-analytics.js.map +1 -1
- package/package.json +17 -14
- package/ui-dist/assets/{LibraryLiveSurface-DeUIV5N_.js → LibraryLiveSurface-CZED7oKj.js} +1 -1
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-BaoLM9Pd.js → abnfDiagram-VRR7QNED-BoPyIoAq.js} +1 -1
- package/ui-dist/assets/{arc-Cx0L6o2z.js → arc-DTYs4RCH.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-zVfZP7v4.js → architectureDiagram-ZJ3FMSHR-BGfp2S_3.js} +1 -1
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-BiWWFP9R.js → blockDiagram-677ZJIJ3-aW0EGIUf.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV-CX65GSJ6.js → c4Diagram-LMCZKHZV--1itKgA2.js} +1 -1
- package/ui-dist/assets/channel-DLNwhPnC.js +1 -0
- package/ui-dist/assets/{chunk-2Q5K7J3B-CH6PlelX.js → chunk-2Q5K7J3B-ZIqIozPQ.js} +1 -1
- package/ui-dist/assets/{chunk-32BRIVSS-C7ZEXYO8.js → chunk-32BRIVSS-DiwBEZVQ.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-CyInWuue.js → chunk-5VM5RSS4-CLOrTmL8.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-D58qFIdM.js → chunk-EX3LRPZG-D6xZzF47.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-CJ3Qx30f.js → chunk-JWPE2WC7-B9tYvTZl.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN-BO4bKVLH.js → chunk-MOJQB5TN-D_qo-SzM.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-DxBmxcYc.js → chunk-RYQCIY6F-ChPHGc2P.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-Chdnd6Lq.js → chunk-V7JOEXUC-Dk6GbZYp.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-GkW_x_pD.js → chunk-VR4S4FIN-B6AREC1T.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-BJyBGcSF.js → chunk-XXDRQBXY-CUyO-JUr.js} +1 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-JsIc-rlc.js +1 -0
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-JsIc-rlc.js +1 -0
- package/ui-dist/assets/{cose-bilkent-JH36ORCC-BWP2r8TX.js → cose-bilkent-JH36ORCC-BCxIInLZ.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-C08dfI3w.js → cynefin-VYW2F7L2-DqsnpnHA.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-h6dXjTaO.js → cynefinDiagram-TSTJHNR4-BD7QQNLW.js} +1 -1
- package/ui-dist/assets/{dagre-VKFMJZFB-CWDgoFQD.js → dagre-VKFMJZFB-DaE160f7.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-CK1j48d-.js → diagram-FQU43EPY-DZ0c59y8.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-CoSiG57q.js → diagram-G47NLZAW-C_413g5E.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-DRG-xXGQ.js → diagram-NH7WQ7WH-D_o9pXB-.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-D04mMwYs.js → diagram-OA4YK3LP-BI2xMqiW.js} +1 -1
- package/ui-dist/assets/{diagram-WEI45ONY-ZkC1ZQMq.js → diagram-WEI45ONY-hhM8R_14.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-BxMIw9PZ.js → ebnfDiagram-CCIWWBDH-DfFgEtmG.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-B4Zwbn84.js → erDiagram-Q63AITRT-CCw4ysHK.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-D5pYz8Px.js → flowDiagram-23GEKE2U-CzC1SMmo.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-RSramodc.js → ganttDiagram-NO4QXBWP-CbPJIrIw.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-BFQfCkMd.js → gitGraphDiagram-IHSO6WYX-jCxJ66_C.js} +1 -1
- package/ui-dist/assets/{graph-DuSS8poS.js → graph-BfNZ9Jzj.js} +1 -1
- package/ui-dist/assets/{index-DRbt_Svi.js → index-B3h9Vdxx.js} +1 -1
- package/ui-dist/assets/{index-9U78M9Np.js → index-B8q4cbOz.js} +1 -1
- package/ui-dist/assets/{index-olsHIcXs.js → index-BE1vSI6a.js} +1 -1
- package/ui-dist/assets/{index-B-NP8fOI.js → index-BKn4zRjf.js} +1 -1
- package/ui-dist/assets/{index-BKXUkeeU.js → index-BULll2e0.js} +1 -1
- package/ui-dist/assets/{index-BpvytaKr.js → index-BjxRqzZK.js} +1 -1
- package/ui-dist/assets/{index-Cyq94-QT.js → index-Bwo-C8W5.js} +1 -1
- package/ui-dist/assets/{index-BADa8mxG.js → index-ByUFNj0O.js} +1 -1
- package/ui-dist/assets/{index-CHbXMgL0.js → index-Chop-Dpa.js} +1 -1
- package/ui-dist/assets/{index-BU0KLNTt.js → index-Ck-ZNQeD.js} +541 -528
- package/ui-dist/assets/index-CxPYXL3t.css +1 -0
- package/ui-dist/assets/{index-wZlfBtwh.js → index-D00XdcOq.js} +1 -1
- package/ui-dist/assets/{index-BGcgy63z.js → index-D_K-9VDs.js} +1 -1
- package/ui-dist/assets/{index-DzdRgH-y.js → index-DiMDROQY.js} +1 -1
- package/ui-dist/assets/{index-5tzBDABj.js → index-DmjAbzHq.js} +1 -1
- package/ui-dist/assets/{index-De3vaw_P.js → index-SkHIC7Ma.js} +1 -1
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-f5i4pO3J.js → infoDiagram-FWYZ7A6U-BkDimGw3.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-CVEdv5i_.js → ishikawaDiagram-FXEZZL3T-BAyUfn6x.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-Cvp7vWcy.js → journeyDiagram-5HDEW3XC-DlbpTZHG.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-C6dURjjK.js → kanban-definition-HUTT4EX6-Cd67S14K.js} +1 -1
- package/ui-dist/assets/{layout-DxdOu9MY.js → layout-Dc4YEiCC.js} +1 -1
- package/ui-dist/assets/{linear-CRi8RB_7.js → linear-BhRsbD_5.js} +1 -1
- package/ui-dist/assets/{map-BlpDrw_l.js → map-CEWybj6z.js} +1 -1
- package/ui-dist/assets/{mermaid.core-2Gz9YusH.js → mermaid.core-CqqAFYNg.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-BmSjJLTI.js → mindmap-definition-LN4V7U3C-CCb-XmEi.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-BTUboUw8.js → pegDiagram-2B236MQR-CqUV14VZ.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-CVPP8SYv.js → pieDiagram-ENE6RG2P-Dn_M_GRM.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-BG4FmirT.js → quadrantDiagram-ABIIQ3AL-rAEhJDr2.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-DFRNo9hF.js → railroadDiagram-RFXS5EU6-iE2o_jkH.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-DpnVF9qP.js → requirementDiagram-TGXJPOKE-BFyKBR1h.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-D1ETFdSE.js → sankeyDiagram-HTMAVEWB-DRa_2YB6.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-CNqzB_AL.js → sequenceDiagram-DBY2YBRQ-BG8VIjD7.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-DuoMCjdH.js → sizeCapture-X5ZJPWSS-CS1xlbzG.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-fmHeKL8l.js → stateDiagram-2N3HPSRC-BSl2RUJ1.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DUVNSzI8.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-hjosaIhT.js → swimlanes-5IMT3BWC-BT8Hrm9J.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DfLFj7sh.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-xoMEClc-.js → timeline-definition-FHXFAJF6-CfYIqEuQ.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-sdSXQfX-.js → vennDiagram-L72KCM5P-C8zBH7o9.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-BbQBSKlD.js → wardleyDiagram-EHGQE667-D5HyFfI9.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BfAtadyK.js → xychartDiagram-FW5EYKEG-CGItJmLx.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/channel-CHc3ibOz.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-9iLZpz3t.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-9iLZpz3t.js +0 -1
- package/ui-dist/assets/index-QrRs-r-4.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DajAVikh.js +0 -1
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DJjG9OJ-.js +0 -8
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type ProductAnalyticsCollectorConfig = {
|
|
2
|
+
databaseUrl: string;
|
|
3
|
+
maintenanceDatabaseUrl: string;
|
|
4
|
+
reportDatabaseUrl: string;
|
|
5
|
+
databaseRole: string | null;
|
|
6
|
+
expectedDatabaseRole: string | null;
|
|
7
|
+
maintenanceDatabaseRole: string | null;
|
|
8
|
+
reportDatabaseRole: string | null;
|
|
9
|
+
schema: "rudder_analytics";
|
|
10
|
+
host: string;
|
|
11
|
+
port: number;
|
|
12
|
+
identityPublicKey: string;
|
|
13
|
+
identityIssuer: string;
|
|
14
|
+
identityKeyId: string;
|
|
15
|
+
anonymousAuthorization: string | null;
|
|
16
|
+
reportSecret: string | null;
|
|
17
|
+
revokeSecret: string | null;
|
|
18
|
+
consentSyncSecret: string | null;
|
|
19
|
+
retentionDays: number;
|
|
20
|
+
privacyThreshold: number;
|
|
21
|
+
rollupIntervalMs: number;
|
|
22
|
+
};
|
|
23
|
+
/** Parse the central deployment contract. Missing identity or DB settings fail closed. */
|
|
24
|
+
export declare function parseProductAnalyticsCollectorConfig(env?: NodeJS.ProcessEnv): ProductAnalyticsCollectorConfig;
|
|
25
|
+
export declare const PRODUCT_ANALYTICS_COLLECTOR_DEFAULTS: {
|
|
26
|
+
readonly host: "127.0.0.1";
|
|
27
|
+
readonly port: 4318;
|
|
28
|
+
readonly schema: "rudder_analytics";
|
|
29
|
+
readonly retentionDays: 90;
|
|
30
|
+
readonly privacyThreshold: 10;
|
|
31
|
+
readonly rollupIntervalMs: number;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=product-analytics-collector-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-analytics-collector-config.d.ts","sourceRoot":"","sources":["../src/product-analytics-collector-config.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,+BAA+B,GAAG;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAiBF,0FAA0F;AAC1F,wBAAgB,oCAAoC,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,+BAA+B,CA+B1H;AAED,eAAO,MAAM,oCAAoC;;;;;;;CAOvC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const DEFAULT_HOST = "127.0.0.1";
|
|
2
|
+
const DEFAULT_PORT = 4318;
|
|
3
|
+
const DEFAULT_SCHEMA = "rudder_analytics";
|
|
4
|
+
const DEFAULT_RETENTION_DAYS = 90;
|
|
5
|
+
const DEFAULT_PRIVACY_THRESHOLD = 10;
|
|
6
|
+
const DEFAULT_ROLLUP_INTERVAL_MS = 15 * 60 * 1000;
|
|
7
|
+
function required(env, key) {
|
|
8
|
+
const value = env[key]?.trim();
|
|
9
|
+
if (!value)
|
|
10
|
+
throw new Error(`missing_${key.toLowerCase()}`);
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function positiveInteger(env, key, fallback, limits) {
|
|
14
|
+
const raw = env[key]?.trim();
|
|
15
|
+
if (!raw)
|
|
16
|
+
return fallback;
|
|
17
|
+
if (!/^\d+$/.test(raw))
|
|
18
|
+
throw new Error(`invalid_${key.toLowerCase()}`);
|
|
19
|
+
const value = Number(raw);
|
|
20
|
+
if (!Number.isSafeInteger(value) || value < limits.min || value > limits.max)
|
|
21
|
+
throw new Error(`invalid_${key.toLowerCase()}`);
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
/** Parse the central deployment contract. Missing identity or DB settings fail closed. */
|
|
25
|
+
export function parseProductAnalyticsCollectorConfig(env = process.env) {
|
|
26
|
+
const schema = env.RUDDER_TELEMETRY_COLLECTOR_SCHEMA?.trim() || DEFAULT_SCHEMA;
|
|
27
|
+
if (schema !== DEFAULT_SCHEMA)
|
|
28
|
+
throw new Error("invalid_rudder_telemetry_collector_schema");
|
|
29
|
+
const port = positiveInteger(env, "RUDDER_TELEMETRY_COLLECTOR_PORT", DEFAULT_PORT, { min: 1, max: 65535 });
|
|
30
|
+
const retentionDays = positiveInteger(env, "RUDDER_TELEMETRY_COLLECTOR_RETENTION_DAYS", DEFAULT_RETENTION_DAYS, { min: 1, max: 3650 });
|
|
31
|
+
const privacyThreshold = positiveInteger(env, "RUDDER_TELEMETRY_COLLECTOR_PRIVACY_THRESHOLD", DEFAULT_PRIVACY_THRESHOLD, { min: 2, max: 100000 });
|
|
32
|
+
const rollupIntervalMs = positiveInteger(env, "RUDDER_TELEMETRY_COLLECTOR_ROLLUP_INTERVAL_MS", DEFAULT_ROLLUP_INTERVAL_MS, { min: 1000, max: 24 * 60 * 60 * 1000 });
|
|
33
|
+
const host = env.RUDDER_TELEMETRY_COLLECTOR_HOST?.trim() || DEFAULT_HOST;
|
|
34
|
+
if (host.length > 255)
|
|
35
|
+
throw new Error("invalid_rudder_telemetry_collector_host");
|
|
36
|
+
return {
|
|
37
|
+
databaseUrl: required(env, "RUDDER_TELEMETRY_COLLECTOR_DATABASE_URL"),
|
|
38
|
+
maintenanceDatabaseUrl: required(env, "RUDDER_TELEMETRY_COLLECTOR_MAINTENANCE_DATABASE_URL"),
|
|
39
|
+
reportDatabaseUrl: required(env, "RUDDER_TELEMETRY_COLLECTOR_REPORT_DATABASE_URL"),
|
|
40
|
+
databaseRole: env.RUDDER_TELEMETRY_COLLECTOR_DATABASE_ROLE?.trim() || null,
|
|
41
|
+
expectedDatabaseRole: env.RUDDER_TELEMETRY_COLLECTOR_EXPECTED_DATABASE_ROLE?.trim() || env.RUDDER_TELEMETRY_COLLECTOR_DATABASE_ROLE?.trim() || null,
|
|
42
|
+
maintenanceDatabaseRole: env.RUDDER_TELEMETRY_COLLECTOR_MAINTENANCE_DATABASE_ROLE?.trim() || null,
|
|
43
|
+
reportDatabaseRole: env.RUDDER_TELEMETRY_COLLECTOR_REPORT_DATABASE_ROLE?.trim() || null,
|
|
44
|
+
schema,
|
|
45
|
+
host,
|
|
46
|
+
port,
|
|
47
|
+
identityPublicKey: required(env, "RUDDER_TELEMETRY_COLLECTOR_IDENTITY_PUBLIC_KEY"),
|
|
48
|
+
identityIssuer: required(env, "RUDDER_TELEMETRY_COLLECTOR_IDENTITY_ISSUER"),
|
|
49
|
+
identityKeyId: required(env, "RUDDER_TELEMETRY_COLLECTOR_IDENTITY_KEY_ID"),
|
|
50
|
+
anonymousAuthorization: env.RUDDER_TELEMETRY_COLLECTOR_ANONYMOUS_AUTHORIZATION?.trim() || null,
|
|
51
|
+
reportSecret: env.RUDDER_TELEMETRY_COLLECTOR_REPORT_SECRET?.trim() || null,
|
|
52
|
+
revokeSecret: env.RUDDER_TELEMETRY_COLLECTOR_REVOKE_SECRET?.trim() || null,
|
|
53
|
+
consentSyncSecret: env.RUDDER_TELEMETRY_COLLECTOR_CONSENT_SYNC_SECRET?.trim() || null,
|
|
54
|
+
retentionDays,
|
|
55
|
+
privacyThreshold,
|
|
56
|
+
rollupIntervalMs,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export const PRODUCT_ANALYTICS_COLLECTOR_DEFAULTS = {
|
|
60
|
+
host: DEFAULT_HOST,
|
|
61
|
+
port: DEFAULT_PORT,
|
|
62
|
+
schema: DEFAULT_SCHEMA,
|
|
63
|
+
retentionDays: DEFAULT_RETENTION_DAYS,
|
|
64
|
+
privacyThreshold: DEFAULT_PRIVACY_THRESHOLD,
|
|
65
|
+
rollupIntervalMs: DEFAULT_ROLLUP_INTERVAL_MS,
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=product-analytics-collector-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-analytics-collector-config.js","sourceRoot":"","sources":["../src/product-analytics-collector-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Db } from "@rudderhq/db";
|
|
2
|
+
import { type Express } from "express";
|
|
3
|
+
import { type Server } from "node:http";
|
|
4
|
+
import { type ProductAnalyticsCollectorConfig } from "./product-analytics-collector-config.js";
|
|
5
|
+
export type ProductAnalyticsCollectorAppOptions = {
|
|
6
|
+
config: ProductAnalyticsCollectorConfig;
|
|
7
|
+
db: Db;
|
|
8
|
+
maintenanceDb?: Db;
|
|
9
|
+
reportDb: Db;
|
|
10
|
+
maintenance?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function createProductAnalyticsCollectorApp(options: ProductAnalyticsCollectorAppOptions): Express;
|
|
13
|
+
export type StartedProductAnalyticsCollector = {
|
|
14
|
+
app: Express;
|
|
15
|
+
server: Server;
|
|
16
|
+
host: string;
|
|
17
|
+
port: number;
|
|
18
|
+
config: ProductAnalyticsCollectorConfig;
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
export declare function startProductAnalyticsCollector(options?: {
|
|
22
|
+
config?: ProductAnalyticsCollectorConfig;
|
|
23
|
+
db?: Db;
|
|
24
|
+
listen?: boolean;
|
|
25
|
+
}): Promise<StartedProductAnalyticsCollector>;
|
|
26
|
+
//# sourceMappingURL=product-analytics-collector-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-analytics-collector-server.d.ts","sourceRoot":"","sources":["../src/product-analytics-collector-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;AACjD,OAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAwC,KAAK,+BAA+B,EAAE,MAAM,yCAAyC,CAAC;AASrI,MAAM,MAAM,mCAAmC,GAAG;IAChD,MAAM,EAAE,+BAA+B,CAAC;IACxC,EAAE,EAAE,EAAE,CAAC;IACP,aAAa,CAAC,EAAE,EAAE,CAAC;IACnB,QAAQ,EAAE,EAAE,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,mCAAmC,GAAG,OAAO,CAqDxG;AAED,MAAM,MAAM,gCAAgC,GAAG;IAC7C,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,+BAA+B,CAAC;IACxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAEF,wBAAsB,8BAA8B,CAAC,OAAO,GAAE;IAC5D,MAAM,CAAC,EAAE,+BAA+B,CAAC;IACzC,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAiEjD"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { createDb } from "@rudderhq/db";
|
|
2
|
+
import express from "express";
|
|
3
|
+
import { createServer } from "node:http";
|
|
4
|
+
import { parseProductAnalyticsCollectorConfig } from "./product-analytics-collector-config.js";
|
|
5
|
+
import { productAnalyticsCollectorReportRoutes } from "./routes/product-analytics-collector-report.js";
|
|
6
|
+
import { createProductAnalyticsAssertionAuthorizer, productAnalyticsCollectorRoutes } from "./routes/product-analytics-collector.js";
|
|
7
|
+
import { assertProductAnalyticsCollectorDatabaseBoundary, runProductAnalyticsCollectorMaintenance, } from "./services/product-analytics-collector-maintenance.js";
|
|
8
|
+
import { createProductAnalyticsPersistentCollector } from "./services/product-analytics-collector.js";
|
|
9
|
+
export function createProductAnalyticsCollectorApp(options) {
|
|
10
|
+
const app = express();
|
|
11
|
+
app.disable("x-powered-by");
|
|
12
|
+
app.use(express.json({ limit: "64kb", strict: true, type: "application/json" }));
|
|
13
|
+
app.get(["/healthz", "/api/health"], (_req, res) => {
|
|
14
|
+
res.status(200).json({ ok: true, service: "product-analytics-collector", schema: options.config.schema });
|
|
15
|
+
});
|
|
16
|
+
const collector = createProductAnalyticsPersistentCollector(options.db);
|
|
17
|
+
const authorize = createProductAnalyticsAssertionAuthorizer({
|
|
18
|
+
identityPublicKey: options.config.identityPublicKey,
|
|
19
|
+
expectedKeyId: options.config.identityKeyId,
|
|
20
|
+
expectedIssuer: options.config.identityIssuer,
|
|
21
|
+
anonymousAuthorization: options.config.anonymousAuthorization,
|
|
22
|
+
});
|
|
23
|
+
app.use(productAnalyticsCollectorRoutes(collector, authorize, {
|
|
24
|
+
anonymousAuthorization: options.config.anonymousAuthorization,
|
|
25
|
+
revokeSecret: options.config.revokeSecret,
|
|
26
|
+
consentSyncSecret: options.config.consentSyncSecret,
|
|
27
|
+
}));
|
|
28
|
+
// Reports use a distinct read-only connection. The reader role is granted
|
|
29
|
+
// only report rollups/aggregates; it never serves the ingest or maintenance
|
|
30
|
+
// connection to report callers.
|
|
31
|
+
app.use(productAnalyticsCollectorReportRoutes(options.reportDb, {
|
|
32
|
+
reportSecret: options.config.reportSecret,
|
|
33
|
+
privacyThreshold: options.config.privacyThreshold,
|
|
34
|
+
}));
|
|
35
|
+
app.use((error, _req, res, _next) => {
|
|
36
|
+
const message = error instanceof Error ? error.message : "collector_request_failed";
|
|
37
|
+
const details = error && typeof error === "object" ? error : null;
|
|
38
|
+
if (details?.status === 400 || details?.type === "entity.parse.failed") {
|
|
39
|
+
res.status(400).json({ errorCode: "invalid_schema" });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (message.startsWith("Telemetry assertion") || message.startsWith("Telemetry installation")) {
|
|
43
|
+
res.status(401).json({ errorCode: "unauthorized" });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (message === "request entity too large" || message === "entity.too.large") {
|
|
47
|
+
res.status(413).json({ errorCode: "too_large" });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
res.status(500).json({ errorCode: "collector_request_failed" });
|
|
51
|
+
});
|
|
52
|
+
if (options.maintenance === true) {
|
|
53
|
+
if (!options.maintenanceDb) {
|
|
54
|
+
throw new Error("product_analytics_maintenance_database_required");
|
|
55
|
+
}
|
|
56
|
+
void runProductAnalyticsCollectorMaintenance(options.maintenanceDb, {
|
|
57
|
+
retentionDays: options.config.retentionDays,
|
|
58
|
+
privacyThreshold: options.config.privacyThreshold,
|
|
59
|
+
}).catch((error) => console.error("[product-analytics-collector] maintenance failed", error));
|
|
60
|
+
}
|
|
61
|
+
return app;
|
|
62
|
+
}
|
|
63
|
+
export async function startProductAnalyticsCollector(options = {}) {
|
|
64
|
+
const config = options.config ?? parseProductAnalyticsCollectorConfig();
|
|
65
|
+
const db = options.db ?? createDb(config.databaseUrl);
|
|
66
|
+
const maintenanceDb = options.db ? options.db : createDb(config.maintenanceDatabaseUrl);
|
|
67
|
+
const reportDb = options.db ? options.db : createDb(config.reportDatabaseUrl);
|
|
68
|
+
await assertProductAnalyticsCollectorDatabaseBoundary(db, config.expectedDatabaseRole);
|
|
69
|
+
await assertProductAnalyticsCollectorDatabaseBoundary(maintenanceDb, options.db ? config.expectedDatabaseRole : config.maintenanceDatabaseRole);
|
|
70
|
+
await assertProductAnalyticsCollectorDatabaseBoundary(reportDb, options.db ? config.expectedDatabaseRole : config.reportDatabaseRole);
|
|
71
|
+
// Project once before accepting traffic so a restart cannot expose stale
|
|
72
|
+
// rollups or leave retention cleanup waiting for the first interval tick.
|
|
73
|
+
await runProductAnalyticsCollectorMaintenance(maintenanceDb, {
|
|
74
|
+
retentionDays: config.retentionDays,
|
|
75
|
+
privacyThreshold: config.privacyThreshold,
|
|
76
|
+
});
|
|
77
|
+
const app = createProductAnalyticsCollectorApp({ config, db, maintenanceDb, reportDb, maintenance: false });
|
|
78
|
+
const server = createServer(app);
|
|
79
|
+
if (options.listen !== false) {
|
|
80
|
+
await new Promise((resolve, reject) => {
|
|
81
|
+
const onError = (error) => {
|
|
82
|
+
server.off("listening", onListening);
|
|
83
|
+
reject(error);
|
|
84
|
+
};
|
|
85
|
+
const onListening = () => {
|
|
86
|
+
server.off("error", onError);
|
|
87
|
+
resolve();
|
|
88
|
+
};
|
|
89
|
+
server.once("error", onError);
|
|
90
|
+
server.once("listening", onListening);
|
|
91
|
+
server.listen(config.port, config.host);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const interval = setInterval(() => {
|
|
95
|
+
void runProductAnalyticsCollectorMaintenance(maintenanceDb, {
|
|
96
|
+
retentionDays: config.retentionDays,
|
|
97
|
+
privacyThreshold: config.privacyThreshold,
|
|
98
|
+
}).catch((error) => console.error("[product-analytics-collector] maintenance failed", error));
|
|
99
|
+
}, config.rollupIntervalMs);
|
|
100
|
+
interval.unref?.();
|
|
101
|
+
return {
|
|
102
|
+
app,
|
|
103
|
+
server,
|
|
104
|
+
host: config.host,
|
|
105
|
+
port: config.port,
|
|
106
|
+
config,
|
|
107
|
+
async stop() {
|
|
108
|
+
clearInterval(interval);
|
|
109
|
+
await new Promise((resolve) => {
|
|
110
|
+
if (!server.listening) {
|
|
111
|
+
resolve();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
server.close(() => resolve());
|
|
115
|
+
});
|
|
116
|
+
const closableDb = db;
|
|
117
|
+
await closableDb.$client?.end?.({ timeout: 5 }).catch(() => undefined);
|
|
118
|
+
if (maintenanceDb !== db) {
|
|
119
|
+
const closableMaintenanceDb = maintenanceDb;
|
|
120
|
+
await closableMaintenanceDb.$client?.end?.({ timeout: 5 }).catch(() => undefined);
|
|
121
|
+
}
|
|
122
|
+
if (reportDb !== db && reportDb !== maintenanceDb) {
|
|
123
|
+
const closableReportDb = reportDb;
|
|
124
|
+
await closableReportDb.$client?.end?.({ timeout: 5 }).catch(() => undefined);
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
130
|
+
startProductAnalyticsCollector().then((started) => {
|
|
131
|
+
let stopping = false;
|
|
132
|
+
const stop = async () => {
|
|
133
|
+
if (stopping)
|
|
134
|
+
return;
|
|
135
|
+
stopping = true;
|
|
136
|
+
try {
|
|
137
|
+
await started.stop();
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
process.exit(0);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
process.once("SIGTERM", stop);
|
|
144
|
+
process.once("SIGINT", stop);
|
|
145
|
+
}).catch((error) => {
|
|
146
|
+
console.error("[product-analytics-collector] startup failed", error);
|
|
147
|
+
process.exitCode = 1;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=product-analytics-collector-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-analytics-collector-server.js","sourceRoot":"","sources":["../src/product-analytics-collector-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,6 @@ import type { Db } from "@rudderhq/db";
|
|
|
2
2
|
import { type DeploymentMode } from "@rudderhq/shared";
|
|
3
3
|
export declare function instanceSettingsRoutes(db: Db, opts: {
|
|
4
4
|
deploymentMode: DeploymentMode;
|
|
5
|
+
instanceId?: string;
|
|
5
6
|
}): import("express-serve-static-core").Router;
|
|
6
7
|
//# sourceMappingURL=instance-settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-settings.d.ts","sourceRoot":"","sources":["../../src/routes/instance-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"instance-settings.d.ts","sourceRoot":"","sources":["../../src/routes/instance-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAoC1B,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,EAAE,EACN,IAAI,EAAE;IAAE,cAAc,EAAE,cAAc,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,8CAmS9D"}
|
|
@@ -5,6 +5,7 @@ import { validate } from "../middleware/validate.js";
|
|
|
5
5
|
import { browserBrokerRegistry } from "../services/browser-broker.js";
|
|
6
6
|
import { boardAuthService, instanceSettingsService, logActivity, operatorProfileService, } from "../services/index.js";
|
|
7
7
|
import { createNativePathPicker, NativePathPickerUnsupportedError } from "../services/native-path-picker.js";
|
|
8
|
+
import { getProductAnalyticsInstallationState, reconcileProductAnalyticsInstallationMode, recordProductAnalyticsConsent, registerProductAnalyticsInstallation, } from "../services/product-analytics.js";
|
|
8
9
|
import { assertBoard, getActorInfo } from "./authz.js";
|
|
9
10
|
function assertCanManageInstanceSettings(req) {
|
|
10
11
|
if (req.actor.type !== "board") {
|
|
@@ -26,6 +27,63 @@ export function instanceSettingsRoutes(db, opts) {
|
|
|
26
27
|
const operatorProfiles = operatorProfileService(db);
|
|
27
28
|
const boardAuth = boardAuthService(db);
|
|
28
29
|
const pathPicker = createNativePathPicker();
|
|
30
|
+
const telemetryInstallationId = opts.instanceId ?? process.env.RUDDER_INSTANCE_ID ?? "default";
|
|
31
|
+
router.get("/instance/settings/product-analytics", async (req, res) => {
|
|
32
|
+
assertCanManageInstanceSettings(req);
|
|
33
|
+
const state = await getProductAnalyticsInstallationState(db, telemetryInstallationId);
|
|
34
|
+
const general = await svc.getGeneral();
|
|
35
|
+
const installationState = state?.installation.state;
|
|
36
|
+
const installationId = state?.installation.installationId ?? telemetryInstallationId;
|
|
37
|
+
const hasAnonymousPayloadPreview = installationState?.lastPayloadMode === "anonymous";
|
|
38
|
+
const maskedInstallationId = installationId.length > 6
|
|
39
|
+
? `****${installationId.slice(-6)}`
|
|
40
|
+
: installationId.length > 0 ? `****${installationId}` : null;
|
|
41
|
+
res.json({
|
|
42
|
+
mode: general.productAnalyticsMode,
|
|
43
|
+
consentVersion: "v1",
|
|
44
|
+
consentEpoch: general.productAnalyticsConsentEpoch,
|
|
45
|
+
maskedInstallationId,
|
|
46
|
+
pendingCount: state?.pendingCount ?? 0,
|
|
47
|
+
lastAttemptedAt: typeof installationState?.lastAttemptedAt === "string" ? installationState.lastAttemptedAt : null,
|
|
48
|
+
lastSucceededAt: typeof installationState?.lastSucceededAt === "string" ? installationState.lastSucceededAt : null,
|
|
49
|
+
lastErrorCode: typeof installationState?.lastErrorCode === "string" ? installationState.lastErrorCode : null,
|
|
50
|
+
coverageGap: installationState?.coverageGap === true,
|
|
51
|
+
lastPayloadAt: hasAnonymousPayloadPreview && typeof installationState?.lastPayloadAt === "string" ? installationState.lastPayloadAt : null,
|
|
52
|
+
lastPayload: hasAnonymousPayloadPreview && Array.isArray(installationState?.lastPayload) ? installationState.lastPayload : null,
|
|
53
|
+
disclosure: {
|
|
54
|
+
collected: ["event names", "coarse version/platform dimensions", "pseudonymous ids"],
|
|
55
|
+
excluded: ["prompts", "transcripts", "file paths", "issue titles", "output content", "credentials"],
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
router.patch("/instance/settings/product-analytics", async (req, res) => {
|
|
60
|
+
assertCanManageInstanceSettings(req);
|
|
61
|
+
const mode = req.body?.mode;
|
|
62
|
+
if (mode !== "off" && mode !== "anonymous" && mode !== "account_linked") {
|
|
63
|
+
throw unprocessable("Product analytics mode is invalid");
|
|
64
|
+
}
|
|
65
|
+
const installation = await registerProductAnalyticsInstallation(db, { installationId: telemetryInstallationId });
|
|
66
|
+
if (!installation.installation && !installation.installationSecret) {
|
|
67
|
+
// Existing registrations are intentionally not returned with their secret.
|
|
68
|
+
// The local uploader keeps its credential separately.
|
|
69
|
+
}
|
|
70
|
+
const actor = getActorInfo(req);
|
|
71
|
+
const localUserId = mode === "account_linked" && actor.actorType === "user" ? actor.actorId : null;
|
|
72
|
+
if (mode === "account_linked" && (!localUserId || req.actor.source === "local_implicit"))
|
|
73
|
+
throw forbidden("Account-linked telemetry requires a signed-in user");
|
|
74
|
+
const scope = mode === "account_linked" ? "account_linked_user" : "anonymous_installation";
|
|
75
|
+
await recordProductAnalyticsConsent(db, {
|
|
76
|
+
installationId: telemetryInstallationId,
|
|
77
|
+
scope,
|
|
78
|
+
localUserId,
|
|
79
|
+
decision: mode === "off" ? "revoked" : "granted",
|
|
80
|
+
policyVersion: "v1",
|
|
81
|
+
decidedByLocalUserId: actor.actorType === "user" ? actor.actorId : null,
|
|
82
|
+
});
|
|
83
|
+
await reconcileProductAnalyticsInstallationMode(db, telemetryInstallationId, mode);
|
|
84
|
+
const updated = await svc.updateGeneral({ productAnalyticsMode: mode });
|
|
85
|
+
res.json({ mode: updated.general.productAnalyticsMode, consentEpoch: updated.general.productAnalyticsConsentEpoch });
|
|
86
|
+
});
|
|
29
87
|
router.get("/instance/settings/general", async (req, res) => {
|
|
30
88
|
assertCanManageInstanceSettings(req);
|
|
31
89
|
res.json(await svc.getGeneral());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-settings.js","sourceRoot":"","sources":["../../src/routes/instance-settings.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instance-settings.js","sourceRoot":"","sources":["../../src/routes/instance-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Db } from "@rudderhq/db";
|
|
2
|
+
/** Read-only, aggregate-only central reporting surface. It never returns IDs or raw properties. */
|
|
3
|
+
export declare function productAnalyticsCollectorReportRoutes(db: Db, options: {
|
|
4
|
+
reportSecret: string | null;
|
|
5
|
+
privacyThreshold?: number;
|
|
6
|
+
}): import("express-serve-static-core").Router;
|
|
7
|
+
//# sourceMappingURL=product-analytics-collector-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-analytics-collector-report.d.ts","sourceRoot":"","sources":["../../src/routes/product-analytics-collector-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAgCvC,mGAAmG;AACnG,wBAAgB,qCAAqC,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;IAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,8CAkIhI"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { privateProductAnalyticsCollectorDailyRollups, privateProductAnalyticsCollectorPrivacyAggregates, privateProductAnalyticsCollectorQualityCounters, } from "@rudderhq/db";
|
|
2
|
+
import { and, gte, lte, sql } from "drizzle-orm";
|
|
3
|
+
import { Router } from "express";
|
|
4
|
+
import { timingSafeEqual } from "node:crypto";
|
|
5
|
+
function authorized(value, expected) {
|
|
6
|
+
if (!value || !expected)
|
|
7
|
+
return false;
|
|
8
|
+
const actual = Buffer.from(value);
|
|
9
|
+
const target = Buffer.from(expected);
|
|
10
|
+
return actual.length === target.length && timingSafeEqual(actual, target);
|
|
11
|
+
}
|
|
12
|
+
function window(req) {
|
|
13
|
+
const toRaw = typeof req.query.to === "string" ? req.query.to : undefined;
|
|
14
|
+
const fromRaw = typeof req.query.from === "string" ? req.query.from : undefined;
|
|
15
|
+
const toInput = toRaw ? new Date(toRaw) : new Date();
|
|
16
|
+
const fromInput = fromRaw ? new Date(fromRaw) : new Date(toInput.getTime() - 6 * 24 * 60 * 60 * 1000);
|
|
17
|
+
if (Number.isNaN(fromInput.getTime()) || Number.isNaN(toInput.getTime()) || fromInput > toInput)
|
|
18
|
+
throw new Error("invalid_window");
|
|
19
|
+
// Reports are built from UTC daily rollups. Normalize arbitrary timestamps
|
|
20
|
+
// to complete UTC days instead of implying sub-day precision we cannot
|
|
21
|
+
// recover after the raw event has been projected.
|
|
22
|
+
const from = new Date(Date.UTC(fromInput.getUTCFullYear(), fromInput.getUTCMonth(), fromInput.getUTCDate()));
|
|
23
|
+
const to = new Date(Date.UTC(toInput.getUTCFullYear(), toInput.getUTCMonth(), toInput.getUTCDate() + 1) - 1);
|
|
24
|
+
if (from >= to)
|
|
25
|
+
throw new Error("invalid_window");
|
|
26
|
+
return { from, to };
|
|
27
|
+
}
|
|
28
|
+
/** Read-only, aggregate-only central reporting surface. It never returns IDs or raw properties. */
|
|
29
|
+
export function productAnalyticsCollectorReportRoutes(db, options) {
|
|
30
|
+
const router = Router();
|
|
31
|
+
const privacyThreshold = options.privacyThreshold ?? 10;
|
|
32
|
+
router.get("/api/analytics/v1/report", async (req, res) => {
|
|
33
|
+
const bearer = req.header("authorization")?.replace(/^Bearer\s+/iu, "");
|
|
34
|
+
if (!authorized(bearer, options.reportSecret)) {
|
|
35
|
+
res.status(401).json({ errorCode: "unauthorized" });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
let range;
|
|
39
|
+
try {
|
|
40
|
+
range = window(req);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
res.status(422).json({ errorCode: "invalid_window" });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const retentionEventTo = new Date(range.to.getTime() + 35 * 24 * 60 * 60 * 1000);
|
|
47
|
+
// The report connection is intentionally limited to installation rollups
|
|
48
|
+
// and thresholded aggregates. Raw events, subjects, and installation
|
|
49
|
+
// registry rows are never readable by this route or its DB role.
|
|
50
|
+
const rollupRows = await db.select({
|
|
51
|
+
day: privateProductAnalyticsCollectorDailyRollups.day,
|
|
52
|
+
installationId: privateProductAnalyticsCollectorDailyRollups.installationId,
|
|
53
|
+
eventName: privateProductAnalyticsCollectorDailyRollups.eventName,
|
|
54
|
+
origin: privateProductAnalyticsCollectorDailyRollups.origin,
|
|
55
|
+
dimensions: privateProductAnalyticsCollectorDailyRollups.dimensions,
|
|
56
|
+
eventCount: privateProductAnalyticsCollectorDailyRollups.eventCount,
|
|
57
|
+
firstOccurredAt: privateProductAnalyticsCollectorDailyRollups.firstOccurredAt,
|
|
58
|
+
lastOccurredAt: privateProductAnalyticsCollectorDailyRollups.lastOccurredAt,
|
|
59
|
+
}).from(privateProductAnalyticsCollectorDailyRollups).where(and(gte(privateProductAnalyticsCollectorDailyRollups.day, range.from.toISOString().slice(0, 10)), lte(privateProductAnalyticsCollectorDailyRollups.day, retentionEventTo.toISOString().slice(0, 10))));
|
|
60
|
+
const production = rollupRows.filter((event) => event.dimensions?.environment === "production");
|
|
61
|
+
const reportProduction = production.filter((event) => new Date(event.firstOccurredAt) <= range.to);
|
|
62
|
+
const retentionProduction = production.filter((event) => new Date(event.lastOccurredAt) <= retentionEventTo);
|
|
63
|
+
const meaningful = new Set(["human_work_started", "review_decision_recorded", "work_loop_completed"]);
|
|
64
|
+
const productive = new Set(["output_ready", "work_loop_completed"]);
|
|
65
|
+
const distinct = (rows) => new Set(rows.map((row) => row.installationId)).size;
|
|
66
|
+
const at = (days, names) => {
|
|
67
|
+
const cutoff = new Date(range.to.getTime() - days * 24 * 60 * 60 * 1000);
|
|
68
|
+
return distinct(reportProduction.filter((event) => new Date(event.lastOccurredAt) >= cutoff && names.has(event.eventName)));
|
|
69
|
+
};
|
|
70
|
+
const quality = await db.select({
|
|
71
|
+
receivedBatches: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.receivedBatches}), 0)::int`,
|
|
72
|
+
accepted: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.acceptedEvents}), 0)::int`,
|
|
73
|
+
late: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.lateEvents}), 0)::int`,
|
|
74
|
+
duplicate: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.duplicateEvents}), 0)::int`,
|
|
75
|
+
rejected: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.rejectedEvents}), 0)::int`,
|
|
76
|
+
}).from(privateProductAnalyticsCollectorQualityCounters).where(and(gte(privateProductAnalyticsCollectorQualityCounters.day, range.from.toISOString().slice(0, 10)), lte(privateProductAnalyticsCollectorQualityCounters.day, range.to.toISOString().slice(0, 10))));
|
|
77
|
+
const aggregateRows = await db.select({
|
|
78
|
+
metricName: privateProductAnalyticsCollectorPrivacyAggregates.metricName,
|
|
79
|
+
metricValue: privateProductAnalyticsCollectorPrivacyAggregates.metricValue,
|
|
80
|
+
contributingInstallations: privateProductAnalyticsCollectorPrivacyAggregates.contributingInstallations,
|
|
81
|
+
privacyThreshold: privateProductAnalyticsCollectorPrivacyAggregates.privacyThreshold,
|
|
82
|
+
dimensionValues: privateProductAnalyticsCollectorPrivacyAggregates.dimensionValues,
|
|
83
|
+
}).from(privateProductAnalyticsCollectorPrivacyAggregates).where(and(gte(privateProductAnalyticsCollectorPrivacyAggregates.day, range.from.toISOString().slice(0, 10)), lte(privateProductAnalyticsCollectorPrivacyAggregates.day, range.to.toISOString().slice(0, 10))));
|
|
84
|
+
const loops = aggregateRows
|
|
85
|
+
.filter((row) => row.metricName === "weekly_completed_work_loops")
|
|
86
|
+
.reduce((sum, row) => sum + Number(row.metricValue), 0);
|
|
87
|
+
const firstSeenByInstallation = new Map();
|
|
88
|
+
for (const event of retentionProduction) {
|
|
89
|
+
const firstSeen = firstSeenByInstallation.get(event.installationId);
|
|
90
|
+
const candidate = new Date(event.firstOccurredAt);
|
|
91
|
+
if (!firstSeen || candidate < firstSeen)
|
|
92
|
+
firstSeenByInstallation.set(event.installationId, candidate);
|
|
93
|
+
}
|
|
94
|
+
const meaningfulEventsByInstallation = new Map();
|
|
95
|
+
for (const event of retentionProduction) {
|
|
96
|
+
if (meaningful.has(event.eventName)) {
|
|
97
|
+
const dates = meaningfulEventsByInstallation.get(event.installationId) ?? [];
|
|
98
|
+
dates.push(new Date(event.lastOccurredAt));
|
|
99
|
+
meaningfulEventsByInstallation.set(event.installationId, dates);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const loopRetentionByCohort = new Map();
|
|
103
|
+
for (const row of aggregateRows.filter((value) => value.metricName === "work_loop_retention")) {
|
|
104
|
+
const cohortDay = typeof row.dimensionValues?.cohort_day === "string" ? row.dimensionValues.cohort_day : null;
|
|
105
|
+
const window = row.dimensionValues?.window;
|
|
106
|
+
if (!cohortDay || (window !== "w1" && window !== "w4"))
|
|
107
|
+
continue;
|
|
108
|
+
const retention = loopRetentionByCohort.get(cohortDay) ?? { w1: 0, w4: 0 };
|
|
109
|
+
retention[window] = Number(row.metricValue);
|
|
110
|
+
loopRetentionByCohort.set(cohortDay, retention);
|
|
111
|
+
}
|
|
112
|
+
const cohorts = new Map();
|
|
113
|
+
for (const [installationId, firstSeen] of firstSeenByInstallation) {
|
|
114
|
+
const cohortDay = firstSeen.toISOString().slice(0, 10);
|
|
115
|
+
const row = cohorts.get(cohortDay) ?? { eligibleInstallations: 0, meaningfulW1: 0, loopW1: 0, loopW4: 0 };
|
|
116
|
+
const meaningfulDates = meaningfulEventsByInstallation.get(installationId) ?? [];
|
|
117
|
+
const inWindow = (date, startDays, endDays) => {
|
|
118
|
+
const start = firstSeen.getTime() + startDays * 24 * 60 * 60 * 1000;
|
|
119
|
+
const end = firstSeen.getTime() + endDays * 24 * 60 * 60 * 1000;
|
|
120
|
+
return date.getTime() >= start && date.getTime() < end;
|
|
121
|
+
};
|
|
122
|
+
if (firstSeen <= range.to && firstSeen >= range.from)
|
|
123
|
+
row.eligibleInstallations += 1;
|
|
124
|
+
if (firstSeen <= range.to && meaningfulDates.some((date) => inWindow(date, 7, 14)))
|
|
125
|
+
row.meaningfulW1 += 1;
|
|
126
|
+
const loopRetention = loopRetentionByCohort.get(cohortDay);
|
|
127
|
+
if (firstSeen <= range.to && loopRetention) {
|
|
128
|
+
row.loopW1 = loopRetention.w1;
|
|
129
|
+
row.loopW4 = loopRetention.w4;
|
|
130
|
+
}
|
|
131
|
+
cohorts.set(cohortDay, row);
|
|
132
|
+
}
|
|
133
|
+
res.json({
|
|
134
|
+
window: { from: range.from.toISOString(), to: range.to.toISOString(), timezone: "UTC" },
|
|
135
|
+
metrics: {
|
|
136
|
+
meaningfulActiveInstallations1d: at(1, meaningful),
|
|
137
|
+
meaningfulActiveInstallations7d: at(7, meaningful),
|
|
138
|
+
productiveInstallations7d: at(7, productive),
|
|
139
|
+
weeklyCompletedWorkLoops: loops,
|
|
140
|
+
meaningfulDau: at(1, meaningful),
|
|
141
|
+
productiveWau: at(7, productive),
|
|
142
|
+
},
|
|
143
|
+
quality: { receivedBatchCount: Number(quality[0]?.receivedBatches ?? 0), acceptedEventCount: Number(quality[0]?.accepted ?? 0), lateEventCount: Number(quality[0]?.late ?? 0), duplicateEventCount: Number(quality[0]?.duplicate ?? 0), rejectedEventCount: Number(quality[0]?.rejected ?? 0), aggregateRows: aggregateRows.length },
|
|
144
|
+
privacy: { aggregateRows: aggregateRows.map((row) => ({ metricName: row.metricName, metricValue: row.metricValue, contributingInstallations: row.contributingInstallations, privacyThreshold: row.privacyThreshold })) },
|
|
145
|
+
coverage: {
|
|
146
|
+
accountLinkedEventCount: reportProduction.filter((event) => event.dimensions?.analytics_mode === "account_linked").reduce((sum, event) => sum + Number(event.eventCount), 0),
|
|
147
|
+
anonymousEventCount: reportProduction.filter((event) => event.dimensions?.analytics_mode !== "account_linked").reduce((sum, event) => sum + Number(event.eventCount), 0),
|
|
148
|
+
},
|
|
149
|
+
retention: [...cohorts.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([cohortDay, row]) => {
|
|
150
|
+
const suppressed = row.eligibleInstallations < privacyThreshold;
|
|
151
|
+
return suppressed
|
|
152
|
+
? { cohortDay, eligibleInstallations: null, meaningfulW1: null, loopW1: null, loopW4: null, suppressed: true }
|
|
153
|
+
: { cohortDay, ...row, suppressed: false };
|
|
154
|
+
}),
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
return router;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=product-analytics-collector-report.js.map
|