metrics: count LIST membership status, not the subscriber's own status
The first live run recorded newsletter_subs = 0 — a wrong zero, the exact fail-open this module documents against. Cause: Listmonk's subscriber record carries status enabled/blocked, while the LIST membership carries subscription_status confirmed/unconfirmed. Filtering on the subscriber's own status matched nothing and returned a silent 0. Now counts memberships whose subscription_status is confirmed (verified: 71, matching the list), and returns NULL when the endpoint yields no rows at all — "not measured" rather than "nobody is subscribed". The daily job is the regression test: it must record 71, not 0.
This commit is contained in:
1 parent
80de75672c
commit
27c32fc75f
1 file changed
+17
-2
+17
-2
@@ -99,7 +99,7 @@ def from_listmonk() -> int | None:
|
||||
print("metrics: LISTMONK_API_TOKEN not set — newsletter_subs left NULL")
|
||||
return None
|
||||
try:
|
||||
total, page = 0, 1
|
||||
total, page, seen = 0, 1, 0
|
||||
while True:
|
||||
data = _get_json(
|
||||
f"{LISTMONK_BASE}/api/subscribers?list_id={LISTMONK_LIST_ID}&per_page=100&page={page}",
|
||||
@@ -107,10 +107,25 @@ def from_listmonk() -> int | None:
|
||||
) or {}
|
||||
payload = data.get("data") or {}
|
||||
rows = payload.get("results") or []
|
||||
total += sum(1 for s in rows if (s.get("status") or "") == "confirmed")
|
||||
# The subscriber's own `status` is enabled/blocked; the LIST
|
||||
# membership status is what means "on this list" — counting the
|
||||
# former returned a silent, wrong 0.
|
||||
for s in rows:
|
||||
for membership in s.get("lists") or []:
|
||||
if membership.get("id") == LISTMONK_LIST_ID and (
|
||||
membership.get("subscription_status") or ""
|
||||
) == "confirmed":
|
||||
total += 1
|
||||
seen += len(rows)
|
||||
if not rows or len(rows) < 100 or page >= 20:
|
||||
break
|
||||
page += 1
|
||||
if seen == 0:
|
||||
# Nothing came back at all: the endpoint or payload shape changed.
|
||||
# Record "not measured" (NULL) rather than a zero that reads as
|
||||
# "nobody is subscribed".
|
||||
print("metrics: listmonk returned no rows — newsletter_subs left NULL")
|
||||
return None
|
||||
return total
|
||||
except Exception as exc: # noqa: BLE001 - report, never guess
|
||||
print(f"metrics: listmonk read failed ({exc}) — newsletter_subs left NULL")
|
||||
|
||||
Reference in new issue
Block a user