Search before asking
What happened
Description:
The Rootly plugin collects incidents by filtering per-service using filter[service_ids]. However, in practice many (or all) Rootly incidents are created without service associations. This causes three compounding issues that silently discard valid incidents:
Bug 1 — Collector always sends service filter
buildIncidentsQuery always appends filter[service_ids]= to every API request. The Rootly API returns 0 results for incidents with no service tag, so untagged incidents are never stored in the raw table.
Bug 2 — ValidateTaskOptions rejects empty ServiceId
There is no way to trigger a global (unfiltered) collection because an empty serviceId returns a validation error: "not enough info for Rootly execution".
Bug 3 — Extractor service-membership guard drops incidents when ServiceId is empty
In extractRootlyIncident, there is a safety check that filters out any incident whose service list doesn't contain the current ServiceId. When ServiceId == "", containsServiceId always returns false, so any incident that does have service relationships attached gets dropped as a false positive.
Impact:
- Any incident not tagged with a specific service is permanently lost — never reaches the tool layer or domain layer
What do you expect to happen
Allow ServiceId to be empty (opt-in global collection)
Skip filter[service_ids] in buildIncidentsQuery when ServiceId is empty
Skip the extractor service-membership guard when collecting globally
How to reproduce
- Create a Rootly incident without associating it to any service
- Run the Rootly collector for any service scope
- The incident does not appear in _tool_rootly_incidents or the incidents domain table
Anything else
No response
Version
v1.0.3-beta12
Are you willing to submit PR?
Code of Conduct
Search before asking
What happened
Description:
The Rootly plugin collects incidents by filtering per-service using filter[service_ids]. However, in practice many (or all) Rootly incidents are created without service associations. This causes three compounding issues that silently discard valid incidents:
Bug 1 — Collector always sends service filter
buildIncidentsQuery always appends filter[service_ids]= to every API request. The Rootly API returns 0 results for incidents with no service tag, so untagged incidents are never stored in the raw table.
Bug 2 — ValidateTaskOptions rejects empty ServiceId
There is no way to trigger a global (unfiltered) collection because an empty serviceId returns a validation error: "not enough info for Rootly execution".
Bug 3 — Extractor service-membership guard drops incidents when ServiceId is empty
In extractRootlyIncident, there is a safety check that filters out any incident whose service list doesn't contain the current ServiceId. When ServiceId == "", containsServiceId always returns false, so any incident that does have service relationships attached gets dropped as a false positive.
Impact:
What do you expect to happen
Allow ServiceId to be empty (opt-in global collection)
Skip filter[service_ids] in buildIncidentsQuery when ServiceId is empty
Skip the extractor service-membership guard when collecting globally
How to reproduce
Anything else
No response
Version
v1.0.3-beta12
Are you willing to submit PR?
Code of Conduct