def test_generator_wrapper(self):
        reporter = TestTelemetryReporter()
        telemetry.set_reporter(reporter)

        range_max = 10

        def generator():
            for g in range(range_max):
                yield g

        wrapped_generator = get_generator_wrapper(generate_record_telemetry('test.'), state='model', enable_if=None)

        i = j = 0
        for i in wrapped_generator(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 = get_generator_wrapper(generate_record_telemetry('test.'), state='model', enable_if=None)

        def trigger_generator_exit():
            # trigger the GeneratorExit when this goes out of scope
            iterator = wrapped_generator(generator)
            six.next(iterator)

        trigger_generator_exit()

        self.assertLessEqual(0, reporter.get_record('test.latency'))
        self.assertEqual(2, reporter.get_count('test.requests'))
Example #2
0
    def run(self):
        wrappers = {
            "django.db.models.query.QuerySet.iterator": get_generator_wrapper(
                generate_record_telemetry("model.iterator."), state="model"
            )
        }

        _query_set_methods = [
            "aggregate",
            "count",
            "bulk_create",
            "create",
            "get",
            "get_or_create",
            "latest",
            "first",
            "last",
            "in_bulk",
            "iterator",
            "update_or_create",
            "delete",
            "update",
            "exists",
        ]

        for method in _query_set_methods:
            metric = "model." + method
            wrappers["django.db.models.query.QuerySet." + method] = get_complex_wrapper(metric, state="model")

        self.set_wrapped(wrappers)
        super(DjangoDbInstrumentor, self).run()
Example #3
0
    def test_generator_wrapper(self):
        reporter = TestTelemetryReporter()
        telemetry.set_reporter(reporter)

        range_max = 10

        def generator():
            for g in range(range_max):
                yield g

        wrapped_generator = get_generator_wrapper(
            generate_record_telemetry('test.'), state='model', enable_if=None)

        i = j = 0
        for i in wrapped_generator(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 = get_generator_wrapper(
            generate_record_telemetry('test.'), state='model', enable_if=None)

        def trigger_generator_exit():
            # trigger the GeneratorExit when this goes out of scope
            iterator = wrapped_generator(generator)
            six.next(iterator)

        trigger_generator_exit()

        self.assertLessEqual(0, reporter.get_record('test.latency'))
        self.assertEqual(2, reporter.get_count('test.requests'))
Example #4
0
    def run(self):
        wrappers = {
            'django.db.models.query.QuerySet.iterator':
            get_generator_wrapper(generate_record_telemetry('model.iterator.'),
                                  state='model'),
        }

        _query_set_methods = [
            'aggregate', 'count', 'bulk_create', 'create', 'get',
            'get_or_create', 'latest', 'first', 'last', 'in_bulk', 'iterator',
            'update_or_create', 'delete', 'update', 'exists'
        ]

        for method in _query_set_methods:
            metric = 'model.' + method
            wrappers['django.db.models.query.QuerySet.' +
                     method] = get_complex_wrapper(metric, state='model')

        self.set_wrapped(wrappers)
        super(DjangoDbInstrumentor, self).run()
Example #5
0
class DjangoDbInstrumentor(BaseInstrumentor):
    modules = {'django.db.models.query': ['QuerySet']}
    _wrapped = {
        'django.db.models.query.QuerySet.iterator':
            generator_wrapper_factory(generate_record_telemetry('model.iterator.'), state='model'),
    }
    _query_set_methods = 'aggregate, count, bulk_create, create, get, get_or_create, latest, first, last, in_bulk,' \
                         'iterator, update_or_create, delete, update, exists'

    def __init__(self):
        super(DjangoDbInstrumentor, self).__init__()
        for method in [m.strip() for m in self._query_set_methods.split(',')]:
            self._wrapped['django.db.models.query.QuerySet.%s' % method] = default_context_wrapper_factory(
                'model.%s.' % method,
                state='model')

    def run(self):
        try:
            instrument_methods(self._wrapped)
            logger.debug('django db instrumentation complete')
        except:
            logger.exception('problem with django db instrumentation')
            raise