Skip to content

Commit

Permalink
fix: analytics make sure first event is flushed
Browse files Browse the repository at this point in the history
  • Loading branch information
10ko authored and eysi09 committed Jan 22, 2020
1 parent c26eee8 commit c4d6935
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 11 deletions.
24 changes: 15 additions & 9 deletions garden-service/src/analytics/analytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ export class AnalyticsHandler {
private projectMetadata: ProjectMetadata

private constructor(garden: Garden, log: LogEntry) {
this.segment = new segmentClient(API_KEY, { flushAt: 10, flushInterval: 300 })
this.segment = new segmentClient(API_KEY, { flushAt: 20, flushInterval: 300 })
this.log = log
this.garden = garden
this.globalConfigStore = new GlobalConfigStore()
Expand Down Expand Up @@ -207,6 +207,7 @@ export class AnalyticsHandler {
platform: platform(),
platformVersion: release(),
gardenVersion: getPackageVersion(),
isCI: this.isCI,
},
})
}
Expand All @@ -222,9 +223,9 @@ export class AnalyticsHandler {
/**
* Handler used internally to process the TaskGraph events.
*/
private processEvent<T extends EventName>(name: T, payload: Events[T]) {
private async processEvent<T extends EventName>(name: T, payload: Events[T]) {
if (AnalyticsHandler.isSupportedEvent(name, payload)) {
this.trackTask(payload.batchId, payload.name, payload.type, name)
await this.trackTask(payload.batchId, payload.name, payload.type, name)
}
}

Expand Down Expand Up @@ -308,7 +309,7 @@ export class AnalyticsHandler {
* @returns
* @memberof AnalyticsHandler
*/
private track(event: AnalyticsEvent) {
private async track(event: AnalyticsEvent) {
if (this.segment && this.hasOptedIn()) {
const segmentEvent: SegmentEvent = {
userId: this.globalConfig.userId || "unknown",
Expand All @@ -319,15 +320,20 @@ export class AnalyticsHandler {
},
}

// NOTE: We need to wrap the track method in a Promise because of the race condition
// when tracking flushing the first event. See: https://github.com/segmentio/analytics-node/issues/219
const trackToRemote = (eventToTrack: SegmentEvent) => {
this.segment.track(eventToTrack, (err) => {
if (err && this.log) {
this.log.debug(`Error sending tracking event: ${err}`)
}
return new Promise((resolve) => {
this.segment.track(eventToTrack, (err) => {
if (err && this.log) {
this.log.debug(`Error sending tracking event: ${err}`)
}
resolve(true)
})
})
}

return trackToRemote(segmentEvent)
return await trackToRemote(segmentEvent)
}
return false
}
Expand Down
2 changes: 1 addition & 1 deletion garden-service/src/cli/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ export class GardenCli {
// the file writers depend on the project root.
await this.initFileWriters(logger, garden.projectRoot, garden.gardenDirPath)
const analytics = await AnalyticsHandler.init(garden, log)
analytics.trackCommand(command.getFullName())
await analytics.trackCommand(command.getFullName())

cliContext.details.analytics = analytics

Expand Down
2 changes: 1 addition & 1 deletion garden-service/src/server/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export class GardenServer {
this.analytics = await AnalyticsHandler.init(this.garden, this.log)
}

this.analytics.trackApi("POST", ctx.originalUrl, { ...ctx.request.body })
await this.analytics.trackApi("POST", ctx.originalUrl, { ...ctx.request.body })

// TODO: set response code when errors are in result object?
const result = await resolveRequest(ctx, this.garden, this.log, commands, ctx.request.body)
Expand Down

0 comments on commit c4d6935

Please sign in to comment.