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 |