@@ -16,6 +16,19 @@ def _increment(d, k):
1616 d [k ] = 1
1717
1818
19+ class EventTypeStats :
20+ """Tracks count for an event type and formats it for the status line."""
21+
22+ def __init__ (self ):
23+ self .count = 0
24+
25+ def increment (self , event ):
26+ self .count += 1
27+
28+ def format (self , event_type ):
29+ return f"{ event_type } : { self .count } "
30+
31+
1932class SpeedCounter :
2033 """
2134 A simple class for keeping a rolling tally of the number of events inside a specific time window
@@ -45,8 +58,23 @@ def __init__(self, scan):
4558 self .scan = scan
4659 self .module_stats = {}
4760 self .events_emitted_by_type = {}
61+ self ._type_stats = {}
4862 self .speedometer = SpeedCounter (scan .status_frequency )
4963
64+ def _get_type_stats (self , event ):
65+ event_type = event .type
66+ try :
67+ return self ._type_stats [event_type ]
68+ except KeyError :
69+ stats_class = getattr (event , "_stats_class" , None ) or EventTypeStats
70+ self ._type_stats [event_type ] = stats_class ()
71+ return self ._type_stats [event_type ]
72+
73+ def event_type_summary (self ):
74+ """Return a formatted list of event type counts, sorted by count descending."""
75+ entries = sorted (self ._type_stats .items (), key = lambda x : x [1 ].count , reverse = True )
76+ return [stats .format (event_type ) for event_type , stats in entries if stats .count > 0 ]
77+
5078 def _get_attribution_module (self , event ):
5179 """Return the module that should get credit for producing this event.
5280
@@ -65,6 +93,7 @@ def _get_attribution_module(self, event):
6593
6694 def event_produced (self , event ):
6795 _increment (self .events_emitted_by_type , event .type )
96+ self ._get_type_stats (event ).increment (event )
6897 module = self ._get_attribution_module (event )
6998 module_stat = self .get (module )
7099 if module_stat is not None :
0 commit comments