UNPKG

statsd

Version:

Network daemon for the collection and aggregation of realtime application metrics

460 lines (446 loc) 19.6 kB
var pm = require('../lib/process_metrics'), _ = require('underscore'); module.exports = { setUp: function (callback) { this.time_stamp = Math.round(new Date().getTime() / 1000); var counters = {}; var gauges = {}; var timers = {}; var timer_counters = {}; var sets = {}; var pctThreshold = null; var calculatedTimerMetrics = []; this.metrics = { counters: counters, gauges: gauges, timers: timers, timer_counters: timer_counters, sets: sets, pctThreshold: pctThreshold } callback(); }, counters_has_stats_count: function(test) { test.expect(1); this.metrics.counters['a'] = 2; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 1000, this.time_stamp, function(){}); test.equal(2, this.metrics.counters['a']); test.done(); }, counters_has_correct_rate: function(test) { test.expect(1); this.metrics.counters['a'] = 2; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); test.equal(20, this.metrics.counter_rates['a']); test.done(); }, timers_handle_empty: function(test) { test.expect(1); this.metrics.timers['a'] = []; this.metrics.timer_counters['a'] = 0; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); //potentially a cleaner way to check this test.equal(undefined, this.metrics.counter_rates['a']); test.done(); }, timers_single_time: function(test) { test.expect(9); this.metrics.timers['a'] = [100]; this.metrics.timer_counters['a'] = 1; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(0, timer_data.std); test.equal(100, timer_data.upper); test.equal(100, timer_data.lower); test.equal(1, timer_data.count); test.equal(10, timer_data.count_ps); test.equal(100, timer_data.sum); test.equal(100 * 100, timer_data.sum_squares); test.equal(100, timer_data.mean); test.equal(100, timer_data.median); test.done(); }, timer_single_time_with_one_filter: function(test) { test.expect(10); this.metrics.timers['a'] = [100]; this.metrics.timer_counters['a'] = 1; let filter = ['upper', 'lower', 'count', 'count_ps', 'sum', 'sum_squares', 'mean', 'median'] pm.process_metrics(this.metrics, filter, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(8, Object.keys(timer_data).length) test.equal(null, timer_data.std); test.equal(100, timer_data.upper); test.equal(100, timer_data.lower); test.equal(1, timer_data.count); test.equal(10, timer_data.count_ps); test.equal(100, timer_data.sum); test.equal(100 * 100, timer_data.sum_squares); test.equal(100, timer_data.mean); test.equal(100, timer_data.median); test.done(); }, timer_single_time_multiple_filter: function(test) { test.expect(10); this.metrics.timers['a'] = [100]; this.metrics.timer_counters['a'] = 1; let filter = ['upper', 'lower', 'count_ps', 'sum_squares'] pm.process_metrics(this.metrics, filter, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(4, Object.keys(timer_data).length) test.equal(null, timer_data.std); test.equal(100, timer_data.upper); test.equal(100, timer_data.lower); test.equal(null, timer_data.count); test.equal(10, timer_data.count_ps); test.equal(null, timer_data.sum); test.equal(100 * 100, timer_data.sum_squares); test.equal(null, timer_data.mean); test.equal(null, timer_data.median); test.done(); }, timers_multiple_times: function(test) { test.expect(9); this.metrics.timers['a'] = [100, 200, 300]; this.metrics.timer_counters['a'] = 3; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(81.64965809277261, timer_data.std); test.equal(300, timer_data.upper); test.equal(100, timer_data.lower); test.equal(3, timer_data.count); test.equal(30, timer_data.count_ps); test.equal(600, timer_data.sum); test.equal(100 * 100 + 200 * 200 + 300 * 300, timer_data.sum_squares); test.equal(200, timer_data.mean); test.equal(200, timer_data.median); test.done(); }, timers_multiple_times_with_calculated_timer_metrics: function(test) { test.expect(9); this.metrics.timers['a'] = [100, 200, 300]; this.metrics.timer_counters['a'] = 3; let calculatedTimerMetrics = ['std', 'count', 'sum_squares', 'mean', 'median'] pm.process_metrics(this.metrics, calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(81.64965809277261, timer_data.std); test.equal(null, timer_data.upper); test.equal(null, timer_data.lower); test.equal(3, timer_data.count); test.equal(null, timer_data.count_ps); test.equal(null, timer_data.sum); test.equal(100 * 100 + 200 * 200 + 300 * 300, timer_data.sum_squares); test.equal(200, timer_data.mean); test.equal(200, timer_data.median); test.done(); }, timers_single_time_single_percentile: function(test) { test.expect(4); this.metrics.timers['a'] = [100]; this.metrics.timer_counters['a'] = 1; this.metrics.pctThreshold = [90]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(100, timer_data.mean_90); test.equal(100, timer_data.upper_90); test.equal(100, timer_data.sum_90); test.equal(100 * 100, timer_data.sum_squares_90); test.done(); }, timers_single_time_single_percentile_with_calculated_timer_metrics: function(test) { test.expect(4); this.metrics.timers['a'] = [100]; this.metrics.timer_counters['a'] = 1; this.metrics.pctThreshold = [90]; pm.process_metrics(this.metrics, ['upper_percent', 'sum_squares_percent'], 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(null, timer_data.mean_90); test.equal(100, timer_data.upper_90); test.equal(null, timer_data.sum_90); test.equal(100 * 100, timer_data.sum_squares_90); test.done(); }, timers_single_time_multiple_percentiles: function(test) { test.expect(10); this.metrics.timers['a'] = [100]; this.metrics.timer_counters['a'] = 1; this.metrics.pctThreshold = [90, 80]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(1, timer_data.count_90); test.equal(100, timer_data.mean_90); test.equal(100, timer_data.upper_90); test.equal(100, timer_data.sum_90); test.equal(100 * 100, timer_data.sum_squares_90); test.equal(1, timer_data.count_80); test.equal(100, timer_data.mean_80); test.equal(100, timer_data.upper_80); test.equal(100, timer_data.sum_80); test.equal(100 * 100, timer_data.sum_squares_80); test.done(); }, timers_single_time_multiple_percentiles_with_calculated_timer_metrics: function(test) { test.expect(10); this.metrics.timers['a'] = [100]; this.metrics.timer_counters['a'] = 1; this.metrics.pctThreshold = [90, 80]; let calculatedTimerMetrics = ['mean_percent', 'sum_percent'] pm.process_metrics(this.metrics, calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(null, timer_data.count_90); test.equal(100, timer_data.mean_90); test.equal(null, timer_data.upper_90); test.equal(100, timer_data.sum_90); test.equal(null, timer_data.sum_squares_90); test.equal(null, timer_data.count_80); test.equal(100, timer_data.mean_80); test.equal(null, timer_data.upper_80); test.equal(100, timer_data.sum_80); test.equal(null, timer_data.sum_squares_80); test.done(); }, timers_multiple_times_single_percentiles: function(test) { test.expect(5); this.metrics.timers['a'] = [100, 200, 300]; this.metrics.timer_counters['a'] = 3; this.metrics.pctThreshold = [90]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(3, timer_data.count_90); test.equal(200, timer_data.mean_90); test.equal(300, timer_data.upper_90); test.equal(600, timer_data.sum_90); test.equal(100 * 100 + 200 * 200 + 300 * 300, timer_data.sum_squares_90); test.done(); }, timers_multiple_times_single_percentiles_with_calculated_timer_metrics: function(test) { test.expect(5); this.metrics.timers['a'] = [100, 200, 300]; this.metrics.timer_counters['a'] = 3; this.metrics.pctThreshold = [90]; let filter = ['count_percent', 'mean_percent', 'upper_percent'] pm.process_metrics(this.metrics, filter, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(3, timer_data.count_90); test.equal(200, timer_data.mean_90); test.equal(300, timer_data.upper_90); test.equal(null, timer_data.sum_90); test.equal(null, timer_data.sum_squares_90); test.done(); }, timers_multiple_times_multiple_percentiles: function(test) { test.expect(11); this.metrics.timers['a'] = [100, 200, 300]; this.metrics.timer_counters['a'] = 3; this.metrics.pctThreshold = [90, 80]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(3, timer_data.count); test.equal(3, timer_data.count_90); test.equal(200, timer_data.mean_90); test.equal(300, timer_data.upper_90); test.equal(600, timer_data.sum_90); test.equal(100 * 100 + 200 * 200 + 300 * 300, timer_data.sum_squares_90); test.equal(2, timer_data.count_80); test.equal(150, timer_data.mean_80); test.equal(200, timer_data.upper_80); test.equal(300, timer_data.sum_80); test.equal(100 * 100 + 200 * 200, timer_data.sum_squares_80); test.done(); }, timers_multiple_times_multiple_percentiles_with_calculated_timer_metrics: function(test) { test.expect(11); this.metrics.timers['a'] = [100, 200, 300]; this.metrics.timer_counters['a'] = 3; this.metrics.pctThreshold = [90, 80]; pm.process_metrics(this.metrics, ['count_percent', 'sum_percent', 'sum_squares_percent'], 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(null, timer_data.count); test.equal(3, timer_data.count_90); test.equal(null, timer_data.mean_90); test.equal(null, timer_data.upper_90); test.equal(600, timer_data.sum_90); test.equal(100 * 100 + 200 * 200 + 300 * 300, timer_data.sum_squares_90); test.equal(2, timer_data.count_80); test.equal(null, timer_data.mean_80); test.equal(null, timer_data.upper_80); test.equal(300, timer_data.sum_80); test.equal(100 * 100 + 200 * 200, timer_data.sum_squares_80); test.done(); }, timers_sampled_times: function(test) { test.expect(8); this.metrics.timers['a'] = [100, 200, 300]; this.metrics.timer_counters['a'] = 50; this.metrics.pctThreshold = [90, 80]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(50, timer_data.count); test.equal(500, timer_data.count_ps); test.equal(200, timer_data.mean_90); test.equal(300, timer_data.upper_90); test.equal(600, timer_data.sum_90); test.equal(150, timer_data.mean_80); test.equal(200, timer_data.upper_80); test.equal(300, timer_data.sum_80); test.done(); }, // check if the correct settings are being applied. as well as actual counts timers_histogram: function (test) { test.expect(13); this.metrics.timers['a'] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; this.metrics.timers['abc'] = [0.1234, 2.89, 4, 6, 8]; this.metrics.timers['foo'] = [0, 2, 4, 6, 8]; this.metrics.timers['barbazfoobar'] = [0, 2, 4, 6, 8]; this.metrics.timers['bar.bazfoobar.abc'] = [0, 2, 4, 6, 8]; this.metrics.timers['xyz'] = [0, 2, 4, 6, 8]; this.metrics.histogram = [ { metric: 'foo', bins: [] }, { metric: 'abcd', bins: [ 1, 5, 'inf'] }, { metric: 'abc', bins: [ 1, 2.21, 'inf'] }, { metric: 'a', bins: [ 1, 2] } ]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data; // nothing matches the 'abcd' calculatedTimerMetrics, so nothing has bin_5 test.equal(undefined, timer_data['a']['histogram']['bin_5']); test.equal(undefined, timer_data['abc']['histogram']['bin_5']); // check that 'a' got the right calculatedTimerMetrics and numbers test.equal(0, timer_data['a']['histogram']['bin_1']); test.equal(1, timer_data['a']['histogram']['bin_2']); test.equal(undefined, timer_data['a']['histogram']['bin_inf']); // only 'abc' should have a bin_inf; also check all its counts, // and make sure it has no other bins test.equal(1, timer_data['abc']['histogram']['bin_1']); test.equal(0, timer_data['abc']['histogram']['bin_2_21']); test.equal(4, timer_data['abc']['histogram']['bin_inf']); test.equal(3, _.size(timer_data['abc']['histogram'])); // these all have histograms disabled ('foo' explicitly, rest implicitly) test.equal(undefined, timer_data['foo']['histogram']); test.equal(undefined, timer_data['barbazfoobar']['histogram']); test.equal(undefined, timer_data['bar.bazfoobar.abc']['histogram']); test.equal(undefined, timer_data['xyz']['histogram']); test.done(); }, timers_histogram_with_calculated_timer_metrics: function (test) { test.expect(13); this.metrics.timers['a'] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; this.metrics.timers['abc'] = [0.1234, 2.89, 4, 6, 8]; this.metrics.timers['foo'] = [0, 2, 4, 6, 8]; this.metrics.timers['barbazfoobar'] = [0, 2, 4, 6, 8]; this.metrics.timers['bar.bazfoobar.abc'] = [0, 2, 4, 6, 8]; this.metrics.timers['xyz'] = [0, 2, 4, 6, 8]; this.metrics.histogram = [ { metric: 'foo', bins: [] }, { metric: 'abcd', bins: [ 1, 5, 'inf'] }, { metric: 'abc', bins: [ 1, 2.21, 'inf'] }, { metric: 'a', bins: [ 1, 2] } ]; pm.process_metrics(this.metrics, ['histogram'], 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data; // nothing matches the 'abcd' calculatedTimerMetrics, so nothing has bin_5 test.equal(undefined, timer_data['a']['histogram']['bin_5']); test.equal(undefined, timer_data['abc']['histogram']['bin_5']); // check that 'a' got the right calculatedTimerMetrics and numbers test.equal(0, timer_data['a']['histogram']['bin_1']); test.equal(1, timer_data['a']['histogram']['bin_2']); test.equal(undefined, timer_data['a']['histogram']['bin_inf']); // only 'abc' should have a bin_inf; also check all its counts, // and make sure it has no other bins test.equal(1, timer_data['abc']['histogram']['bin_1']); test.equal(0, timer_data['abc']['histogram']['bin_2_21']); test.equal(4, timer_data['abc']['histogram']['bin_inf']); test.equal(3, _.size(timer_data['abc']['histogram'])); // these all have histograms disabled ('foo' explicitly, rest implicitly) test.equal(undefined, timer_data['foo']['histogram']); test.equal(undefined, timer_data['barbazfoobar']['histogram']); test.equal(undefined, timer_data['bar.bazfoobar.abc']['histogram']); test.equal(undefined, timer_data['xyz']['histogram']); test.done(); }, timers_single_time_single_top_percentile: function(test) { test.expect(3); this.metrics.timers['a'] = [100]; this.metrics.pctThreshold = [-10]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(100, timer_data.mean_top10); test.equal(100, timer_data.lower_top10); test.equal(100, timer_data.sum_top10); test.done(); }, timers_single_time_single_top_percentile_with_calculated_timer_metrics: function(test) { test.expect(3); this.metrics.timers['a'] = [100]; this.metrics.pctThreshold = [-10]; pm.process_metrics(this.metrics, ['lower_percent'], 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(null, timer_data.mean_top10); test.equal(100, timer_data.lower_top10); test.equal(null, timer_data.sum_top10); test.done(); }, timers_multiple_times_single_top_percentile: function(test) { test.expect(3); this.metrics.timers['a'] = [10, 10, 10, 10, 10, 10, 10, 10, 100, 200]; this.metrics.pctThreshold = [-20]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(150, timer_data.mean_top20); test.equal(100, timer_data.lower_top20); test.equal(300, timer_data.sum_top20); test.done(); }, timers_multiple_times_single_top_percentile_with_calculated_timer_metrics: function(test) { test.expect(3); this.metrics.timers['a'] = [10, 10, 10, 10, 10, 10, 10, 10, 100, 200]; this.metrics.pctThreshold = [-20]; pm.process_metrics(this.metrics, ['mean_percent', 'sum_percent'], 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(150, timer_data.mean_top20); test.equal(null, timer_data.lower_top20); test.equal(300, timer_data.sum_top20); test.done(); }, statsd_metrics_exist: function(test) { test.expect(1); pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); statsd_metrics = this.metrics.statsd_metrics; test.notEqual(undefined, statsd_metrics["processing_time"]); test.done(); }, timers_multiple_times_even: function(test) { test.expect(1); this.metrics.timers['a'] = [300, 200, 400, 100]; pm.process_metrics(this.metrics, this.calculatedTimerMetrics, 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(250, timer_data.median); test.done(); }, timers_multiple_times_even_with_calculated_timer_metrics: function(test) { test.expect(1); this.metrics.timers['a'] = [300, 200, 400, 100]; pm.process_metrics(this.metrics, ['median'], 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(250, timer_data.median); test.done(); }, timers_with_invalid_filter: function(test) { test.expect(9); this.metrics.timers['a'] = [100]; this.metrics.timer_counters['a'] = 1; pm.process_metrics(this.metrics, 'not a valid filter', 100, this.time_stamp, function(){}); timer_data = this.metrics.timer_data['a']; test.equal(0, timer_data.std); test.equal(100, timer_data.upper); test.equal(100, timer_data.lower); test.equal(1, timer_data.count); test.equal(10, timer_data.count_ps); test.equal(100, timer_data.sum); test.equal(100 * 100, timer_data.sum_squares); test.equal(100, timer_data.mean); test.equal(100, timer_data.median); test.done(); } }