@iann29/rastro 0.1.0-alpha.2 → 0.1.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +325 -63
- package/agent/integration.md +651 -0
- package/agent/manifest.json +183 -0
- package/agent/manifest.schema.json +405 -0
- package/dist/client/federation.d.ts +205 -0
- package/dist/client/federation.d.ts.map +1 -0
- package/dist/client/federation.js +179 -0
- package/dist/client/federation.js.map +1 -0
- package/dist/client/index.d.ts +1600 -8
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +210 -2
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +9 -5
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +161 -1
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/_generated/server.d.ts +4 -0
- package/dist/component/_generated/server.d.ts.map +1 -1
- package/dist/component/_generated/server.js.map +1 -1
- package/dist/component/cardinality.d.ts +12 -0
- package/dist/component/cardinality.d.ts.map +1 -0
- package/dist/component/cardinality.js +94 -0
- package/dist/component/cardinality.js.map +1 -0
- package/dist/component/constants.d.ts +10 -0
- package/dist/component/constants.d.ts.map +1 -1
- package/dist/component/constants.js +10 -0
- package/dist/component/constants.js.map +1 -1
- package/dist/component/convex.config.d.ts +7 -2
- package/dist/component/convex.config.d.ts.map +1 -1
- package/dist/component/convex.config.js +9 -4
- package/dist/component/convex.config.js.map +1 -1
- package/dist/component/coverage.d.ts +18 -0
- package/dist/component/coverage.d.ts.map +1 -0
- package/dist/component/coverage.js +19 -0
- package/dist/component/coverage.js.map +1 -0
- package/dist/component/diagnostics.d.ts +9 -0
- package/dist/component/diagnostics.d.ts.map +1 -0
- package/dist/component/diagnostics.js +47 -0
- package/dist/component/diagnostics.js.map +1 -0
- package/dist/component/errors.d.ts +1 -1
- package/dist/component/errors.d.ts.map +1 -1
- package/dist/component/errors.js.map +1 -1
- package/dist/component/eventStore.d.ts +11 -9
- package/dist/component/eventStore.d.ts.map +1 -1
- package/dist/component/eventStore.js +55 -227
- package/dist/component/eventStore.js.map +1 -1
- package/dist/component/geo.d.ts +71 -0
- package/dist/component/geo.d.ts.map +1 -0
- package/dist/component/geo.js +610 -0
- package/dist/component/geo.js.map +1 -0
- package/dist/component/http.d.ts.map +1 -1
- package/dist/component/http.js +168 -17
- package/dist/component/http.js.map +1 -1
- package/dist/component/ingest.d.ts.map +1 -1
- package/dist/component/ingest.js +272 -32
- package/dist/component/ingest.js.map +1 -1
- package/dist/component/live.d.ts.map +1 -1
- package/dist/component/live.js +6 -3
- package/dist/component/live.js.map +1 -1
- package/dist/component/reports.d.ts +117 -8
- package/dist/component/reports.d.ts.map +1 -1
- package/dist/component/reports.js +641 -79
- package/dist/component/reports.js.map +1 -1
- package/dist/component/retention.d.ts +75 -1
- package/dist/component/retention.d.ts.map +1 -1
- package/dist/component/retention.js +517 -54
- package/dist/component/retention.js.map +1 -1
- package/dist/component/sanitize.d.ts +4 -1
- package/dist/component/sanitize.d.ts.map +1 -1
- package/dist/component/sanitize.js +9 -4
- package/dist/component/sanitize.js.map +1 -1
- package/dist/component/schema.d.ts +202 -53
- package/dist/component/schema.js +113 -16
- package/dist/component/schema.js.map +1 -1
- package/dist/component/sites.d.ts.map +1 -1
- package/dist/component/sites.js +5 -1
- package/dist/component/sites.js.map +1 -1
- package/dist/component/validators.d.ts +29 -51
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +11 -12
- package/dist/component/validators.js.map +1 -1
- package/dist/tracker/generated.d.ts +4 -4
- package/dist/tracker/generated.d.ts.map +1 -1
- package/dist/tracker/generated.js +4 -4
- package/dist/tracker/generated.js.map +1 -1
- package/dist/tracker/tracker.js +7 -6
- package/dist/tracker/tracker.js.map +1 -1
- package/dist/tracker.min.js +1 -1
- package/docs/benchmarks/2026-08-20-realistic.md +5 -5
- package/docs/benchmarks/2026-08-21-formal-certification.md +333 -0
- package/docs/federation-setup.md +395 -0
- package/docs/federation.md +258 -0
- package/docs/upgrading.md +130 -0
- package/llms.txt +65 -0
- package/package.json +29 -7
- package/scripts/benchmark-ingest.mjs +81 -32
- package/scripts/generate-federation-keys.mjs +20 -0
- package/src/component/_generated/api.ts +9 -5
- package/src/component/_generated/component.ts +224 -1
- package/src/component/_generated/server.ts +4 -0
- package/src/component/cardinality.ts +116 -0
- package/src/component/constants.ts +10 -0
- package/src/component/convex.config.ts +11 -5
- package/src/component/coverage.ts +25 -0
- package/src/component/diagnostics.ts +64 -0
- package/src/component/errors.ts +2 -1
- package/src/component/eventStore.ts +78 -280
- package/src/component/geo.ts +779 -0
- package/src/component/http.ts +259 -22
- package/src/component/ingest.ts +436 -27
- package/src/component/live.ts +8 -3
- package/src/component/reports.ts +895 -87
- package/src/component/retention.ts +624 -88
- package/src/component/sanitize.ts +15 -4
- package/src/component/schema.ts +125 -16
- package/src/component/sites.ts +5 -1
- package/src/component/validators.ts +12 -13
- package/src/test.ts +0 -2
- package/dist/component/migrations.d.ts +0 -17
- package/dist/component/migrations.d.ts.map +0 -1
- package/dist/component/migrations.js +0 -44
- package/dist/component/migrations.js.map +0 -1
- package/src/component/migrations.ts +0 -52
package/dist/tracker/tracker.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
(() => {
|
|
3
3
|
const script = document.currentScript;
|
|
4
4
|
const siteId = script?.dataset.site;
|
|
5
|
-
const endpoint = script?.dataset.endpoint ||
|
|
5
|
+
const endpoint = script?.dataset.endpoint ||
|
|
6
|
+
(script?.src && new URL("events", script.src).href);
|
|
6
7
|
if (!siteId || !endpoint)
|
|
7
8
|
return;
|
|
8
9
|
const createId = () => crypto.randomUUID?.() || Math.random() + "";
|
|
@@ -50,7 +51,7 @@
|
|
|
50
51
|
const emit = (type, name, extra) => {
|
|
51
52
|
const timestamp = Date.now();
|
|
52
53
|
queue.push({
|
|
53
|
-
eventId: `${sessionId}.${timestamp.toString(36)}.${sequence
|
|
54
|
+
eventId: `${sessionId}.${timestamp.toString(36)}.${sequence}`,
|
|
54
55
|
sessionId,
|
|
55
56
|
visitorId,
|
|
56
57
|
type,
|
|
@@ -88,8 +89,8 @@
|
|
|
88
89
|
return;
|
|
89
90
|
const name = element.dataset.rastroEvent;
|
|
90
91
|
const href = element.href;
|
|
91
|
-
const url = href
|
|
92
|
-
const web = url?.protocol
|
|
92
|
+
const url = (href && new URL(href));
|
|
93
|
+
const web = /^https?:$/.test(url?.protocol);
|
|
93
94
|
emit(name
|
|
94
95
|
? "custom"
|
|
95
96
|
: web && url.origin !== location.origin
|
|
@@ -101,8 +102,8 @@
|
|
|
101
102
|
}, true);
|
|
102
103
|
const wrapHistory = (method) => {
|
|
103
104
|
const native = history[method];
|
|
104
|
-
history[method] = function (
|
|
105
|
-
native.
|
|
105
|
+
history[method] = function (...args) {
|
|
106
|
+
native.apply(history, args);
|
|
106
107
|
pageview();
|
|
107
108
|
};
|
|
108
109
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/tracker/tracker.ts"],"names":[],"mappings":";AAyCA,CAAC,GAAG,EAAE;IACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAyC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/tracker/tracker.ts"],"names":[],"mappings":";AAyCA,CAAC,GAAG,EAAE;IACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAyC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC,QAAQ;QACvC,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEjC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;SAClD,GAAG,CAAC,KAAK,CAAC;QACX,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjB,IAAI,SAAiB,CAAC;IACtB,IAAI,SAA6B,CAAC;IAClC,IAAI,CAAC;QACH,SAAS,GAAG,cAAc,CAAC,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC5C,cAAc,CAAC,EAAE,GAAG,SAAS,CAAC;QAC9B,SAAS,GAAG,QAAQ,IAAI,cAAc,CAAC,EAAE,CAAC;QAC1C,IAAI,SAAS;YAAE,cAAc,CAAC,EAAE,GAAG,SAAS,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,QAAQ,EAAE,CAAC;QACvB,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;IACtD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,UAAqD,CAAC;IAC1D,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ;QAChC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM;QACnC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,KAAK,GAAG,CAAC,MAAgB,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;QAC3B,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,SAAS,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YACrD,KAAK,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CACnE,GAAG,EAAE;gBACH,mEAAmE;YACrE,CAAC,CACF,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CACX,IAAqB,EACrB,IAAa,EACb,KAA4B,EAC5B,EAAE;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,GAAG,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE;YAC7D,SAAS;YACT,SAAS;YACT,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACrC,QAAQ;YACR,SAAS;YACT,QAAQ,EAAE,QAAQ,EAAE;YACpB,aAAa,EAAE,SAAS;YACxB,GAAG,KAAK;SACT,CAAC,CAAC;QACH,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,IAAI,QAA4B,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/B,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO;QAC9B,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,CAAC;IACnB,CAAC,CAAC;IACD,MAAuB,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QAC/D,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAC3D,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,IAAI,CACF,QAAQ,EACR,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAClC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,MAAM;gBACtD,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,EAAE,UAAU,EAAE,CACnB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,CAAC,gBAAgB,CACvB,OAAO,EACP,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,OAAO,GAAI,KAAK,CAAC,MAAyB,EAAE,OAAO,CACvD,8BAA8B,CAC/B,CAAC;QACF,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;QACzC,MAAM,IAAI,GAAI,OAA6B,CAAC,IAAI,CAAC;QACjD,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAoB,CAAC;QACvD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,QAAkB,CAAC,CAAC;QACtD,IAAI,CACF,IAAI;YACF,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,GAAG,IAAI,GAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;gBACtC,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,OAAO,EACb,IAAI,EACJ;YACE,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACrE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;SACpD,CACF,CAAC;IACJ,CAAC,EACD,IAAI,CACL,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,MAAoC,EAAE,EAAE;QAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,GAAG,IAAI;YACjC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5B,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,WAAW,CAAC,WAAW,CAAC,CAAC;IACzB,WAAW,CAAC,cAAc,CAAC,CAAC;IAC5B,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvC,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,WAAW,CAAC,GAAG,EAAE;QACf,IAAI,CAAC,WAAW,CAAC,CAAC;QAClB,KAAK,EAAE,CAAC;IACV,CAAC,EAAE,MAAM,CAAC,CAAC;IACX,QAAQ,EAAE,CAAC;AACb,CAAC,CAAC,EAAE,CAAC"}
|
package/dist/tracker.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
(()=>{const e=document.currentScript,t=e?.dataset.site,s=e?.dataset.endpoint||e?.src&&new URL("events",e.src).href;if(!t||!s)return;const n=()=>crypto.randomUUID?.()||Math.random()+"",o=new URLSearchParams(location.search).get("ref")?.slice(0,64);let r,a;try{r=sessionStorage._r||n(),sessionStorage._r=r,a=o||sessionStorage._a,a&&(sessionStorage._a=a)}catch{r=n(),a=o}const i=e.dataset.visitor||r;let c,d=0;const l=[],h=document.referrer?new URL(document.referrer).origin:void 0,p=e=>{const n=l.splice(0,50);if(!n.length)return;const o=()=>new Blob([JSON.stringify({siteId:t,events:n})]);let r=o();for(;r.size>64e3&&n.length>1;)l.unshift(n.pop()),r=o();e&&navigator.sendBeacon(s,r)||fetch(s,{method:"POST",body:r,keepalive:1}).catch(()=>{}),l.length&&p(e)},g=(e,t,s)=>{const n=Date.now();l.push({eventId:`${r}.${n.toString(36)}.${d}`,sessionId:r,visitorId:i,type:e,name:t,path:location.pathname.slice(0,256),referrer:h,timestamp:n,sequence:d++,affiliateSlug:a,...s}),clearTimeout(c),c=setTimeout(p,1200)};let u;const v=()=>{const e=location.pathname;e!==u&&(u=e,g("pageview"))};window.rastro=(e,t,s)=>{if("context"===e)return{sessionId:r,visitorId:i};"event"===e&&g("custom",`${t||"event"}`.slice(0,80),s&&JSON.stringify(s).length>2e4?void 0:{properties:s})},document.addEventListener("click",e=>{const t=e.target?.closest("a,button,[data-rastro-event]");if(!t)return;const s=t.dataset.rastroEvent,n=t.href,o=n&&new URL(n),r=/^https?:$/.test(o?.protocol);g(s?"custom":r&&o.origin!==location.origin?"outbound":"click",s,{target:(t.dataset.rastroLabel||t.tagName).slice(0,80),href:r?o.pathname.slice(0,256):void 0})},1);const m=e=>{const t=history[e];history[e]=(...e)=>{t.apply(history,e),v()}};m("pushState"),m("replaceState"),addEventListener("popstate",v),addEventListener("pagehide",()=>p(1)),setInterval(()=>{g("heartbeat"),p()},2e4),v()})();
|
|
@@ -12,10 +12,10 @@ It is a historical engineering record, not a production SLA.
|
|
|
12
12
|
preserve a run-scoped JSON artifact with aggregate reconciliation.
|
|
13
13
|
- A later smoke against the final PR code reconciled every expected stored
|
|
14
14
|
event, but lasted only 30 seconds.
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
- This historical gap was closed by the four-profile runs recorded in
|
|
16
|
+
[`2026-08-21-formal-certification.md`](2026-08-21-formal-certification.md).
|
|
17
|
+
Lean and realistic exceeded 100 million stored events/day; heavy and feature
|
|
18
|
+
completed cleanly below that target. Trusted conversions remain pending.
|
|
19
19
|
|
|
20
20
|
Do not collapse these statements into a generic claim that every workload is
|
|
21
21
|
certified for 100 million stored events/day.
|
|
@@ -150,7 +150,7 @@ A passing harness certification must include:
|
|
|
150
150
|
- `certification.requested: true` and `certification.passed: true`;
|
|
151
151
|
- zero request failures, duplicate events, rejected events, and failed events;
|
|
152
152
|
- completed request accounting;
|
|
153
|
-
- reliable and exact
|
|
153
|
+
- reliable and exact run-session reconciliation;
|
|
154
154
|
- separate accepted and stored throughput/capacity fields.
|
|
155
155
|
|
|
156
156
|
Release evidence should additionally record deployment health and successful
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# Formal ingest certification, 2026-08-21
|
|
2
|
+
|
|
3
|
+
This report preserves four isolated ten-minute benchmark runs against the
|
|
4
|
+
non-production Synapse canary. It is engineering evidence for the tested commit
|
|
5
|
+
and deployment, not a production SLA.
|
|
6
|
+
|
|
7
|
+
## Environment
|
|
8
|
+
|
|
9
|
+
| Item | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Git commit | `e6ae92658c86c1931e697fa2a38c80fd902f7afa` |
|
|
12
|
+
| Package version | `0.1.0-alpha.3` |
|
|
13
|
+
| Deployment | DEV `fast-finch-7454` |
|
|
14
|
+
| Benchmark site | `kx75pnr9wap522n0zmh4nnb4jh8cv110` |
|
|
15
|
+
| Driver | One local Node.js process |
|
|
16
|
+
| Reconciliation | Exact run-scoped session IDs, indexed pages of 100 |
|
|
17
|
+
| Health before/after | `ok: true` |
|
|
18
|
+
| GeoIP provider | Disabled |
|
|
19
|
+
|
|
20
|
+
All runs used `--duration 600 --certify`. Runs were sequential so the profiles
|
|
21
|
+
did not compete with each other. A harness certification means the run lasted
|
|
22
|
+
the required duration, had clean request accounting, and reconciled every
|
|
23
|
+
expected stored event. Meeting the separate 100 million stored-events/day target
|
|
24
|
+
requires at least 1,157.41 stored events/second.
|
|
25
|
+
|
|
26
|
+
## Results
|
|
27
|
+
|
|
28
|
+
| Profile | Concurrency | Batch | Accepted | Stored | Stored/s | Certified stored/day | p95 | Exact reconciliation | 100M/day target |
|
|
29
|
+
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- |
|
|
30
|
+
| Lean | 100 | 50 | 952,600 | 952,600 | 1,582 | 136,654,617 | 4,543 ms | 952,600 / 952,600 | Pass |
|
|
31
|
+
| Realistic | 75 | 50 | 885,700 | 842,080 | 1,398 | 120,808,947 | 4,247 ms | 842,080 / 842,080 | Pass |
|
|
32
|
+
| Heavy | 100 | 20 | 353,980 | 353,980 | 588 | 50,769,480 | 5,787 ms | 353,980 / 353,980 | **Below target** |
|
|
33
|
+
| Feature | 100 | 15 | 232,170 | 232,170 | 384 | 33,218,356 | 6,226 ms | 232,170 / 232,170 | **Below target** |
|
|
34
|
+
|
|
35
|
+
The realistic run accepted 43,620 heartbeats, which intentionally update live
|
|
36
|
+
presence without increasing persistent event counts. Its accepted-versus-stored
|
|
37
|
+
difference is therefore exact. The heavy request measured 62,054 bytes and
|
|
38
|
+
sustained 1,828,443 request bytes/second below the 64 KiB HTTP body limit.
|
|
39
|
+
|
|
40
|
+
## Heavy recertification after byte-accounting optimization
|
|
41
|
+
|
|
42
|
+
Commit `4460ad34314a6e15c24a0c78aab6e6ce85db5c60` reused each event's
|
|
43
|
+
exact UTF-8 byte measurement for both batch validation and rate limits, removing
|
|
44
|
+
one full-payload serialization from the ingestion transaction. A new isolated
|
|
45
|
+
ten-minute run on 2026-08-22 used the same deployment, site, concurrency, batch
|
|
46
|
+
size, and heavy payload.
|
|
47
|
+
|
|
48
|
+
| Result | Original | Recertified | Change |
|
|
49
|
+
| --- | ---: | ---: | ---: |
|
|
50
|
+
| Stored events/s | 588 | 887 | +50.9% |
|
|
51
|
+
| Certified stored/day | 50,769,480 | 76,623,702 | +50.9% |
|
|
52
|
+
| Request bytes/s | 1,828,443 | 2,759,875 | +50.9% |
|
|
53
|
+
| p95 latency | 5,787 ms | 3,670 ms | -36.6% |
|
|
54
|
+
|
|
55
|
+
The recertification remained below the separate 100 million events/day target,
|
|
56
|
+
but raised the measured heavy-payload ceiling without changing payload shape or
|
|
57
|
+
weakening validation, rate limits, or reconciliation.
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"label": "heavy-2026-08-22T04:03:22.517Z",
|
|
62
|
+
"runId": "f3943151-bc71-4806-b609-69faf8bdfb0c",
|
|
63
|
+
"profile": "heavy",
|
|
64
|
+
"targetDurationSeconds": 600,
|
|
65
|
+
"elapsedMs": 601726,
|
|
66
|
+
"terminationReason": "duration",
|
|
67
|
+
"durationCompleted": true,
|
|
68
|
+
"certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
|
|
69
|
+
"concurrency": 100,
|
|
70
|
+
"batchSize": 20,
|
|
71
|
+
"sessionPool": 2048,
|
|
72
|
+
"maximumRequests": null,
|
|
73
|
+
"requests": { "started": 26682, "completed": 26682, "failures": 0 },
|
|
74
|
+
"events": {
|
|
75
|
+
"sent": 533640,
|
|
76
|
+
"heartbeats": 0,
|
|
77
|
+
"accepted": 533640,
|
|
78
|
+
"stored": 533640,
|
|
79
|
+
"duplicates": 0,
|
|
80
|
+
"rejected": 0,
|
|
81
|
+
"failed": 0
|
|
82
|
+
},
|
|
83
|
+
"errors": {},
|
|
84
|
+
"throughput": {
|
|
85
|
+
"eventsPerSecond": 887,
|
|
86
|
+
"storedEventsPerSecond": 887,
|
|
87
|
+
"estimatedEventsPerDay": 76623702,
|
|
88
|
+
"estimatedStoredEventsPerDay": 76623702,
|
|
89
|
+
"certifiedEventsPerDay": 76623702,
|
|
90
|
+
"certifiedStoredEventsPerDay": 76623702,
|
|
91
|
+
"requestBytesPerSecond": 2759875
|
|
92
|
+
},
|
|
93
|
+
"latencyMs": { "p50": 2035, "p95": 3670, "p99": 4755, "max": 8139 },
|
|
94
|
+
"reconciliation": {
|
|
95
|
+
"scope": "run-session-ids",
|
|
96
|
+
"reliable": true,
|
|
97
|
+
"expectedSessions": 2048,
|
|
98
|
+
"requestedSessions": 2048,
|
|
99
|
+
"foundSessions": 2048,
|
|
100
|
+
"acceptedEvents": 533640,
|
|
101
|
+
"acceptedHeartbeats": 0,
|
|
102
|
+
"expectedStoredEvents": 533640,
|
|
103
|
+
"storedEvents": 533640,
|
|
104
|
+
"matches": true
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Run artifacts
|
|
110
|
+
|
|
111
|
+
### Lean
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"label": "lean-2026-08-21T13:31:27.434Z",
|
|
116
|
+
"runId": "41788de1-964e-4315-8b00-f295e202f2e0",
|
|
117
|
+
"profile": "lean",
|
|
118
|
+
"targetDurationSeconds": 600,
|
|
119
|
+
"elapsedMs": 602282,
|
|
120
|
+
"terminationReason": "duration",
|
|
121
|
+
"durationCompleted": true,
|
|
122
|
+
"certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
|
|
123
|
+
"concurrency": 100,
|
|
124
|
+
"batchSize": 50,
|
|
125
|
+
"sessionPool": "unique-per-request",
|
|
126
|
+
"maximumRequests": null,
|
|
127
|
+
"requests": { "started": 19052, "completed": 19052, "failures": 0 },
|
|
128
|
+
"events": {
|
|
129
|
+
"sent": 952600,
|
|
130
|
+
"heartbeats": 0,
|
|
131
|
+
"accepted": 952600,
|
|
132
|
+
"stored": 952600,
|
|
133
|
+
"duplicates": 0,
|
|
134
|
+
"rejected": 0,
|
|
135
|
+
"failed": 0
|
|
136
|
+
},
|
|
137
|
+
"errors": {},
|
|
138
|
+
"throughput": {
|
|
139
|
+
"eventsPerSecond": 1582,
|
|
140
|
+
"storedEventsPerSecond": 1582,
|
|
141
|
+
"estimatedEventsPerDay": 136654617,
|
|
142
|
+
"estimatedStoredEventsPerDay": 136654617,
|
|
143
|
+
"certifiedEventsPerDay": 136654617,
|
|
144
|
+
"certifiedStoredEventsPerDay": 136654617,
|
|
145
|
+
"requestBytesPerSecond": 438830
|
|
146
|
+
},
|
|
147
|
+
"latencyMs": { "p50": 2979, "p95": 4543, "p99": 5217, "max": 5628 },
|
|
148
|
+
"reconciliation": {
|
|
149
|
+
"scope": "run-session-ids",
|
|
150
|
+
"reliable": true,
|
|
151
|
+
"expectedSessions": 19052,
|
|
152
|
+
"requestedSessions": 19052,
|
|
153
|
+
"foundSessions": 19052,
|
|
154
|
+
"acceptedEvents": 952600,
|
|
155
|
+
"acceptedHeartbeats": 0,
|
|
156
|
+
"expectedStoredEvents": 952600,
|
|
157
|
+
"storedEvents": 952600,
|
|
158
|
+
"matches": true
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Realistic
|
|
164
|
+
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"label": "realistic-2026-08-21T13:42:07.118Z",
|
|
168
|
+
"runId": "8a883d9a-537a-4ce5-b300-be77995ba5da",
|
|
169
|
+
"profile": "realistic",
|
|
170
|
+
"targetDurationSeconds": 600,
|
|
171
|
+
"elapsedMs": 602238,
|
|
172
|
+
"terminationReason": "duration",
|
|
173
|
+
"durationCompleted": true,
|
|
174
|
+
"certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
|
|
175
|
+
"concurrency": 75,
|
|
176
|
+
"batchSize": 50,
|
|
177
|
+
"sessionPool": 2048,
|
|
178
|
+
"maximumRequests": null,
|
|
179
|
+
"requests": { "started": 17714, "completed": 17714, "failures": 0 },
|
|
180
|
+
"events": {
|
|
181
|
+
"sent": 885700,
|
|
182
|
+
"heartbeats": 43620,
|
|
183
|
+
"accepted": 885700,
|
|
184
|
+
"stored": 842080,
|
|
185
|
+
"duplicates": 0,
|
|
186
|
+
"rejected": 0,
|
|
187
|
+
"failed": 0
|
|
188
|
+
},
|
|
189
|
+
"errors": {},
|
|
190
|
+
"throughput": {
|
|
191
|
+
"eventsPerSecond": 1471,
|
|
192
|
+
"storedEventsPerSecond": 1398,
|
|
193
|
+
"estimatedEventsPerDay": 127066887,
|
|
194
|
+
"estimatedStoredEventsPerDay": 120808947,
|
|
195
|
+
"certifiedEventsPerDay": 127066887,
|
|
196
|
+
"certifiedStoredEventsPerDay": 120808947,
|
|
197
|
+
"requestBytesPerSecond": 445267
|
|
198
|
+
},
|
|
199
|
+
"latencyMs": { "p50": 2257, "p95": 4247, "p99": 5122, "max": 6133 },
|
|
200
|
+
"reconciliation": {
|
|
201
|
+
"scope": "run-session-ids",
|
|
202
|
+
"reliable": true,
|
|
203
|
+
"expectedSessions": 2048,
|
|
204
|
+
"requestedSessions": 2048,
|
|
205
|
+
"foundSessions": 2048,
|
|
206
|
+
"acceptedEvents": 885700,
|
|
207
|
+
"acceptedHeartbeats": 43620,
|
|
208
|
+
"expectedStoredEvents": 842080,
|
|
209
|
+
"storedEvents": 842080,
|
|
210
|
+
"matches": true
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Heavy
|
|
216
|
+
|
|
217
|
+
```json
|
|
218
|
+
{
|
|
219
|
+
"label": "heavy-2026-08-21T13:52:43.382Z",
|
|
220
|
+
"runId": "8cd7221e-2e33-4e94-9f9d-13bb4a84c60e",
|
|
221
|
+
"profile": "heavy",
|
|
222
|
+
"targetDurationSeconds": 600,
|
|
223
|
+
"elapsedMs": 602407,
|
|
224
|
+
"terminationReason": "duration",
|
|
225
|
+
"durationCompleted": true,
|
|
226
|
+
"certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
|
|
227
|
+
"concurrency": 100,
|
|
228
|
+
"batchSize": 20,
|
|
229
|
+
"sessionPool": 2048,
|
|
230
|
+
"maximumRequests": null,
|
|
231
|
+
"requests": { "started": 17699, "completed": 17699, "failures": 0 },
|
|
232
|
+
"events": {
|
|
233
|
+
"sent": 353980,
|
|
234
|
+
"heartbeats": 0,
|
|
235
|
+
"accepted": 353980,
|
|
236
|
+
"stored": 353980,
|
|
237
|
+
"duplicates": 0,
|
|
238
|
+
"rejected": 0,
|
|
239
|
+
"failed": 0
|
|
240
|
+
},
|
|
241
|
+
"errors": {},
|
|
242
|
+
"throughput": {
|
|
243
|
+
"eventsPerSecond": 588,
|
|
244
|
+
"storedEventsPerSecond": 588,
|
|
245
|
+
"estimatedEventsPerDay": 50769480,
|
|
246
|
+
"estimatedStoredEventsPerDay": 50769480,
|
|
247
|
+
"certifiedEventsPerDay": 50769480,
|
|
248
|
+
"certifiedStoredEventsPerDay": 50769480,
|
|
249
|
+
"requestBytesPerSecond": 1828443
|
|
250
|
+
},
|
|
251
|
+
"latencyMs": { "p50": 2968, "p95": 5787, "p99": 6942, "max": 7839 },
|
|
252
|
+
"reconciliation": {
|
|
253
|
+
"scope": "run-session-ids",
|
|
254
|
+
"reliable": true,
|
|
255
|
+
"expectedSessions": 2048,
|
|
256
|
+
"requestedSessions": 2048,
|
|
257
|
+
"foundSessions": 2048,
|
|
258
|
+
"acceptedEvents": 353980,
|
|
259
|
+
"acceptedHeartbeats": 0,
|
|
260
|
+
"expectedStoredEvents": 353980,
|
|
261
|
+
"storedEvents": 353980,
|
|
262
|
+
"matches": true
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Feature
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"label": "feature-2026-08-21T14:03:20.654Z",
|
|
272
|
+
"runId": "8e60bc5f-6fff-4791-b02c-0e7340767b55",
|
|
273
|
+
"profile": "feature",
|
|
274
|
+
"targetDurationSeconds": 600,
|
|
275
|
+
"elapsedMs": 603868,
|
|
276
|
+
"terminationReason": "duration",
|
|
277
|
+
"durationCompleted": true,
|
|
278
|
+
"certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
|
|
279
|
+
"concurrency": 100,
|
|
280
|
+
"batchSize": 15,
|
|
281
|
+
"sessionPool": 2048,
|
|
282
|
+
"maximumRequests": null,
|
|
283
|
+
"requests": { "started": 15478, "completed": 15478, "failures": 0 },
|
|
284
|
+
"events": {
|
|
285
|
+
"sent": 232170,
|
|
286
|
+
"heartbeats": 0,
|
|
287
|
+
"accepted": 232170,
|
|
288
|
+
"stored": 232170,
|
|
289
|
+
"duplicates": 0,
|
|
290
|
+
"rejected": 0,
|
|
291
|
+
"failed": 0
|
|
292
|
+
},
|
|
293
|
+
"errors": {},
|
|
294
|
+
"throughput": {
|
|
295
|
+
"eventsPerSecond": 384,
|
|
296
|
+
"storedEventsPerSecond": 384,
|
|
297
|
+
"estimatedEventsPerDay": 33218356,
|
|
298
|
+
"estimatedStoredEventsPerDay": 33218356,
|
|
299
|
+
"certifiedEventsPerDay": 33218356,
|
|
300
|
+
"certifiedStoredEventsPerDay": 33218356,
|
|
301
|
+
"requestBytesPerSecond": 119846
|
|
302
|
+
},
|
|
303
|
+
"latencyMs": { "p50": 3523, "p95": 6226, "p99": 7722, "max": 8524 },
|
|
304
|
+
"reconciliation": {
|
|
305
|
+
"scope": "run-session-ids",
|
|
306
|
+
"reliable": true,
|
|
307
|
+
"expectedSessions": 2048,
|
|
308
|
+
"requestedSessions": 2048,
|
|
309
|
+
"foundSessions": 2048,
|
|
310
|
+
"acceptedEvents": 232170,
|
|
311
|
+
"acceptedHeartbeats": 0,
|
|
312
|
+
"expectedStoredEvents": 232170,
|
|
313
|
+
"storedEvents": 232170,
|
|
314
|
+
"matches": true
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## Conclusions
|
|
320
|
+
|
|
321
|
+
- Lean and realistic traffic exceeded 100 million stored events/day for a full
|
|
322
|
+
ten minutes with exact reconciliation and no failures.
|
|
323
|
+
- Heavy and feature traffic completed cleanly but did not meet the 100 million
|
|
324
|
+
stored-events/day target at the tested payloads and concurrency. The latest
|
|
325
|
+
heavy ceiling is 76.62 million events/day after recertification.
|
|
326
|
+
- The updated heavy result demonstrates a different ceiling: 2.76 MB/s of
|
|
327
|
+
near-limit requests. It must not be generalized to minimal or realistic
|
|
328
|
+
payloads.
|
|
329
|
+
- Trusted financial conversions were not exercised. They require a separate
|
|
330
|
+
server-side driver because browser traffic cannot cross the financial trust
|
|
331
|
+
boundary.
|
|
332
|
+
- GeoIP provider behavior was not benchmarked because provider enrichment was
|
|
333
|
+
disabled on this deployment.
|