forked from MirrorHub/synapse
Support multi client R30 for psql
This commit is contained in:
parent
792d340572
commit
86932be2cb
2 changed files with 30 additions and 8 deletions
|
@ -425,7 +425,9 @@ def run(hs):
|
|||
stats["daily_active_rooms"] = yield hs.get_datastore().count_daily_active_rooms()
|
||||
stats["daily_messages"] = yield hs.get_datastore().count_daily_messages()
|
||||
|
||||
stats["r30_users_all"] = yield hs.get_datastore().count_r30_users()
|
||||
r30_results = yield hs.get_datastore().count_r30_users()
|
||||
for name, count in r30_results.items():
|
||||
stats["r30_users_" + name] = count
|
||||
|
||||
daily_sent_messages = yield hs.get_datastore().count_daily_sent_messages()
|
||||
stats["daily_sent_messages"] = daily_sent_messages
|
||||
|
|
|
@ -280,6 +280,15 @@ class DataStore(RoomMemberStore, RoomStore,
|
|||
now = int(self._clock.time_msec())
|
||||
thirty_days_ago_in_secs = now - thirty_days_in_secs
|
||||
|
||||
# Are these filters sufficiently robust?
|
||||
filters = {
|
||||
"ALL": "",
|
||||
"IOS": "^(Vector|Riot|Riot\.im)\/.* iOS",
|
||||
"ANDROID": "^(Dalvik|Riot|Riot\.im)\/.* Android",
|
||||
"ELECTRON": "Electron",
|
||||
"WEB": "(Gecko|Mozilla)",
|
||||
}
|
||||
|
||||
sql = """
|
||||
SELECT COALESCE(count(*), 0) FROM (
|
||||
SELECT users.name, users.creation_ts * 1000, MAX(user_ips.last_seen)
|
||||
|
@ -289,16 +298,27 @@ class DataStore(RoomMemberStore, RoomStore,
|
|||
AND users.creation_ts < ?
|
||||
AND user_ips.last_seen/1000 > ?
|
||||
AND (user_ips.last_seen/1000) - users.creation_ts > ?
|
||||
GROUP BY users.name, users.creation_ts
|
||||
) u
|
||||
"""
|
||||
|
||||
txn.execute(sql, (thirty_days_ago_in_secs,
|
||||
thirty_days_ago_in_secs,
|
||||
thirty_days_in_secs))
|
||||
if isinstance(self.database_engine, PostgresEngine):
|
||||
sql = sql + "AND user_ips.user_agent ~ ? "
|
||||
sql = sql + "GROUP BY users.name, users.creation_ts ) u"
|
||||
|
||||
count, = txn.fetchone()
|
||||
return count
|
||||
results = {}
|
||||
if isinstance(self.database_engine, PostgresEngine):
|
||||
for filter_name, user_agent_filter in filters.items():
|
||||
txn.execute(sql, (thirty_days_ago_in_secs,
|
||||
thirty_days_ago_in_secs,
|
||||
thirty_days_in_secs,
|
||||
user_agent_filter))
|
||||
results[filter_name], = txn.fetchone()
|
||||
|
||||
else:
|
||||
txn.execute(sql, (thirty_days_ago_in_secs,
|
||||
thirty_days_ago_in_secs,
|
||||
thirty_days_in_secs))
|
||||
results["ALL"], = txn.fetchone()
|
||||
return results
|
||||
|
||||
ret = yield self.runInteraction("count_r30_users", _count_r30_users)
|
||||
defer.returnValue(ret)
|
||||
|
|
Loading…
Reference in a new issue