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'
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
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]
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
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 == []
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
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)
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
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
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 reporter(mock_requests): return Reporter('api key', mock_requests.Session())