105 lines
4.2 KiB
Python
105 lines
4.2 KiB
Python
import requests
|
||
from typing import Optional, Dict, Any, List
|
||
|
||
class PrometheusSkill:
|
||
"""
|
||
Prometheus API Skill
|
||
封装 Prometheus HTTP API 所有常用接口,支持 agent/LangChain/LLM 等调用。
|
||
"""
|
||
|
||
def __init__(self, base_url: str, bearer_token: Optional[str] = None):
|
||
self.base_url = base_url.rstrip("/")
|
||
self.headers = {"Authorization": f"Bearer {bearer_token}"} if bearer_token else {}
|
||
|
||
# ========== 1. 实时查询 ==========
|
||
def instant_query(self, promql: str, time: Optional[float] = None) -> Dict[str, Any]:
|
||
"""执行单点PromQL查询 /api/v1/query"""
|
||
params = {"query": promql}
|
||
if time:
|
||
params["time"] = time
|
||
return self._get("/api/v1/query", params)
|
||
|
||
# ========== 2. 范围查询 ==========
|
||
def range_query(self, promql: str, start: str, end: str, step: str) -> Dict[str, Any]:
|
||
"""执行时序PromQL查询 /api/v1/query_range"""
|
||
params = {
|
||
"query": promql,
|
||
"start": start,
|
||
"end": end,
|
||
"step": step
|
||
}
|
||
return self._get("/api/v1/query_range", params)
|
||
|
||
# ========== 3. 获取所有 metric 名字 ==========
|
||
def list_series(self, match: List[str], start: Optional[str] = None, end: Optional[str] = None) -> Dict[str, Any]:
|
||
"""列出匹配的时序(可用于探查所有监控项) /api/v1/series"""
|
||
params = [("match[]", m) for m in match]
|
||
if start: params.append(("start", start))
|
||
if end: params.append(("end", end))
|
||
return self._get("/api/v1/series", params)
|
||
|
||
def list_labels(self, start: Optional[str] = None, end: Optional[str] = None) -> Dict[str, Any]:
|
||
"""列出所有label名 /api/v1/labels"""
|
||
params = {}
|
||
if start: params["start"] = start
|
||
if end: params["end"] = end
|
||
return self._get("/api/v1/labels", params)
|
||
|
||
def label_values(self, label_name: str, start: Optional[str] = None, end: Optional[str] = None) -> Dict[str, Any]:
|
||
"""列出某个label的所有 possible value /api/v1/label/{label_name}/values"""
|
||
params = {}
|
||
if start: params["start"] = start
|
||
if end: params["end"] = end
|
||
return self._get(f"/api/v1/label/{{label_name}}/values", params)
|
||
|
||
# ========== 4. 获取目标/告警 配置/状态 ==========
|
||
def get_targets(self) -> Dict[str, Any]:
|
||
"""获取targets(监控目标) /api/v1/targets"""
|
||
return self._get("/api/v1/targets")
|
||
|
||
def get_alerts(self) -> Dict[str, Any]:
|
||
"""Prometheus当前所有告警(由Prometheus规则产生) /api/v1/alerts"""
|
||
return self._get("/api/v1/alerts")
|
||
|
||
def get_rules(self) -> Dict[str, Any]:
|
||
"""获取当前所有Prometheus规则 /api/v1/rules"""
|
||
return self._get("/api/v1/rules")
|
||
|
||
def get_active_alertmanagers(self) -> Dict[str, Any]:
|
||
"""获取当前活跃的alertmanager列表 /api/v1/alertmanagers"""
|
||
return self._get("/api/v1/alertmanagers")
|
||
|
||
def get_status(self) -> Dict[str, Any]:
|
||
"""获取Prometheus服务状态 /api/v1/status"""
|
||
return self._get("/api/v1/status")
|
||
|
||
def get_flags(self) -> Dict[str, Any]:
|
||
"""获取Prometheus启动flags /api/v1/status/flags"""
|
||
return self._get("/api/v1/status/flags")
|
||
|
||
def get_config(self) -> Dict[str, Any]:
|
||
"""获取Prometheus配置 /api/v1/status/config"""
|
||
return self._get("/api/v1/status/config")
|
||
|
||
def get_runtimeinfo(self) -> Dict[str, Any]:
|
||
"""Prometheus运行时信息 /api/v1/status/runtimeinfo"""
|
||
return self._get("/api/v1/status/runtimeinfo")
|
||
|
||
def get_buildinfo(self) -> Dict[str, Any]:
|
||
"""Prometheus构建信息 /api/v1/status/buildinfo"""
|
||
return self._get("/api/v1/status/buildinfo")
|
||
|
||
# ========== 5. 内部辅助 ==========
|
||
def _get(self, path: str, params=None) -> Dict[str, Any]:
|
||
url = self.base_url + path
|
||
r = requests.get(url, headers=self.headers, params=params, timeout=15)
|
||
r.raise_for_status()
|
||
return r.json()
|
||
|
||
# ==== 用法示例 ====
|
||
if __name__ == "__main__":
|
||
prom = PrometheusSkill(base_url="http://localhost:9090")
|
||
print(prom.instant_query("up"))
|
||
print(prom.get_targets())
|
||
print(prom.list_labels())
|
||
print(prom.get_rules()) |