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':
104 try_reformat_json(row.pop(
'body')),
108 elif entry_type ==
'response':
109 if 'body' not in row:
111 f
'Response log record without "body" tag. Looks like in the C++ code the tracing::Span of a'
112 f
'request was moved out or corrupted. Link: {link}. Text: {text}. Other: {row}'
114 if 'meta_code' in row:
115 status_code = row.pop(
'meta_code')
120 text =
'Response finished'
124 try_reformat_json(row.pop(
'body')),
128 elif entry_type ==
'mockserver_request':
129 text =
'Mockserver request finished'
130 if 'meta_code' in row:
131 status_code = str(row.pop(
'meta_code'))
135 for key
in (
'method',
'url',
'status',
'exc_info',
'delay'):
136 value = row.pop(key,
None)
138 extra_fields.append(f
'{key}={value}')
141 logid = f
'[{self._requests[link]}]'
142 elif link
is not None:
147 level_color = LEVEL_COLORS.get(level)
148 flow_color = Colors.colorize(flowid)
151 self.
textcolor(f
'{level:<8}', level_color),
155 http_url_info = row.pop(
'http_url',
None)
157 http_url_info = http_url_info.removeprefix(
158 HTTP_LOCALHOST_PREFIX,
160 http_url_info = http_url_info.removesuffix(
'?')
161 http_url_info = http_url_info[http_url_info.find(
'/') + 1 :]
163 meta_code = row.pop(
'meta_code',
None)
165 http_url_info += f
' meta_code={meta_code}'
167 text = f
'{self.textcolor(http_url_info, Colors.GREEN)} {text}'
171 fields.append(
'<NO TEXT>')
175 fields.extend(extra_fields)
177 fields.extend([f
'{k}={v}' for k, v
in row.items()])
178 return ' '.join(fields)
180 def textcolor(self, text, color):
183 return f
'{color}{text}{Colors.DEFAULT}'
185 def _http_status(self, key, status):
186 color = HTTP_STATUS_COLORS.get(status[:1], Colors.DEFAULT)
187 return self.
textcolor(f
'{key}={status}', color)
189 def _build_request_info(self, row):
193 method = row.get(
'method',
'UNKNOWN')
194 return f
'{method} {uri}'