def test_histogram_percentiles(self): dog = DogStatsApi() dog.start(roll_up_interval=10, flush_in_thread=False) reporter = dog.reporter = MemoryReporter() # Sample all numbers between 1-100 many times. This # means our percentiles should be relatively close to themselves. percentiles = list(range(100)) random.shuffle(percentiles) # in place for i in percentiles: for j in range(20): dog.histogram('percentiles', i, 1000.0) dog.flush(2000.0) metrics = reporter.metrics def assert_almost_equal(i, j, e=1): # Floating point math? assert abs(i - j) <= e, "%s %s %s" % (i, j, e) nt.assert_equal(len(metrics), 8) p75, p85, p95, p99, _, _, _, _ = self.sort_metrics(metrics) nt.assert_equal(p75['metric'], 'percentiles.75percentile') nt.assert_equal(p75['points'][0][0], 1000.0) assert_almost_equal(p75['points'][0][1], 75, 8) assert_almost_equal(p85['points'][0][1], 85, 8) assert_almost_equal(p95['points'][0][1], 95, 8) assert_almost_equal(p99['points'][0][1], 99, 8)
def test_host(self): dog = DogStatsApi() dog.start(roll_up_interval=10, flush_in_thread=False, host='default') reporter = dog.reporter = MemoryReporter() # Post the same metric with different tags. dog.gauge('gauge', 12, timestamp=100.0, host='') # unset the host dog.gauge('gauge', 10, timestamp=100.0) dog.gauge('gauge', 15, timestamp=100.0, host='test') dog.gauge('gauge', 15, timestamp=100.0, host='test') dog.increment('counter', timestamp=100.0) dog.increment('counter', timestamp=100.0) dog.increment('counter', timestamp=100.0, host='test') dog.increment('counter', timestamp=100.0, host='test', tags=['tag']) dog.increment('counter', timestamp=100.0, host='test', tags=['tag']) dog.flush(200.0) metrics = self.sort_metrics(reporter.metrics) nt.assert_equal(len(metrics), 6) [c1, c2, c3, g1, g2, g3] = metrics (nt.assert_equal(c['metric'], 'counter') for c in [c1, c2, c3]) nt.assert_equal(c1['host'], 'default') nt.assert_equal(c1['tags'], None) nt.assert_equal(c1['points'][0][1], 2) nt.assert_equal(c2['host'], 'test') nt.assert_equal(c2['tags'], None) nt.assert_equal(c2['points'][0][1], 1) nt.assert_equal(c3['host'], 'test') nt.assert_equal(c3['tags'], ['tag']) nt.assert_equal(c3['points'][0][1], 2) (nt.assert_equal(g['metric'], 'gauge') for g in [g1, g2, g3]) nt.assert_equal(g1['host'], '') nt.assert_equal(g1['points'][0][1], 12) nt.assert_equal(g2['host'], 'default') nt.assert_equal(g2['points'][0][1], 10) nt.assert_equal(g3['host'], 'test') nt.assert_equal(g3['points'][0][1], 15) # Ensure histograms work as well. @dog.timed('timed', host='test') def test(): pass test() dog.histogram('timed', 20, timestamp=300.0, host='test') reporter.metrics = [] dog.flush(400) for metric in reporter.metrics: assert metric['host'] == 'test'
def test_tags(self): dog = DogStatsApi() dog.start(roll_up_interval=10, flush_in_thread=False) reporter = dog.reporter = MemoryReporter() # Post the same metric with different tags. dog.gauge('gauge', 10, timestamp=100.0) dog.gauge('gauge', 15, timestamp=100.0, tags=['env:production', 'db']) dog.gauge('gauge', 20, timestamp=100.0, tags=['env:staging']) dog.increment('counter', timestamp=100.0) dog.increment('counter', timestamp=100.0, tags=['env:production', 'db']) dog.increment('counter', timestamp=100.0, tags=['env:staging']) dog.flush(200.0) metrics = self.sort_metrics(reporter.metrics) nt.assert_equal(len(metrics), 6) [c1, c2, c3, g1, g2, g3] = metrics (nt.assert_equal(c['metric'], 'counter') for c in [c1, c2, c3]) nt.assert_equal(c1['tags'], None) nt.assert_equal(c1['points'][0][1], 1) nt.assert_equal(c2['tags'], ['env:production', 'db']) nt.assert_equal(c2['points'][0][1], 1) nt.assert_equal(c3['tags'], ['env:staging']) nt.assert_equal(c3['points'][0][1], 1) (nt.assert_equal(c['metric'], 'gauge') for c in [g1, g2, g3]) nt.assert_equal(g1['tags'], None) nt.assert_equal(g1['points'][0][1], 10) nt.assert_equal(g2['tags'], ['env:production', 'db']) nt.assert_equal(g2['points'][0][1], 15) nt.assert_equal(g3['tags'], ['env:staging']) nt.assert_equal(g3['points'][0][1], 20) # Ensure histograms work as well. @dog.timed('timed', tags=['version:1']) def test(): pass test() dog.histogram('timed', 20, timestamp=300.0, tags=['db', 'version:2']) reporter.metrics = [] dog.flush(400) for metric in reporter.metrics: assert metric['tags'] # this is enough
def test_flushing_in_thread(self): dog = DogStatsApi() dog.start(roll_up_interval=1, flush_interval=1, flush_in_greenlet=True, api_key=API_KEY) now = time.time() dog.gauge('test.dogapi.greenlet.gauge.%s' % now, 3) dog.increment('test.dogapi.greenlet.counter.%s' % now) dog.increment('test.dogapi.greenlet.counter.%s' % now) dog.histogram('test.dogapi.greenlet.histogram.%s' % now, 20) dog.histogram('test.dogapi.greenlet.histogram.%s' % now, 30) time.sleep(3) assert 1 <= dog.flush_count <= 5
def test_flushing_in_thread(self): dog = DogStatsApi() dog.start(roll_up_interval=1, flush_interval=1, flush_in_greenlet=True, api_key=API_KEY) now = time.time() dog.gauge('test.dogapi.greenlet.gauge.%s' % now , 3) dog.increment('test.dogapi.greenlet.counter.%s' % now) dog.increment('test.dogapi.greenlet.counter.%s' % now) dog.histogram('test.dogapi.greenlet.histogram.%s' % now, 20) dog.histogram('test.dogapi.greenlet.histogram.%s' % now, 30) time.sleep(3) assert 1 <= dog.flush_count <= 5
def measure_thousands_of_metrics(): dog = DogStatsApi() dog.start(api_key='apikey_3', api_host="https://app.datad0g.com") yappi.start() @dog.timed('timed') def timed(): pass for i in range(100): for j in range(1000): name = j % 100 dog.gauge('gauge.%s' % name, j) dog.increment('counter.%s' % name, j) dog.histogram('histogram.%s' % name, j) timed() print('run %s' % i) yappi.print_stats(sort_type=yappi.SORTTYPE_TSUB, sort_order=yappi.SORTORDER_DESC)
def test_histogram(self): dog = DogStatsApi() dog.start(roll_up_interval=10, flush_in_thread=False) reporter = dog.reporter = MemoryReporter() # Add some histogram metrics. dog.histogram('histogram.1', 20, 100.0) dog.histogram('histogram.1', 30, 105.0) dog.histogram('histogram.1', 40, 106.0) dog.histogram('histogram.1', 50, 106.0) dog.histogram('histogram.1', 30, 110.0) dog.histogram('histogram.1', 50, 115.0) dog.histogram('histogram.1', 40, 116.0) dog.histogram('histogram.2', 40, 100.0) dog.histogram('histogram.3', 50, 134.0) # Flush and ensure they roll up properly. dog.flush(120.0) metrics = self.sort_metrics(reporter.metrics) nt.assert_equal(len(metrics), 24) # Test histograms elsewhere. (h1751, h1851, h1951, h1991, h1avg1, h1cnt1, h1max1, h1min1, _, _, _, _, h2avg1, h2cnt1, h2max1, h2min1, h1752, _, _, h1992, h1avg2, h1cnt2, h1max2, h1min2) = metrics nt.assert_equal(h1avg1['metric'], 'histogram.1.avg') nt.assert_equal(h1avg1['points'][0][0], 100.0) nt.assert_equal(h1avg1['points'][0][1], 35) nt.assert_equal(h1cnt1['metric'], 'histogram.1.count') nt.assert_equal(h1cnt1['points'][0][0], 100.0) nt.assert_equal(h1cnt1['points'][0][1], 4) nt.assert_equal(h1min1['metric'], 'histogram.1.min') nt.assert_equal(h1min1['points'][0][1], 20) nt.assert_equal(h1max1['metric'], 'histogram.1.max') nt.assert_equal(h1max1['points'][0][1], 50) nt.assert_equal(h1751['metric'], 'histogram.1.75percentile') nt.assert_equal(h1751['points'][0][1], 40) nt.assert_equal(h1991['metric'], 'histogram.1.99percentile') nt.assert_equal(h1991['points'][0][1], 50) nt.assert_equal(h1avg2['metric'], 'histogram.1.avg') nt.assert_equal(h1avg2['points'][0][0], 110.0) nt.assert_equal(h1avg2['points'][0][1], 40) nt.assert_equal(h1cnt2['metric'], 'histogram.1.count') nt.assert_equal(h1cnt2['points'][0][0], 110.0) nt.assert_equal(h1cnt2['points'][0][1], 3) nt.assert_equal(h1752['metric'], 'histogram.1.75percentile') nt.assert_equal(h1752['points'][0][0], 110.0) nt.assert_equal(h1752['points'][0][1], 40.0) nt.assert_equal(h1992['metric'], 'histogram.1.99percentile') nt.assert_equal(h1992['points'][0][0], 110.0) nt.assert_equal(h1992['points'][0][1], 50.0) nt.assert_equal(h2avg1['metric'], 'histogram.2.avg') nt.assert_equal(h2avg1['points'][0][0], 100.0) nt.assert_equal(h2avg1['points'][0][1], 40) nt.assert_equal(h2cnt1['metric'], 'histogram.2.count') nt.assert_equal(h2cnt1['points'][0][0], 100.0) nt.assert_equal(h2cnt1['points'][0][1], 1) # Flush again ensure they're gone. dog.reporter.metrics = [] dog.flush(140.0) nt.assert_equal(len(dog.reporter.metrics), 8) dog.reporter.metrics = [] dog.flush(200.0) nt.assert_equal(len(dog.reporter.metrics), 0)