예제 #1
0
def test_prepare_report_json(mock_report, mock_report_with_byte_field):
    reporter = Reporter('api key')

    reports = reporter.prepare_report_json([mock_report, mock_report_with_byte_field])
    reports = json.loads(reports[0])

    assert len(reports) == 2
    assert reports[0].get('type') != 'bytes'
    assert reports[1].get('type') == 'bytes'
예제 #2
0
def test_send_report(mock_requests, mock_invocation_report):
    test_session = mock_requests.Session()
    reporter = Reporter('unauthorized api key', session=test_session)
    responses = reporter.send_reports([mock_invocation_report])

    assert reporter.session.post.call_count == 1
    test_session.post.return_value.status_code = 401
    for response in responses:
        assert response.status_code == 401
예제 #3
0
def test_get_report_batches(mock_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_BATCH_SIZE, '2')

    reporter = Reporter('api key')
    batches = reporter.get_report_batches([mock_report] * 3)

    assert len(batches) == 2
    assert batches[0] == [mock_report, mock_report]
    assert batches[1] == [mock_report]
예제 #4
0
def test_prepare_report_json_batch(mock_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_BATCH_SIZE, '1')

    reporter = Reporter('api key')

    batched_reports = reporter.prepare_report_json([mock_report] * 2)
    assert len(batched_reports) == 2

    reports = json.loads(batched_reports[0])
    assert len(reports) == 1
예제 #5
0
def test_send_report_to_url_async(mock_requests, mock_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_BASEURL, 'different_url/api')
    ConfigProvider.set(config_names.THUNDRA_REPORT_CLOUDWATCH_ENABLE, 'true')

    test_session = mock_requests.Session()
    reporter = Reporter('api key', session=test_session)

    responses = reporter.send_reports([mock_report])

    reporter.session.post.assert_not_called()
    assert responses == []
예제 #6
0
def test_send_report_to_url_composite(mock_requests, mock_report, mock_invocation_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_BASEURL, 'different_url/api')
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_ENABLE, 'true')
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_BATCH_SIZE, '1')

    test_session = mock_requests.Session()
    reporter = Reporter('api key', session=test_session)

    responses = reporter.send_reports([mock_invocation_report, mock_report])
    assert reporter.session.post.call_count == 2

    reporter.session.post.return_value.status_code = 200
    for response in responses:
        assert response.status_code == 200
예제 #7
0
class BaseWrapper(ABC):

    def __init__(self, api_key=None, disable_trace=False, disable_metric=True, disable_log=True, opts=None):
        self.plugins = None
        self.config = ThundraConfig()
        if opts is not None:
            self.config = ThundraConfig(opts)

        self.api_key = ConfigProvider.get(config_names.THUNDRA_APIKEY, api_key)
        if not self.api_key:
            self.api_key = self.config.api_key
        if self.api_key is None:
            logger.error('Please set "thundra_apiKey" from environment variables in order to use Thundra')

        self.reporter = Reporter(self.api_key)
        self.debugger_process = None

        if not ConfigProvider.get(config_names.THUNDRA_TRACE_INSTRUMENT_DISABLE):
            if not PY2:
                from thundra.plugins.trace.patcher import ImportPatcher
                self.import_patcher = ImportPatcher()
        self.thread_pool_executor = ThreadPoolExecutorWithQueueSizeLimit()
        terminator = Terminator()
        terminator.register_task(self)


    def execute_hook(self, name, data):
        if name == 'after:invocation':
            [plugin.hooks[name](data) for plugin in reversed(self.plugins) if hasattr(plugin, 'hooks')
             and name in plugin.hooks]
        else:
            [plugin.hooks[name](data) for plugin in self.plugins if
             hasattr(plugin, 'hooks') and name in plugin.hooks]


    def prepare_and_send_reports(self, execution_context):
        execution_context.finish_timestamp = int(time.time() * 1000)
        self.execute_hook('after:invocation', execution_context)
        self.reporter.send_reports(execution_context.reports)


    def prepare_and_send_reports_async(self, execution_context):
        execution_context.finish_timestamp = int(time.time() * 1000)
        self.execute_hook('after:invocation', execution_context)
        try:
            self.thread_pool_executor.submit(self.reporter.send_reports, execution_context.reports)
        except queue.Full:
            logger.error("Dropping the monitoring report as the request queue is full")
        except Exception as e:
            logger.error(e)
예제 #8
0
def test_prepare_composite_report_json(mock_report, mock_invocation_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_BATCH_SIZE, '2')
    reporter = Reporter('api key')
    batched_reports = reporter.prepare_composite_report_json([mock_invocation_report, mock_report, mock_report])
    composite_report = json.loads(batched_reports[0])

    assert composite_report["type"] == "Composite"
    assert composite_report["apiKey"] == "api key"
    assert len(composite_report["data"]["allMonitoringData"]) == 2

    composite_report = json.loads(batched_reports[1])

    assert composite_report["type"] == "Composite"
    assert composite_report["apiKey"] == "api key"
    assert len(composite_report["data"]["allMonitoringData"]) == 1
예제 #9
0
def test_send_report_to_url(mock_requests, mock_report):
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_BASEURL, 'different_url/api')
    ConfigProvider.set(config_names.THUNDRA_REPORT_REST_COMPOSITE_ENABLE, 'false')
    test_session = mock_requests.Session()
    reporter = Reporter('api key', session=test_session)
    responses = reporter.send_reports([mock_report])

    post_url = 'different_url/api/monitoring-data'
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'ApiKey api key'
    }

    reporter.session.post.assert_called_once_with(post_url, data=to_json([mock_report], separators=(',', ':')),
                                                  headers=headers, timeout=constants.DEFAULT_REPORT_TIMEOUT)
    reporter.session.post.return_value.status_code = 200
    for response in responses:
        assert response.status_code == 200
예제 #10
0
    def __init__(self, api_key=None, disable_trace=False, disable_metric=True, disable_log=True, opts=None):
        self.plugins = None
        self.config = ThundraConfig()
        if opts is not None:
            self.config = ThundraConfig(opts)

        self.api_key = ConfigProvider.get(config_names.THUNDRA_APIKEY, api_key)
        if not self.api_key:
            self.api_key = self.config.api_key
        if self.api_key is None:
            logger.error('Please set "thundra_apiKey" from environment variables in order to use Thundra')

        self.reporter = Reporter(self.api_key)
        self.debugger_process = None

        if not ConfigProvider.get(config_names.THUNDRA_TRACE_INSTRUMENT_DISABLE):
            if not PY2:
                from thundra.plugins.trace.patcher import ImportPatcher
                self.import_patcher = ImportPatcher()
        self.thread_pool_executor = ThreadPoolExecutorWithQueueSizeLimit()
        terminator = Terminator()
        terminator.register_task(self)
예제 #11
0
def reporter(mock_requests):
    return Reporter('api key', mock_requests.Session())