mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-03-15 05:41:51 +00:00
Add rate limit logging
This commit is contained in:
parent
0a00be7a72
commit
57ed43b018
4 changed files with 67 additions and 0 deletions
|
@ -22,6 +22,7 @@ import { loadYamlSafely } from "./utils/loadYamlSafely";
|
|||
import { DecayingCounter } from "./utils/DecayingCounter";
|
||||
import { PluginNotLoadedError } from "knub/dist/plugins/PluginNotLoadedError";
|
||||
import { logRestCall } from "./restCallStats";
|
||||
import { logRateLimit } from "./rateLimitStats";
|
||||
|
||||
if (!process.env.KEY) {
|
||||
// tslint:disable-next-line:no-console
|
||||
|
@ -317,6 +318,10 @@ connect().then(async () => {
|
|||
startUptimeCounter();
|
||||
});
|
||||
|
||||
client.on(Constants.Events.RATE_LIMIT, (data) => {
|
||||
logRateLimit(data);
|
||||
});
|
||||
|
||||
bot.initialize();
|
||||
logger.info("Bot Initialized");
|
||||
logger.info("Logging in...");
|
||||
|
|
|
@ -22,6 +22,7 @@ import { PluginPerformanceCmd } from "./commands/PluginPerformanceCmd";
|
|||
import { AddServerFromInviteCmd } from "./commands/AddServerFromInviteCmd";
|
||||
import { ChannelToServerCmd } from "./commands/ChannelToServerCmd";
|
||||
import { RestPerformanceCmd } from "./commands/RestPerformanceCmd";
|
||||
import { RateLimitPerformanceCmd } from "./commands/RateLimitPerformanceCmd";
|
||||
|
||||
const defaultOptions = {
|
||||
config: {
|
||||
|
@ -54,6 +55,7 @@ export const BotControlPlugin = zeppelinGlobalPlugin<BotControlPluginType>()({
|
|||
EligibleCmd,
|
||||
PluginPerformanceCmd,
|
||||
RestPerformanceCmd,
|
||||
RateLimitPerformanceCmd,
|
||||
AddServerFromInviteCmd,
|
||||
ChannelToServerCmd,
|
||||
],
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
import { botControlCmd } from "../types";
|
||||
import { getRateLimitStats } from "../../../rateLimitStats";
|
||||
import moment from "moment-timezone";
|
||||
import { GuildArchives } from "../../../data/GuildArchives";
|
||||
import { getBaseUrl, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
|
||||
import { TextChannel } from "discord.js";
|
||||
|
||||
export const RateLimitPerformanceCmd = botControlCmd({
|
||||
trigger: ["rate_limit_performance"],
|
||||
permission: "can_performance",
|
||||
|
||||
signature: {},
|
||||
|
||||
async run({ pluginData, message: msg, args }) {
|
||||
const logItems = getRateLimitStats();
|
||||
if (logItems.length === 0) {
|
||||
sendSuccessMessage(pluginData, msg.channel as TextChannel, `No rate limits hit`);
|
||||
return;
|
||||
}
|
||||
|
||||
logItems.reverse();
|
||||
const formatted = logItems.map((item) => {
|
||||
const formattedTime = moment.utc(item.timestamp).format("YYYY-MM-DD HH:mm:ss.SSS");
|
||||
return `${item.data.global ? "GLOBAL " : ""}${item.data.method} ${item.data.route} stalled for ${
|
||||
item.data.timeout
|
||||
}ms`;
|
||||
});
|
||||
|
||||
const fullText = `Last ${logItems.length} rate limits hit:\n\n${formatted.join("\n")}`;
|
||||
|
||||
const archives = GuildArchives.getGuildInstance("0");
|
||||
const archiveId = await archives.create(fullText, moment().add(1, "hour"));
|
||||
const archiveUrl = archives.getUrl(getBaseUrl(pluginData), archiveId);
|
||||
msg.channel.send(`Link: ${archiveUrl}`);
|
||||
},
|
||||
});
|
24
backend/src/rateLimitStats.ts
Normal file
24
backend/src/rateLimitStats.ts
Normal file
|
@ -0,0 +1,24 @@
|
|||
import { RateLimitData } from "discord.js";
|
||||
|
||||
type RateLimitLogItem = {
|
||||
timestamp: number;
|
||||
data: RateLimitData;
|
||||
};
|
||||
|
||||
const rateLimitLog: RateLimitLogItem[] = [];
|
||||
|
||||
const MAX_RATE_LIMIT_LOG_ITEMS = 100;
|
||||
|
||||
export function logRateLimit(data: RateLimitData) {
|
||||
rateLimitLog.push({
|
||||
timestamp: Date.now(),
|
||||
data,
|
||||
});
|
||||
if (rateLimitLog.length > MAX_RATE_LIMIT_LOG_ITEMS) {
|
||||
rateLimitLog.splice(0, rateLimitLog.length - MAX_RATE_LIMIT_LOG_ITEMS);
|
||||
}
|
||||
}
|
||||
|
||||
export function getRateLimitStats(): RateLimitLogItem[] {
|
||||
return Array.from(rateLimitLog);
|
||||
}
|
Loading…
Add table
Reference in a new issue