mirror of
https://github.com/balena-os/balena-supervisor.git
synced 2025-06-04 08:40:49 +00:00
events: Add rate limiting based on event name when reporting to mixpanel
Change-type: patch Signed-off-by: Cameron Diver <cameron@resin.io>
This commit is contained in:
parent
687dfcd124
commit
607c722b0b
@ -32,6 +32,7 @@
|
|||||||
"@types/express": "^4.11.1",
|
"@types/express": "^4.11.1",
|
||||||
"@types/knex": "^0.14.14",
|
"@types/knex": "^0.14.14",
|
||||||
"@types/lodash": "^4.14.109",
|
"@types/lodash": "^4.14.109",
|
||||||
|
"@types/memoizee": "^0.4.2",
|
||||||
"@types/mz": "0.0.32",
|
"@types/mz": "0.0.32",
|
||||||
"@types/node": "^10.3.1",
|
"@types/node": "^10.3.1",
|
||||||
"@types/rwlock": "^5.0.2",
|
"@types/rwlock": "^5.0.2",
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import * as Bluebird from 'bluebird';
|
import * as Bluebird from 'bluebird';
|
||||||
import mask = require('json-mask');
|
import mask = require('json-mask');
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
import * as memoizee from 'memoizee';
|
||||||
|
|
||||||
import Mixpanel = require('mixpanel');
|
import Mixpanel = require('mixpanel');
|
||||||
|
|
||||||
@ -13,6 +14,10 @@ interface InitArgs {
|
|||||||
mixpanelToken: string;
|
mixpanelToken: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The minimum amount of time to wait between sending
|
||||||
|
// events of the same type
|
||||||
|
const eventDebounceTime = 60000;
|
||||||
|
|
||||||
const mixpanelMask = [
|
const mixpanelMask = [
|
||||||
'appId',
|
'appId',
|
||||||
'delay',
|
'delay',
|
||||||
@ -78,9 +83,16 @@ export class EventTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
properties = this.assignDefaultProperties(properties);
|
properties = this.assignDefaultProperties(properties);
|
||||||
this.client.track(event, properties);
|
this.debouncedLogger(event)(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private debouncedLogger = memoizee((event: string) => {
|
||||||
|
// Call this function at maximum once every minute
|
||||||
|
return _.debounce((properties) => {
|
||||||
|
this.client.track(event, properties);
|
||||||
|
}, eventDebounceTime, { leading: true });
|
||||||
|
}, { primitive: true });
|
||||||
|
|
||||||
private logEvent(...args: string[]) {
|
private logEvent(...args: string[]) {
|
||||||
console.log(...args);
|
console.log(...args);
|
||||||
}
|
}
|
||||||
|
@ -77,3 +77,39 @@ describe 'EventTracker', ->
|
|||||||
uuid: 'barbaz'
|
uuid: 'barbaz'
|
||||||
distinct_id: 'barbaz'
|
distinct_id: 'barbaz'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe 'Rate limiting', ->
|
||||||
|
|
||||||
|
it 'should rate limit events of the same type', ->
|
||||||
|
@eventTracker.client.track.reset()
|
||||||
|
|
||||||
|
@eventTracker.track('test', { });
|
||||||
|
@eventTracker.track('test', { });
|
||||||
|
@eventTracker.track('test', { });
|
||||||
|
@eventTracker.track('test', { });
|
||||||
|
@eventTracker.track('test', { });
|
||||||
|
|
||||||
|
expect(@eventTracker.client.track).to.have.callCount(1)
|
||||||
|
|
||||||
|
it 'should rate limit events of the same type with different arguments', ->
|
||||||
|
@eventTracker.client.track.reset()
|
||||||
|
|
||||||
|
@eventTracker.track('test2', { a: 1 });
|
||||||
|
@eventTracker.track('test2', { b: 2 });
|
||||||
|
@eventTracker.track('test2', { c: 3 });
|
||||||
|
@eventTracker.track('test2', { d: 4 });
|
||||||
|
@eventTracker.track('test2', { e: 5 });
|
||||||
|
|
||||||
|
expect(@eventTracker.client.track).to.have.callCount(1)
|
||||||
|
|
||||||
|
it 'should not rate limit events of different types', ->
|
||||||
|
@eventTracker.client.track.reset()
|
||||||
|
|
||||||
|
@eventTracker.track('test3', { a: 1 });
|
||||||
|
@eventTracker.track('test4', { b: 2 });
|
||||||
|
@eventTracker.track('test5', { c: 3 });
|
||||||
|
@eventTracker.track('test6', { d: 4 });
|
||||||
|
@eventTracker.track('test7', { e: 5 });
|
||||||
|
|
||||||
|
expect(@eventTracker.client.track).to.have.callCount(5)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user