From 17f20985ca405c49fa1a05bd45bfee7db558ba7f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 06:14:27 +0000 Subject: [PATCH] Address code review feedback: fix typo and prevent overlapping executions - Fix spelling: 'retrived' -> 'retrieved' in proxysessionmetrics.js - Add flag to prevent overlapping health check executions - Change back to sequential server processing to avoid overwhelming Sense servers - Add warning log when skipping intervals due to long-running health checks Co-authored-by: mountaindude <1029262+mountaindude@users.noreply.github.com> --- src/lib/healthmetrics.js | 53 ++++++++++++++++++++++------------ src/lib/proxysessionmetrics.js | 2 +- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/lib/healthmetrics.js b/src/lib/healthmetrics.js index f673bf1..b0cfbf4 100755 --- a/src/lib/healthmetrics.js +++ b/src/lib/healthmetrics.js @@ -156,35 +156,50 @@ export async function getHealthStatsFromSense(serverName, host, tags, headers, r * * This function creates an interval that runs every pollingInterval milliseconds (as defined in config) * and calls getHealthStatsFromSense for each server in the serverList global variable. + * Uses a flag to prevent overlapping executions if health checks take longer than the polling interval. * * @returns {void} */ export function setupHealthMetricsTimer() { + let isCollecting = false; + // Configure timer for getting healthcheck data setInterval(async () => { - globals.logger.verbose('HEALTH: Event started: Statistics collection'); + // Prevent overlapping executions + if (isCollecting) { + globals.logger.warn( + 'HEALTH: Previous health check collection still in progress, skipping this interval' + ); + return; + } - // Process all servers concurrently with error handling - const healthCheckPromises = globals.serverList.map(async (server) => { - try { - globals.logger.verbose(`HEALTH: Getting stats for server: ${server.serverName}`); - globals.logger.debug(`HEALTH: Server details: ${JSON.stringify(server)}`); + isCollecting = true; + try { + globals.logger.verbose('HEALTH: Event started: Statistics collection'); - // Get per-server tags - const tags = getServerTags(globals.logger, server); + // Process servers sequentially to avoid overwhelming the Sense servers + for (const server of globals.serverList) { + try { + globals.logger.verbose( + `HEALTH: Getting stats for server: ${server.serverName}` + ); + globals.logger.debug(`HEALTH: Server details: ${JSON.stringify(server)}`); - // Get per-server headers - const headers = getServerHeaders(server); + // Get per-server tags + const tags = getServerTags(globals.logger, server); - await getHealthStatsFromSense(server.serverName, server.host, tags, headers); - } catch (err) { - globals.logger.error( - `HEALTH: Unexpected error processing health stats for server '${server.serverName}': ${globals.getErrorMessage(err)}` - ); + // Get per-server headers + const headers = getServerHeaders(server); + + await getHealthStatsFromSense(server.serverName, server.host, tags, headers); + } catch (err) { + globals.logger.error( + `HEALTH: Unexpected error processing health stats for server '${server.serverName}': ${globals.getErrorMessage(err)}` + ); + } } - }); - - // Wait for all health checks to complete - await Promise.allSettled(healthCheckPromises); + } finally { + isCollecting = false; + } }, globals.config.get('Butler-SOS.serversToMonitor.pollingInterval')); } diff --git a/src/lib/proxysessionmetrics.js b/src/lib/proxysessionmetrics.js index 076a677..06052d1 100755 --- a/src/lib/proxysessionmetrics.js +++ b/src/lib/proxysessionmetrics.js @@ -222,7 +222,7 @@ export async function getProxySessionStatsFromSense( influxTags, retryCount = 0 ) { - // Current user sessions are retrived using this API: + // Current user sessions are retrieved using this API: // https://help.qlik.com/en-US/sense-developer/February2021/Subsystems/ProxyServiceAPI/Content/Sense_ProxyServiceAPI/ProxyServiceAPI-Proxy-API.htm // Get certificate configuration options