def test_generator_wrapper(self): reporter = TestTelemetryReporter() telemetry.set_reporter(reporter) range_max = 10 def generator(): for g in range(range_max): yield g factory = generator_wrapper_factory(generate_record_telemetry('test.'), state='model', enable_if=None) wrapped_generator = factory(generator) i = j = 0 for i in wrapped_generator(): self.assertEqual(j, i) j += 1 self.assertEqual(range_max - 1, i) self.assertLessEqual(0, reporter.get_record('test.latency')) self.assertEqual(1, reporter.get_count('test.requests')) reporter.record('test.latency', 0) wrapped_generator = factory(generator) def trigger_generator_exit(): # trigger the GeneratorExit when this goes out of scope iterator = wrapped_generator() six.next(iterator) trigger_generator_exit() self.assertLessEqual(0, reporter.get_record('test.latency')) self.assertEqual(2, reporter.get_count('test.requests'))
class HelloTestCase(helper.CPWebCase): def setup_server(): cherrypy.tree.mount(hello_app.HelloWorld()) setup_server = staticmethod(setup_server) def setUp(self): self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter) def tearDown(self): telemetry.set_reporter(None) def test_once(self): self.getPage('/') self.assertStatus(200) expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater(self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual(self.reporter.counts, {'web.status.2xx': 1, 'web.requests': 1}) def test_twice(self): self.getPage('/') self.getPage('/') self.assertStatus(200) expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, {'web.status.2xx': 2, 'web.requests': 2}) def test_redirect(self): self.getPage('/redirect') self.assertStatus(303) expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, {'web.status.3xx': 1, 'web.requests': 1}) def test_notfound(self): self.getPage('/notfound') self.assertStatus(404) expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, {'web.status.4xx': 1, 'web.requests': 1}) def test_error(self): self.getPage('/error') self.assertStatus(505) expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, {'web.status.5xx': 1, 'web.requests': 1})
def _instrument_native_instance(self, conn): telemetry_reporter = TestTelemetryReporter() telemetry.set_reporter(telemetry_reporter) cur = conn.cursor() cur.execute("SELECT 1") self.assertEqual((1, ), cur.fetchone()) cur.execute("SELECT 1, 2") self.assertEqual((1, 2), cur.fetchone()) self.assertIn('data.psycopg2.execute.latency', telemetry_reporter.records) self.assertIn('data.psycopg2.fetchone.latency', telemetry_reporter.records)
class IOTestCase(helper.CPWebCase): def setup_server(): cherrypy.tree.mount(io_app.IOApp()) setup_server = staticmethod(setup_server) def setUp(self): self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter) def tearDown(self): telemetry.set_reporter(None) def test_data(self): self.getPage('/sqlite') self.assertStatus(200) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency', 'data.sqlite.execute.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater( self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual( self.reporter.counts, { 'web.status.2xx': 1, 'web.requests': 1, 'data.sqlite.execute.requests': 1 }) def test_network(self): self.getPage('/urllib') self.assertStatus(200) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency', 'external.http.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater( self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual( self.reporter.counts, { 'web.status.2xx': 1, 'external.http.requests': 1, 'web.requests': 1, 'external.http.status.2xx': 1 })
class IOTestCase(unittest.TestCase): def setUp(self): io_app.app.config['TESTING'] = True self.app = io_app.app.test_client() self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter) def tearDown(self): telemetry.set_reporter(None) def test_data(self): r = self.app.get('/sqlite') expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency', 'data.sqlite.execute.latency' ] self.assertEqual(r.status_code, 200) six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater( self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual( self.reporter.counts, { 'web.status.2xx': 1, 'web.requests': 1, 'data.sqlite.execute.requests': 1 }) def test_network(self): r = self.app.get('/urllib2') expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency', 'external.http.response.latency' ] self.assertEqual(r.status_code, 200) six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater( self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual( self.reporter.counts, { 'web.status.2xx': 1, 'external.http.requests': 1, 'web.requests': 1, 'external.http.status.2xx': 1 })
class IOTestCase(helper.CPWebCase): def setup_server(): cherrypy.tree.mount(io_app.IOApp()) setup_server = staticmethod(setup_server) def setUp(self): self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter) def tearDown(self): telemetry.set_reporter(None) def test_data(self): self.getPage('/sqlite') self.assertStatus(200) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency', 'data.sqlite.execute.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater(self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual(self.reporter.counts, {'web.status.2xx': 1, 'web.requests': 1, 'data.sqlite.execute.requests': 1}) def test_network(self): self.getPage('/urllib') self.assertStatus(200) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency', 'external.http.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater(self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual(self.reporter.counts, {'web.status.2xx': 1, 'external.http.requests': 1, 'web.requests': 1, 'external.http.status.2xx': 1})
class IOTestCase(unittest.TestCase): def setUp(self): io_app.app.config['TESTING'] = True self.app = io_app.app.test_client() self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter) def tearDown(self): telemetry.set_reporter(None) def test_data(self): r = self.app.get('/sqlite') expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency', 'data.sqlite.execute.latency' ] self.assertEqual(r.status_code, 200) six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater(self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual(self.reporter.counts, {'web.status.2xx': 1, 'web.requests': 1, 'data.sqlite.execute.requests': 1}) def test_network(self): r = self.app.get('/urllib2') expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency', 'external.http.response.latency' ] self.assertEqual(r.status_code, 200) six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater(self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual(self.reporter.counts, {'web.status.2xx': 1, 'external.http.requests': 1, 'web.requests': 1, 'external.http.status.2xx': 1})
def setUp(self): self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter)
def setUp(self): io_app.app.config['TESTING'] = True self.app = io_app.app.test_client() self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter)
def setUp(self): hello_app.app.config['TESTING'] = True self.app = hello_app.app.test_client() self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter)
class HelloTestCase(unittest.TestCase): def setUp(self): hello_app.app.config['TESTING'] = True self.app = hello_app.app.test_client() self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter) def tearDown(self): telemetry.set_reporter(None) def test_once(self): r = self.app.get('/') expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] self.assertEqual(r.status_code, 200) six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater( self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual(self.reporter.counts, { 'web.status.2xx': 1, 'web.requests': 1 }) def test_twice(self): r = self.app.get('/') r = self.app.get('/') expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] self.assertEqual(r.status_code, 200) six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, { 'web.status.2xx': 2, 'web.requests': 2 }) def test_redirect(self): # Excluding the trailing will redirect r = self.app.get('/dir') self.assertEqual(r.status_code, 301) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, { 'web.status.3xx': 1, 'web.requests': 1 }) def test_notfound(self): r = self.app.get('/notfound/') self.assertEqual(r.status_code, 404) self.assertIn("Verify this text!", r.data.decode()) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, { 'web.status.4xx': 1, 'web.requests': 1 }) def test_error(self): r = self.app.get('/error/') self.assertEqual(r.status_code, 505) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, { 'web.status.5xx': 1, 'web.requests': 1 })
class HelloTestCase(unittest.TestCase): def setUp(self): hello_app.app.config['TESTING'] = True self.app = hello_app.app.test_client() self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter) def tearDown(self): telemetry.set_reporter(None) def test_once(self): r = self.app.get('/') expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] self.assertEqual(r.status_code, 200) six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater(self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual(self.reporter.counts, {'web.status.2xx': 1, 'web.requests': 1}) def test_twice(self): r = self.app.get('/') r = self.app.get('/') expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] self.assertEqual(r.status_code, 200) six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, {'web.status.2xx': 2, 'web.requests': 2}) def test_redirect(self): # Excluding the trailing will redirect r = self.app.get('/dir') self.assertEqual(r.status_code, 301) expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, {'web.status.3xx': 1, 'web.requests': 1}) def test_notfound(self): r = self.app.get('/notfound/') self.assertEqual(r.status_code, 404) self.assertIn("Verify this text!", r.data.decode()) expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, {'web.status.4xx': 1, 'web.requests': 1}) def test_error(self): r = self.app.get('/error/') self.assertEqual(r.status_code, 505) expected_gauge_metrics = ['app.response.latency', 'wsgi.response.latency', 'web.response.latency'] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, {'web.status.5xx': 1, 'web.requests': 1})
def test_instrumented_proxy_native_instance(self): import psycopg2 from objproxies import ObjectWrapper class MeasureWrapper(ObjectWrapper): def __init__(self, subject, measured_methods, metric_name, state_name, enable_if, disable_if): super(MeasureWrapper, self).__init__(subject) # initialize all wrapped methods instrumented = {} for m in [ m for m in inspect.getmembers(subject) if measured_methods is None or m[0] in measured_methods ]: name = m[0] factory = contextmanager_wrapper_factory( telemetry_context_manager(metric_name % name), {}, state_name, enable_if, disable_if) instrumented[name] = factory(m[1]) object.__setattr__(self, '__instrumented__', instrumented) def __getattr__(self, attr, oga=object.__getattribute__): if not attr.startswith('__'): instrumented = object.__getattribute__( self, '__instrumented__') if attr in instrumented: return instrumented.get(attr) return super(MeasureWrapper, self).__getattr__(attr, oga) def wrap(f, measured_methods, metric_name, state_name, enable_if, disable_if): def decorator(*args, **keywords): c = f(*args, **keywords) return MeasureWrapper(c, measured_methods, metric_name, state_name, enable_if, disable_if) \ if hasattr(c, '__class__') else c return decorator def override_class_methods(cls, method_names, metric_name, state_name, enable_if, disable_if): methods = { m: wrap(getattr(cls, m), ['execute', 'fetchone'], metric_name, state_name, enable_if, disable_if) for m in method_names } methods['__isproxy__'] = True # temporary? sub_class = type(cls.__name__, (cls, ), methods) sub_class.__module__ = cls.__module__ setattr(sys.modules[cls.__module__], cls.__name__, sub_class) telemetry_reporter = TestTelemetryReporter() telemetry.set_reporter(telemetry_reporter) # Override native class factory methods to wrapped returned objects override_class_methods(psycopg2.extensions.connection, ['cursor'], 'data.psycopg2.%s.', 'data', None, 'model') self.assertTrue(psycopg2.extensions.connection.__isproxy__) conn = psycopg2.extensions.connection(LOCAL_DSN) cur = conn.cursor() self.assertEqual(MeasureWrapper, type(cur)) cur.execute("SELECT 1") self.assertEqual((1, ), cur.fetchone()) cur.execute("SELECT 1, 2") self.assertEqual((1, 2), cur.fetchone()) self.assertIn('data.psycopg2.execute.latency', telemetry_reporter.records) self.assertIn('data.psycopg2.fetchone.latency', telemetry_reporter.records)
class HelloTestCase(helper.CPWebCase): def setup_server(): cherrypy.tree.mount(hello_app.HelloWorld()) setup_server = staticmethod(setup_server) def setUp(self): self.reporter = TestTelemetryReporter() telemetry.set_reporter(self.reporter) def tearDown(self): telemetry.set_reporter(None) def test_once(self): self.getPage('/') self.assertStatus(200) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertGreater( self.reporter.get_gauge_value('wsgi.response.latency'), self.reporter.get_gauge_value('web.response.latency')) self.assertEqual(self.reporter.counts, { 'web.status.2xx': 1, 'web.requests': 1 }) def test_twice(self): self.getPage('/') self.getPage('/') self.assertStatus(200) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, { 'web.status.2xx': 2, 'web.requests': 2 }) def test_redirect(self): self.getPage('/redirect') self.assertStatus(303) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, { 'web.status.3xx': 1, 'web.requests': 1 }) def test_notfound(self): self.getPage('/notfound') self.assertStatus(404) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, { 'web.status.4xx': 1, 'web.requests': 1 }) def test_error(self): self.getPage('/error') self.assertStatus(505) expected_gauge_metrics = [ 'app.response.latency', 'wsgi.response.latency', 'web.response.latency' ] six.assertCountEqual(self, self.reporter.get_gauge_names(), expected_gauge_metrics) self.assertEqual(self.reporter.counts, { 'web.status.5xx': 1, 'web.requests': 1 })