From a2a477d3fba20a98521bf0f4f098c5619c5bc15d Mon Sep 17 00:00:00 2001 From: CN-JS-HuiBai Date: Sat, 4 Apr 2026 17:40:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/prometheus-service.js | 69 ++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/server/prometheus-service.js b/server/prometheus-service.js index 0d3af14..2701a31 100644 --- a/server/prometheus-service.js +++ b/server/prometheus-service.js @@ -68,30 +68,71 @@ async function testConnection(url) { /** * Execute a Prometheus instant query */ -async function query(url, expr) { - const client = createClient(url); - const res = await client.get('/api/v1/query', { params: { query: expr } }); - if (res.data.status !== 'success') { - throw new Error(`Prometheus query failed: ${res.data.error || 'unknown error'}`); +async function query(baseUrl, expr) { + const url = normalizeUrl(baseUrl); + try { + const params = new URLSearchParams({ query: expr }); + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), QUERY_TIMEOUT); + + const res = await fetch(`${url}/api/v1/query?${params.toString()}`, { + signal: controller.signal + }); + + clearTimeout(timer); + + if (!res.ok) { + throw new Error(`Prometheus returned HTTP ${res.status}`); + } + + const data = await res.json(); + if (data.status !== 'success') { + throw new Error(`Prometheus query failed: ${data.error || 'unknown error'}`); + } + return data.data.result; + } catch (err) { + if (err.name === 'AbortError') { + throw new Error('Prometheus query timed out'); + } + throw err; } - return res.data.data.result; } /** * Execute a Prometheus range query */ -async function queryRange(url, expr, start, end, step) { - const client = createClient(url); - const res = await client.get('/api/v1/query_range', { - params: { query: expr, start, end, step } - }); - if (res.data.status !== 'success') { - throw new Error(`Prometheus range query failed: ${res.data.error || 'unknown error'}`); +async function queryRange(baseUrl, expr, start, end, step) { + const url = normalizeUrl(baseUrl); + try { + const params = new URLSearchParams({ query: expr, start, end, step }); + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), QUERY_TIMEOUT); + + const res = await fetch(`${url}/api/v1/query_range?${params.toString()}`, { + signal: controller.signal + }); + + clearTimeout(timer); + + if (!res.ok) { + throw new Error(`Prometheus returned HTTP ${res.status}`); + } + + const data = await res.json(); + if (data.status !== 'success') { + throw new Error(`Prometheus range query failed: ${data.error || 'unknown error'}`); + } + return data.data.result; + } catch (err) { + if (err.name === 'AbortError') { + throw new Error('Prometheus range query timed out'); + } + throw err; } - return res.data.data.result; } + /** * Get overview metrics from a single Prometheus source */