infra-report/src/lib/prometheus.ts

56 lines
2.0 KiB
TypeScript

import axios from 'axios';
const PROMETHEUS_URL = process.env.PROMETHEUS_URL || 'http://prometheus-server.monitoring';
interface PrometheusRangeResult {
metric: Record<string, string>;
values: [number, string][];
}
interface PrometheusResponse {
status: string;
data: {
resultType: string;
result: PrometheusRangeResult[];
};
}
export async function queryRange(
query: string,
start: Date,
end: Date,
step: string = '5m'
): Promise<PrometheusRangeResult[]> {
const res = await axios.get<PrometheusResponse>(`${PROMETHEUS_URL}/api/v1/query_range`, {
params: {
query,
start: start.toISOString(),
end: end.toISOString(),
step,
},
});
return res.data.data.result;
}
export async function queryInstant(query: string): Promise<PrometheusRangeResult[]> {
const res = await axios.get<PrometheusResponse>(`${PROMETHEUS_URL}/api/v1/query`, {
params: { query },
});
return res.data.data.result;
}
export const QUERIES = {
cpuUsage: process.env.QUERY_CPU
|| '100 - (avg by (instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)',
memoryUsage: process.env.QUERY_MEMORY
|| '(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100',
diskUsage: process.env.QUERY_DISK
|| 'sum by (mountpoint,fstype)((1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay|nfs",mountpoint!~"/boot.*"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay|nfs",mountpoint!~"/boot.*"}) * 100)',
nasUsage: process.env.QUERY_NAS
|| '((node_filesystem_size_bytes{fstype=~"nfs", node=~".*(bastion).*"} - node_filesystem_free_bytes{fstype=~"nfs", node=~".*(bastion).*"}) / node_filesystem_size_bytes{fstype=~"nfs", node=~".*(bastion).*"}) * 100',
networkReceive: process.env.QUERY_NET_RX
|| 'sum(rate(container_network_receive_bytes_total{namespace="ingress-nginx", pod=~"ingress-nginx-controller-.*"}[5m]))',
networkTransmit: process.env.QUERY_NET_TX
|| 'sum(rate(container_network_transmit_bytes_total{namespace="ingress-nginx", pod=~"ingress-nginx-controller-.*"}[5m]))',
};