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

@@ -1569,6 +1569,25 @@ def grafana_alerts(server: dict):
print(f"\n({len(rows)} alert{'s' if len(rows) != 1 else ''})")
def grafana_datasources(server: dict):
"""List Grafana datasources."""
data = _grafana_request(server, "datasources")
if not data:
print("(no datasources found)")
return
headers = ["Name", "Type", "URL", "Default"]
rows = []
for ds in data:
rows.append([
ds.get("name", ""),
ds.get("type", ""),
ds.get("url", ""),
"yes" if ds.get("isDefault", False) else "",
])
_print_table(headers, rows)
print(f"\n({len(rows)} datasource{'s' if len(rows) != 1 else ''})")
# ── Prometheus commands ───────────────────────────────
def _prom_request(server: dict, endpoint: str, params: dict = None) -> dict:
@@ -1681,6 +1700,29 @@ def prom_alerts(server: dict):
print(f"\n({len(rows)} alert{'s' if len(rows) != 1 else ''})")
def prom_rules(server: dict):
"""List Prometheus rules (recording + alerting)."""
data = _prom_request(server, "rules")
groups = data.get("data", {}).get("groups", [])
if not groups:
print("(no rules)")
return
headers = ["Type", "Name", "Group", "Health", "Query/Expr"]
rows = []
for group in groups:
gname = group.get("name", "")
for rule in group.get("rules", []):
rows.append([
rule.get("type", ""),
rule.get("name", ""),
gname,
rule.get("health", ""),
(rule.get("query", rule.get("expr", "")))[:60],
])
_print_table(headers, rows)
print(f"\n({len(rows)} rule{'s' if len(rows) != 1 else ''} in {len(groups)} group{'s' if len(groups) != 1 else ''})")
# ── WinRM commands ────────────────────────────────────
def _get_winrm_session(server: dict):
@@ -1834,6 +1876,11 @@ def main():
alias = _resolve_alias(sys.argv[2], servers)
grafana_alerts(servers[alias])
sys.exit(0)
if cmd == "--grafana-datasources" and len(sys.argv) >= 3:
_, servers = load_servers()
alias = _resolve_alias(sys.argv[2], servers)
grafana_datasources(servers[alias])
sys.exit(0)
# ── Prometheus commands ──
if cmd == "--prom-query" and len(sys.argv) >= 4:
@@ -1851,6 +1898,11 @@ def main():
alias = _resolve_alias(sys.argv[2], servers)
prom_alerts(servers[alias])
sys.exit(0)
if cmd == "--prom-rules" and len(sys.argv) >= 3:
_, servers = load_servers()
alias = _resolve_alias(sys.argv[2], servers)
prom_rules(servers[alias])
sys.exit(0)
# ── WinRM commands ──
if cmd == "--ps" and len(sys.argv) >= 4: