Skip to content

Commit a3a55d6

Browse files
feat: adding event logging to EdgeWorker SDK
1 parent 360ec32 commit a3a55d6

File tree

3 files changed

+97
-17
lines changed

3 files changed

+97
-17
lines changed

sdk/edge-worker-server/src/client.ts

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import {
2020
UserError,
2121
DevCycleEvent,
2222
checkParamDefined,
23+
EventTypes,
2324
} from '@devcycle/server-request'
2425
import { generateBucketedConfig } from '@devcycle/bucketing'
26+
import { generateAggEvent, publishDevCycleEvents } from './eventsPublisher'
2527

2628
const castIncomingUser = (user: DevCycleUser) => {
2729
if (!(user instanceof DevCycleUser)) {
@@ -31,6 +33,7 @@ const castIncomingUser = (user: DevCycleUser) => {
3133
}
3234

3335
export class DevCycleEdgeClient {
36+
private sdkKey: string
3437
private options: DevCycleCloudOptions
3538
private configHelper: EnvironmentConfigManager
3639
private onInitialized: Promise<DevCycleEdgeClient>
@@ -39,6 +42,7 @@ export class DevCycleEdgeClient {
3942
private configData: ConfigBody
4043

4144
constructor(sdkKey: string, options: DevCycleCloudOptions = {}) {
45+
this.sdkKey = sdkKey
4246
this.options = options
4347
this.logger =
4448
options?.logger || dvcDefaultLogger({ level: options?.logLevel })
@@ -71,10 +75,6 @@ export class DevCycleEdgeClient {
7175
}
7276
return this
7377
})
74-
75-
// process.on('exit', () => {
76-
// this.close()
77-
// })
7878
}
7979

8080
setConfigData(sdkKey: string, projectConfigStr: string): void {
@@ -139,7 +139,26 @@ export class DevCycleEdgeClient {
139139
}
140140
}
141141

142-
return new DVCVariable(options)
142+
const dvcVariable = new DVCVariable(options)
143+
144+
const aggEvents = generateAggEvent(
145+
populatedUser.user_id,
146+
dvcVariable.isDefaulted
147+
? EventTypes.aggVariableDefaulted
148+
: EventTypes.aggVariableEvaluated,
149+
key,
150+
bucketedConfig.variableVariationMap,
151+
)
152+
// Don't await for the event to be published to the Events API
153+
publishDevCycleEvents(
154+
this.logger,
155+
this.sdkKey,
156+
populatedUser,
157+
aggEvents,
158+
bucketedConfig.featureVariationMap,
159+
)
160+
161+
return dvcVariable
143162
}
144163

145164
async variableValue<T extends DVCVariableValue>(
@@ -180,7 +199,10 @@ export class DevCycleEdgeClient {
180199
return bucketedConfig?.features || {}
181200
}
182201

183-
async track(user: DevCycleUser, event: DevCycleEvent): Promise<void> {
202+
async track(
203+
user: DevCycleUser,
204+
event: DevCycleEvent | DevCycleEvent[],
205+
): Promise<void> {
184206
const incomingUser = castIncomingUser(user)
185207

186208
if (!this.initialized) {
@@ -195,17 +217,22 @@ export class DevCycleEdgeClient {
195217
incomingUser,
196218
this.options,
197219
)
198-
// this.eventQueue.queueEvent(populatedUser, event)
199-
}
220+
const bucketedConfig = generateBucketedConfig({
221+
config: this.configData,
222+
user: populatedUser,
223+
})
200224

201-
async flushEvents(callback?: () => void): Promise<void> {
202-
// return this.eventQueue.flushEvents().then(callback)
225+
await publishDevCycleEvents(
226+
this.logger,
227+
this.sdkKey,
228+
populatedUser,
229+
typeof event === 'object' ? [event] : event,
230+
bucketedConfig.featureVariationMap,
231+
)
203232
}
204233

205234
async close(): Promise<void> {
206235
await this.onInitialized
207-
await this.flushEvents()
208236
this.configHelper.cleanup()
209-
// this.eventQueue.cleanup()
210237
}
211238
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { DVCPopulatedUser } from '@devcycle/js-cloud-server-sdk'
2+
import {
3+
DevCycleEvent,
4+
DVCRequestEvent,
5+
publishEvents,
6+
} from '@devcycle/server-request'
7+
import { BucketedUserConfig, DVCLogger, SDKEventBatchRequestBody } from '@devcycle/types'
8+
9+
export function generateAggEvent(
10+
user_id: string,
11+
type: string,
12+
variableKey: string,
13+
variableVariationMap: BucketedUserConfig['variableVariationMap'],
14+
): DVCRequestEvent[] {
15+
return new DVCRequestEvent({
16+
type,
17+
target: variableKey,
18+
value: 1,
19+
metaData: variableVariationMap[variableKey]
20+
}, user_id)
21+
}
22+
23+
export async function publishDevCycleEvents(
24+
logger: DVCLogger,
25+
sdkKey: string,
26+
user: DVCPopulatedUser,
27+
events: DevCycleEvent[],
28+
featureVars: Record<string, string>,
29+
): Promise<void> {
30+
const requestEvents = events.map((event) => {
31+
return new DVCRequestEvent(event, user.user_id, featureVars)
32+
})
33+
const requestBody: SDKEventBatchRequestBody = [
34+
{
35+
user,
36+
events: requestEvents,
37+
},
38+
]
39+
try {
40+
const res = await publishEvents(logger, sdkKey, requestBody)
41+
if (res.status !== 201) {
42+
this.logger.error(
43+
`Error publishing events, status: ${
44+
res.status
45+
}, body: ${await res.text()}`,
46+
)
47+
} else {
48+
this.logger.debug(
49+
`DevCycle Flushed ${requestEvents.length} Events`,
50+
)
51+
}
52+
}
53+
}

sdk/nodejs/src/eventQueue.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ export class EventQueue {
122122
metricTags,
123123
)
124124
} catch (ex) {
125-
this.logger.error(`DVC Error Flushing Events: ${ex.message}`)
125+
this.logger.error(`DevCycle Error Flushing Events: ${ex.message}`)
126126
}
127127

128128
const results: FlushResults = {
@@ -149,7 +149,7 @@ export class EventQueue {
149149
val + batches.eventCount
150150
const eventCount = flushPayloads.reduce(reducer, 0)
151151
this.logger.debug(
152-
`DVC Flush ${eventCount} Events, for ${flushPayloads.length} Users`,
152+
`DevCycle Flush ${eventCount} Events, for ${flushPayloads.length} Users`,
153153
)
154154

155155
const startTimeRequests = Date.now()
@@ -186,7 +186,7 @@ export class EventQueue {
186186
}
187187
} else {
188188
this.logger.debug(
189-
`DVC Flushed ${eventCount} Events, for ${flushPayload.records.length} Users`,
189+
`DevCycle Flushed ${eventCount} Events, for ${flushPayload.records.length} Users`,
190190
)
191191
getBucketingLib().onPayloadSuccess(
192192
this.sdkKey,
@@ -196,7 +196,7 @@ export class EventQueue {
196196
}
197197
} catch (ex) {
198198
this.logger.error(
199-
`DVC Error Flushing Events response message: ${ex.message}`,
199+
`DevCycle Error Flushing Events response message: ${ex.message}`,
200200
)
201201
getBucketingLib().onPayloadFailure(
202202
this.sdkKey,
@@ -240,7 +240,7 @@ export class EventQueue {
240240
try {
241241
await this._flushEvents()
242242
} catch (e) {
243-
this.logger.error(`DVC Error Flushing Events`, e)
243+
this.logger.error(`DevCycle Error Flushing Events`, e)
244244
}
245245

246246
this.flushInProgress = false

0 commit comments

Comments
 (0)