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 to_trait(self, notification_body): value = self.parse(notification_body) if value is None: return None # NOTE(mdragon): some openstack projects (mostly Nova) emit '' # for null fields for things like dates. if self.trait_type != models.Trait.TEXT_TYPE and value == '': return None value = models.Trait.convert_value(self.trait_type, value) return models.Trait(self.name, self.trait_type, value)
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))
import six from stevedore import extension import testscenarios from ceilometer.event import models from ceilometer.publisher import gnocchi from ceilometer import sample from ceilometer import service as ceilometer_service from ceilometer.tests import base 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'),