fix(prometheus, syslog): a target or pattern pauses with a Pause/Resume button, not an "on" tick box in its form (#6419)
Monitors, schedules and maintenance plans already pause with a Pause/Resume button and say "Paused" where they're listed. Prometheus targets and syslog patterns only had a tick box inside the edit form, so a target refused by its endpoint couldn't be stopped from its page. - Both get a Pause/Resume button (target page and list; patterns list) posting to /toggle, recorded in the audit log, and a Paused badge. - The forms lose the tick box. A new one starts running; an edit keeps whether it is paused. - A target's "off" state is now "paused", in its pages and MCP tools. A resumed target reads "not scraped yet" until its next scrape, and its counter rates start over. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -25,7 +25,7 @@ from .service import (OWN_METRICS, SOURCE, FormError, fold_states, form_values,
|
||||
|
||||
prometheus_bp = Blueprint("prometheus", __name__, template_folder="templates")
|
||||
|
||||
_REACH_ORDER = {"down": 0, "stale": 1, "pending": 2, "up": 3, "off": 4}
|
||||
_REACH_ORDER = {"down": 0, "stale": 1, "pending": 2, "up": 3, "paused": 4}
|
||||
|
||||
|
||||
def _actor() -> tuple[str | None, str]:
|
||||
@@ -40,7 +40,8 @@ def view(target: PrometheusTarget, own: dict, now: datetime) -> dict:
|
||||
"""What a page says about a target: its state in words and the numbers
|
||||
from its newest scrape."""
|
||||
state = target_state(target, now)
|
||||
return {"id": target.id, "name": target.name, "url": target.url, "reach": state.reach,
|
||||
return {"id": target.id, "name": target.name, "url": target.url, "enabled": target.enabled,
|
||||
"reach": state.reach,
|
||||
"says": state.says, "scraped_at": target.last_scraped_at, "ok_at": target.last_ok_at,
|
||||
"interval": target.interval_seconds, "kept": target.last_kept,
|
||||
"dropped": target.last_dropped, "capped": target.last_capped, "cap": target.series_cap,
|
||||
@@ -79,8 +80,7 @@ def _typed(form, target: PrometheusTarget | None = None) -> dict:
|
||||
return {"name": form.get("name", ""), "url": form.get("url", ""),
|
||||
"interval_seconds": form.get("interval_seconds", ""), "series_cap": form.get("series_cap", ""),
|
||||
"keep": form.get("keep", ""), "drop": form.get("drop", ""),
|
||||
"verify_tls": bool(form.get("verify_tls")), "enabled": bool(form.get("enabled")),
|
||||
"has_token": bool(target and target.token)}
|
||||
"verify_tls": bool(form.get("verify_tls")), "has_token": bool(target and target.token)}
|
||||
|
||||
|
||||
async def _name_taken(db, name: str, other_than: str | None = None) -> bool:
|
||||
@@ -176,6 +176,27 @@ async def save_target(target_id: str):
|
||||
return redirect(f"/plugins/prometheus/targets/{target_id}")
|
||||
|
||||
|
||||
@prometheus_bp.post("/targets/<target_id>/toggle")
|
||||
@require_role(UserRole.admin)
|
||||
async def toggle_target(target_id: str):
|
||||
"""Pause a target, or resume a paused one, from its page or the list."""
|
||||
async with current_app.db_sessionmaker() as db:
|
||||
async with db.begin():
|
||||
target = await _target_or_404(db, target_id)
|
||||
target.enabled = not target.enabled
|
||||
if target.enabled:
|
||||
# Resumed: it reads "not scraped yet" until the next scrape,
|
||||
# rather than stale from before the pause.
|
||||
target.last_scraped_at = target.last_error = None
|
||||
enabled, name = target.enabled, target.name
|
||||
# A rate needs two readings in a row; one from before the pause isn't one.
|
||||
from . import scheduler
|
||||
scheduler.RATES.forget(target_id)
|
||||
await log_audit(current_app, *_actor(), "prometheus.target_resumed" if enabled else "prometheus.target_paused",
|
||||
entity_type="prometheus_target", entity_id=target_id, detail={"name": name})
|
||||
return redirect(request.referrer or f"/plugins/prometheus/targets/{target_id}")
|
||||
|
||||
|
||||
@prometheus_bp.post("/targets/<target_id>/delete")
|
||||
@require_role(UserRole.admin)
|
||||
async def delete_target(target_id: str):
|
||||
|
||||
Reference in New Issue
Block a user