Beispiel #1
0
def _start(config_dir):
    from azure.cli.telemetry.components.telemetry_logging import get_logger

    logger = get_logger('process')

    args = [sys.executable, os.path.realpath(__file__), config_dir]
    logger.info('Creating upload process: "%s %s %s"', *args)

    kwargs = {'args': args}
    if os.name == 'nt':
        # Windows process creation flag to not reuse the parent console.
        # Without this, the background service is associated with the
        # starting process's console, and will block that console from
        # exiting until the background service self-terminates.
        # Elsewhere, fork just does the right thing.
        kwargs['creationflags'] = 0x00000010  # CREATE_NEW_CONSOLE

        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        startupinfo.wShowWindow = subprocess.SW_HIDE
        kwargs['startupinfo'] = startupinfo
    else:
        if sys.version_info >= (3, 3):
            kwargs['stdin'] = subprocess.DEVNULL
            kwargs['stdout'] = subprocess.DEVNULL
            kwargs['stderr'] = subprocess.STDOUT

    subprocess.Popen(**kwargs)
    logger.info('Return from creating porcess')
Beispiel #2
0
def _start(config_dir):
    from azure.cli.telemetry.components.telemetry_logging import get_logger

    logger = get_logger('process')

    args = [sys.executable, os.path.realpath(__file__), config_dir]
    logger.info('Creating upload process: "%s %s %s"', *args)

    kwargs = {'args': args}
    if os.name == 'nt':
        # Windows process creation flag to not reuse the parent console.
        # Without this, the background service is associated with the
        # starting process's console, and will block that console from
        # exiting until the background service self-terminates.
        # Elsewhere, fork just does the right thing.
        kwargs['creationflags'] = 0x00000010  # CREATE_NEW_CONSOLE

        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        startupinfo.wShowWindow = subprocess.SW_HIDE
        kwargs['startupinfo'] = startupinfo
    else:
        if sys.version_info >= (3, 3):
            kwargs['stdin'] = subprocess.DEVNULL
            kwargs['stdout'] = subprocess.DEVNULL
            kwargs['stderr'] = subprocess.STDOUT

    subprocess.Popen(**kwargs)
    logger.info('Return from creating process')
Beispiel #3
0
    def test_create_logger(self):
        random_name = base64.b64encode(os.urandom(8)).decode('utf-8')
        logger = get_logger(random_name)

        self.assertEqual('{}.{}'.format(LOGGER_NAME, random_name), logger.name)

        logger.debug('come from {}'.format(random_name))
    def test_create_logger(self):
        random_name = base64.b64encode(os.urandom(8)).decode('utf-8')
        logger = get_logger(random_name)

        self.assertEqual('{}.{}'.format(LOGGER_NAME, random_name), logger.name)

        logger.debug('come from {}'.format(random_name))
    def __init__(self, last_sent, config_dir):
        from azure.cli.telemetry.components.telemetry_logging import get_logger

        self._last_sent = last_sent
        self._next_send = last_sent
        self._records = []
        self._logger = get_logger('records')
        self._config_dir = config_dir
    def __init__(self, batch=100, sender=None):
        from azure.cli.telemetry.components.telemetry_logging import get_logger

        self._clients = dict()
        self._counter = 0
        self._batch = batch
        self._sender = sender or _NoRetrySender
        self._logger = get_logger('client')
Beispiel #7
0
    def __init__(self, last_sent, config_dir):
        from azure.cli.telemetry.components.telemetry_logging import get_logger

        self._last_sent = last_sent
        self._next_send = last_sent
        self._records = []
        self._logger = get_logger('records')
        self._config_dir = config_dir
Beispiel #8
0
    def __init__(self, batch=100, sender=None):
        from azure.cli.telemetry.components.telemetry_logging import get_logger

        self._clients = dict()
        self._counter = 0
        self._batch = batch
        self._sender = sender or _NoRetrySender
        self._logger = get_logger('client')
Beispiel #9
0
def save(config_dir, payload):
    from azure.cli.telemetry.util import should_upload
    from azure.cli.telemetry.components.telemetry_logging import get_logger

    if save_payload(config_dir, payload) and should_upload(config_dir):
        logger = get_logger('main')
        logger.info('Begin creating telemetry upload process.')
        _start(config_dir)
        logger.info('Finish creating telemetry upload process.')
Beispiel #10
0
def save(config_dir, payload):
    from azure.cli.telemetry.util import should_upload
    from azure.cli.telemetry.components.telemetry_logging import get_logger

    if save_payload(config_dir, payload) and should_upload(config_dir):
        logger = get_logger('main')
        logger.info('Begin creating telemetry upload process.')
        _start(config_dir)
        logger.info('Finish creating telemetry upload process.')
Beispiel #11
0
    def __init__(self, config_dir):
        from azure.cli.telemetry.components.telemetry_logging import get_logger

        self._path = self.get_file_path(config_dir)
        self._logger = get_logger('note')

        if not os.path.exists(self._path):
            super(TelemetryNote, self).__init__(self._path, mode='w', timeout=0.1, fail_when_locked=True)
        else:
            super(TelemetryNote, self).__init__(self._path, mode='r+', timeout=1, fail_when_locked=True)
