import argparse from collections import OrderedDict import sys from time import sleep from fpsweeper.connector.mysql import ar_session, dd_session, fpc_session from fpsweeper.logic.util import get_timestamp_utc_iso8601 from fpsweeper.model.query.codegen_error import QUERY_CODEGEN_ERROR_RECENT_ROWS, QUERY_CODEGEN_ERROR_STATS from fpsweeper.model.query.track_fp import QUERY_TRACK_FP_STATS from fpsweeper.model.query.fp_sweeper_log import QUERY_FP_SWEEPER_LOG_RECENT_ROWS def print_dict(d): """Print a dictionary in "key: value\n" format Args: d (dict): dictionary to print """ for key, value in d.items(): print("{}: {}".format(key, value)) print("\n") sys.stdout.flush() def run_query_and_print_results(db_session_fp_capture, query, desc): res = db_session_fp_capture.execute(query) db_session_fp_capture.commit() print("{}: {}".format(get_timestamp_utc_iso8601(), desc)) for row in res: print_dict(OrderedDict(row)) def main(): """Main entry point into backfill monitor. """ args = parse_cl_args() try: db_session_fp_capture = fpc_session() for _ in range(0, args.iterations): run_query_and_print_results(db_session_fp_capture=db_session_fp_capture, query=QUERY_FP_SWEEPER_LOG_RECENT_ROWS, desc="fingerprint_capture.fp_sweeper_log recent rows") run_query_and_print_results(db_session_fp_capture=db_session_fp_capture, query=QUERY_CODEGEN_ERROR_RECENT_ROWS, desc="fingerprint_capture.codegen_error recent rows") run_query_and_print_results(db_session_fp_capture=db_session_fp_capture, query=QUERY_CODEGEN_ERROR_STATS, desc="fingerprint_capture.codegen_error stats") run_query_and_print_results(db_session_fp_capture=db_session_fp_capture, query=QUERY_TRACK_FP_STATS, desc="fingerprint_capture.track_fp stats") sleep(args.sleep_time_seconds) except: db_session_fp_capture.rollback() raise finally: db_session_fp_capture.close() def parse_cl_args(): """Parse the command-line arguments and return them Returns: args (argparse.Namespace): namespace containing command-line arguments """ desc = """Script to monitor fingerprint backfill progress""" parser = argparse.ArgumentParser(description=desc) parser.add_argument('--iterations', type=int, help='Number of iterations to print backfill progress info (default 10)', default=10) parser.add_argument('--sleep_time_seconds', type=int, help='Number of seconds to sleep between iterations (default 30)', default=30) return parser.parse_args() if __name__ == "__main__": main()