Skip to content

Commit cf6480d

Browse files
committed
Use CDN sample rate (wip)
1 parent de05dd3 commit cf6480d

File tree

6 files changed

+44
-1
lines changed

6 files changed

+44
-1
lines changed

packages/browser/src/browser/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,13 @@ export interface CDNSettings {
122122
version: number
123123
}
124124
| {}
125+
126+
/**
127+
* Settings for auto instrumentation
128+
*/
129+
autoInstrumentationSettings?: {
130+
sampleRate: number
131+
}
125132
}
126133

127134
export interface AnalyticsBrowserSettings {

packages/signals/signals/src/core/client/index.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ export class SignalsIngestSettings {
1010
shouldDisableSignalRedaction: () => boolean
1111
signalIngestion: () => boolean
1212
writeKey?: string
13+
sampleRate: number
1314
constructor(settings: SignalsIngestSettingsConfig) {
1415
this.flushAt = settings.flushAt ?? 5
1516
this.apiHost = settings.apiHost ?? 'signals.segment.io/v1'
1617
this.flushInterval = settings.flushInterval ?? 2000
1718
this.shouldDisableSignalRedaction =
1819
settings.shouldDisableSignalRedaction ?? (() => false)
1920
this.signalIngestion = settings.signalIngestion ?? (() => false)
21+
this.sampleRate = settings.sampleRate ?? 0
2022
}
2123
}
2224

@@ -26,6 +28,7 @@ export interface SignalsIngestSettingsConfig {
2628
flushInterval?: number
2729
shouldDisableSignalRedaction?: () => boolean
2830
signalIngestion?: () => boolean
31+
sampleRate?: number
2932
}
3033
/**
3134
* This currently just uses the Segment analytics-next library to send signals.
@@ -72,11 +75,23 @@ export class SignalsIngestClient {
7275
return analytics
7376
}
7477

78+
private shouldIngestSignals(): boolean {
79+
let shouldIngest = false
80+
if (Math.random() > this.settings.sampleRate) {
81+
// currently a no-op, but will be used once signals are sent outside of debug mode
82+
shouldIngest = false
83+
}
84+
if (this.settings.signalIngestion()) {
85+
shouldIngest = true
86+
}
87+
return shouldIngest
88+
}
89+
7590
private sendTrackCall(signal: Signal) {
7691
if (!this.analytics) {
7792
throw new Error('Please initialize before calling this method.')
7893
}
79-
if (!this.settings.signalIngestion) {
94+
if (!this.shouldIngestSignals()) {
8095
return
8196
}
8297
const disableRedaction = this.settings.shouldDisableSignalRedaction()

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export type SignalsSettingsConfig = Pick<
1515
| 'flushInterval'
1616
| 'disableSignalsRedaction'
1717
| 'signalsIngestion'
18+
| 'sampleRate'
1819
| 'networkSignalsAllowList'
1920
| 'networkSignalsDisallowList'
2021
| 'networkSignalsAllowSameDomain'
@@ -58,6 +59,7 @@ export class SignalGlobalSettings {
5859
flushInterval: settings.flushInterval,
5960
shouldDisableSignalRedaction: this.redaction.getDisableSignalRedaction,
6061
signalIngestion: this.ingestion.getSignalIngestion,
62+
sampleRate: settings.sampleRate,
6163
}
6264
this.sandbox = {
6365
functionHost: settings.functionHost,
@@ -73,6 +75,7 @@ export class SignalGlobalSettings {
7375
public update({
7476
edgeFnDownloadURL,
7577
disallowListURLs,
78+
sampleRate,
7679
}: {
7780
/**
7881
* The URL to download the edge function from
@@ -82,13 +85,18 @@ export class SignalGlobalSettings {
8285
* Add new URLs to the disallow list
8386
*/
8487
disallowListURLs: (string | undefined)[]
88+
/**
89+
* The sample rate pulled from CDN settings
90+
*/
91+
sampleRate: number
8592
}): void {
8693
edgeFnDownloadURL && (this.sandbox.edgeFnDownloadURL = edgeFnDownloadURL)
8794
this.network.networkSignalsFilterList.disallowed.addURLLike(
8895
...disallowListURLs.filter(<T>(val: T): val is NonNullable<T> =>
8996
Boolean(val)
9097
)
9198
)
99+
this.ingestClient.sampleRate = sampleRate
92100
}
93101
}
94102

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ export class Signals implements ISignals {
9191
analyticsService.instance.settings.apiHost,
9292
analyticsService.instance.settings.cdnURL,
9393
],
94+
sampleRate:
95+
analyticsService.instance.settings.cdnSettings
96+
.autoInstrumentationSettings?.sampleRate || 0,
9497
})
9598

9699
const sandbox = new Sandbox(

packages/signals/signals/src/types/analytics-api.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@ export type EdgeFnCDNSettings = {
88
downloadURL: string
99
}
1010

11+
export type AutoInstrumentationCDNSettings = {
12+
sampleRate: number
13+
}
14+
1115
export interface CDNSettings {
1216
integrations: CDNSettingsIntegrations
1317
edgeFunction?: EdgeFnCDNSettings | { [key: string]: never }
18+
autoInstrumentationSettings?: AutoInstrumentationCDNSettings
1419
}
1520

1621
export interface SegmentEventStub {

packages/signals/signals/src/types/settings.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ export interface SignalsPluginSettingsConfig {
2828
*/
2929
signalsIngestion?: boolean
3030

31+
/**
32+
* Percentage of sessions that should be ingested
33+
*/
34+
sampleRate?: number
35+
3136
/**
3237
* Override signals API host
3338
* @default signals.segment.io/v1

0 commit comments

Comments
 (0)