import axios from 'axios';
import { PrometheusQueryResult, PrometheusRangeResult } from './types.js';
export class PrometheusClient {
private baseUrl: string;
constructor(baseUrl: string = 'http://localhost:9090') {
this.baseUrl = baseUrl;
}
async query(query: string): Promise<PrometheusQueryResult> {
try {
const response = await axios.get(`${this.baseUrl}/api/v1/query`, {
params: { query },
timeout: 5000
});
return response.data;
} catch (error) {
throw new Error(`Prometheus query failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
async queryRange(query: string, startTime: Date, endTime: Date, step: string = '1h'): Promise<PrometheusRangeResult> {
try {
const response = await axios.get(`${this.baseUrl}/api/v1/query_range`, {
params: {
query,
start: startTime.toISOString(),
end: endTime.toISOString(),
step
},
timeout: 10000
});
return response.data;
} catch (error) {
throw new Error(`Prometheus range query failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
async isHealthy(): Promise<boolean> {
try {
const response = await axios.get(`${this.baseUrl}/-/healthy`, { timeout: 3000 });
return response.status === 200;
} catch {
return false;
}
}
// Helper method to get the latest value from a metric
getLatestValue(result: PrometheusQueryResult): number {
if (result.data.result.length === 0) {
return 0;
}
const value = result.data.result[0].value[1];
return parseFloat(value) || 0;
}
// Helper method to get time series data
getTimeSeries(result: PrometheusRangeResult): Array<{ timestamp: Date; value: number }> {
if (result.data.result.length === 0) {
return [];
}
return result.data.result[0].values.map(([timestamp, value]) => ({
timestamp: new Date(timestamp * 1000),
value: parseFloat(value) || 0
}));
}
}