def start_polling_tasks(self): # NOTE(sileht): 1000 is just the same as previous oslo_service code self.polling_periodics = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers=1000)) # allow time for coordination if necessary delay_start = self.partition_coordinator.is_active() # set shuffle time before polling task if necessary delay_polling_time = random.randint( 0, cfg.CONF.shuffle_time_before_polling_task) data = self.setup_polling_tasks() for interval, polling_task in data.items(): delay_time = (interval + delay_polling_time if delay_start else delay_polling_time) @periodics.periodic(spacing=interval, run_immediately=False) def task(running_task): self.interval_task(running_task) utils.spawn_thread(utils.delayed, delay_time, self.polling_periodics.add, task, polling_task) if data: # Don't start useless threads if no task will run utils.spawn_thread(self.polling_periodics.start, allow_empty=True)
def start_polling_tasks(self): # allow time for coordination if necessary delay_start = self.partition_coordinator.is_active() # set shuffle time before polling task if necessary delay_polling_time = random.randint( 0, self.conf.shuffle_time_before_polling_task) data = self.setup_polling_tasks() # Don't start useless threads if no task will run if not data: return # One thread per polling tasks is enough self.polling_periodics = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers=len(data))) for interval, polling_task in data.items(): delay_time = (interval + delay_polling_time if delay_start else delay_polling_time) @periodics.periodic(spacing=interval, run_immediately=False) def task(running_task): self.interval_task(running_task) utils.spawn_thread(utils.delayed, delay_time, self.polling_periodics.add, task, polling_task) utils.spawn_thread(self.polling_periodics.start, allow_empty=True)
def start_polling_tasks(self): # NOTE(sileht): 1000 is just the same as previous oslo_service code self.polling_periodics = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers= 1000)) # allow time for coordination if necessary delay_start = self.partition_coordinator.is_active() # set shuffle time before polling task if necessary delay_polling_time = random.randint( 0, cfg.CONF.shuffle_time_before_polling_task) data = self.setup_polling_tasks() for interval, polling_task in data.items(): delay_time = (interval + delay_polling_time if delay_start else delay_polling_time) @periodics.periodic(spacing=interval, run_immediately=False) def task(running_task): self.interval_task(running_task) utils.spawn_thread(utils.delayed, delay_time, self.polling_periodics.add, task, polling_task) if data: # Don't start useless threads if no task will run utils.spawn_thread(self.polling_periodics.start, allow_empty=True)
def start_polling_tasks(self): # set shuffle time before polling task if necessary delay_polling_time = random.randint( 0, self.conf.shuffle_time_before_polling_task) data = self.setup_polling_tasks() # Don't start useless threads if no task will run if not data: return # One thread per polling tasks is enough self.polling_periodics = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers= len(data))) for interval, polling_task in data.items(): delay_time = interval + delay_polling_time @periodics.periodic(spacing=interval, run_immediately=False) def task(running_task): self.interval_task(running_task) utils.spawn_thread(utils.delayed, delay_time, self.polling_periodics.add, task, polling_task) utils.spawn_thread(self.polling_periodics.start, allow_empty=True)
def run(self): # Delay startup so workers are jittered time.sleep(self.startup_delay) super(NotificationService, self).run() self.shutdown = False self.periodic = None self.coord_lock = threading.Lock() self.listeners = [] # NOTE(kbespalov): for the pipeline queues used a single amqp host # hence only one listener is required self.pipeline_listener = None self.pipeline_manager = pipeline.setup_pipeline(self.conf) self.event_pipeline_manager = pipeline.setup_event_pipeline(self.conf) self.transport = messaging.get_transport(self.conf) if self.conf.notification.workload_partitioning: self.partition_coordinator.start() else: # FIXME(sileht): endpoint uses the notification_topics option # and it should not because this is an oslo_messaging option # not a ceilometer. Until we have something to get the # notification_topics in another way, we must create a transport # to ensure the option has been registered by oslo_messaging. messaging.get_notifier(self.transport, '') pipe_manager = self._get_pipe_manager(self.transport, self.pipeline_manager) event_pipe_manager = self._get_event_pipeline_manager(self.transport) self._configure_main_queue_listeners(pipe_manager, event_pipe_manager) if self.conf.notification.workload_partitioning: # join group after all manager set up is configured self.hashring = self.partition_coordinator.join_partitioned_group( self.NOTIFICATION_NAMESPACE) @periodics.periodic(spacing=self.conf.coordination.check_watchers, run_immediately=True) def run_watchers(): self.partition_coordinator.run_watchers() self.periodic = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers =10)) self.periodic.add(run_watchers) utils.spawn_thread(self.periodic.start) # configure pipelines after all coordination is configured. with self.coord_lock: self._configure_pipeline_listener()
def start_task(self): LOG.info('Start the polling task of zabbix_sender, interval is %ss' % cfg.CONF.zabbix.interval) polling_periodics = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers=1)) @periodics.periodic(spacing=cfg.CONF.zabbix.interval, run_immediately=True) def task(to_run_task): to_run_task() polling_periodics.add(task, self.send_data_to_zabbix) utils.spawn_thread(polling_periodics.start, allow_empty=True)
def init_pipeline_refresh(self): """Initializes pipeline refresh state.""" self.clear_pipeline_validation_status() self.refresh_pipeline_periodic = None if (self.conf.refresh_pipeline_cfg or self.conf.refresh_event_pipeline_cfg): self.refresh_pipeline_periodic = utils.create_periodic( target=self.refresh_pipeline, spacing=self.conf.pipeline_polling_interval) utils.spawn_thread(self.refresh_pipeline_periodic.start)
def run(self): # Delay startup so workers are jittered time.sleep(self.startup_delay) super(NotificationService, self).run() self.coord_lock = threading.Lock() self.managers = [ ext.obj for ext in named.NamedExtensionManager( namespace='ceilometer.notification.pipeline', names=self.conf.notification.pipelines, invoke_on_load=True, on_missing_entrypoints_callback=self._log_missing_pipeline, invoke_args=(self.conf, self.conf.notification.workload_partitioning)) ] self.transport = messaging.get_transport(self.conf) if self.conf.notification.workload_partitioning: self.partition_coordinator.start(start_heart=True) else: # FIXME(sileht): endpoint uses the notification_topics option # and it should not because this is an oslo_messaging option # not a ceilometer. Until we have something to get the # notification_topics in another way, we must create a transport # to ensure the option has been registered by oslo_messaging. messaging.get_notifier(self.transport, '') self._configure_main_queue_listeners() if self.conf.notification.workload_partitioning: # join group after all manager set up is configured self.hashring = self.partition_coordinator.join_partitioned_group( self.NOTIFICATION_NAMESPACE) @periodics.periodic(spacing=self.conf.coordination.check_watchers, run_immediately=True) def run_watchers(): self.partition_coordinator.run_watchers() if self.group_state != self.hashring.ring.nodes: self.group_state = self.hashring.ring.nodes.copy() self._refresh_agent() self.periodic = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers =10)) self.periodic.add(run_watchers) utils.spawn_thread(self.periodic.start)
def run(self): if self.conf.collector.udp_address: self.udp_thread = utils.spawn_thread(self.start_udp) transport = messaging.get_transport(self.conf, optional=True) if transport: if list(self.meter_manager): sample_target = oslo_messaging.Target( topic=self.conf.publisher_notifier.metering_topic) self.sample_listener = ( messaging.get_batch_notification_listener( transport, [sample_target], [SampleEndpoint(self.conf.publisher.telemetry_secret, self.meter_manager)], allow_requeue=True, batch_size=self.conf.collector.batch_size, batch_timeout=self.conf.collector.batch_timeout)) self.sample_listener.start() if list(self.event_manager): event_target = oslo_messaging.Target( topic=self.conf.publisher_notifier.event_topic) self.event_listener = ( messaging.get_batch_notification_listener( transport, [event_target], [EventEndpoint(self.conf.publisher.telemetry_secret, self.event_manager)], allow_requeue=True, batch_size=self.conf.collector.batch_size, batch_timeout=self.conf.collector.batch_timeout)) self.event_listener.start()
def run(self): if self.conf.collector.udp_address: self.udp_thread = utils.spawn_thread(self.start_udp) transport = messaging.get_transport(self.conf, optional=True) if transport: if list(self.meter_manager): sample_target = oslo_messaging.Target( topic=self.conf.publisher_notifier.metering_topic) self.sample_listener = ( messaging.get_batch_notification_listener( transport, [sample_target], [ SampleEndpoint( self.conf.publisher.telemetry_secret, self.meter_manager) ], allow_requeue=True, batch_size=self.conf.collector.batch_size, batch_timeout=self.conf.collector.batch_timeout)) self.sample_listener.start() if list(self.event_manager): event_target = oslo_messaging.Target( topic=self.conf.publisher_notifier.event_topic) self.event_listener = ( messaging.get_batch_notification_listener( transport, [event_target], [ EventEndpoint(self.conf.publisher.telemetry_secret, self.event_manager) ], allow_requeue=True, batch_size=self.conf.collector.batch_size, batch_timeout=self.conf.collector.batch_timeout)) self.event_listener.start()
def start_polling_tasks(self): data = self.setup_polling_tasks() # Don't start useless threads if no task will run if not data: return # One thread per polling tasks is enough self.polling_periodics = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers=len(data))) for interval, polling_task in data.items(): @periodics.periodic(spacing=interval, run_immediately=True) def task(running_task): self.interval_task(running_task) self.polling_periodics.add(task, polling_task) utils.spawn_thread(self.polling_periodics.start, allow_empty=True)
def init_pipeline_refresh(self): """Initializes pipeline refresh state.""" self.clear_pipeline_validation_status() if cfg.CONF.refresh_pipeline_cfg: self.set_pipeline_mtime(pipeline.get_pipeline_mtime()) self.set_pipeline_hash(pipeline.get_pipeline_hash()) if cfg.CONF.refresh_event_pipeline_cfg: self.set_pipeline_mtime(pipeline.get_pipeline_mtime( pipeline.EVENT_TYPE), pipeline.EVENT_TYPE) self.set_pipeline_hash(pipeline.get_pipeline_hash( pipeline.EVENT_TYPE), pipeline.EVENT_TYPE) self.refresh_pipeline_periodic = None if (cfg.CONF.refresh_pipeline_cfg or cfg.CONF.refresh_event_pipeline_cfg): self.refresh_pipeline_periodic = utils.create_periodic( target=self.refresh_pipeline, spacing=cfg.CONF.pipeline_polling_interval) utils.spawn_thread(self.refresh_pipeline_periodic.start)
def join_partitioning_groups(self): self.groups = set([self.construct_group_id(d.obj.group_id) for d in self.discoveries]) # let each set of statically-defined resources have its own group static_resource_groups = set([ self.construct_group_id(utils.hash_of_set(p.resources)) for p in self.polling_manager.sources if p.resources ]) self.groups.update(static_resource_groups) if not self.groups and self.partition_coordinator.is_active(): self.partition_coordinator.stop() self.heartbeat_timer.stop() if self.groups and not self.partition_coordinator.is_active(): self.partition_coordinator.start() utils.spawn_thread(self.heartbeat_timer.start) for group in self.groups: self.partition_coordinator.join_group(group)
def init_pipeline_refresh(self): """Initializes pipeline refresh state.""" self.clear_pipeline_validation_status() if cfg.CONF.refresh_pipeline_cfg: self.set_pipeline_mtime(pipeline.get_pipeline_mtime()) self.set_pipeline_hash(pipeline.get_pipeline_hash()) if cfg.CONF.refresh_event_pipeline_cfg: self.set_pipeline_mtime( pipeline.get_pipeline_mtime(pipeline.EVENT_TYPE), pipeline.EVENT_TYPE) self.set_pipeline_hash( pipeline.get_pipeline_hash(pipeline.EVENT_TYPE), pipeline.EVENT_TYPE) self.refresh_pipeline_periodic = None if (cfg.CONF.refresh_pipeline_cfg or cfg.CONF.refresh_event_pipeline_cfg): self.refresh_pipeline_periodic = utils.create_periodic( target=self.refresh_pipeline, spacing=cfg.CONF.pipeline_polling_interval) utils.spawn_thread(self.refresh_pipeline_periodic.start)
def run(self): """Bind the UDP socket and handle incoming data.""" super(CollectorService, self).run() # ensure dispatcher is configured before starting other services dispatcher_managers = dispatcher.load_dispatcher_manager() (self.meter_manager, self.event_manager) = dispatcher_managers self.sample_listener = None self.event_listener = None self.udp_thread = None if cfg.CONF.collector.udp_address: self.udp_thread = utils.spawn_thread(self.start_udp) transport = messaging.get_transport(optional=True) if transport: if list(self.meter_manager): sample_target = oslo_messaging.Target( topic=cfg.CONF.publisher_notifier.metering_topic) self.sample_listener = ( messaging.get_batch_notification_listener( transport, [sample_target], [ SampleEndpoint(cfg.CONF.publisher.telemetry_secret, self.meter_manager) ], allow_requeue=True, batch_size=cfg.CONF.collector.batch_size, batch_timeout=cfg.CONF.collector.batch_timeout)) self.sample_listener.start() if cfg.CONF.notification.store_events and list(self.event_manager): event_target = oslo_messaging.Target( topic=cfg.CONF.publisher_notifier.event_topic) self.event_listener = ( messaging.get_batch_notification_listener( transport, [event_target], [ EventEndpoint(cfg.CONF.publisher.telemetry_secret, self.event_manager) ], allow_requeue=True, batch_size=cfg.CONF.collector.batch_size, batch_timeout=cfg.CONF.collector.batch_timeout)) self.event_listener.start()
def start(self): """Bind the UDP socket and handle incoming data.""" # ensure dispatcher is configured before starting other services dispatcher_managers = dispatcher.load_dispatcher_manager() (self.meter_manager, self.event_manager) = dispatcher_managers self.sample_listener = None self.event_listener = None self.udp_thread = None super(CollectorService, self).start() if cfg.CONF.collector.udp_address: self.udp_thread = utils.spawn_thread(self.start_udp) transport = messaging.get_transport(optional=True) if transport: if list(self.meter_manager): sample_target = oslo_messaging.Target( topic=cfg.CONF.publisher_notifier.metering_topic) self.sample_listener = ( messaging.get_batch_notification_listener( transport, [sample_target], [SampleEndpoint(cfg.CONF.publisher.telemetry_secret, self.meter_manager)], allow_requeue=True, batch_size=cfg.CONF.collector.batch_size, batch_timeout=cfg.CONF.collector.batch_timeout)) self.sample_listener.start() if cfg.CONF.notification.store_events and list(self.event_manager): event_target = oslo_messaging.Target( topic=cfg.CONF.publisher_notifier.event_topic) self.event_listener = ( messaging.get_batch_notification_listener( transport, [event_target], [EventEndpoint(cfg.CONF.publisher.telemetry_secret, self.event_manager)], allow_requeue=True, batch_size=cfg.CONF.collector.batch_size, batch_timeout=cfg.CONF.collector.batch_timeout)) self.event_listener.start()
def start(self): super(NotificationService, self).start() self.periodic = None self.partition_coordinator = None self.coord_lock = threading.Lock() self.listeners = [] # NOTE(kbespalov): for the pipeline queues used a single amqp host # hence only one listener is required self.pipeline_listener = None self.pipeline_manager = pipeline.setup_pipeline() if cfg.CONF.notification.store_events: self.event_pipeline_manager = pipeline.setup_event_pipeline() self.transport = messaging.get_transport() if cfg.CONF.notification.workload_partitioning: self.group_id = self.NOTIFICATION_NAMESPACE self.partition_coordinator = coordination.PartitionCoordinator() self.partition_coordinator.start() else: # FIXME(sileht): endpoint uses the notification_topics option # and it should not because this is an oslo_messaging option # not a ceilometer. Until we have something to get the # notification_topics in another way, we must create a transport # to ensure the option has been registered by oslo_messaging. messaging.get_notifier(self.transport, '') self.group_id = None self.pipe_manager = self._get_pipe_manager(self.transport, self.pipeline_manager) self.event_pipe_manager = self._get_event_pipeline_manager( self.transport) self._configure_main_queue_listeners(self.pipe_manager, self.event_pipe_manager) if cfg.CONF.notification.workload_partitioning: # join group after all manager set up is configured self.partition_coordinator.join_group(self.group_id) self.partition_coordinator.watch_group(self.group_id, self._refresh_agent) @periodics.periodic(spacing=cfg.CONF.coordination.heartbeat, run_immediately=True) def heartbeat(): self.partition_coordinator.heartbeat() @periodics.periodic(spacing=cfg.CONF.coordination.check_watchers, run_immediately=True) def run_watchers(): self.partition_coordinator.run_watchers() self.periodic = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers=10)) self.periodic.add(heartbeat) self.periodic.add(run_watchers) utils.spawn_thread(self.periodic.start) # configure pipelines after all coordination is configured. self._configure_pipeline_listener() if not cfg.CONF.notification.disable_non_metric_meters: LOG.warning(_LW('Non-metric meters may be collected. It is highly ' 'advisable to disable these meters using ' 'ceilometer.conf or the pipeline.yaml')) self.init_pipeline_refresh()
def run(self): super(NotificationService, self).run() self.shutdown = False self.periodic = None self.partition_coordinator = None self.coord_lock = threading.Lock() self.listeners = [] # NOTE(kbespalov): for the pipeline queues used a single amqp host # hence only one listener is required self.pipeline_listener = None self.pipeline_manager = pipeline.setup_pipeline(self.conf) self.event_pipeline_manager = pipeline.setup_event_pipeline(self.conf) self.transport = messaging.get_transport(self.conf) if self.conf.notification.workload_partitioning: self.group_id = self.NOTIFICATION_NAMESPACE self.partition_coordinator = coordination.PartitionCoordinator( self.conf) self.partition_coordinator.start() else: # FIXME(sileht): endpoint uses the notification_topics option # and it should not because this is an oslo_messaging option # not a ceilometer. Until we have something to get the # notification_topics in another way, we must create a transport # to ensure the option has been registered by oslo_messaging. messaging.get_notifier(self.transport, '') self.group_id = None self.pipe_manager = self._get_pipe_manager(self.transport, self.pipeline_manager) self.event_pipe_manager = self._get_event_pipeline_manager( self.transport) self._configure_main_queue_listeners(self.pipe_manager, self.event_pipe_manager) if self.conf.notification.workload_partitioning: # join group after all manager set up is configured self.partition_coordinator.join_group(self.group_id) self.partition_coordinator.watch_group(self.group_id, self._refresh_agent) @periodics.periodic(spacing=self.conf.coordination.heartbeat, run_immediately=True) def heartbeat(): self.partition_coordinator.heartbeat() @periodics.periodic(spacing=self.conf.coordination.check_watchers, run_immediately=True) def run_watchers(): self.partition_coordinator.run_watchers() self.periodic = periodics.PeriodicWorker.create( [], executor_factory=lambda: futures.ThreadPoolExecutor(max_workers =10)) self.periodic.add(heartbeat) self.periodic.add(run_watchers) utils.spawn_thread(self.periodic.start) # configure pipelines after all coordination is configured. with self.coord_lock: self._configure_pipeline_listener() if not self.conf.notification.disable_non_metric_meters: LOG.warning( _LW('Non-metric meters may be collected. It is highly ' 'advisable to disable these meters using ' 'ceilometer.conf or the pipeline.yaml')) self.init_pipeline_refresh()