def gc_event_queues(port: int) -> None: start = time.time() to_remove: Set[str] = set() affected_users: Set[int] = set() affected_realms: Set[int] = set() for (id, client) in clients.items(): if client.expired(start): to_remove.add(id) affected_users.add(client.user_profile_id) affected_realms.add(client.realm_id) # We don't need to call e.g. finish_current_handler on the clients # being removed because they are guaranteed to be idle (because # they are expired) and thus not have a current handler. do_gc_event_queues(to_remove, affected_users, affected_realms) if settings.PRODUCTION: logging.info( "Tornado %d removed %d expired event queues owned by %d users in %.3fs." " Now %d active queues, %s", port, len(to_remove), len(affected_users), time.time() - start, len(clients), handler_stats_string(), ) statsd.gauge("tornado.active_queues", len(clients)) statsd.gauge("tornado.active_users", len(user_clients))
def gc_event_queues(): # type: () -> None start = time.time() to_remove = set() # type: Set[str] affected_users = set() # type: Set[int] affected_realms = set() # type: Set[int] for (id, client) in clients.items(): if client.idle(start): to_remove.add(id) affected_users.add(client.user_profile_id) affected_realms.add(client.realm_id) # We don't need to call e.g. finish_current_handler on the clients # being removed because they are guaranteed to be idle and thus # not have a current handler. do_gc_event_queues(to_remove, affected_users, affected_realms) if settings.PRODUCTION: logging.info( ('Tornado removed %d idle event queues owned by %d users in %.3fs.' + ' Now %d active queues, %s') % (len(to_remove), len(affected_users), time.time() - start, len(clients), handler_stats_string())) statsd.gauge('tornado.active_queues', len(clients)) statsd.gauge('tornado.active_users', len(user_clients))
def gc_event_queues(): start = time.time() to_remove = set() affected_users = set() affected_realms = set() for (id, client) in clients.iteritems(): if client.idle(start): to_remove.add(id) affected_users.add(client.user_profile_id) affected_realms.add(client.realm_id) do_gc_event_queues(to_remove, affected_users, affected_realms) logging.info(('Tornado removed %d idle event queues owned by %d users in %.3fs.' + ' Now %d active queues') % (len(to_remove), len(affected_users), time.time() - start, len(clients))) statsd.gauge('tornado.active_queues', len(clients)) statsd.gauge('tornado.active_users', len(user_clients))
def handle(self, *args, **options): # type: (*Any, **Any) -> None # Get list of all active users in the last 1 week cutoff = timezone_now() - timedelta(minutes=30, hours=168) users = UserPresence.objects.select_related().filter(timestamp__gt=cutoff) # Calculate 10min, 2hrs, 12hrs, 1day, 2 business days (TODO business days), 1 week bucket of stats hour_buckets = [0.16, 2, 12, 24, 48, 168] user_info = defaultdict(dict) # type: Dict[str, Dict[float, List[str]]] for last_presence in users: if last_presence.status == UserPresence.IDLE: known_active = last_presence.timestamp - timedelta(minutes=30) else: known_active = last_presence.timestamp for bucket in hour_buckets: if bucket not in user_info[last_presence.user_profile.realm.string_id]: user_info[last_presence.user_profile.realm.string_id][bucket] = [] if timezone_now() - known_active < timedelta(hours=bucket): user_info[last_presence.user_profile.realm.string_id][bucket].append(last_presence.user_profile.email) for realm, buckets in user_info.items(): print("Realm %s" % (realm,)) for hr, users in sorted(buckets.items()): print("\tUsers for %s: %s" % (hr, len(users))) statsd.gauge("users.active.%s.%shr" % (statsd_key(realm, True), statsd_key(hr, True)), len(users)) # Also do stats for how many users have been reading the app. users_reading = UserActivity.objects.select_related().filter(query="/json/messages/flags") user_info = defaultdict(dict) for activity in users_reading: for bucket in hour_buckets: if bucket not in user_info[activity.user_profile.realm.string_id]: user_info[activity.user_profile.realm.string_id][bucket] = [] if timezone_now() - activity.last_visit < timedelta(hours=bucket): user_info[activity.user_profile.realm.string_id][bucket].append(activity.user_profile.email) for realm, buckets in user_info.items(): print("Realm %s" % (realm,)) for hr, users in sorted(buckets.items()): print("\tUsers reading for %s: %s" % (hr, len(users))) statsd.gauge("users.reading.%s.%shr" % (statsd_key(realm, True), statsd_key(hr, True)), len(users))
def handle(self, *args, **options): # type: (*Any, **Any) -> None # Get list of all active users in the last 1 week cutoff = timezone.now() - timedelta(minutes=30, hours=168) users = UserPresence.objects.select_related().filter(timestamp__gt=cutoff) # Calculate 10min, 2hrs, 12hrs, 1day, 2 business days (TODO business days), 1 week bucket of stats hour_buckets = [0.16, 2, 12, 24, 48, 168] user_info = defaultdict(dict) # type: Dict[str, Dict[float, List[str]]] for last_presence in users: if last_presence.status == UserPresence.IDLE: known_active = last_presence.timestamp - timedelta(minutes=30) else: known_active = last_presence.timestamp for bucket in hour_buckets: if bucket not in user_info[last_presence.user_profile.realm.string_id]: user_info[last_presence.user_profile.realm.string_id][bucket] = [] if timezone.now() - known_active < timedelta(hours=bucket): user_info[last_presence.user_profile.realm.string_id][bucket].append(last_presence.user_profile.email) for realm, buckets in user_info.items(): print("Realm %s" % (realm,)) for hr, users in sorted(buckets.items()): print("\tUsers for %s: %s" % (hr, len(users))) statsd.gauge("users.active.%s.%shr" % (statsd_key(realm, True), statsd_key(hr, True)), len(users)) # Also do stats for how many users have been reading the app. users_reading = UserActivity.objects.select_related().filter(query="/json/messages/flags") user_info = defaultdict(dict) for activity in users_reading: for bucket in hour_buckets: if bucket not in user_info[activity.user_profile.realm.string_id]: user_info[activity.user_profile.realm.string_id][bucket] = [] if timezone.now() - activity.last_visit < timedelta(hours=bucket): user_info[activity.user_profile.realm.string_id][bucket].append(activity.user_profile.email) for realm, buckets in user_info.items(): print("Realm %s" % (realm,)) for hr, users in sorted(buckets.items()): print("\tUsers reading for %s: %s" % (hr, len(users))) statsd.gauge("users.reading.%s.%shr" % (statsd_key(realm, True), statsd_key(hr, True)), len(users))
def gc_event_queues(): start = time.time() to_remove = set() affected_users = set() affected_realms = set() for (id, client) in six.iteritems(clients): if client.idle(start): to_remove.add(id) affected_users.add(client.user_profile_id) affected_realms.add(client.realm_id) # We don't need to call e.g. finish_current_handler on the clients # being removed because they are guaranteed to be idle and thus # not have a current handler. do_gc_event_queues(to_remove, affected_users, affected_realms) logging.info(('Tornado removed %d idle event queues owned by %d users in %.3fs.' + ' Now %d active queues, %s') % (len(to_remove), len(affected_users), time.time() - start, len(clients), handler_stats_string())) statsd.gauge('tornado.active_queues', len(clients)) statsd.gauge('tornado.active_users', len(user_clients))
def gc_event_queues(port: int) -> None: start = time.time() to_remove = set() # type: Set[str] affected_users = set() # type: Set[int] affected_realms = set() # type: Set[int] for (id, client) in clients.items(): if client.expired(start): to_remove.add(id) affected_users.add(client.user_profile_id) affected_realms.add(client.realm_id) # We don't need to call e.g. finish_current_handler on the clients # being removed because they are guaranteed to be idle (because # they are expired) and thus not have a current handler. do_gc_event_queues(to_remove, affected_users, affected_realms) if settings.PRODUCTION: logging.info(('Tornado %d removed %d expired event queues owned by %d users in %.3fs.' + ' Now %d active queues, %s') % (port, len(to_remove), len(affected_users), time.time() - start, len(clients), handler_stats_string())) statsd.gauge('tornado.active_queues', len(clients)) statsd.gauge('tornado.active_users', len(user_clients))