Summary
The webex_meetings input can get into a state where it re-ingests every meeting on every interval, producing unbounded duplicates. The trigger is a single host in the org whose GET /v1/meetings call fails (we observed a persistent 502 Bad Gateway for one hostEmail).
This issue documents the root design flaw and proposes the proper fix. A separate PR offers an interim stop-the-bleeding fix and links here.
Root cause
In input_module_webex_meetings.py, collect_events():
- Computes a single, global window
from/to for the whole org.
- Loops over every user/
hostEmail, fetching and writing that host's meetings.
- Calls
save_check_point() exactly once, after the entire loop, using one global checkpoint key ({stanza}_meeting_report_last_timestamp).
Two things make a single host's failure fatal to the whole run:
- The per-host fetch
paging_get_request_to_webex(...) is outside any try/except.
- The write path catches, logs, then
raise e.
So if any host errors, the run aborts before save_check_point().
The per-meeting dedup gate is:
checkpoint_value = helper.get_check_point(last_timestamp_checkpoint_key) or opt_start_time
last_checkpoint_time = datetime.strptime(checkpoint_value, "%Y-%m-%dT%H:%M:%SZ")
...
if meeting_start_time > last_checkpoint_time:
ew.write_event(...)
With the checkpoint never saved, get_check_point(...) stays None forever and the comparison permanently falls back to opt_start_time. Every scheduled run re-requests start_time → now and re-writes every meeting. There is no event-level idempotency, so these are real duplicate events.
Observed symptoms
- The modinput log shows one
hostEmail's request returning 502, a traceback, and Get error when collecting events.
"Saved checkpoint" never appears in the log; the input's checkpoint directory stays empty.
- Duplicate
cisco:webex:meetings events accumulate on every interval.
Proposed proper fix: per-host checkpointing
Track progress per host instead of one global checkpoint:
- Checkpoint key per host, e.g.
{stanza}_{hostEmail}_meeting_report_last_timestamp.
- Compute the
from/to window per host from that host's own checkpoint.
- On success, advance only that host's checkpoint; on failure, log and skip — that host simply retries its unchanged window next run, while healthy hosts advance independently.
This makes one bad host cost nothing: no stall, no duplicates, and no data loss for the failing host (it's retried, not skipped-past).
Interim fix (separate PR)
Because per-host checkpointing changes the window/dedup semantics, a smaller PR will first make the per-host fetch/write log-and-continue so the global checkpoint can advance and the duplicate flood stops. That interim fix has a known trade-off — a persistently-failing host's meetings for the current window are not captured — which this issue's per-host approach would eliminate. Happy to implement the per-host version if the maintainers agree on the direction.
Summary
The
webex_meetingsinput can get into a state where it re-ingests every meeting on every interval, producing unbounded duplicates. The trigger is a single host in the org whoseGET /v1/meetingscall fails (we observed a persistent502 Bad Gatewayfor onehostEmail).This issue documents the root design flaw and proposes the proper fix. A separate PR offers an interim stop-the-bleeding fix and links here.
Root cause
In
input_module_webex_meetings.py,collect_events():from/tofor the whole org.hostEmail, fetching and writing that host's meetings.save_check_point()exactly once, after the entire loop, using one global checkpoint key ({stanza}_meeting_report_last_timestamp).Two things make a single host's failure fatal to the whole run:
paging_get_request_to_webex(...)is outside anytry/except.raise e.So if any host errors, the run aborts before
save_check_point().The per-meeting dedup gate is:
With the checkpoint never saved,
get_check_point(...)staysNoneforever and the comparison permanently falls back toopt_start_time. Every scheduled run re-requestsstart_time → nowand re-writes every meeting. There is no event-level idempotency, so these are real duplicate events.Observed symptoms
hostEmail's request returning502, a traceback, andGet error when collecting events."Saved checkpoint"never appears in the log; the input's checkpoint directory stays empty.cisco:webex:meetingsevents accumulate on every interval.Proposed proper fix: per-host checkpointing
Track progress per host instead of one global checkpoint:
{stanza}_{hostEmail}_meeting_report_last_timestamp.from/towindow per host from that host's own checkpoint.This makes one bad host cost nothing: no stall, no duplicates, and no data loss for the failing host (it's retried, not skipped-past).
Interim fix (separate PR)
Because per-host checkpointing changes the window/dedup semantics, a smaller PR will first make the per-host fetch/write log-and-continue so the global checkpoint can advance and the duplicate flood stops. That interim fix has a known trade-off — a persistently-failing host's meetings for the current window are not captured — which this issue's per-host approach would eliminate. Happy to implement the per-host version if the maintainers agree on the direction.