You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					58 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					58 lines
				
				1.6 KiB
			| 
								 
											5 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								import argparse
							 | 
						||
| 
								 | 
							
								import bz2
							 | 
						||
| 
								 | 
							
								from collections import defaultdict
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import matplotlib.pyplot as plt
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from cereal.services import service_list
							 | 
						||
| 
								 | 
							
								from tools.lib.logreader import LogReader
							 | 
						||
| 
								 | 
							
								from tools.lib.route import Route
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MIN_SIZE = 0.5  # Percent size of total to show as separate entry
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def make_pie(msgs, typ):
							 | 
						||
| 
								 | 
							
								  compressed_length_by_type = {k: len(bz2.compress(b"".join(v))) for k, v in msgs.items()}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  total = sum(compressed_length_by_type.values())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  sizes = sorted(compressed_length_by_type.items(), key=lambda kv: kv[1])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  sizes_large = [(k, sz) for (k, sz) in sizes if sz >= total * MIN_SIZE / 100]
							 | 
						||
| 
								 | 
							
								  sizes_large += [('other', sum([sz for (_, sz) in sizes if sz < total * MIN_SIZE / 100]))]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  labels, sizes = zip(*sizes_large)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  plt.figure()
							 | 
						||
| 
								 | 
							
								  plt.title(f"{typ}")
							 | 
						||
| 
								 | 
							
								  plt.pie(sizes, labels=labels, autopct='%1.1f%%')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  parser = argparse.ArgumentParser(description='Check qlog size based on a rlog')
							 | 
						||
| 
								 | 
							
								  parser.add_argument('route', help='route to use')
							 | 
						||
| 
								 | 
							
								  parser.add_argument('segment', type=int, help='segment number to use')
							 | 
						||
| 
								 | 
							
								  args = parser.parse_args()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  r = Route(args.route)
							 | 
						||
| 
								 | 
							
								  rlog = r.log_paths()[args.segment]
							 | 
						||
| 
								 | 
							
								  msgs = list(LogReader(rlog))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  msgs_by_type = defaultdict(list)
							 | 
						||
| 
								 | 
							
								  for m in msgs:
							 | 
						||
| 
								 | 
							
								    msgs_by_type[m.which()].append(m.as_builder().to_bytes())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  qlog_by_type = defaultdict(list)
							 | 
						||
| 
								 | 
							
								  for name, service in service_list.items():
							 | 
						||
| 
								 | 
							
								    if service.decimation is None:
							 | 
						||
| 
								 | 
							
								      continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for i, msg in enumerate(msgs_by_type[name]):
							 | 
						||
| 
								 | 
							
								      if i % service.decimation == 0:
							 | 
						||
| 
								 | 
							
								        qlog_by_type[name].append(msg)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  make_pie(msgs_by_type, 'rlog')
							 | 
						||
| 
								 | 
							
								  make_pie(qlog_by_type, 'qlog')
							 | 
						||
| 
								 | 
							
								  plt.show()
							 |