def process_notifications(self, priority, notifications): events = chain.from_iterable(m["payload"] for m in notifications) events = [ models.Event(message_id=ev['message_id'], event_type=ev['event_type'], generated=timeutils.normalize_time( timeutils.parse_isotime(ev['generated'])), traits=[ models.Trait( name, dtype, models.Trait.convert_value(dtype, value)) for name, dtype, value in ev['traits'] ], raw=ev.get('raw', {})) for ev in events if publisher_utils.verify_signature( ev, self.conf.publisher.telemetry_secret) ] try: with self.publisher as p: p(events) except Exception: if not self.conf.notification.ack_on_event_error: return oslo_messaging.NotificationResult.REQUEUE raise return oslo_messaging.NotificationResult.HANDLED
def publish_data(metering_connection, events_connection): '''Connects to given QDR passed by argument (default '127.0.0.1:5672') and sends sample metric and event data to the bus. ''' conf = cfg.ConfigOpts() for opts in [oslo_opts, ceilo_opts]: for group, options in opts.list_opts(): conf.register_opts(list(options), group=None if group == "DEFAULT" else group) # override default configuration according to overcloud conf.set_override('notify_address_prefix', '', group='oslo_messaging_amqp') conf.set_override('control_exchange', 'ceilometer') try: metric_publisher = messaging.SampleNotifierPublisher( conf, netutils.urlsplit(metering_connection)) event_publisher = messaging.EventNotifierPublisher( conf, netutils.urlsplit(events_connection)) except Exception as ex: print(f'Failed to connect to QDR ({url}) due to {ex}') sys.exit(1) for evt in EVENTS: itm = event.Event(message_id=evt['message_id'], event_type=evt['event_type'], generated=evt['generated'], traits=[event.Trait(*tr) for tr in evt['traits']], raw=evt['raw']) topic = conf.publisher_notifier.event_topic print( f'Sending event to {topic}: ' f'{utils.message_from_event(itm, conf.publisher.telemetry_secret)}' ) try: event_publisher.publish_events([itm]) except Exception as ex: print(f'Failed to send event due to {ex}') sys.exit(1) for metr in METRICS: itm = sample.Sample(name=metr['counter_name'], type=metr['counter_type'], unit=metr['counter_unit'], volume=metr['counter_volume'], user_id=metr['user_id'], project_id=metr['project_id'], resource_id=metr['resource_id'], timestamp=metr['timestamp'], resource_metadata=metr['resource_metadata']) topic = conf.publisher_notifier.metering_topic print( f'Sending metric to {topic}: ' f'{utils.meter_message_from_counter(itm, conf.publisher.telemetry_secret)}' ) try: metric_publisher.publish_samples([itm]) except Exception as ex: print(f'Failed to send metric due to {ex}') sys.exit(1)
def setUp(self): super(EventPipelineTestCase, self).setUp() self.CONF = service.prepare_service([], []) self.p_type = pipeline.EVENT_TYPE self.transformer_manager = None self.test_event = models.Event( message_id=uuid.uuid4(), event_type='a', generated=datetime.datetime.utcnow(), traits=[ models.Trait('t_text', 1, 'text_trait'), models.Trait('t_int', 2, 'int_trait'), models.Trait('t_float', 3, 'float_trait'), models.Trait('t_datetime', 4, 'datetime_trait') ], raw={'status': 'started'}) self.test_event2 = models.Event( message_id=uuid.uuid4(), event_type='b', generated=datetime.datetime.utcnow(), traits=[ models.Trait('t_text', 1, 'text_trait'), models.Trait('t_int', 2, 'int_trait'), models.Trait('t_float', 3, 'float_trait'), models.Trait('t_datetime', 4, 'datetime_trait') ], raw={'status': 'stopped'}) self.useFixture( fixtures.MockPatchObject(publisher, 'get_publisher', side_effect=self.get_publisher)) self._setup_pipeline_cfg() self._reraise_exception = True self.useFixture( fixtures.MockPatch('ceilometer.pipeline.LOG.exception', side_effect=self._handle_reraise_exception))
def to_event(self, priority, notification_body): event_type = notification_body['event_type'] message_id = notification_body['metadata']['message_id'] when = timeutils.normalize_time(timeutils.parse_isotime( notification_body['metadata']['timestamp'])) traits = (self.traits[t].to_trait(notification_body) for t in self.traits) # Only accept non-None value traits ... traits = [trait for trait in traits if trait is not None] raw = notification_body if priority in self.raw_levels else {} event = models.Event(message_id, event_type, when, traits, raw) return event
class TestHttpPublisher(base.BaseTestCase): resource_id = str(uuid.uuid4()) sample_data = [ sample.Sample( name='alpha', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id=resource_id, timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), sample.Sample( name='beta', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id=resource_id, timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), sample.Sample( name='gamma', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id=resource_id, timestamp=datetime.datetime.now().isoformat(), resource_metadata={'name': 'TestPublish'}, ), ] event_data = [ event.Event(message_id=str(uuid.uuid4()), event_type='event_%d' % i, generated=datetime.datetime.utcnow().isoformat(), traits=[], raw={'payload': { 'some': 'aa' }}) for i in range(3) ] def setUp(self): super(TestHttpPublisher, self).setUp() self.CONF = service.prepare_service([], []) def test_http_publisher_config(self): """Test publisher config parameters.""" # invalid hostname, the given url, results in an empty hostname parsed_url = urlparse.urlparse('http:/aaa.bb/path') self.assertRaises(ValueError, http.HttpPublisher, self.CONF, parsed_url) # invalid port parsed_url = urlparse.urlparse('http://*****:*****@mock.patch('ceilometer.publisher.http.LOG') def test_http_post_samples(self, thelog): """Test publisher post.""" parsed_url = urlparse.urlparse('http://*****:*****@mock.patch('ceilometer.publisher.http.LOG') def test_http_post_events(self, thelog): """Test publisher post.""" parsed_url = urlparse.urlparse('http://*****:*****@mock.patch('ceilometer.publisher.http.LOG') def test_http_post_empty_data(self, thelog): parsed_url = urlparse.urlparse('http://*****:*****@localhost:90/path1?') publisher = http.HttpPublisher(self.CONF, parsed_url) with mock.patch.object(requests.Session, 'post') as post: publisher.publish_samples(self.sample_data) self.assertEqual(('alice', 'l00kingGla$$'), post.call_args[1]['auth']) def test_post_client_cert_auth(self): parsed_url = urlparse.urlparse('http://localhost:90/path1?' 'clientcert=/path/to/cert.crt&' 'clientkey=/path/to/cert.key') publisher = http.HttpPublisher(self.CONF, parsed_url) with mock.patch.object(requests.Session, 'post') as post: publisher.publish_samples(self.sample_data) self.assertEqual(('/path/to/cert.crt', '/path/to/cert.key'), post.call_args[1]['cert']) def test_post_raw_only(self): parsed_url = urlparse.urlparse('http://localhost:90/path1?raw_only=1') publisher = http.HttpPublisher(self.CONF, parsed_url) with mock.patch.object(requests.Session, 'post') as post: publisher.publish_events(self.event_data) self.assertEqual( '[{"some": "aa"}, {"some": "aa"}, {"some": "aa"}]', post.call_args[1]['data'])
class BasePublisherTestCase(tests_base.BaseTestCase): test_event_data = [ event.Event(message_id=uuid.uuid4(), event_type='event_%d' % i, generated=datetime.datetime.utcnow(), traits=[], raw={}) for i in range(0, 5) ] test_sample_data = [ sample.Sample( name='test', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id='test_run_tasks', timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), sample.Sample( name='test', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id='test_run_tasks', timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), sample.Sample( name='test2', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id='test_run_tasks', timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), sample.Sample( name='test2', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id='test_run_tasks', timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), sample.Sample( name='test3', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id='test_run_tasks', timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), ] def setUp(self): super(BasePublisherTestCase, self).setUp() self.CONF = service.prepare_service([], []) self.setup_messaging(self.CONF)
load_tests = testscenarios.load_tests_apply_scenarios INSTANCE_DELETE_START = models.Event( event_type=u'compute.instance.delete.start', traits=[ models.Trait('state', 1, u'active'), models.Trait('user_id', 1, u'1e3ce043029547f1a61c1996d1a531a2'), models.Trait('service', 1, u'compute'), models.Trait('disk_gb', 2, 0), models.Trait('instance_type', 1, u'm1.tiny'), models.Trait('tenant_id', 1, u'7c150a59fe714e6f9263774af9688f0e'), models.Trait('root_gb', 2, 0), models.Trait('ephemeral_gb', 2, 0), models.Trait('instance_type_id', 2, 2), models.Trait('vcpus', 2, 1), models.Trait('memory_mb', 2, 512), models.Trait('instance_id', 1, u'9f9d01b9-4a58-4271-9e27-398b21ab20d1'), models.Trait('host', 1, u'vagrant-precise'), models.Trait('request_id', 1, u'req-fb3c4546-a2e5-49b7-9fd2-a63bd658bc39'), models.Trait('project_id', 1, u'7c150a59fe714e6f9263774af9688f0e'), models.Trait('launched_at', 4, '2012-05-08T20:23:47') ], raw={}, generated='2012-05-08T20:24:14.824743', message_id=u'a15b94ee-cb8e-4c71-9abe-14aa80055fb4', ) IMAGE_DELETE_START = models.Event( event_type=u'image.delete',
class TestZaqarPublisher(base.BaseTestCase): resource_id = str(uuid.uuid4()) sample_data = [ sample.Sample( name='alpha', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id=resource_id, timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), sample.Sample( name='beta', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id=resource_id, timestamp=datetime.datetime.utcnow().isoformat(), resource_metadata={'name': 'TestPublish'}, ), sample.Sample( name='gamma', type=sample.TYPE_CUMULATIVE, unit='', volume=1, user_id='test', project_id='test', resource_id=resource_id, timestamp=datetime.datetime.now().isoformat(), resource_metadata={'name': 'TestPublish'}, ), ] event_data = [event.Event( message_id=str(uuid.uuid4()), event_type='event_%d' % i, generated=datetime.datetime.utcnow().isoformat(), traits=[], raw={'payload': {'some': 'aa'}}) for i in range(3)] def setUp(self): super(TestZaqarPublisher, self).setUp() self.CONF = service.prepare_service([], []) def test_zaqar_publisher_config(self): """Test publisher config parameters.""" parsed_url = urlparse.urlparse('zaqar://') self.assertRaises(ValueError, zaqar.ZaqarPublisher, self.CONF, parsed_url) parsed_url = urlparse.urlparse('zaqar://?queue=foo&ttl=bar') self.assertRaises(ValueError, zaqar.ZaqarPublisher, self.CONF, parsed_url) parsed_url = urlparse.urlparse('zaqar://?queue=foo&ttl=60') publisher = zaqar.ZaqarPublisher(self.CONF, parsed_url) self.assertEqual(60, publisher.ttl) parsed_url = urlparse.urlparse('zaqar://?queue=foo') publisher = zaqar.ZaqarPublisher(self.CONF, parsed_url) self.assertEqual(3600, publisher.ttl) self.assertEqual('foo', publisher.queue_name) @mock.patch('zaqarclient.queues.v2.queues.Queue') def test_zaqar_post_samples(self, mock_queue): """Test publisher post.""" parsed_url = urlparse.urlparse('zaqar://?queue=foo') publisher = zaqar.ZaqarPublisher(self.CONF, parsed_url) mock_post = mock.Mock() mock_queue.return_value = mock_post publisher.publish_samples(self.sample_data) mock_queue.assert_called_once_with(mock.ANY, 'foo') self.assertEqual( 3, len(mock_post.post.call_args_list[0][0][0])) self.assertEqual( mock_post.post.call_args_list[0][0][0][0]['body'], self.sample_data[0].as_dict()) @mock.patch('zaqarclient.queues.v2.queues.Queue') def test_zaqar_post_events(self, mock_queue): """Test publisher post.""" parsed_url = urlparse.urlparse('zaqar://?queue=foo') publisher = zaqar.ZaqarPublisher(self.CONF, parsed_url) mock_post = mock.Mock() mock_queue.return_value = mock_post publisher.publish_events(self.event_data) mock_queue.assert_called_once_with(mock.ANY, 'foo') self.assertEqual( 3, len(mock_post.post.call_args_list[0][0][0])) self.assertEqual( mock_post.post.call_args_list[0][0][0][0]['body'], self.event_data[0].serialize())
load_tests = testscenarios.load_tests_apply_scenarios INSTANCE_DELETE_START = models.Event( event_type=u'compute.instance.delete.start', traits=[models.Trait('state', 1, u'active'), models.Trait( 'user_id', 1, u'1e3ce043029547f1a61c1996d1a531a2'), models.Trait('service', 1, u'compute'), models.Trait('availability_zone', 1, u'zone1'), models.Trait('disk_gb', 2, 0), models.Trait('instance_type', 1, u'm1.tiny'), models.Trait('tenant_id', 1, u'7c150a59fe714e6f9263774af9688f0e'), models.Trait('root_gb', 2, 0), models.Trait('ephemeral_gb', 2, 0), models.Trait('instance_type_id', 2, u'2'), models.Trait('vcpus', 2, 1), models.Trait('memory_mb', 2, 512), models.Trait( 'instance_id', 1, u'9f9d01b9-4a58-4271-9e27-398b21ab20d1'), models.Trait('host', 1, u'vagrant-precise'), models.Trait( 'request_id', 1, u'req-fb3c4546-a2e5-49b7-9fd2-a63bd658bc39'), models.Trait('project_id', 1, u'7c150a59fe714e6f9263774af9688f0e'), models.Trait('launched_at', 4, '2012-05-08T20:23:47')], raw={}, generated='2012-05-08T20:24:14.824743', message_id=u'a15b94ee-cb8e-4c71-9abe-14aa80055fb4', ) INSTANCE_CREATE_END = models.Event( event_type=u'compute.instance.create.end',