What the derived dependency graph would do to alerting, compared with the hand-authored one.
const url = 'https://example.com/api/v1/topology/shadow';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://example.com/api/v1/topology/shadow \ --header 'Authorization: Bearer <token>'This is the review surface for enabling derived suppression: would_suppress lists the active
alerts that would stop being raised, and unresolved_pools lists the pollers that have no place
in the graph yet. Both are computed on demand and neither affects alerting.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”The comparison between the manual and derived dependency graphs
What the derived dependency graph would do, against what the manual one does.
object
Nodes the derived graph treats as roots, because a poller sits on their segment.
How many nodes the derived graph gives at least one upstream.
Read with total_nodes: a low ratio means most of the fleet would keep alerting exactly as
it does now, which is usually the point rather than a problem.
Edges in the derived graph.
Edges in the hand-authored graph.
manual, shadow or derived.
When the mode was last changed (RFC 3339), or null if it never has been.
Parent edges only the derived graph has.
One node whose parent set differs between the two graphs.
object
The downstream node.
The upstream node.
Parent edges only the hand-authored graph has.
One node whose parent set differs between the two graphs.
object
The downstream node.
The upstream node.
Nodes an operator has excluded from derived suppression entirely.
A list rather than a count: the screen that shows the comparison is also where the exclusion is toggled, and a count cannot tell a row whether it is the excluded one. Bounded by what an operator typed in, not by the fleet.
Nodes in the inventory.
Poller ids that could not be placed, so an operator knows which to give an anchor.
Pools with at least one poller whose location could not be resolved.
Non-empty blocks derived. A pool with no anchor contributes no roots, so none of its
nodes would ever be suppressed while every screen showed the feature as on.
Active alerts the derived graph would suppress and the manual one does not.
The number to review before enabling derived: each of these is an alert that would stop
being raised.
One node whose suppression would change if the deployment moved to the derived graph.
object
The node whose active alert is affected.
The node the derived graph blames, when it has one.
Active alerts the manual graph suppresses and the derived one would not — the noise direction.
One node whose suppression would change if the deployment moved to the derived graph.
object
The node whose active alert is affected.
The node the derived graph blames, when it has one.
Example
{ "mode": "manual"}No valid bearer token
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}Role lacks the view permission
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}Skeleton mode has no inventory to compare
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}