v1.9.42: full Grafana/Prometheus GUI & CLI improvements

Grafana tab:
- Datasources table (Name, Type, URL, Default)
- Open Grafana button (opens browser)
- Switch to AlertManager endpoint for real-time active alerts

Prometheus tab:
- Quick query buttons (up, CPU, Memory)
- Metrics browser popup with filter (loads all metric names)
- Rules section (recording + alerting rules Treeview)

CLI:
- --grafana-datasources ALIAS
- --prom-rules ALIAS

i18n: 28 new keys (EN/RU/ZH)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chrome-storm-c442
2026-03-06 10:23:33 -05:00
parent 6a2db542c3
commit 8ff62d8f11
7 changed files with 384 additions and 61 deletions

View File

@@ -138,6 +138,16 @@ class GrafanaClient:
log.error("Grafana list_alerts failed: %s", exc)
return []
def get_active_alerts(self) -> list[dict]:
"""List active (firing) alerts via AlertManager endpoint."""
try:
results = self._get("/api/alertmanager/grafana/api/v2/alerts")
log.info("Grafana: %d active alerts", len(results))
return results
except Exception as exc:
log.error("Grafana get_active_alerts failed: %s", exc)
return []
def list_datasources(self) -> list[dict]:
"""
List all datasources via GET /api/datasources.

View File

@@ -429,6 +429,19 @@ _EN = {
"grafana_connected": "Connected to {alias}",
"grafana_no_dashboards": "No dashboards found",
"grafana_no_alerts": "No alerts",
"grafana_loading": "Loading...",
"grafana_loaded": "{dashboards} dashboards, {alerts} alerts, {datasources} datasources",
"grafana_no_server": "No server selected",
"grafana_open_browser": "Open Grafana",
"grafana_datasources": "Datasources",
"grafana_ds_name": "Name",
"grafana_ds_type": "Type",
"grafana_ds_default": "Default",
"grafana_dash_title": "Title",
"grafana_dash_folder": "Folder",
"grafana_alert_state": "State",
"grafana_alert_name": "Name",
"grafana_alert_severity": "Severity",
# Prometheus tab
"prom_refresh": "Refresh",
@@ -444,6 +457,23 @@ _EN = {
"prom_no_targets": "No targets",
"prom_no_alerts": "No alerts",
"prom_placeholder": "up",
"prom_loading": "Loading...",
"prom_loaded": "{targets} targets, {alerts} alerts, {rules} rules",
"prom_no_server": "No server selected",
"prom_executing": "Executing...",
"prom_results": "Results",
"prom_query_placeholder": "e.g. up, node_cpu_seconds_total",
"prom_metrics_browser": "Metrics",
"prom_filter_metrics": "Filter metrics...",
"prom_rules": "Rules",
"prom_rule_type": "Type",
"prom_rule_name": "Name",
"prom_rule_group": "Group",
"prom_rule_health": "Health",
"prom_target_job": "Job",
"prom_target_instance": "Instance",
"prom_target_health": "Health",
"prom_target_scrape": "Last Scrape",
# PowerShell tab
"ps_execute": "Execute",
@@ -956,6 +986,19 @@ _RU = {
"grafana_connected": "Подключено к {alias}",
"grafana_no_dashboards": "Дашборды не найдены",
"grafana_no_alerts": "Нет оповещений",
"grafana_loading": "Загрузка...",
"grafana_loaded": "{dashboards} дашб., {alerts} оповещ., {datasources} источн.",
"grafana_no_server": "Сервер не выбран",
"grafana_open_browser": "Открыть Grafana",
"grafana_datasources": "Источники данных",
"grafana_ds_name": "Имя",
"grafana_ds_type": "Тип",
"grafana_ds_default": "По умолч.",
"grafana_dash_title": "Название",
"grafana_dash_folder": "Папка",
"grafana_alert_state": "Состояние",
"grafana_alert_name": "Имя",
"grafana_alert_severity": "Серьёзность",
# Prometheus tab
"prom_refresh": "Обновить",
@@ -971,6 +1014,23 @@ _RU = {
"prom_no_targets": "Нет целей",
"prom_no_alerts": "Нет оповещений",
"prom_placeholder": "up",
"prom_loading": "Загрузка...",
"prom_loaded": "{targets} целей, {alerts} оповещ., {rules} правил",
"prom_no_server": "Сервер не выбран",
"prom_executing": "Выполнение...",
"prom_results": "Результаты",
"prom_query_placeholder": "напр. up, node_cpu_seconds_total",
"prom_metrics_browser": "Метрики",
"prom_filter_metrics": "Фильтр метрик...",
"prom_rules": "Правила",
"prom_rule_type": "Тип",
"prom_rule_name": "Имя",
"prom_rule_group": "Группа",
"prom_rule_health": "Здоровье",
"prom_target_job": "Job",
"prom_target_instance": "Инстанс",
"prom_target_health": "Здоровье",
"prom_target_scrape": "Последний опрос",
# PowerShell tab
"ps_execute": "Выполнить",
@@ -1483,6 +1543,19 @@ _ZH = {
"grafana_connected": "已连接到 {alias}",
"grafana_no_dashboards": "未找到仪表盘",
"grafana_no_alerts": "无告警",
"grafana_loading": "加载中...",
"grafana_loaded": "{dashboards}仪表盘, {alerts}告警, {datasources}数据源",
"grafana_no_server": "未选择服务器",
"grafana_open_browser": "打开Grafana",
"grafana_datasources": "数据源",
"grafana_ds_name": "名称",
"grafana_ds_type": "类型",
"grafana_ds_default": "默认",
"grafana_dash_title": "标题",
"grafana_dash_folder": "文件夹",
"grafana_alert_state": "状态",
"grafana_alert_name": "名称",
"grafana_alert_severity": "严重程度",
# Prometheus tab
"prom_refresh": "刷新",
@@ -1498,6 +1571,23 @@ _ZH = {
"prom_no_targets": "无目标",
"prom_no_alerts": "无告警",
"prom_placeholder": "up",
"prom_loading": "加载中...",
"prom_loaded": "{targets}目标, {alerts}告警, {rules}规则",
"prom_no_server": "未选择服务器",
"prom_executing": "执行中...",
"prom_results": "结果",
"prom_query_placeholder": "例如 up, node_cpu_seconds_total",
"prom_metrics_browser": "指标",
"prom_filter_metrics": "过滤指标...",
"prom_rules": "规则",
"prom_rule_type": "类型",
"prom_rule_name": "名称",
"prom_rule_group": "",
"prom_rule_health": "健康",
"prom_target_job": "任务",
"prom_target_instance": "实例",
"prom_target_health": "健康",
"prom_target_scrape": "最后抓取",
# PowerShell tab
"ps_execute": "执行",