feat(prometheus): fold state sets on the target page; forget series an endpoint drops (#5689)
#5689 "Prometheus target page: fold state sets, show epoch times, size bytes", step 1 of milestone 508 "Prometheus widget templates". - A state set (name ending in _state, a state label, every series 0 or 1; or the OpenMetrics form, the label named after the metric) reads as one row per thing it describes, naming the current state, the others on hover. fabledarchives_jobs{state} is a count and stays as it is. - label_pairs / state_label / fold_states in service.py, for the widget templates to reuse. - After a good scrape, series it no longer has lose their newest value (forget_gone): Archives' old build_info row read as current beside the new one. History stays; a failed scrape forgets nothing; alert rules keep their own last-sample time. - Epoch times and _bytes sizes were already read by shown_value / metric_value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -60,7 +60,11 @@ def test_series_are_grouped_by_metric_with_their_labels_and_units():
|
||||
assert [g["metric"] for g in groups] == ["fa_disk_free_bytes", "fa_last_backup_timestamp_seconds", "fa_state"]
|
||||
assert groups[0]["rows"][0]["labels"] == "" and groups[0]["rows"][0]["text"] == "2.0 GiB"
|
||||
assert groups[1]["rows"][0]["moment"] == datetime.fromtimestamp(stamp, timezone.utc)
|
||||
assert [r["labels"] for r in groups[2]["rows"]] == ["target=S,state=fresh", "target=S,state=late"]
|
||||
# A state set reads as one row naming the current state.
|
||||
assert groups[2]["states"] and not groups[0]["states"]
|
||||
assert [(r["labels"], r["text"], r["states"]) for r in groups[2]["rows"]] == [
|
||||
("target=S", "fresh", ["fresh", "late"])]
|
||||
assert groups[2]["rows"][0]["resource"] == "A:target=S,state=fresh"
|
||||
assert shown_value("x_timestamp_seconds", 0) == {"text": "never", "moment": None}
|
||||
assert shown_value("jobs_per_sec", 0.25)["text"] == "0.25/s"
|
||||
assert shown_value("job_seconds", 90)["text"] == "1m 30s"
|
||||
@@ -69,9 +73,9 @@ def test_series_are_grouped_by_metric_with_their_labels_and_units():
|
||||
|
||||
async def test_the_target_page_leads_with_its_state_then_its_series(app):
|
||||
from quart import session
|
||||
groups = [{"metric": "fa_state", "rows": [
|
||||
{"labels": "target=S,state=late", "resource": "archives:target=S,state=late", "at": None,
|
||||
"text": "0", "moment": None}]}]
|
||||
groups = [{"metric": "fa_state", "states": True, "rows": [
|
||||
{"labels": "target=S", "resource": "archives:target=S,state=late", "moment": None,
|
||||
"text": "late", "states": ["fresh", "late"]}]}]
|
||||
async with app.test_request_context("/plugins/prometheus/targets/id-archives"):
|
||||
session["user_role"] = "viewer"
|
||||
page = await render_plugin_template(app, "prometheus", "prometheus/target.html",
|
||||
@@ -81,6 +85,7 @@ async def test_the_target_page_leads_with_its_state_then_its_series(app):
|
||||
assert page.index("Answering") < page.index("Series stored") < page.index("fa_state")
|
||||
assert "3 series weren't stored" in page and "Keeping fabledarchives_*" in page
|
||||
assert "resource=archives%3Atarget%3DS%2Cstate%3Dlate" in page and "metric=fa_state" in page
|
||||
assert 'title="One of: fresh, late">late</a>' in page and "a state set" in page
|
||||
assert 'href="/plugins/prometheus/">Prometheus</a>' in page # its breadcrumb
|
||||
assert "/edit" not in page
|
||||
|
||||
|
||||
Reference in New Issue
Block a user