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'))
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)
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)
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)
def tearDown(self): telemetry.set_reporter(None)
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)
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)