diff options
Diffstat (limited to 'net/tools/dns_trace_formatter/parser.py')
-rwxr-xr-x | net/tools/dns_trace_formatter/parser.py | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/net/tools/dns_trace_formatter/parser.py b/net/tools/dns_trace_formatter/parser.py new file mode 100755 index 0000000..a19b9d7 --- /dev/null +++ b/net/tools/dns_trace_formatter/parser.py @@ -0,0 +1,139 @@ +#!/usr/bin/python2.4 +# Copyright (c) 2010 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Package for parsing the log lines from a Chromium DNS trace capture.""" + +import re + +# The type of log line. +(LINE_TYPE_OUTSTANDING_JOB, + LINE_TYPE_CREATED_JOB, + LINE_TYPE_STARTING_JOB, + LINE_TYPE_RUNNING_JOB, + LINE_TYPE_COMPLETED_JOB, + LINE_TYPE_COMPLETING_JOB, + LINE_TYPE_RECEIVED_REQUEST, + LINE_TYPE_ATTACHED_REQUEST, + LINE_TYPE_FINISHED_REQUEST, + LINE_TYPE_CANCELLED_REQUEST) = range(10) + +class ParsedLine(object): + """Structure that represents a parsed line from the trace log. + + Attributes: + t: The time (in milliseconds) when the line was logged. + line_type: The type of event that this line was logging. One of LINE_TYPE_*. + raw_line: The full unparsed line. + details: Dictionary containing additional properties that were parsed from + this line. + """ + + def __init__(self): + self.t = None + self.line_type = None + self.raw_line = None + self.details = {} + + +def ParseLine(line): + """Parses |line| into a ParsedLine. Returns None on failure.""" + + m = re.search(r'^t=(\d+): "(.*)"\s*$', line) + if not m: + return None + + parsed = ParsedLine() + parsed.t = int(m.group(1)) + parsed.raw_line = line.strip() + + msg = m.group(2) + + m = re.search(r"^Received request (r\d+) for (.*)$", msg) + if m: + parsed.line_type = LINE_TYPE_RECEIVED_REQUEST + parsed.entity_id = m.group(1) + parsed.details['request_details'] = m.group(2) + return parsed + + m = re.search(r"^Created job (j\d+) for {hostname='([^']*)', " + "address_family=(\d+)}$", msg) + if m: + parsed.line_type = LINE_TYPE_CREATED_JOB + parsed.entity_id = m.group(1) + parsed.details['hostname'] = m.group(2) + parsed.details['address_family'] = m.group(3) + return parsed + + m = re.search(r"^Outstanding job (j\d+) for {hostname='([^']*)', address_" + "family=(\d+)}, which was started at t=(\d+)$", msg) + if m: + parsed.line_type = LINE_TYPE_OUTSTANDING_JOB + parsed.t = int(m.group(4)) + parsed.entity_id = m.group(1) + parsed.details['hostname'] = m.group(2) + parsed.details['address_family'] = m.group(3) + return parsed + + m = re.search(r"^Attached request (r\d+) to job (j\d+)$", msg) + if m: + parsed.line_type = LINE_TYPE_ATTACHED_REQUEST + parsed.entity_id = m.group(1) + parsed.details['job_id'] = m.group(2) + return parsed + + m = re.search(r'^Finished request (r\d+) (.*)$', msg) + if m: + parsed.line_type = LINE_TYPE_FINISHED_REQUEST + parsed.entity_id = m.group(1) + parsed.details['extra'] = m.group(2) + return parsed + + m = re.search(r'^Cancelled request (r\d+)$', msg) + if m: + parsed.line_type = LINE_TYPE_CANCELLED_REQUEST + parsed.entity_id = m.group(1) + return parsed + + m = re.search(r'^Starting job (j\d+)$', msg) + if m: + parsed.line_type = LINE_TYPE_STARTING_JOB + parsed.entity_id = m.group(1) + return parsed + + m = re.search(r'\[resolver thread\] Running job (j\d+)$', msg) + if m: + parsed.line_type = LINE_TYPE_RUNNING_JOB + parsed.entity_id = m.group(1) + return parsed + + m = re.search(r'\[resolver thread\] Completed job (j\d+)$', msg) + if m: + parsed.line_type = LINE_TYPE_COMPLETED_JOB + parsed.entity_id = m.group(1) + return parsed + + m = re.search(r'Completing job (j\d+).*$', msg) + if m: + parsed.line_type = LINE_TYPE_COMPLETING_JOB + parsed.entity_id = m.group(1) + return parsed + + return None + + +def ParseFile(path): + """Parses the file at |path| and returns a list of ParsedLines.""" + f = open(path, 'r') + + entries = [] + + for line in f: + parsed = ParseLine(line) + if parsed: + entries.append(parsed) + + f.close() + return entries + |