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:
52
tools/ssh.py
52
tools/ssh.py
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user