Skip to content

Commit 9ad4e73

Browse files
committed
feat: Store Lighthouse results
2 parents e4ce3cb + 80e7178 commit 9ad4e73

File tree

14 files changed

+85
-439
lines changed

14 files changed

+85
-439
lines changed

.github/workflows/lighthouse_cron.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ on:
77
environment:
88
description: 'Environment to run LHCI against'
99
required: false
10-
default: 'stage'
10+
default: 'prod'
1111
type: choice
1212
options:
1313
- stage
1414
- prod
1515
jobs:
1616
lhci:
17-
name: Lighthouse Report - ${{ inputs.environment != null && inputs.environment || 'stage' }}
17+
name: Lighthouse Report - ${{ inputs.environment != null && inputs.environment || 'prod' }}
1818
runs-on: ubuntu-latest
19-
environment: ${{ inputs.environment != null && inputs.environment || 'stage' }}
19+
environment: ${{ inputs.environment != null && inputs.environment || 'prod' }}
2020
permissions:
2121
contents: read
2222
id-token: write
@@ -44,4 +44,6 @@ jobs:
4444
- name: Report results
4545
run: npm run cron:report-lighthouse-results
4646
env:
47+
BQ_LIGHTHOUSE_PROJECT: ${{ secrets.BQ_LIGHTHOUSE_PROJECT }}
4748
BQ_LIGHTHOUSE_DATASET: ${{ secrets.BQ_LIGHTHOUSE_DATASET }}
49+
BQ_LIGHTHOUSE_TABLE: ${{ secrets.BQ_LIGHTHOUSE_TABLE }}

