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')
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')
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')
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.')
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 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)
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 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)
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')