Observability
This page documents Orleans.Lattice.Scaling 9.9.0, in the documentation for Orleans.Lattice 9.9.0 (release line 9.9), built 2026-10-04. It is also published as markdown, with every table and list, at observability.md, and llms.txt lists every page.The Orleans.Lattice.Scaling package emits its signal as OpenTelemetry metrics
on a dedicated meter and ships a bundled Grafana dashboard, so the same scale
value the HTTP endpoint serves can be scraped by Prometheus and charted
alongside the rest of the cluster's telemetry.
The orleans.lattice.scaling meter
LatticeScalingMetrics.MeterName is orleans.lattice.scaling. Every instrument
is an observable gauge published from the cached ScalingSignal on the silo's
sampling timer, so scraping them is as cheap as scraping the HTTP endpoint - the
gauge callbacks read a published scalar and never recompute the signal.
| Instrument | Unit | Source |
|---|---|---|
orleans.lattice.scaling.scale_value |
{replica} |
ScalingSignal.ScaleValue (the value an autoscaler acts on) |
orleans.lattice.scaling.raw_scale_value |
{replica} |
ScalingSignal.RawScaleValue (before smoothing and gating) |
orleans.lattice.scaling.compute.activation_pressure |
1 |
ComputePressure.Activation |
orleans.lattice.scaling.compute.resource_pressure |
1 |
ComputePressure.Resource |
orleans.lattice.scaling.compute.wal_dispatch_pressure |
1 |
ComputePressure.WalDispatch |
orleans.lattice.scaling.compute.replicas |
{replica} |
ScalingSignal.RecommendedReplicas |
orleans.lattice.scaling.storage.accounts_over_threshold |
{account} |
count of over-threshold WalAccountPressure entries |
orleans.lattice.scaling.storage.rebalance_recommendations |
1 |
1 when a rebalance is recommended, else 0 |
Every series carries a single tag, the repository-wide derived tenant
dimension, fixed to the platform sentinel _platform_: the signal is a
cluster-aggregate answer that belongs to no tenant. The three pressure gauges and
the two scale-value gauges report double values; the replica, account, and
recommendation gauges report long values.
The instrument-name constants are exposed on LatticeScalingMetrics
(ScaleValueName, RawScaleValueName, ComputeActivationPressureName, and so
on) so a MeterListener or a test can reference them without hard-coding
strings.
When these names are exported through the OpenTelemetry Prometheus exporter the
dots become underscores, so orleans.lattice.scaling.scale_value is scraped as
orleans_lattice_scaling_scale_value.
Reading the meter in-process
using System.Diagnostics.Metrics;
using Orleans.Lattice.Scaling;
var listener = new MeterListener();
listener.InstrumentPublished = (instrument, l) =>
{
if (instrument.Meter.Name == LatticeScalingMetrics.MeterName)
{
l.EnableMeasurementEvents(instrument);
}
};
listener.SetMeasurementEventCallback<double>((instrument, value, tags, state) =>
{
if (instrument.Name == LatticeScalingMetrics.ScaleValueName)
{
Console.WriteLine($"scaleValue={value}");
}
});
listener.Start();
listener.RecordObservableInstruments();
The bundled dashboard
Orleans.Lattice.Dashboards bundles an Autoscaling Signal Grafana dashboard
(LatticeDashboardKind.Scaling) with panels for the smoothed-versus-raw scale
value, compute pressure by dimension, the recommended replica count, WAL accounts
over threshold, and whether a rebalance is recommended. Every instrument on the
meter is charted by a panel; the mapping is recorded in
docs/lattice.dashboards/metrics-to-panel-map.md
and enforced by a coverage test in Orleans.Lattice.Scaling.Tests.
Load it the same way as the other bundled dashboards:
using Orleans.Lattice.Dashboards;
public static class ScalingDashboardLoader
{
public static string LoadScalingDashboard()
=> LatticeDashboards.GetGrafanaDashboardJson(LatticeDashboardKind.Scaling);
}