From 53d7491c1b516d4ca872752c2e538e29856b64a2 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Tue, 5 Oct 2021 23:49:00 +0300 Subject: [PATCH] debug: re-enable Automod with extra profiling --- backend/src/plugins/Automod/AutomodPlugin.ts | 12 ++++++------ .../Automod/functions/clearOldRecentActions.ts | 3 +++ .../plugins/Automod/functions/clearOldRecentSpam.ts | 3 +++ .../functions/clearRecentActionsForMessage.ts | 6 ++++++ .../src/plugins/Automod/functions/findRecentSpam.ts | 6 +++++- .../functions/getMatchingMessageRecentActions.ts | 6 ++++++ .../Automod/functions/getMatchingRecentActions.ts | 6 +++++- backend/src/utils/easyProfiler.ts | 9 +++++++++ 8 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 backend/src/utils/easyProfiler.ts diff --git a/backend/src/plugins/Automod/AutomodPlugin.ts b/backend/src/plugins/Automod/AutomodPlugin.ts index 4eef9c84..9a9cbc76 100644 --- a/backend/src/plugins/Automod/AutomodPlugin.ts +++ b/backend/src/plugins/Automod/AutomodPlugin.ts @@ -193,15 +193,15 @@ export const AutomodPlugin = zeppelinGuildPlugin()({ // prettier-ignore events: [ - // RunAutomodOnJoinEvt, - // RunAutomodOnMemberUpdate, - // RunAutomodOnLeaveEvt, + RunAutomodOnJoinEvt, + RunAutomodOnMemberUpdate, + RunAutomodOnLeaveEvt, // Messages use message events from SavedMessages, see onLoad below ], commands: [AntiraidClearCmd, SetAntiraidCmd, ViewAntiraidCmd], - async __beforeLoad(pluginData) { + async beforeLoad(pluginData) { pluginData.state.queue = new Queue(); pluginData.state.regexRunner = getRegExpRunner(`guild-${pluginData.guild.id}`); @@ -224,7 +224,7 @@ export const AutomodPlugin = zeppelinGuildPlugin()({ pluginData.state.cachedAntiraidLevel = await pluginData.state.antiraidLevels.get(); }, - async __afterLoad(pluginData) { + async afterLoad(pluginData) { pluginData.state.clearRecentActionsInterval = setInterval(() => clearOldRecentActions(pluginData), 1 * MINUTES); pluginData.state.clearRecentSpamInterval = setInterval(() => clearOldRecentSpam(pluginData), 1 * SECONDS); pluginData.state.clearRecentNicknameChangesInterval = setInterval( @@ -289,7 +289,7 @@ export const AutomodPlugin = zeppelinGuildPlugin()({ registerEventListenersFromMap(mutesEvents, pluginData.state.mutesListeners); }, - async __beforeUnload(pluginData) { + async beforeUnload(pluginData) { const countersPlugin = pluginData.getPlugin(CountersPlugin); countersPlugin.offCounterEvent("trigger", pluginData.state.onCounterTrigger); countersPlugin.offCounterEvent("reverseTrigger", pluginData.state.onCounterReverseTrigger); diff --git a/backend/src/plugins/Automod/functions/clearOldRecentActions.ts b/backend/src/plugins/Automod/functions/clearOldRecentActions.ts index 9293e9c3..5d75e68d 100644 --- a/backend/src/plugins/Automod/functions/clearOldRecentActions.ts +++ b/backend/src/plugins/Automod/functions/clearOldRecentActions.ts @@ -1,10 +1,13 @@ import { GuildPluginData } from "knub"; import { RECENT_ACTION_EXPIRY_TIME } from "../constants"; import { AutomodPluginType } from "../types"; +import { startProfiling } from "../../../utils/easyProfiler"; export function clearOldRecentActions(pluginData: GuildPluginData) { + const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:clearOldRecentActions"); const now = Date.now(); pluginData.state.recentActions = pluginData.state.recentActions.filter((info) => { return info.context.timestamp + RECENT_ACTION_EXPIRY_TIME > now; }); + stopProfiling(); } diff --git a/backend/src/plugins/Automod/functions/clearOldRecentSpam.ts b/backend/src/plugins/Automod/functions/clearOldRecentSpam.ts index 7cda8329..a4b9ad1b 100644 --- a/backend/src/plugins/Automod/functions/clearOldRecentSpam.ts +++ b/backend/src/plugins/Automod/functions/clearOldRecentSpam.ts @@ -1,10 +1,13 @@ import { GuildPluginData } from "knub"; import { RECENT_SPAM_EXPIRY_TIME } from "../constants"; import { AutomodPluginType } from "../types"; +import { startProfiling } from "../../../utils/easyProfiler"; export function clearOldRecentSpam(pluginData: GuildPluginData) { + const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:clearOldRecentSpam"); const now = Date.now(); pluginData.state.recentSpam = pluginData.state.recentSpam.filter((spam) => { return spam.timestamp + RECENT_SPAM_EXPIRY_TIME > now; }); + stopProfiling(); } diff --git a/backend/src/plugins/Automod/functions/clearRecentActionsForMessage.ts b/backend/src/plugins/Automod/functions/clearRecentActionsForMessage.ts index e1cadc58..8a21f8ad 100644 --- a/backend/src/plugins/Automod/functions/clearRecentActionsForMessage.ts +++ b/backend/src/plugins/Automod/functions/clearRecentActionsForMessage.ts @@ -1,7 +1,12 @@ import { GuildPluginData } from "knub"; import { AutomodContext, AutomodPluginType } from "../types"; +import { startProfiling } from "../../../utils/easyProfiler"; export function clearRecentActionsForMessage(pluginData: GuildPluginData, context: AutomodContext) { + const stopProfiling = startProfiling( + pluginData.getKnubInstance().profiler, + "automod:fns:clearRecentActionsForMessage", + ); const message = context.message!; const globalIdentifier = message.user_id; const perChannelIdentifier = `${message.channel_id}-${message.user_id}`; @@ -9,4 +14,5 @@ export function clearRecentActionsForMessage(pluginData: GuildPluginData { return act.identifier !== globalIdentifier && act.identifier !== perChannelIdentifier; }); + stopProfiling(); } diff --git a/backend/src/plugins/Automod/functions/findRecentSpam.ts b/backend/src/plugins/Automod/functions/findRecentSpam.ts index 07e68d77..809fbefd 100644 --- a/backend/src/plugins/Automod/functions/findRecentSpam.ts +++ b/backend/src/plugins/Automod/functions/findRecentSpam.ts @@ -1,13 +1,17 @@ import { GuildPluginData } from "knub"; import { RecentActionType } from "../constants"; import { AutomodPluginType } from "../types"; +import { startProfiling } from "../../../utils/easyProfiler"; export function findRecentSpam( pluginData: GuildPluginData, type: RecentActionType, identifier?: string, ) { - return pluginData.state.recentSpam.find((spam) => { + const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:findRecentSpam"); + const result = pluginData.state.recentSpam.find((spam) => { return spam.type === type && (!identifier || spam.identifiers.includes(identifier)); }); + stopProfiling(); + return result; } diff --git a/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts b/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts index 8318ea1e..48ad51d7 100644 --- a/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts +++ b/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts @@ -4,6 +4,7 @@ import { SavedMessage } from "../../../data/entities/SavedMessage"; import { RecentActionType } from "../constants"; import { AutomodPluginType } from "../types"; import { getMatchingRecentActions } from "./getMatchingRecentActions"; +import { startProfiling } from "../../../utils/easyProfiler"; export function getMatchingMessageRecentActions( pluginData: GuildPluginData, @@ -13,11 +14,16 @@ export function getMatchingMessageRecentActions( count: number, within: number, ) { + const stopProfiling = startProfiling( + pluginData.getKnubInstance().profiler, + "automod:fns:getMatchingMessageRecentActions", + ); const since = moment.utc(message.posted_at).valueOf() - within; const to = moment.utc(message.posted_at).valueOf(); const recentActions = getMatchingRecentActions(pluginData, type, identifier, since, to); const totalCount = recentActions.reduce((total, action) => total + action.count, 0); + stopProfiling(); if (totalCount >= count) { return { recentActions, diff --git a/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts b/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts index 75107e45..e8ecb6c2 100644 --- a/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts +++ b/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts @@ -1,6 +1,7 @@ import { GuildPluginData } from "knub"; import { RecentActionType } from "../constants"; import { AutomodPluginType } from "../types"; +import { startProfiling } from "../../../utils/easyProfiler"; export function getMatchingRecentActions( pluginData: GuildPluginData, @@ -9,9 +10,10 @@ export function getMatchingRecentActions( since: number, to?: number, ) { + const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:getMatchingRecentActions"); to = to || Date.now(); - return pluginData.state.recentActions.filter((action) => { + const result = pluginData.state.recentActions.filter((action) => { return ( action.type === type && (!identifier || action.identifier === identifier) && @@ -20,4 +22,6 @@ export function getMatchingRecentActions( !action.context.actioned ); }); + stopProfiling(); + return result; } diff --git a/backend/src/utils/easyProfiler.ts b/backend/src/utils/easyProfiler.ts new file mode 100644 index 00000000..8392aceb --- /dev/null +++ b/backend/src/utils/easyProfiler.ts @@ -0,0 +1,9 @@ +import { Profiler } from "knub/dist/Profiler"; +import { performance } from "perf_hooks"; + +export const startProfiling = (profiler: Profiler, key: string) => { + const startTime = performance.now(); + return () => { + profiler.addDataPoint(key, performance.now() - startTime); + }; +};