src/app/(proper_react)/(redesign)/(authenticated)/user/(dashboard)/dashboard/[[...slug]]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ export default async function DashboardPage({ params, searchParams }: Props) {
167167
totalNumberOfPerformedScans={profileStats?.total}
168168
isNewUser={isNewUser}
169169
elapsedTimeInDaysSinceInitialScan={elapsedTimeInDaysSinceInitialScan}
170-
experimentData={experimentData["Features"]}
170+
experimentData={experimentData}
171171
activeTab={activeTab}
172172
hasFirstMonitoringScan={hasFirstMonitoringScan}
173173
signInCount={signInCount}

src/app/(proper_react)/(redesign)/(authenticated)/user/(dashboard)/settings/[[...slug]]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export default async function SettingsPage({ params, searchParams }: Props) {
125125
yearlySubscriptionUrl={`${yearlySubscriptionUrl}&${additionalSubplatParams.toString()}`}
126126
subscriptionBillingAmount={getSubscriptionBillingAmount()}
127127
enabledFeatureFlags={enabledFeatureFlags}
128-
experimentData={experimentData["Features"]}
128+
experimentData={experimentData}
129129
lastScanDate={lastOneRepScan?.created_at}
130130
isMonthlySubscriber={isMonthlySubscriber}
131131
activeTab={activeTab}

src/app/(proper_react)/(redesign)/(authenticated)/user/welcome/[[...slug]]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export default async function Onboarding({ params, searchParams }: Props) {
7777
breachesTotalCount={allBreachesCount}
7878
stepId={firstSlug === FreeScanSlug ? "enterInfo" : "getStarted"}
7979
previousRoute={previousRoute}
80-
experimentData={experimentData["Features"]}
80+
experimentData={experimentData}
8181
/>
8282
);
8383
}

src/app/(proper_react)/(redesign)/(public)/page.tsx

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,41 +59,39 @@ export default async function Page({ searchParams }: Props) {
5959
oneRepActivations > monthlySubscribersQuota;
6060
return (
6161
<AccountsMetricsFlowProvider
62-
enabled={experimentData["Features"]["landing-page-free-scan-cta"].enabled}
62+
enabled={experimentData["landing-page-free-scan-cta"].enabled}
6363
metricsFlowParams={{
6464
entrypoint: CONST_URL_MONITOR_LANDING_PAGE_ID,
6565
entrypoint_experiment: "landing-page-free-scan-cta",
6666
entrypoint_variation:
67-
experimentData["Features"]["landing-page-free-scan-cta"].variant,
67+
experimentData["landing-page-free-scan-cta"].variant,
6868
form_type:
69-
experimentData["Features"]["landing-page-free-scan-cta"].variant ===
69+
experimentData["landing-page-free-scan-cta"].variant ===
7070
"ctaWithEmail"
7171
? "email"
7272
: "button",
7373
service: process.env.OAUTH_CLIENT_ID as string,
7474
}}
7575
>
7676
{enabledFeatureFlags.includes("LandingPageRedesign") &&
77-
experimentData["Features"][
78-
"landing-page-redesign-plus-eligible-experiment"
79-
].enabled &&
80-
experimentData["Features"][
81-
"landing-page-redesign-plus-eligible-experiment"
82-
].variant === "redesign" ? (
77+
experimentData["landing-page-redesign-plus-eligible-experiment"]
78+
.enabled &&
79+
experimentData["landing-page-redesign-plus-eligible-experiment"]
80+
.variant === "redesign" ? (
8381
<LandingViewRedesign
8482
eligibleForPremium={eligibleForPremium}
8583
l10n={getL10n()}
8684
countryCode={countryCode}
8785
scanLimitReached={scanLimitReached}
88-
experimentData={experimentData["Features"]}
86+
experimentData={experimentData}
8987
/>
9088
) : (
9189
<LandingView
9290
eligibleForPremium={eligibleForPremium}
9391
l10n={getL10n()}
9492
countryCode={countryCode}
9593
scanLimitReached={scanLimitReached}
96-
experimentData={experimentData["Features"]}
94+
experimentData={experimentData}
9795
/>
9896
)}
9997
</AccountsMetricsFlowProvider>

src/app/api/v1/user/welcome-scan/create/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export async function POST(
9898
previewMode: searchParams.get("nimbus_preview") === "true",
9999
});
100100
const optionalInfoExperimentData =
101-
experimentData["Features"]["welcome-scan-optional-info"];
101+
experimentData["welcome-scan-optional-info"];
102102

103103
const profileData: CreateProfileRequest = {
104104
first_name: firstName,

src/app/functions/server/getExperiments.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ export async function getExperiments(params: {
2828
locale: string;
2929
countryCode: string;
3030
previewMode: boolean;
31-
}): Promise<ExperimentData> {
31+
}): Promise<ExperimentData["Features"]> {
3232
if (["local"].includes(process.env.APP_ENV ?? "local")) {
33-
return localExperimentData;
33+
return localExperimentData["Features"];
3434
}
3535

3636
if (!process.env.NIMBUS_SIDECAR_URL) {
@@ -87,7 +87,10 @@ export async function getExperiments(params: {
8787
experimentData = json;
8888
}
8989

90-
return (experimentData as ExperimentData) ?? defaultExperimentData;
90+
return (
91+
(experimentData as ExperimentData["Features"]) ??
92+
defaultExperimentData["Features"]
93+
);
9194
} catch (ex) {
9295
logger.error("Could not connect to Cirrus", {
9396
serverUrl,
@@ -96,6 +99,6 @@ export async function getExperiments(params: {
9699
params,
97100
});
98101
captureException(ex);
99-
return defaultExperimentData;
102+
return defaultExperimentData["Features"];
100103
}
101104
}

src/app/hooks/useGlean.ts

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,9 @@ import EventMetricType from "@mozilla/glean/private/metrics/event";
99
import type { GleanMetricMap } from "../../telemetry/generated/_map";
1010
import { useSession } from "next-auth/react";
1111
import { hasPremium } from "../functions/universal/user";
12-
import { useExperiments } from "../../contextProviders/experiments";
1312

1413
export const useGlean = () => {
1514
const session = useSession();
16-
const experimentData = useExperiments();
17-
// Telemetry recording is mocked in our unit tests, therefore we
18-
// do not have test coverage for this method.
19-
/* c8 ignore start */
2015
const isPremiumUser = hasPremium(session.data?.user);
2116
const record = useCallback(
2217
async <
@@ -41,30 +36,10 @@ export const useGlean = () => {
4136
? "Plus"
4237
: "Free";
4338

44-
// Record the `nimbus_*` keys on all events.
45-
// `nimbus_*` is set on every metric, but it's too much work for TypeScript
46-
// to infer that — hence the type assertion.
47-
if (experimentData) {
48-
(data as GleanMetricMap["button"]["click"]).nimbus_user_id =
49-
experimentData["Enrollments"]["nimbus_user_id"];
50-
(data as GleanMetricMap["button"]["click"]).nimbus_app_id =
51-
experimentData["Enrollments"]["app_id"];
52-
(data as GleanMetricMap["button"]["click"]).nimbus_experiment =
53-
experimentData["Enrollments"]["experiment"];
54-
(data as GleanMetricMap["button"]["click"]).nimbus_branch =
55-
experimentData["Enrollments"]["branch"];
56-
(data as GleanMetricMap["button"]["click"]).nimbus_experiment_type =
57-
experimentData["Enrollments"]["experiment_type"];
58-
(data as GleanMetricMap["button"]["click"]).nimbus_is_preview =
59-
experimentData["Enrollments"]["is_preview"].toString();
60-
} else {
61-
console.warn("No experiment data available for Glean");
62-
}
63-
6439
// eslint-disable-next-line @typescript-eslint/no-explicit-any
6540
mod[event].record(data as any);
6641
},
67-
[isPremiumUser, experimentData],
42+
[isPremiumUser],
6843
);
6944
/* c8 ignore end */
7045

src/app/layout.tsx

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ import { GoogleAnalyticsWorkaround } from "./components/client/GoogleAnalyticsWo
1717
import StripeScript from "./components/client/StripeScript";
1818
import { GleanScript } from "./components/client/GleanScript";
1919
import { getExperimentationId } from "./functions/server/getExperimentationId";
20-
import { getExperiments } from "./functions/server/getExperiments";
21-
import { getCountryCode } from "./functions/server/getCountryCode";
22-
import { ExperimentsProvider } from "../contextProviders/experiments";
23-
import * as Sentry from "@sentry/nextjs";
2420

2521
const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });
2622

@@ -58,26 +54,6 @@ export default async function RootLayout({
5854
const nonce = headers().get("x-nonce") ?? "";
5955
const currentLocale = getLocale(getL10nBundles());
6056
const session = await getServerSession();
61-
const headersList = headers();
62-
const countryCode = getCountryCode(headersList);
63-
64-
// Check for Nimbus preview mode. Note that this requires a full page reload
65-
// to activate: https://nextjs.org/docs/app/api-reference/file-conventions/layout#caveats
66-
const nimbusPreviewMode = headers().get("x-nimbus-preview-mode");
67-
const experimentationId = getExperimentationId(session?.user ?? null);
68-
const experimentData = await getExperiments({
69-
experimentationId: experimentationId,
70-
countryCode: countryCode,
71-
locale: currentLocale,
72-
previewMode: nimbusPreviewMode === "true",
73-
});
74-
75-
const nimbus_user_id = experimentData["Enrollments"].nimbus_user_id;
76-
if (nimbus_user_id !== experimentationId) {
77-
Sentry.captureMessage(
78-
`Nimbus user ID from Cirrus: [${nimbus_user_id}] did not match experimentationId: [${experimentationId}]`,
79-
);
80-
}
8157

8258
return (
8359
<html lang={currentLocale}>
@@ -88,14 +64,12 @@ export default async function RootLayout({
8864
data-ga4-measurement-id={CONST_GA4_MEASUREMENT_ID}
8965
data-node-env={process.env.NODE_ENV}
9066
>
91-
<ExperimentsProvider experimentData={experimentData}>
92-
<SessionProvider session={session}>{children}</SessionProvider>
93-
</ExperimentsProvider>
67+
<SessionProvider session={session}>{children}</SessionProvider>
9468
</body>
9569
<StripeScript />
9670
<GleanScript
9771
channel={process.env.APP_ENV ?? ""}
98-
experimentationId={experimentationId}
72+
experimentationId={getExperimentationId(session?.user ?? null)}
9973
/>
10074
{headers().get("DNT") !== "1" && (
10175
<GoogleAnalyticsWorkaround

src/contextProviders/experiments.tsx

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)