Diagnostics
This page is part of 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 README.md, and llms.txt lists every page.What it shows
ILattice.DiagnoseAsync returns a point-in-time health snapshot of a tree without
touching application data paths. The report exposes the shard count, total live keys,
total tombstones, recent split activity, and a per-shard breakdown (B+ tree depth,
whether the root is a leaf, live keys, tombstones, tombstone ratio, read/write
counts, current ops/second and the window it is measured over, whether a split
or a bulk load is in flight, and whether the shard could not be sampled - a shard
whose sample failed reports zero for every count because nothing was measured).
This sample writes ten keys, deletes three (leaving tombstones), then prints a deep
snapshot. Both report depths walk each shard's leaf chain: a deep report reads each
leaf's full statistics, so tombstone counts are exact, while a shallow report counts
only live keys and reports zero tombstones.
Run it
dotnet run --project samples/Diagnostics
Expected output
Each key is routed to its shard by a stable hash of the key, so the shard indices
below are the same on every run; the sampled timestamp and the ops/s values (which
depend on timing) vary between runs. The totals - 7 live keys and 3 tombstones after
10 writes and 3 deletes - are deterministic.
Silo starting... ready.
Writing 10 keys, then deleting 3 (leaving tombstones)...
Tree 'inventory' health snapshot (sampled 2026-07-02T18:34:14.5400810+00:00):
Deep report: True
Shard count: 64 (of 4096 virtual slots)
Total live keys: 7
Total tombstones: 3
Recent splits: 0
Per-shard breakdown (shards with activity only):
shard 13: depth=1 rootIsLeaf=True live=1 tombstones=0 ratio=0.00 reads=0 writes=1 ops/s=11.4
shard 14: depth=1 rootIsLeaf=True live=0 tombstones=1 ratio=1.00 reads=0 writes=2 ops/s=17.8
shard 15: depth=1 rootIsLeaf=True live=1 tombstones=0 ratio=0.00 reads=0 writes=1 ops/s=12.1
shard 19: depth=1 rootIsLeaf=True live=0 tombstones=1 ratio=1.00 reads=0 writes=2 ops/s=29.9
shard 21: depth=1 rootIsLeaf=True live=1 tombstones=0 ratio=0.00 reads=0 writes=1 ops/s=16.0
shard 26: depth=1 rootIsLeaf=True live=1 tombstones=0 ratio=0.00 reads=0 writes=1 ops/s=17.0
shard 35: depth=1 rootIsLeaf=True live=0 tombstones=1 ratio=1.00 reads=0 writes=2 ops/s=25.3
shard 43: depth=1 rootIsLeaf=True live=1 tombstones=0 ratio=0.00 reads=0 writes=1 ops/s=13.5
shard 62: depth=1 rootIsLeaf=True live=1 tombstones=0 ratio=0.00 reads=0 writes=1 ops/s=13.1
shard 63: depth=1 rootIsLeaf=True live=1 tombstones=0 ratio=0.00 reads=0 writes=1 ops/s=14.3
When to use
- Health probes and dashboards: poll
DiagnoseAsync(deep: false, ...)at a low rate to track live-key growth and per-shard hotness cheaply. A shallow report counts no tombstones, so tombstone counts and the tombstone ratio needdeep: true. - Post-mortem investigation: run
DiagnoseAsync(deep: true, ...)to get exact tombstone counts and B+ tree depth when diagnosing compaction or split behaviour.
When not to use
- Do not call
DiagnoseAsyncon the hot path or per request. It is an admin-rate API; every report walks each shard's leaf chain, and a deep report also reads full statistics from every leaf, so it is comparatively expensive. - Do not rely on
ops/sas a precise benchmark - it is a short-window hotness hint, not a load-test measurement.