Nebula
Orchestrator

SaturationReport

The planner's answer to "why is this still hot?".

generated from the sources
public struct SaturationReport

The planner's answer to "why is this still hot?". Emitted when the busiest worker's load cannot be reduced by moving anything it holds, and read by WorkerScaler (which names it in ScaleDecision.Reason), by the dashboard, and by admission reporting, which groups the rows by ScopeKey. A report is a statement, never an action: Nebula does not split a container, and never breaks a group or a hold to relieve a worker (docs/cohesion-rebalancing.md, D5).

Fields

ContainerId

public string ContainerId;

The heaviest container of the item that cannot move: what the operator should look at first.

ScopeKey

public string ScopeKey;

The scope the container belongs to ("" for the public world), so the rows group per scope.

Containers

public string[] Containers;

Every container of the item, including ContainerId.

WorkerId

public string WorkerId;

The worker that is carrying it, or "" when the item has no owner.

Utilization

public float Utilization;

What the whole item costs its worker, in tick budgets (1 = a whole worker).

Cause

public SaturationCause Cause;

Which constraint stops the planner.

Reason

public string Reason;

The cause as a sentence: "cohesion 7 spans c0, c3", "held for another 4.2 s", "no boundary hint".

Methods

ToString

public override string ToString();

The short form the scaler appends to its blocked reason and the dashboard prints.

NameOf

public static string NameOf(SaturationCause cause);

The cause as it goes into JSON.

On this page