diff --git a/src/prometheus-metric.interface.ts b/src/prometheus-metric.interface.ts index 646cbab..2f30262 100644 --- a/src/prometheus-metric.interface.ts +++ b/src/prometheus-metric.interface.ts @@ -4,4 +4,5 @@ export interface PrometheusMetric { timestamp: number; value: number; type: string; // Тип метрики ("gauge", "counter", и т. д.) -} + description?: string; // Описание метрики +} \ No newline at end of file diff --git a/src/prometheus.service.ts b/src/prometheus.service.ts index b829278..333292c 100644 --- a/src/prometheus.service.ts +++ b/src/prometheus.service.ts @@ -16,6 +16,7 @@ export class PrometheusService { console.log('Prometheus API URL:', this.prometheusUrl); } + // Получаем тип метрики async fetchMetricType(metric: string): Promise { try { const response = await lastValueFrom( @@ -32,6 +33,24 @@ export class PrometheusService { } } + // Получаем описание метрики + async fetchMetricDescription(metric: string): Promise { + try { + const response = await lastValueFrom( + this.httpService.get(`${this.prometheusUrl}/metadata`, { + params: { metric }, + }) + ); + + const metadata = response.data.data[metric]; + return metadata?.length ? metadata[0].help : undefined; + } catch (error) { + console.error(`Ошибка при получении описания метрики ${metric}:`, error); + return undefined; + } + } + + // Получаем данные метрики (текущие значения) async fetchMetrics(metric: string): Promise { const response = await lastValueFrom( this.httpService.get(`${this.prometheusUrl}/query`, { @@ -40,15 +59,18 @@ export class PrometheusService { ); const metricType = await this.fetchMetricType(metric); + const metricDescription = await this.fetchMetricDescription(metric); return response.data.data.result.map((entry): PrometheusMetric => ({ ...entry.metric, timestamp: entry.value[0] * 1000, value: parseFloat(entry.value[1]), type: metricType || 'unknown', + description: metricDescription, // Добавляем описание })); } + // Получаем данные метрики за интервал async fetchMetricsRange(metric: string, start: number, end: number, step: number): Promise { const response = await lastValueFrom( this.httpService.get(`${this.prometheusUrl}/query_range`, { @@ -62,6 +84,7 @@ export class PrometheusService { ); const metricType = await this.fetchMetricType(metric); + const metricDescription = await this.fetchMetricDescription(metric); return response.data.data.result.flatMap((entry) => entry.values.map((value): PrometheusMetric => ({ @@ -69,10 +92,12 @@ export class PrometheusService { timestamp: value[0] * 1000, value: parseFloat(value[1]), type: metricType || 'unknown', + description: metricDescription, // Добавляем описание })) ); } + // Получаем список всех метрик async fetchAllMetrics(): Promise { const response = await lastValueFrom( this.httpService.get(`${this.prometheusUrl}/label/__name__/values`) @@ -80,6 +105,7 @@ export class PrometheusService { return response.data.data; } + // Получаем все метрики с их значениями async fetchAllMetricsWithValues(): Promise { const metricNames = await this.fetchAllMetrics(); const promises = metricNames.map(async (metric) => {