change-propagation
Version:
Listens to events from Kafka and delivers them
54 lines (44 loc) • 1.63 kB
JavaScript
;
/* eslint no-bitwise: ["error", { "allow": ["~", "<<"] }] */
/* jshint bitwise: false */
const murmur = require('murmur-32');
const Template = require('hyperswitch').Template;
class Sampler {
constructor(options) {
this._options = options || {};
if (!this._options.hash_template) {
throw new Error('Sampling requires that a hash_template be configured');
}
if (!this._options.rate) {
throw new Error('Sampling requires that a rate be configured');
}
if ((this._options.rate > 1.0) || (this._options.rate < 0.01)) {
throw new Error('Sample rate must be a value between 0.01 and 1.0');
}
this._hashSourceTemplate = new Template(this._options.hash_template);
const percent = Math.round(this._options.rate * 100);
const minMurmur = 1 << 31;
const maxMurmur = ~minMurmur;
const step = Math.round((Math.abs(minMurmur) + maxMurmur) / 100);
this._maxHash = minMurmur + (step * percent);
}
/**
* Returns true if this request should be sampled, false if it should
* be ignored.
* @param {Object} context
* @return {boolean}
*/
accept(context) {
const hashSource = this._hashSourceTemplate.expand(context);
return (Sampler.hash(hashSource) <= this._maxHash);
}
/**
* Returns a numeric representation of the value's murmur32 hash.
* @param {string} value
* @return {number}
*/
static hash(value) {
return new DataView(murmur(value)).getInt32(0);
}
}
module.exports = Sampler;