| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/python2.4 | |
| 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 """Package for parsing the log lines from a Chromium DNS trace capture.""" | |
| 7 | |
| 8 import re | |
| 9 | |
| 10 # The type of log line. | |
| 11 (LINE_TYPE_OUTSTANDING_JOB, | |
| 12 LINE_TYPE_CREATED_JOB, | |
| 13 LINE_TYPE_STARTING_JOB, | |
| 14 LINE_TYPE_RUNNING_JOB, | |
| 15 LINE_TYPE_COMPLETED_JOB, | |
| 16 LINE_TYPE_COMPLETING_JOB, | |
| 17 LINE_TYPE_RECEIVED_REQUEST, | |
| 18 LINE_TYPE_ATTACHED_REQUEST, | |
| 19 LINE_TYPE_FINISHED_REQUEST, | |
| 20 LINE_TYPE_CANCELLED_REQUEST) = range(10) | |
| 21 | |
| 22 class ParsedLine(object): | |
| 23 """Structure that represents a parsed line from the trace log. | |
| 24 | |
| 25 Attributes: | |
| 26 t: The time (in milliseconds) when the line was logged. | |
| 27 line_type: The type of event that this line was logging. One of LINE_TYPE_*. | |
| 28 raw_line: The full unparsed line. | |
| 29 details: Dictionary containing additional properties that were parsed from | |
| 30 this line. | |
| 31 """ | |
| 32 | |
| 33 def __init__(self): | |
| 34 self.t = None | |
| 35 self.line_type = None | |
| 36 self.raw_line = None | |
| 37 self.details = {} | |
| 38 | |
| 39 | |
| 40 def ParseLine(line): | |
| 41 """Parses |line| into a ParsedLine. Returns None on failure.""" | |
| 42 | |
| 43 m = re.search(r'^t=(\d+): "(.*)"\s*$', line) | |
| 44 if not m: | |
| 45 return None | |
| 46 | |
| 47 parsed = ParsedLine() | |
| 48 parsed.t = int(m.group(1)) | |
| 49 parsed.raw_line = line.strip() | |
| 50 | |
| 51 msg = m.group(2) | |
| 52 | |
| 53 m = re.search(r"^Received request (r\d+) for (.*)$", msg) | |
| 54 if m: | |
| 55 parsed.line_type = LINE_TYPE_RECEIVED_REQUEST | |
| 56 parsed.entity_id = m.group(1) | |
| 57 parsed.details['request_details'] = m.group(2) | |
| 58 return parsed | |
| 59 | |
| 60 m = re.search(r"^Created job (j\d+) for {hostname='([^']*)', " | |
| 61 "address_family=(\d+)}$", msg) | |
| 62 if m: | |
| 63 parsed.line_type = LINE_TYPE_CREATED_JOB | |
| 64 parsed.entity_id = m.group(1) | |
| 65 parsed.details['hostname'] = m.group(2) | |
| 66 parsed.details['address_family'] = m.group(3) | |
| 67 return parsed | |
| 68 | |
| 69 m = re.search(r"^Outstanding job (j\d+) for {hostname='([^']*)', address_" | |
| 70 "family=(\d+)}, which was started at t=(\d+)$", msg) | |
| 71 if m: | |
| 72 parsed.line_type = LINE_TYPE_OUTSTANDING_JOB | |
| 73 parsed.t = int(m.group(4)) | |
| 74 parsed.entity_id = m.group(1) | |
| 75 parsed.details['hostname'] = m.group(2) | |
| 76 parsed.details['address_family'] = m.group(3) | |
| 77 return parsed | |
| 78 | |
| 79 m = re.search(r"^Attached request (r\d+) to job (j\d+)$", msg) | |
| 80 if m: | |
| 81 parsed.line_type = LINE_TYPE_ATTACHED_REQUEST | |
| 82 parsed.entity_id = m.group(1) | |
| 83 parsed.details['job_id'] = m.group(2) | |
| 84 return parsed | |
| 85 | |
| 86 m = re.search(r'^Finished request (r\d+) (.*)$', msg) | |
| 87 if m: | |
| 88 parsed.line_type = LINE_TYPE_FINISHED_REQUEST | |
| 89 parsed.entity_id = m.group(1) | |
| 90 parsed.details['extra'] = m.group(2) | |
| 91 return parsed | |
| 92 | |
| 93 m = re.search(r'^Cancelled request (r\d+)$', msg) | |
| 94 if m: | |
| 95 parsed.line_type = LINE_TYPE_CANCELLED_REQUEST | |
| 96 parsed.entity_id = m.group(1) | |
| 97 return parsed | |
| 98 | |
| 99 m = re.search(r'^Starting job (j\d+)$', msg) | |
| 100 if m: | |
| 101 parsed.line_type = LINE_TYPE_STARTING_JOB | |
| 102 parsed.entity_id = m.group(1) | |
| 103 return parsed | |
| 104 | |
| 105 m = re.search(r'\[resolver thread\] Running job (j\d+)$', msg) | |
| 106 if m: | |
| 107 parsed.line_type = LINE_TYPE_RUNNING_JOB | |
| 108 parsed.entity_id = m.group(1) | |
| 109 return parsed | |
| 110 | |
| 111 m = re.search(r'\[resolver thread\] Completed job (j\d+)$', msg) | |
| 112 if m: | |
| 113 parsed.line_type = LINE_TYPE_COMPLETED_JOB | |
| 114 parsed.entity_id = m.group(1) | |
| 115 return parsed | |
| 116 | |
| 117 m = re.search(r'Completing job (j\d+).*$', msg) | |
| 118 if m: | |
| 119 parsed.line_type = LINE_TYPE_COMPLETING_JOB | |
| 120 parsed.entity_id = m.group(1) | |
| 121 return parsed | |
| 122 | |
| 123 return None | |
| 124 | |
| 125 | |
| 126 def ParseFile(path): | |
| 127 """Parses the file at |path| and returns a list of ParsedLines.""" | |
| 128 f = open(path, 'r') | |
| 129 | |
| 130 entries = [] | |
| 131 | |
| 132 for line in f: | |
| 133 parsed = ParseLine(line) | |
| 134 if parsed: | |
| 135 entries.append(parsed) | |
| 136 | |
| 137 f.close() | |
| 138 return entries | |
| 139 | |
| OLD | NEW |