def METHOD_NAME(
    self,
    connection_id: str = None,
    monitor_ids: List[str] = None,
    poll_interval: int = 60,
    raise_on_failure: bool = False,
) -> None:
    print('Metaplane process started.')
    if not monitor_ids and connection_id:
        print(f'Fetching monitors for connection ID {connection_id}.')
        monitors = self.monitors(connection_id)['data']
        monitor_ids = [m['id'] for m in monitors]
        time.sleep(10)
    monitors_started = {}
    print(f'Running {len(monitor_ids)} monitor(s).')
    for monitor_id in monitor_ids:
        print(f'Running monitor ID {monitor_id}.')
        now = datetime.utcnow()
        status = self.run_monitors([monitor_id])['status']
        print(f'Monitor ID {monitor_id} ran with status {status}.')
        if 200 == status:
            monitors_started[monitor_id] = now
    monitors_completed = {}
    while len(monitors_completed) < len(monitors_started):
        for monitor_id in monitor_ids:
            print(f'Checking status for monitor ID {monitor_id}.')
            monitor_status = self.monitor_status(monitor_id)
            start_date = monitors_started[monitor_id]
            status_date = dateutil.parser.parse(monitor_status['createdAt'])
            completed = status_date.timestamp() >= start_date.timestamp()
            print(f'Monitor ID {monitor_id} completed: {completed}; started {start_date}, '
                  f'last created {status_date}).')
            if completed:
                passed = monitor_status['passed']
                if raise_on_failure and not passed:
                    raise Exception(f'Monitor ID {monitor_id} didn’t pass.')
                monitors_completed[monitor_id] = passed
                print(f'Monitor ID {monitor_id} passed: {passed}.')
        if len(monitors_completed) < len(monitors_started):
            time.sleep(poll_interval)
    print('Metaplane process completed.')