Skip to content

Commit 9cd2f6e

Browse files
Handle logging and batch uploads
1 parent e8de444 commit 9cd2f6e

File tree

1 file changed

+50
-26
lines changed

1 file changed

+50
-26
lines changed

server/routers/badger/logRequestAudit.ts

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ async function getRetentionDays(orgId: string): Promise<number> {
5656
return response.data.data.days;
5757
} catch (error) {
5858
if (axios.isAxiosError(error)) {
59-
logger.error("Error fetching retention days:", {
59+
logger.error("logRequestAudit: Error fetching retention days:", {
6060
message: error.message,
6161
code: error.code,
6262
status: error.response?.status,
@@ -65,20 +65,49 @@ async function getRetentionDays(orgId: string): Promise<number> {
6565
method: error.config?.method
6666
});
6767
} else {
68-
logger.error("Error fetching retention days:", error);
68+
logger.error("logRequestAudit: Error fetching retention days:", error);
6969
}
7070
return 0;
7171
}
7272
}
7373

74-
async function sendQueuedLogs() {
75-
await axios.post(
76-
`${config.getRawConfig().managed?.endpoint}/api/v1/hybrid/logs/batch`,
77-
{
78-
logs: logQueue
79-
},
80-
await tokenManager.getAuthHeader()
81-
);
74+
async function sendQueuedLogs(): Promise<boolean> {
75+
try {
76+
const endpoint = config.getRawConfig().managed?.endpoint;
77+
if (!endpoint) {
78+
logger.warn("Cannot send logs: managed endpoint not configured");
79+
return false;
80+
}
81+
82+
// create a copy of the log queue to process
83+
const logsToProcess = [...logQueue];
84+
// Process logs in batches of 100
85+
for (let i = 0; i < logsToProcess.length; i += 100) {
86+
const batch = logsToProcess.slice(i, i + 100);
87+
await axios.post(
88+
`${endpoint}/api/v1/hybrid/logs/batch`,
89+
{
90+
logs: batch
91+
},
92+
await tokenManager.getAuthHeader()
93+
);
94+
}
95+
} catch (error) {
96+
if (axios.isAxiosError(error)) {
97+
logger.error("logRequestAudit: Error sending queued logs:", {
98+
message: error.message,
99+
code: error.code,
100+
status: error.response?.status,
101+
statusText: error.response?.statusText,
102+
url: error.config?.url,
103+
method: error.config?.method
104+
});
105+
} else {
106+
logger.error("logRequestAudit: Error sending queued logs:", error);
107+
}
108+
return false;
109+
}
110+
return true;
82111
}
83112

84113
export async function logRequestAudit(
@@ -190,32 +219,27 @@ export async function logRequestAudit(
190219
tls: body.tls
191220
};
192221

222+
// if the queue is full dont push new logs
223+
if (logQueue.length >= 10000) {
224+
logger.warn(
225+
"logRequestAudit: Log queue full, dropping log entry to prevent memory issues"
226+
);
227+
return;
228+
}
229+
193230
logQueue.push(payload);
194231
} catch (error) {
195232
logQueue = []; // clear queue on error to prevent buildup
196-
if (axios.isAxiosError(error)) {
197-
logger.error("Error fetching retention days:", {
198-
message: error.message,
199-
code: error.code,
200-
status: error.response?.status,
201-
statusText: error.response?.statusText,
202-
url: error.config?.url,
203-
method: error.config?.method
204-
});
205-
} else {
206-
logger.error("Error fetching config in verify session:", error);
207-
}
233+
logger.error("logRequestAudit: Error fetching config in verify session:", error);
208234
}
209235
}
210236

211237
// set a periodic flush of the log queue every 30 seconds
212238
setInterval(async () => {
239+
logger.debug(`logRequestAudit: Attempting to upload log queue of size ${logQueue.length}`);
213240
if (logQueue.length > 0) {
214-
try {
215-
await sendQueuedLogs();
241+
if (await sendQueuedLogs()) {
216242
logQueue = [];
217-
} catch (error) {
218-
logger.error("Error sending queued logs:", error);
219243
}
220244
}
221245
}, 30000);

0 commit comments

Comments
 (0)