mirror of https://github.com/zulip/zulip.git
analytics: Add section for remote Zulip servers.
This commit is contained in:
parent
ebdd55814c
commit
96f096f38e
|
@ -764,7 +764,8 @@ def sent_messages_report(realm: str) -> str:
|
||||||
return make_table(title, cols, rows)
|
return make_table(title, cols, rows)
|
||||||
|
|
||||||
def ad_hoc_queries() -> List[Dict[str, str]]:
|
def ad_hoc_queries() -> List[Dict[str, str]]:
|
||||||
def get_page(query: str, cols: List[str], title: str) -> Dict[str, str]:
|
def get_page(query: str, cols: List[str], title: str,
|
||||||
|
totals_columns: List[int]=[]) -> Dict[str, str]:
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
cursor.execute(query)
|
cursor.execute(query)
|
||||||
rows = cursor.fetchall()
|
rows = cursor.fetchall()
|
||||||
|
@ -776,11 +777,24 @@ def ad_hoc_queries() -> List[Dict[str, str]]:
|
||||||
for row in rows:
|
for row in rows:
|
||||||
row[i] = fixup_func(row[i])
|
row[i] = fixup_func(row[i])
|
||||||
|
|
||||||
|
total_row = []
|
||||||
for i, col in enumerate(cols):
|
for i, col in enumerate(cols):
|
||||||
if col == 'Realm':
|
if col == 'Realm':
|
||||||
fix_rows(i, realm_activity_link)
|
fix_rows(i, realm_activity_link)
|
||||||
elif col in ['Last time', 'Last visit']:
|
elif col in ['Last time', 'Last visit']:
|
||||||
fix_rows(i, format_date_for_activity_reports)
|
fix_rows(i, format_date_for_activity_reports)
|
||||||
|
elif col == 'Hostname':
|
||||||
|
for row in rows:
|
||||||
|
row[i] = remote_installation_stats_link(row[0], row[i])
|
||||||
|
if len(totals_columns) > 0:
|
||||||
|
if i == 0:
|
||||||
|
total_row.append("Total")
|
||||||
|
elif i in totals_columns:
|
||||||
|
total_row.append(str(sum(row[i] for row in rows if row[i] is not None)))
|
||||||
|
else:
|
||||||
|
total_row.append('')
|
||||||
|
if len(totals_columns) > 0:
|
||||||
|
rows.insert(0, total_row)
|
||||||
|
|
||||||
content = make_table(title, cols, rows)
|
content = make_table(title, cols, rows)
|
||||||
|
|
||||||
|
@ -930,6 +944,49 @@ def ad_hoc_queries() -> List[Dict[str, str]]:
|
||||||
|
|
||||||
pages.append(get_page(query, cols, title))
|
pages.append(get_page(query, cols, title))
|
||||||
|
|
||||||
|
title = 'Remote Zulip servers'
|
||||||
|
|
||||||
|
query = '''
|
||||||
|
with icount as (
|
||||||
|
select
|
||||||
|
server_id,
|
||||||
|
max(value) as max_value,
|
||||||
|
max(end_time) as max_end_time
|
||||||
|
from zilencer_remoteinstallationcount
|
||||||
|
where
|
||||||
|
property='active_users:is_bot:day'
|
||||||
|
and subgroup='false'
|
||||||
|
group by server_id
|
||||||
|
),
|
||||||
|
remote_push_devices as (
|
||||||
|
select server_id, count(distinct(user_id)) as push_user_count from zilencer_remotepushdevicetoken
|
||||||
|
group by server_id
|
||||||
|
)
|
||||||
|
select
|
||||||
|
rserver.id,
|
||||||
|
rserver.hostname,
|
||||||
|
rserver.contact_email,
|
||||||
|
max_value,
|
||||||
|
push_user_count,
|
||||||
|
max_end_time
|
||||||
|
from zilencer_remotezulipserver rserver
|
||||||
|
left join icount on icount.server_id = rserver.id
|
||||||
|
left join remote_push_devices on remote_push_devices.server_id = rserver.id
|
||||||
|
order by max_value DESC NULLS LAST, push_user_count DESC NULLS LAST
|
||||||
|
'''
|
||||||
|
|
||||||
|
cols = [
|
||||||
|
'ID',
|
||||||
|
'Hostname',
|
||||||
|
'Contact email',
|
||||||
|
'Analytics users',
|
||||||
|
'Mobile users',
|
||||||
|
'Last update time',
|
||||||
|
]
|
||||||
|
|
||||||
|
pages.append(get_page(query, cols, title,
|
||||||
|
totals_columns=[3, 4]))
|
||||||
|
|
||||||
return pages
|
return pages
|
||||||
|
|
||||||
@require_server_admin
|
@require_server_admin
|
||||||
|
@ -1080,6 +1137,12 @@ def realm_stats_link(realm_str: str) -> mark_safe:
|
||||||
stats_link = '<a href="{}"><i class="fa fa-pie-chart"></i></a>'.format(url, realm_str)
|
stats_link = '<a href="{}"><i class="fa fa-pie-chart"></i></a>'.format(url, realm_str)
|
||||||
return mark_safe(stats_link)
|
return mark_safe(stats_link)
|
||||||
|
|
||||||
|
def remote_installation_stats_link(server_id: int, hostname: str) -> mark_safe:
|
||||||
|
url_name = 'analytics.views.stats_for_remote_installation'
|
||||||
|
url = reverse(url_name, kwargs=dict(remote_server_id=server_id))
|
||||||
|
stats_link = '<a href="{}"><i class="fa fa-pie-chart"></i>{}</a>'.format(url, hostname)
|
||||||
|
return mark_safe(stats_link)
|
||||||
|
|
||||||
def realm_client_table(user_summaries: Dict[str, Dict[str, Dict[str, Any]]]) -> str:
|
def realm_client_table(user_summaries: Dict[str, Dict[str, Dict[str, Any]]]) -> str:
|
||||||
exclude_keys = [
|
exclude_keys = [
|
||||||
'internal',
|
'internal',
|
||||||
|
|
|
@ -61,7 +61,7 @@ class ActivityTest(ZulipTestCase):
|
||||||
result = self.client_get('/activity')
|
result = self.client_get('/activity')
|
||||||
self.assertEqual(result.status_code, 200)
|
self.assertEqual(result.status_code, 200)
|
||||||
|
|
||||||
self.assert_length(queries, 14)
|
self.assert_length(queries, 15)
|
||||||
|
|
||||||
flush_per_request_caches()
|
flush_per_request_caches()
|
||||||
with queries_captured() as queries:
|
with queries_captured() as queries:
|
||||||
|
|
Loading…
Reference in New Issue