|
1 | 1 | /** |
2 | | -* statful-client-javascript 1.1.5 |
| 2 | +* statful-client-javascript 1.1.6 |
3 | 3 | * Copyright 2016 Statful <https://www.statful.com/> |
4 | 4 | */ |
5 | 5 | (function(window) { |
|
128 | 128 | * @param {object} item - object to be sent |
129 | 129 | */ |
130 | 130 | this.addItemToQueue = function(queueName, item) { |
131 | | - if (this.listQueues[queueName]) { |
| 131 | + var sampleRateNormalized = (item.sampleRate || this.config.sampleRate || 100) / 100; |
| 132 | + if (this.listQueues[queueName] && Math.random() <= sampleRateNormalized) { |
132 | 133 | this.listQueues[queueName].data.push(item); |
| 134 | + return true; |
| 135 | + } else { |
| 136 | + logger.debug("Metric was discarded due to sample rate."); |
| 137 | + return false; |
133 | 138 | } |
134 | 139 | }; |
135 | 140 | /** |
|
262 | 267 | aggregations: [ "last" ] |
263 | 268 | }, |
264 | 269 | timeout: 2e3, |
265 | | - flushInterval: 1e4 |
| 270 | + flushInterval: 1e4, |
| 271 | + sampleRate: 100 |
266 | 272 | }; |
267 | 273 | var logger; |
268 | 274 | var statful = { |
|
291 | 297 | self.config[key] = clientConfig[key]; |
292 | 298 | }); |
293 | 299 | }; |
294 | | - self.metricsData = function(name, type, value, tags, aggregations, aggregationFrequency, namespace) { |
| 300 | + self.metricsData = function(name, type, value, tags, aggregations, aggregationFrequency, namespace, sampleRate) { |
295 | 301 | return { |
296 | 302 | name: name, |
297 | 303 | type: type, |
298 | 304 | value: value, |
299 | 305 | tags: self.util.setTags(tags || {}, self.config.tags, self.config[type].tags, self.config.app), |
300 | 306 | aggregations: self.util.setAggregations(aggregations, self.config.aggregations, self.config[type].aggregations), |
301 | 307 | aggregationFrequency: self.util.setAggregationFrequency(aggregationFrequency, self.config.aggregationFrequency, self.config[type].aggregationFrequency), |
302 | | - namespace: namespace || self.config.namespace |
| 308 | + namespace: namespace || self.config.namespace, |
| 309 | + sampleRate: sampleRate || self.config.sampleRate |
303 | 310 | }; |
304 | 311 | }; |
305 | 312 | this.mergeConfigs(clientConfig); |
|
424 | 431 | var time = this.measureTimeUserTiming(measureName); |
425 | 432 | if (time) { |
426 | 433 | // Push metrics to queue |
427 | | - this.util.addItemToQueue("metrics", new this.metricsData(metricName, "timer", time, defaults.tags, defaults.aggregations, defaults.aggregationFrequency)); |
| 434 | + this.util.addItemToQueue("metrics", new this.metricsData(metricName, "timer", time, defaults.tags, defaults.aggregations, defaults.aggregationFrequency, defaults.namespace, defaults.sampleRate)); |
428 | 435 | } else { |
429 | 436 | logger.error("Failed to get measure time to register as timer value"); |
430 | 437 | } |
|
453 | 460 | if (metricName && metricValue) { |
454 | 461 | options = options || {}; |
455 | 462 | // Push metrics to queue |
456 | | - var item = new this.metricsData(metricName, "timer", metricValue, options.tags, options.agg, options.aggFreq, options.namespace); |
| 463 | + var item = new this.metricsData(metricName, "timer", metricValue, options.tags, options.agg, options.aggFreq, options.namespace, options.sampleRate); |
457 | 464 | this.util.addItemToQueue("metrics", item); |
458 | 465 | } else { |
459 | 466 | logger.error("Undefined metric name/value to register as a timer"); |
|
475 | 482 | if (metricName) { |
476 | 483 | options = options || {}; |
477 | 484 | // Push metrics to queue |
478 | | - var item = new this.metricsData(metricName, "counter", metricValue, options.tags, options.agg, options.aggFreq, options.namespace); |
| 485 | + var item = new this.metricsData(metricName, "counter", metricValue, options.tags, options.agg, options.aggFreq, options.namespace, options.sampleRate); |
479 | 486 | this.util.addItemToQueue("metrics", item); |
480 | 487 | } else { |
481 | 488 | logger.error("Undefined metric name to register as a counter"); |
|
496 | 503 | if (metricName && metricValue) { |
497 | 504 | options = options || {}; |
498 | 505 | // Push metrics to queue |
499 | | - var item = new this.metricsData(metricName, "gauge", metricValue, options.tags, options.agg, options.aggFreq, options.namespace); |
| 506 | + var item = new this.metricsData(metricName, "gauge", metricValue, options.tags, options.agg, options.aggFreq, options.namespace, options.sampleRate); |
500 | 507 | this.util.addItemToQueue("metrics", item); |
501 | 508 | } else { |
502 | 509 | logger.error("Undefined metric name/value to register as a gauge"); |
|
0 commit comments