Beispiel #12
0
def main():
    from azure.cli.telemetry.util import should_upload
    from azure.cli.telemetry.components.telemetry_note import TelemetryNote
    from azure.cli.telemetry.components.records_collection import RecordsCollection
    from azure.cli.telemetry.components.telemetry_client import CliTelemetryClient
    from azure.cli.telemetry.components.telemetry_logging import config_logging_for_upload, get_logger

    try:
        config_dir = sys.argv[1]
        config_logging_for_upload(config_dir)

        logger = get_logger('main')
        logger.info('Attempt start. Configuration directory [%s].',
                    sys.argv[1])

        if not should_upload(config_dir):
            logger.info(
                'Exit early. The note file indicates it is not a suitable time to upload telemetry.'
            )
            sys.exit(0)

        try:
            with TelemetryNote(config_dir) as telemetry_note:
                telemetry_note.touch()

                collection = RecordsCollection(telemetry_note.get_last_sent(),
                                               config_dir)
                collection.snapshot_and_read()

                client = CliTelemetryClient()
                for each in collection:
                    client.add(each, flush=True)
                client.flush(force=True)

                telemetry_note.update_telemetry_note(collection.next_send)
        except portalocker.AlreadyLocked:
            # another upload process is running.
            logger.info(
                'Lock out from note file under %s which means another process is running. Exit 0.',
                config_dir)
            sys.exit(0)
        except IOError as err:
            logger.warning('Unexpected IO Error %s. Exit 1.', err)
            sys.exit(1)
        except Exception as err:  # pylint: disable=broad-except
            logger.error('Unexpected Error %s. Exit 2.', err)
            logger.exception(err)
            sys.exit(2)
    except IndexError:
        sys.exit(1)
Beispiel #13
0
    def __init__(self, config_dir):
        from azure.cli.telemetry.components.telemetry_logging import get_logger

        self._path = self.get_file_path(config_dir)
        self._logger = get_logger('note')

        if not os.path.exists(self._path):
            super(TelemetryNote, self).__init__(self._path,
                                                mode='w',
                                                timeout=0.1,
                                                fail_when_locked=True)
        else:
            super(TelemetryNote, self).__init__(self._path,
                                                mode='r+',
                                                timeout=1,
                                                fail_when_locked=True)
    def test_config_logging_for_upload_process(self):
        temp_dir = tempfile.mkdtemp()
        random_name = base64.b64encode(os.urandom(8)).decode('utf-8')

        config_logging_for_upload(temp_dir)

        logger = get_logger(random_name)
        logger.info('come from {}'.format(random_name))

        log_file = os.path.join(temp_dir, TELEMETRY_LOG_DIR, TELEMETRY_LOG_NAME)
        self.assertTrue(os.path.exists(log_file))

        with open(log_file, mode='r') as fq:
            content = fq.read().strip('\n')
            self.assertTrue(content.endswith(random_name),
                            'Log content {} does not contain {}'.format(content, random_name))
Beispiel #15
0
def main():
    from azure.cli.telemetry.util import should_upload
    from azure.cli.telemetry.components.telemetry_note import TelemetryNote
    from azure.cli.telemetry.components.records_collection import RecordsCollection
    from azure.cli.telemetry.components.telemetry_client import CliTelemetryClient
    from azure.cli.telemetry.components.telemetry_logging import config_logging_for_upload, get_logger

    try:
        config_dir = sys.argv[1]
        config_logging_for_upload(config_dir)

        logger = get_logger('main')
        logger.info('Attempt start. Configuration directory [%s].', sys.argv[1])

        if not should_upload(config_dir):
            logger.info('Exit early. The note file indicates it is not a suitable time to upload telemetry.')
            sys.exit(0)

        try:
            with TelemetryNote(config_dir) as telemetry_note:
                telemetry_note.touch()

                collection = RecordsCollection(telemetry_note.get_last_sent(), config_dir)
                collection.snapshot_and_read()

                client = CliTelemetryClient()
                for each in collection:
                    client.add(each, flush=True)
                client.flush(force=True)

                telemetry_note.update_telemetry_note(collection.next_send)
        except portalocker.AlreadyLocked:
            # another upload process is running.
            logger.info('Lock out from note file under %s which means another process is running. Exit 0.', config_dir)
            sys.exit(0)
        except IOError as err:
            logger.warning('Unexpected IO Error %s. Exit 1.', err)
            sys.exit(1)
        except Exception as err:  # pylint: disable=broad-except
            logger.error('Unexpected Error %s. Exit 2.', err)
            logger.exception(err)
            sys.exit(2)
    except IndexError:
        sys.exit(1)
Beispiel #16
0
    def test_config_logging_for_upload_process(self):
        temp_dir = tempfile.mkdtemp()
        random_name = base64.b64encode(os.urandom(8)).decode('utf-8')

        config_logging_for_upload(temp_dir)

        logger = get_logger(random_name)
        logger.info('come from {}'.format(random_name))

        log_file = os.path.join(temp_dir, TELEMETRY_LOG_DIR,
                                TELEMETRY_LOG_NAME)
        self.assertTrue(os.path.exists(log_file))

        with open(log_file, mode='r') as fq:
            content = fq.read().strip('\n')
            self.assertTrue(
                content.endswith(random_name),
                'Log content {} does not contain {}'.format(
                    content, random_name))
    def __init__(self):
        from azure.cli.telemetry.components.telemetry_logging import get_logger

        super(_NoRetrySender, self).__init__()
        self._logger = get_logger('sender')
Beispiel #18
0
    def __init__(self):
        from azure.cli.telemetry.components.telemetry_logging import get_logger

        super(_NoRetrySender, self).__init__()
        self._logger = get_logger('sender')