From b53a97494d1e1ccfc9b19aa384cfcd3535dde5c2 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Thu, 24 Nov 2022 14:56:16 +1100 Subject: [PATCH 1/4] Send telemetry to localhost in sandboxes --- code/lib/telemetry/src/telemetry.ts | 2 +- scripts/tasks/sandbox-parts.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/lib/telemetry/src/telemetry.ts b/code/lib/telemetry/src/telemetry.ts index 9c6bbe65e7a0..d8d895395b7e 100644 --- a/code/lib/telemetry/src/telemetry.ts +++ b/code/lib/telemetry/src/telemetry.ts @@ -4,7 +4,7 @@ import { nanoid } from 'nanoid'; import type { Options, TelemetryData } from './types'; import { getAnonymousProjectId } from './anonymous-id'; -const URL = 'https://storybook.js.org/event-log'; +const URL = process.env.STORYBOOK_TELEMETRY_URL || 'https://storybook.js.org/event-log'; const fetch = retry(originalFetch); diff --git a/scripts/tasks/sandbox-parts.ts b/scripts/tasks/sandbox-parts.ts index 17c97f02dbba..6e1600d02bde 100644 --- a/scripts/tasks/sandbox-parts.ts +++ b/scripts/tasks/sandbox-parts.ts @@ -70,7 +70,6 @@ export const create: Task['run'] = async ( const mainConfig = await readMainConfig({ cwd }); - mainConfig.setFieldValue(['core', 'disableTelemetry'], true); if (template.expected.builder === '@storybook/builder-vite') setSandboxViteFinal(mainConfig); await writeConfig(mainConfig); }; @@ -109,7 +108,8 @@ export const install: Task['run'] = async ({ sandboxDir }, { link, dryRun, debug logger.info(`🔢 Adding package scripts:`); await updatePackageScripts({ cwd, - prefix: 'NODE_OPTIONS="--preserve-symlinks --preserve-symlinks-main"', + prefix: + 'NODE_OPTIONS="--preserve-symlinks --preserve-symlinks-main" STORYBOOK_TELEMETRY_URL="http://localhost:6007/event-log"', }); }; From 488d0e3dc1276193bb7c02818a5adf6f714d25d3 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Thu, 24 Nov 2022 15:10:40 +1100 Subject: [PATCH 2/4] Created a super simple event logger server --- scripts/event-log-collector.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 scripts/event-log-collector.ts diff --git a/scripts/event-log-collector.ts b/scripts/event-log-collector.ts new file mode 100644 index 000000000000..160120428553 --- /dev/null +++ b/scripts/event-log-collector.ts @@ -0,0 +1,22 @@ +import express from 'express'; + +const PORT = process.env.PORT || 6007; + +const server = express(); +server.use(express.json()); + +const events: Record[] = []; +server.post('/event-log', (req, res) => { + console.log(`Received event ${req.body.eventType}`); + events.push(req.body); + res.end('OK'); +}); + +server.get('/event-log', (req, res) => { + console.log(`Sending ${events.length} events`); + res.json(events); +}); + +server.listen(PORT, () => { + console.log(`Event log listening on ${PORT}`); +}); From f67a0d8862012bb166ea42956f0c6a55f05d9c23 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Thu, 24 Nov 2022 15:29:42 +1100 Subject: [PATCH 3/4] Build basic event-log-checker script --- .circleci/config.yml | 10 ++++++- scripts/event-log-checker.ts | 57 ++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 scripts/event-log-checker.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index f6674fc9c46c..ad1833ea2105 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -419,7 +419,7 @@ jobs: class: medium+ name: sb_node_16_browsers environment: - NODE_OPTIONS: --max_old_space_size=6144 + NODE_OPTIONS: --max_old_space_size=6144 steps: # switched this to the CircleCI helper to get the full git history for TurboSnap - checkout @@ -495,9 +495,17 @@ jobs: clone_options: '--depth 1 --verbose' - attach_workspace: at: . + - run: + name: Starting Event Collector + command: yarn ts-node ./event-log-collector.ts + working_directory: scripts - run: name: Building Sandboxes command: yarn task --task build --template $(yarn get-template << pipeline.parameters.workflow >> build) --no-link --start-from=never --junit + - run: + name: Verifying Telemetry + command: yarn ts-node ./event-log-checker build $(yarn get-template << pipeline.parameters.workflow >> build) + working_directory: scripts - report-workflow-on-failure: template: $(yarn get-template << pipeline.parameters.workflow >> build) - store_test_results: diff --git a/scripts/event-log-checker.ts b/scripts/event-log-checker.ts new file mode 100644 index 000000000000..d4df26aa7827 --- /dev/null +++ b/scripts/event-log-checker.ts @@ -0,0 +1,57 @@ +import assert from 'assert'; +import fetch from 'node-fetch'; +import { allTemplates } from '../code/lib/cli/src/repro-templates'; + +const PORT = process.env.PORT || 6007; + +const eventTypeExpectations = { + build: {}, +}; + +async function run() { + const [eventType, templateName] = process.argv.slice(2); + + if (!eventType || !templateName) { + throw new Error( + `Need eventType and templateName; call with ./event-log-checker ` + ); + } + + const expectation = eventTypeExpectations[eventType as keyof typeof eventTypeExpectations]; + if (!expectation) throw new Error(`Unexpected eventType '${eventType}'`); + + const template = allTemplates[templateName as keyof typeof allTemplates]; + if (!template) throw new Error(`Unexpected template '${templateName}'`); + + const events = await (await fetch(`http://localhost:${PORT}/event-log`)).json(); + + assert.equal(events.length, 2); + + const [bootEvent, mainEvent] = events; + + assert.equal(bootEvent.eventType, 'boot'); + assert.equal(bootEvent.payload?.eventType, eventType); + + assert.equal(mainEvent.eventType, eventType); + assert.notEqual(mainEvent.eventId, bootEvent.eventId); + assert.equal(mainEvent.sessionId, bootEvent.sessionId); + + const { + expected: { renderer, builder, framework }, + } = template; + + assert.equal(mainEvent.metadata.renderer, renderer); + assert.equal(mainEvent.metadata.builder, builder); + assert.equal(mainEvent.metadata.framework.name, framework); +} + +export {}; + +if (require.main === module) { + run() + .then(() => process.exit(0)) + .catch((err) => { + console.log(err); + process.exit(1); + }); +} From 346a736659a03ad5095a500e675ea14e8570aac3 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Thu, 24 Nov 2022 19:29:31 +1100 Subject: [PATCH 4/4] Make task collector background --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index ad1833ea2105..6dc15d2eabba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -499,6 +499,7 @@ jobs: name: Starting Event Collector command: yarn ts-node ./event-log-collector.ts working_directory: scripts + background: true - run: name: Building Sandboxes command: yarn task --task build --template $(yarn get-template << pipeline.parameters.workflow >> build) --no-link --start-from=never --junit