diff --git a/src/tools/analyzer/sss_analyze.py b/src/tools/analyzer/sss_analyze.py index 18b998f3803..dafc84fc030 100644 --- a/src/tools/analyzer/sss_analyze.py +++ b/src/tools/analyzer/sss_analyze.py @@ -1,6 +1,7 @@ import argparse from sssd.modules import request +from sssd.modules import error from sssd.parser import SubparsersAction @@ -55,9 +56,11 @@ def load_modules(self, parser, parser_grp): """ # Currently only the 'request' module exists req = request.RequestAnalyzer() + err = error.ErrorAnalyzer() cli = Analyzer() req.setup_args(parser_grp, cli) + err.setup_args(parser_grp, cli) def setup_args(self): """ diff --git a/src/tools/analyzer/util.py b/src/tools/analyzer/util.py new file mode 100644 index 00000000000..98c2b6c41de --- /dev/null +++ b/src/tools/analyzer/util.py @@ -0,0 +1,88 @@ +import re +import logging + +from sssd.source_files import Files +from sssd.source_journald import Journald +from sssd.parser import SubparsersAction +from sssd.parser import Option + +logger = logging.getLogger() + + +class Utils: + """ + A request analyzer module, handles request tracking logic + and analysis. Parses input generated from a source Reader. + """ + + def print_module_help(self, args): + """ + Print the module parser help output + + Args: + args (Namespace): argparse parsed arguments + """ + self.module_parser.print_help() + + def setup_args(self, parser_grp, cli): + """ + Setup module parser, subcommands, and options + + Args: + parser_grp (argparse.Action): Parser group to nest + module and subcommands under + """ + desc = "Analyze request tracking module" + self.module_parser = parser_grp.add_parser('request', + description=desc, + help='Request tracking') + + subparser = self.module_parser.add_subparsers(title=None, + dest='subparser', + action=SubparsersAction, + metavar='COMMANDS') + + subcmd_grp = subparser.add_parser_group('Operation Modes') + cli.add_subcommand(subcmd_grp, 'list', 'List recent requests', + self.list_requests, self.list_opts) + cli.add_subcommand(subcmd_grp, 'show', 'Track individual request ID', + self.track_request, self.show_opts) + + self.module_parser.set_defaults(func=self.print_module_help) + + return self.module_parser + + def load(self, args): + """ + Load the appropriate source reader. + + Args: + args (Namespace): argparse parsed arguments + + Returns: + Instantiated source object + """ + if args.source == "journald": + source = Journald() + else: + source = Files(args.logdir) + return source + + def matched_line(self, source, patterns): + """ + Yield lines which match any number of patterns (OR) in + provided patterns list. + + Args: + source (Reader): source Reader object + Yields: + lines matching the provided pattern(s) + """ + for line in source: + for pattern in patterns: + re_obj = re.compile(pattern) + if re_obj.search(line): + if line.startswith(' * '): + continue + yield line +