74 def __init__(self, *, verbose=False, colors_enabled=True):
79 def colorize_line(self, line):
80 if not line.startswith(
'tskv\t'):
84 def colorize_tskv(self, line):
85 row = tskv.parse_line(line)
88 def colorize_row(self, row):
90 flowid =
'-'.join([row.get(key,
'')
for key
in (
'link',
'trace_id')])
92 entry_type = row.pop(
'_type',
None)
93 link = row.get(
'link',
None)
94 level = row.pop(
'level',
'none')
95 text = row.pop(
'text',
'')
98 if entry_type ==
'request':
102 uri_sep_pos = uri.find(
'?')
103 if uri_sep_pos != -1:
104 text += self.
textcolor(uri[uri_sep_pos:], Colors.GREEN)
110 try_reformat_json(row.pop(
'body')),
114 elif entry_type ==
'response':
115 if 'body' not in row:
117 f
'Response log record without "body" tag. Looks like in the C++ code the tracing::Span of a'
118 f
'request was moved out or corrupted. Link: {link}. Text: {text}. Other: {row}'
120 if 'meta_code' in row:
121 status_code = row.pop(
'meta_code')
126 text =
'Response finished'
131 try_reformat_json(row.pop(
'body')),
135 elif entry_type ==
'mockserver_request':
136 text =
'Mockserver request finished'
137 if 'meta_code' in row:
138 status_code = str(row.pop(
'meta_code'))
142 for key
in (
'method',
'url',
'status',
'exc_info',
'delay'):
143 value = row.pop(key,
None)
145 extra_fields.append(f
'{key}={value}')
148 logid = f
'[{self._requests[link]}]'
149 elif link
is not None:
154 level_color = LEVEL_COLORS.get(level)
155 flow_color = Colors.colorize(flowid)
158 self.
textcolor(f
'{level:<8}', level_color),
162 service = row.pop(
'service')
163 fields.append(self.
textcolor(f
'[{service}]', Colors.colorize(service)))
165 fields.append(self.
textcolor(logid, flow_color))
168 if 'http_url' in row:
169 localhost_pos = text.find(HTTP_LOCALHOST_PREFIX)
170 if localhost_pos != -1:
171 start_url_pos = text.find(
'/', localhost_pos + len(HTTP_LOCALHOST_PREFIX))
172 text = text[:localhost_pos] + self.
textcolor(text[start_url_pos:], Colors.GREEN)
174 start_url_pos = text.rfind(
' ')
175 text = text[:start_url_pos] + self.
textcolor(text[start_url_pos:], Colors.GREEN)
177 meta_code = row.pop(
'meta_code',
None)
187 try_reformat_json(row.pop(
'body')),
192 if 'db_statement_name' in row:
196 row[
'db_statement_name'],
203 fields.append(
'<NO TEXT>')
207 fields.extend(extra_fields)
208 result =
' '.join(fields)
211 result +=
'\n' + self.
textcolor(
' '.join([f
'{k}={v}' for k, v
in row.items()]), Colors.GRAY)
215 def textcolor(self, text, color):
218 return f
'{color}{text}{Colors.DEFAULT}'
220 def _http_status(self, key, status):
221 color = HTTP_STATUS_COLORS.get(status[:1], Colors.DEFAULT)
222 return self.
textcolor(f
'{key}={status}', color)
224 def _build_request_info(self, row):
225 if 'meta_type' not in row:
227 meta_type = row[
'meta_type']
228 method = row.get(
'method',
'UNKNOWN')
229 return f
'{method} {meta_type}'