Skip to content

Commit de6f86d

Browse files
Fix sample rate implementation (#1188)
1 parent 46e8819 commit de6f86d

File tree

4 files changed

+70
-17
lines changed

4 files changed

+70
-17
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@segment/analytics-signals': patch
3+
---
4+
5+
Fix sampleRate check

packages/signals/signals-integration-tests/src/helpers/base-page-object.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ export class BasePage {
4141
page: Page,
4242
edgeFn: string,
4343
signalSettings: Partial<SignalsPluginSettingsConfig> = {},
44-
options: { updateURL?: (url: string) => string } = {}
44+
options: { updateURL?: (url: string) => string; sampleRate?: number } = {}
4545
) {
4646
logConsole(page)
4747
this.page = page
4848
this.network = new PageNetworkUtils(page)
4949
this.edgeFn = edgeFn
50-
await this.setupMockedRoutes()
50+
await this.setupMockedRoutes(options.sampleRate)
5151
const url = options.updateURL ? options.updateURL(this.url) : this.url
5252
await this.page.goto(url, { waitUntil: 'domcontentloaded' })
5353
void this.invokeAnalyticsLoad({
@@ -92,15 +92,15 @@ export class BasePage {
9292
return this
9393
}
9494

95-
private async setupMockedRoutes() {
95+
private async setupMockedRoutes(sampleRate?: number) {
9696
// clear any existing saved requests
9797
this.trackingAPI.clear()
9898
this.signalsAPI.clear()
9999

100100
await Promise.all([
101101
this.mockSignalsApi(),
102102
this.mockTrackingApi(),
103-
this.mockCDNSettings(),
103+
this.mockCDNSettings(sampleRate),
104104
])
105105
}
106106

@@ -203,7 +203,7 @@ export class BasePage {
203203
})
204204
}
205205

206-
async mockCDNSettings() {
206+
async mockCDNSettings(sampleRate?: number) {
207207
await this.page.route(
208208
'https://cdn.segment.com/v1/projects/*/settings',
209209
(route, request) => {
@@ -218,6 +218,9 @@ export class BasePage {
218218
downloadURL: this.edgeFnDownloadURL,
219219
version: 1,
220220
},
221+
autoInstrumentationSettings: {
222+
sampleRate: sampleRate ?? 1,
223+
},
221224
},
222225
}).build()
223226

packages/signals/signals-integration-tests/src/tests/signals-vanilla/signals-ingestion.test.ts

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,34 @@ const indexPage = new IndexPage()
55

66
const basicEdgeFn = `const processSignal = (signal) => {}`
77

8-
test('ingestion not enabled -> will not send the signal', async ({ page }) => {
9-
await indexPage.loadAndWait(page, basicEdgeFn, {
10-
enableSignalsIngestion: false,
11-
flushAt: 1,
12-
})
8+
test('debug ingestion disabled and sample rate 0 -> will not send the signal', async ({
9+
page,
10+
}) => {
11+
await indexPage.loadAndWait(
12+
page,
13+
basicEdgeFn,
14+
{
15+
enableSignalsIngestion: false,
16+
flushAt: 1,
17+
},
18+
{ sampleRate: 0 }
19+
)
1320
await indexPage.fillNameInput('John Doe')
1421
await page.waitForTimeout(100)
1522
expect(indexPage.signalsAPI.getEvents('interaction')).toHaveLength(0)
1623
})
1724

18-
test('ingestion enabled -> will send the signal', async ({ page }) => {
19-
await indexPage.loadAndWait(page, basicEdgeFn, {
20-
enableSignalsIngestion: true,
21-
})
25+
test('debug ingestion enabled and sample rate 0 -> will send the signal', async ({
26+
page,
27+
}) => {
28+
await indexPage.loadAndWait(
29+
page,
30+
basicEdgeFn,
31+
{
32+
enableSignalsIngestion: true,
33+
},
34+
{ sampleRate: 0 }
35+
)
2236

2337
await Promise.all([
2438
indexPage.fillNameInput('John Doe'),
@@ -27,3 +41,21 @@ test('ingestion enabled -> will send the signal', async ({ page }) => {
2741

2842
expect(true).toBe(true)
2943
})
44+
45+
test('debug ingestion disabled and sample rate 1 -> will send the signal', async ({
46+
page,
47+
}) => {
48+
await indexPage.loadAndWait(
49+
page,
50+
basicEdgeFn,
51+
{
52+
flushAt: 1,
53+
enableSignalsIngestion: false,
54+
},
55+
{
56+
sampleRate: 1,
57+
}
58+
)
59+
await indexPage.fillNameInput('John Doe')
60+
expect(indexPage.signalsAPI.getEvents('interaction')).toHaveLength(1)
61+
})

packages/signals/signals/src/core/signals/settings.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ export class SignalGlobalSettings {
6666
if (this.signalsDebug.getEnableSignalsIngestion()) {
6767
return true
6868
}
69-
if (!this.sampleSuccess) {
70-
return false
69+
if (this.sampleSuccess) {
70+
return true
7171
}
7272
return false
7373
},
@@ -107,9 +107,22 @@ export class SignalGlobalSettings {
107107
Boolean(val)
108108
)
109109
)
110+
this.sampleSuccess = this.checkSampleRate(sampleRate ?? 0)
111+
}
112+
private checkSampleRate(sampleRate: number): boolean {
113+
const storage = new WebStorage(window.sessionStorage)
114+
const previousSample = storage.getItem<boolean>('segment_sample_success')
115+
if (previousSample !== undefined) {
116+
return previousSample
117+
}
118+
110119
if (sampleRate && Math.random() <= sampleRate) {
111-
this.sampleSuccess = true
120+
storage.setItem('segment_sample_success', true)
121+
return true
112122
}
123+
124+
storage.setItem('segment_sample_success', false)
125+
return false
113126
}
114127
}
115128

0 commit comments

Comments
 (0)