def test_transmission_cred_exception(self): mixin = TransportMixin() mixin.options = Options() with LocalFileStorage(os.path.join(TEST_FOLDER, self.id())) as stor: mixin.storage = stor mixin.storage.put([1, 2, 3]) with mock.patch('requests.post', throw(CredentialUnavailableError)): # noqa: E501 mixin._transmit_from_storage() self.assertIsNone(mixin.storage.get()) self.assertEqual(len(os.listdir(mixin.storage.path)), 0)
def test_transmission_500(self): mixin = TransportMixin() mixin.options = Options() with LocalFileStorage(os.path.join(TEST_FOLDER, self.id())) as stor: mixin.storage = stor mixin.storage.put([1, 2, 3]) with mock.patch('requests.post') as post: post.return_value = MockResponse(500, '{}') mixin._transmit_from_storage() self.assertIsNone(mixin.storage.get()) self.assertEqual(len(os.listdir(mixin.storage.path)), 1)
def __init__(self, **options): self.options = Options(**options) utils.validate_instrumentation_key(self.options.instrumentation_key) self.storage = LocalFileStorage( path=self.options.storage_path, max_size=self.options.storage_max_size, maintenance_period=self.options.storage_maintenance_period, retention_period=self.options.storage_retention_period, ) self._telemetry_processors = [] super(AzureExporter, self).__init__(**options)
def test_check_stats_collection(self): mixin = TransportMixin() mixin.options = Options() mixin.options.enable_stats_metrics = True self.assertTrue(mixin._check_stats_collection()) mixin._is_stats = False self.assertTrue(mixin._check_stats_collection()) mixin._is_stats = True self.assertFalse(mixin._check_stats_collection()) mixin.options.enable_stats_metrics = False self.assertFalse(mixin._check_stats_collection())
def test_create_properties_none(self): metric = create_metric() options = Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd') exporter = metrics_exporter.MetricsExporter(options) metric.time_series[0].label_values[0]._value = None properties = exporter.create_properties(metric.time_series[0], metric.descriptor) self.assertEqual(len(properties), 1) self.assertEqual(properties['key'], 'null')
def __init__(self, **options): self.options = Options(**options) if not self.options.instrumentation_key: raise ValueError('The instrumentation_key is not provided.') self.storage = LocalFileStorage( path=self.options.storage_path, max_size=self.options.storage_max_size, maintenance_period=self.options.storage_maintenance_period, retention_period=self.options.storage_retention_period, ) super(AzureExporter, self).__init__(**options)
def __init__(self, **options): options = Options(**options) self.export_interval = options.export_interval self.max_batch_size = options.max_batch_size # TODO: queue should be moved to tracer # too much refactor work, leave to the next PR self._queue = Queue(capacity=8192) # TODO: make this configurable # TODO: worker should not be created in the base exporter self._worker = Worker(self._queue, self) self._worker.start() atexit.register(self._worker.stop, options.grace_period)
def test_transmission_307_circular_reference(self): mixin = TransportMixin() mixin.options = Options() mixin._consecutive_redirects = 0 mixin.options.endpoint = "https://example.com" with mock.patch('requests.post') as post: post.return_value = MockResponse( 307, '{}', {"location": "https://example.com"}) # noqa: E501 result = mixin._transmit([1, 2, 3]) self.assertEqual(result, -307) self.assertEqual(post.call_count, _MAX_CONSECUTIVE_REDIRECTS) self.assertEqual(mixin.options.endpoint, "https://example.com")
def test_transmission_lease_failure(self): exporter = trace_exporter.AzureExporter( Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd', storage_path=os.path.join(TEST_FOLDER, 'lease.failure'), ), ) exporter.storage.put([1, 2, 3]) with mock.patch('opencensus.ext.azure.common.storage.LocalFileBlob.lease') as lease: # noqa: E501 lease.return_value = False exporter._transmission_routine() self.assertTrue(exporter.storage.get())
def test_statsbeat_timeout(self): _requests_map.clear() mixin = TransportMixin() mixin.options = Options() with mock.patch('requests.post', throw(requests.Timeout)): result = mixin._transmit([1, 2, 3]) self.assertEqual(len(_requests_map), 3) self.assertIsNotNone(_requests_map['duration']) self.assertEqual(_requests_map['count'], 1) self.assertEqual(_requests_map['retry'], 1) self.assertEqual(result, mixin.options.minimum_retry_interval) _requests_map.clear()
def test_transmission_400(self): exporter = trace_exporter.AzureExporter( Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd', storage_path=os.path.join(TEST_FOLDER, '400'), ), ) exporter.storage.put([1, 2, 3]) with mock.patch('requests.post') as post: post.return_value = MockResponse(400, '{}') exporter._transmission_routine() self.assertEqual(len(os.listdir(exporter.storage.path)), 0)
def test_statsbeat_exception(self): _requests_map.clear() mixin = TransportMixin() mixin.options = Options() with mock.patch('requests.post', throw(Exception)): result = mixin._transmit([1, 2, 3]) self.assertEqual(len(_requests_map), 3) self.assertIsNotNone(_requests_map['duration']) self.assertEqual(_requests_map['exception'], 1) self.assertEqual(_requests_map['count'], 1) self.assertEqual(result, -1) _requests_map.clear()
def test_transmission_request_exception(self): exporter = trace_exporter.AzureExporter( Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd', storage_path=os.path.join(TEST_FOLDER, 'request.exception'), ), ) exporter.storage.put([1, 2, 3]) with mock.patch('requests.post', throw(Exception)): exporter._transmission_routine() self.assertIsNone(exporter.storage.get()) self.assertEqual(len(os.listdir(exporter.storage.path)), 1)
def __init__(self, **options): self.options = Options(**options) utils.validate_instrumentation_key(self.options.instrumentation_key) self.export_interval = self.options.export_interval self.max_batch_size = self.options.max_batch_size self.storage = LocalFileStorage( path=self.options.storage_path, max_size=self.options.storage_max_size, maintenance_period=self.options.storage_maintenance_period, retention_period=self.options.storage_retention_period, ) super(AzureLogHandler, self).__init__()
def test_transmit_invalid_response_body(self, logger_mock): with mock.patch('requests.post') as requests_mock: type(requests_mock.return_value).text = mock.PropertyMock( return_value='invalid') envelope = create_envelope() options = Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd') exporter = metrics_exporter.MetricsExporter(options) exporter._transmit_without_retry([envelope]) self.assertEqual(len(requests_mock.call_args_list), 1) self.assertEqual(len(logger_mock.call_args_list), 1)
def test_transmit_no_status_code(self, logger_mock): with mock.patch('requests.post') as requests_mock: type(requests_mock.return_value).status_code = mock.PropertyMock( side_effect=Exception()) envelope = create_envelope() options = Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd') exporter = metrics_exporter.MetricsExporter(options) exporter._transmit_without_retry([envelope]) self.assertEqual(len(requests_mock.call_args_list), 1) self.assertEqual(len(logger_mock.call_args_list), 1)
def test_transmission_lease_failure(self, requests_mock): requests_mock.return_value = MockResponse(200, 'unknown') mixin = TransportMixin() mixin.options = Options() with LocalFileStorage(os.path.join(TEST_FOLDER, self.id())) as stor: mixin.storage = stor mixin.storage.put([1, 2, 3]) with mock.patch( 'opencensus.ext.azure.common.storage.LocalFileBlob.lease' ) as lease: # noqa: E501 lease.return_value = False mixin._transmit_from_storage() self.assertTrue(mixin.storage.get())
def test_statsbeat_439(self): _requests_map.clear() mixin = TransportMixin() mixin.options = Options() with mock.patch('requests.post') as post: post.return_value = MockResponse(439, 'unknown') result = mixin._transmit([1, 2, 3]) self.assertEqual(len(_requests_map), 3) self.assertIsNotNone(_requests_map['duration']) self.assertEqual(_requests_map['throttle'], 1) self.assertEqual(_requests_map['count'], 1) self.assertEqual(result, -439) _requests_map.clear()
def test_create_data_points(self): metric = create_metric() options = Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd') exporter = metrics_exporter.MetricsExporter(options) data_points = exporter.create_data_points(metric.time_series[0], metric.descriptor) self.assertEqual(len(data_points), 1) data_point = data_points[0] self.assertEqual(data_point.ns, metric.descriptor.name) self.assertEqual(data_point.name, metric.descriptor.name) self.assertEqual(data_point.value, metric.time_series[0].points[0].value.value)
def test_statsbeat_403(self): _requests_map.clear() mixin = TransportMixin() mixin.options = Options() with mock.patch('requests.post') as post: post.return_value = MockResponse(403, 'unknown') result = mixin._transmit([1, 2, 3]) self.assertEqual(len(_requests_map), 4) self.assertIsNotNone(_requests_map['duration']) self.assertEqual(_requests_map['retry'], 1) self.assertEqual(_requests_map['count'], 1) self.assertEqual(_requests_map['failure'], 1) self.assertEqual(result, mixin.options.minimum_retry_interval) _requests_map.clear()
def __init__(self, **options): self.options = Options(**options) utils.validate_instrumentation_key(self.options.instrumentation_key) self.storage = LocalFileStorage( path=self.options.storage_path, max_size=self.options.storage_max_size, maintenance_period=self.options.storage_maintenance_period, retention_period=self.options.storage_retention_period, source=self.__class__.__name__, ) self._telemetry_processors = [] super(AzureExporter, self).__init__(**options) heartbeat_metrics.enable_heartbeat_metrics( self.options.connection_string, self.options.instrumentation_key)
def test_export_metrics(self, requests_mock): metric = create_metric() options = Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd') exporter = metrics_exporter.MetricsExporter(options) requests_mock.return_value.text = '{"itemsReceived":1,'\ '"itemsAccepted":1,'\ '"errors":[]}' requests_mock.return_value.status_code = 200 exporter.export_metrics([metric]) self.assertEqual(len(requests_mock.call_args_list), 1) post_body = requests_mock.call_args_list[0][1]['data'] self.assertTrue('metrics' in post_body) self.assertTrue('properties' in post_body)
def __init__(self, **options): self.options = Options(**options) utils.validate_instrumentation_key(self.options.instrumentation_key) self.storage = None if self.options.enable_local_storage: self.storage = LocalFileStorage( path=self.options.storage_path, max_size=self.options.storage_max_size, maintenance_period=self.options.storage_maintenance_period, retention_period=self.options.storage_retention_period, source=self.__class__.__name__, ) self._telemetry_processors = [] super(AzureExporter, self).__init__(**options) atexit.register(self._stop, self.options.grace_period)
def __init__(self, **options): self.options = Options(**options) utils.validate_instrumentation_key(self.options.instrumentation_key) if self.options.max_batch_size <= 0: raise ValueError('Max batch size must be at least 1.') self.export_interval = self.options.export_interval self.max_batch_size = self.options.max_batch_size self._telemetry_processors = [] self.storage = LocalFileStorage( path=self.options.storage_path, max_size=self.options.storage_max_size, maintenance_period=self.options.storage_maintenance_period, retention_period=self.options.storage_retention_period, ) super(MetricsExporter, self).__init__()
def test_emit(self, request_mock): exporter = trace_exporter.AzureExporter( Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd', storage_path=os.path.join(TEST_FOLDER, 'foo'), ), ) exporter.transport = MockTransport() exporter.emit([]) self.assertEqual(len(os.listdir(exporter.storage.path)), 0) with mock.patch('opencensus.ext.azure.trace_exporter.AzureExporter._transmit') as transmit: # noqa: E501 transmit.return_value = 10 exporter.emit([]) self.assertEqual(len(os.listdir(exporter.storage.path)), 1) self.assertIsNone(exporter.storage.get())
def test_transmit_partial_exception(self, logger_mock): with mock.patch('requests.post') as requests_mock: text = '{"itemsReceived":1,'\ '"itemsAccepted":1}' type(requests_mock.return_value).text = mock.PropertyMock( return_value=text) type(requests_mock.return_value).status_code = mock.PropertyMock( return_value=206) envelope = create_envelope() options = Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd') exporter = metrics_exporter.MetricsExporter(options) exporter._transmit_without_retry([envelope]) self.assertEqual(len(requests_mock.call_args_list), 1) self.assertEqual(len(logger_mock.call_args_list), 1)
def test_transmission_307(self): mixin = TransportMixin() mixin.options = Options() mixin._consecutive_redirects = 0 mixin.options.endpoint = "test.endpoint" with LocalFileStorage(os.path.join(TEST_FOLDER, self.id())) as stor: mixin.storage = stor mixin.storage.put([1, 2, 3]) with mock.patch('requests.post') as post: post.return_value = MockResponse( 307, '{}', {"location": "https://example.com"}) # noqa: E501 mixin._transmit_from_storage() self.assertEqual(post.call_count, _MAX_CONSECUTIVE_REDIRECTS) self.assertEqual(len(os.listdir(mixin.storage.path)), 0) self.assertEqual(mixin.options.endpoint, "https://example.com")
def __init__(self, **options): self.options = Options(**options) utils.validate_instrumentation_key(self.options.instrumentation_key) if not 0 <= self.options.logging_sampling_rate <= 1: raise ValueError('Sampling must be in the range: [0,1]') self.export_interval = self.options.export_interval self.max_batch_size = self.options.max_batch_size self.storage = LocalFileStorage( path=self.options.storage_path, max_size=self.options.storage_max_size, maintenance_period=self.options.storage_maintenance_period, retention_period=self.options.storage_retention_period, ) self._telemetry_processors = [] super(AzureLogHandler, self).__init__() self.addFilter(SamplingFilter(self.options.logging_sampling_rate))
def test_transmit_none_data_non_retryable(self, logger_mock, json_mock): with mock.patch('requests.post') as requests_mock: text = '{"itemsReceived":1,'\ '"itemsAccepted":1,'\ '"errors":[{"statusCode":500, "index":0}]}' type(requests_mock.return_value).text = mock.PropertyMock( return_value=text) type(requests_mock.return_value).status_code = mock.PropertyMock( return_value=402) envelope = create_envelope() options = Options( instrumentation_key='12345678-1234-5678-abcd-12345678abcd') exporter = metrics_exporter.MetricsExporter(options) exporter._transmit_without_retry([envelope]) self.assertEqual(len(requests_mock.call_args_list), 1) self.assertEqual(len(logger_mock.call_args_list), 1)
def test_statsbeat_307(self): _requests_map.clear() mixin = TransportMixin() mixin.options = Options() mixin._consecutive_redirects = 0 mixin.options.endpoint = "test.endpoint" with mock.patch('requests.post') as post: post.return_value = MockResponse( 307, '{}', {"location": "https://example.com"}) # noqa: E501 result = mixin._transmit([1, 2, 3]) self.assertEqual(len(_requests_map), 4) self.assertIsNotNone(_requests_map['duration']) self.assertEqual(_requests_map['exception'], 1) self.assertEqual(_requests_map['count'], 10) self.assertEqual(_requests_map['failure'], 10) self.assertEqual(result, -307) _requests_map.clear()