From 553b9141d4949edf0e9accf1dc09dc73f45db1e1 Mon Sep 17 00:00:00 2001 From: DmitriyA Date: Fri, 4 Apr 2025 15:32:21 -0400 Subject: [PATCH] fixed bugs --- src/metrics.gateway.ts | 66 ++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/src/metrics.gateway.ts b/src/metrics.gateway.ts index 6916b80..50f4559 100644 --- a/src/metrics.gateway.ts +++ b/src/metrics.gateway.ts @@ -35,22 +35,30 @@ export class MetricsGateway implements OnGatewayInit, OnGatewayConnection, OnGat } @SubscribeMessage('get-metrics') - async handleGetMetrics(client: Socket, payload: any) { - const { metric, start, end, step } = payload; - try { - const data = start && end && step - ? await this.prometheusService.fetchMetricsRange(metric, start, end, step) - : await this.prometheusService.fetchMetrics(metric); +async handleGetMetrics(client: Socket, payload: any) { + const { metric, start, end, step } = payload; + try { + const data = start && end && step + ? await this.prometheusService.fetchMetricsRange(metric, start, end, step) + : await this.prometheusService.fetchMetrics(metric); - client.emit('metrics-data', { metric, data }); - } catch (error) { - this.logger.error(`Error fetching metrics: ${error.message}`); - client.emit('metrics-error', { - metric, - error: error.message - }); - } + client.emit('metrics-data', { metric, data }); + + // Запускаем автоматические обновления с интервалом по умолчанию + const stopUpdates = await this.sendPeriodicUpdates( + metric, + 5000, // Интервал по умолчанию + client + ); + client.on('disconnect', () => stopUpdates()); + } catch (error) { + this.logger.error(`Error fetching metrics: ${error.message}`); + client.emit('metrics-error', { + metric, + error: error.message + }); } +} @SubscribeMessage('get-metric-types') async handleGetMetricTypes(client: Socket, payload: { metric: string }) { @@ -84,27 +92,35 @@ export class MetricsGateway implements OnGatewayInit, OnGatewayConnection, OnGat } } - @SubscribeMessage('subscribe-metric') - async handleSubscribeMetric(client: Socket, payload: { metric: string, interval?: number }) { - const stopUpdates = await this.sendPeriodicUpdates(payload.metric, payload.interval); + - // Сохраняем функцию остановки для этого клиента - client.on('disconnect', () => stopUpdates()); - client.on('unsubscribe-metric', () => stopUpdates()); - } + @SubscribeMessage('subscribe-metric') +async handleSubscribeMetric(client: Socket, payload: { metric: string, interval?: number }) { + const stopUpdates = await this.sendPeriodicUpdates( + payload.metric, + payload.interval || 5000, // Добавляем значение по умолчанию + client // Передаем клиента + ); + + // Сохраняем функцию остановки для этого клиента + client.on('disconnect', () => stopUpdates()); + client.on('unsubscribe-metric', () => stopUpdates()); +} // Метод для периодической отправки обновлений - async sendPeriodicUpdates(metric: string, interval: number = 5000) { + async sendPeriodicUpdates(metric: string, interval: number, client: Socket) { const timer = setInterval(async () => { try { const data = await this.prometheusService.fetchMetrics(metric); - this.server.emit('metrics-update', { metric, data }); + client.emit('metrics-data', { metric, data }); } catch (error) { this.logger.error(`Error in periodic update for ${metric}: ${error.message}`); } }, interval); - // Возвращаем функцию для остановки обновлений - return () => clearInterval(timer); + return () => { + clearInterval(timer); + this.logger.log(`Stopped updates for ${metric}`); + }; } } \ No newline at end of file