Skip to content

Cover the full metric set in the dashboard and add a shareable export - #46

Merged
Pixnop merged 1 commit into
devfrom
feat/grafana-full-dashboard
Sep 2, 2026
Merged

Cover the full metric set in the dashboard and add a shareable export#46
Pixnop merged 1 commit into
devfrom
feat/grafana-full-dashboard

Conversation

@Pixnop

@Pixnop Pixnop commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes #45.

Th3Dilli was right that the dashboard read as unfinished. It had eight panels
against a metric set several times that size, so most of what the mod measures
had nowhere to show up.

The dashboard now runs top to bottom as a story about the server. A glance strip
of the numbers you check first, then tick health with p50/p95/p99 out of the
histogram and busy time drawn against the budget, players and ping and deaths,
chunks and entities with the per-code breakdown stacked, worldgen, network on
both the engine's per-second families and the byte totals so TCP and UDP are
both visible, then suspends, engine warnings and log levels, and a runtime row
for the dotnet_* families. 33 data panels across 8 rows, up from 8 panels.

Panels whose families are conditional say so in their own description. Someone
staring at an empty graph should learn from the panel that it needs the engine
probe, or RuntimeMetrics, instead of concluding the mod is broken. The same
goes for the numbers that need interpreting: busy time meeting the budget is a
saturated server, and the suspend seconds are the freeze players actually feel
during an autosave.

pulse-overview-shared.json is the second ask. Same dashboard in
export-for-sharing form, so Grafana's import dialog asks which Prometheus to
bind rather than handing you 33 panels wired to the uid pulse-prom, which
exists only on a Grafana provisioned from this directory. It is generated by
make-shared.py rather than kept in sync by hand; the README says so, in the
hope that nobody edits it directly.

check-dashboard.py covers the failure mode with no error message. Overlapping
panels, a panel running past the 24 column grid and duplicate panel ids all get
drawn wrong or dropped without Grafana saying a word, which is a miserable thing
to chase by eye. Stdlib only, like the generator.

Checked rather than assumed:

  • Both files pass check-dashboard.py, and the checker was itself run against a
    deliberately broken dashboard to confirm it catches all five violations rather
    than always printing ok.
  • All 45 PromQL expressions parse, via promtool check rules over a generated
    rule file.
  • Metric and label names come from the source, not from memory. The dotnet_*
    names in particular were taken by enumerating the real System.Runtime meter
    and pushing the names through the same mapping PrometheusText.MetricName
    applies, which is where dotnet_thread_pool_queue_length_total gets its
    _total.
  • Grafana 13.2.0 provisioned the dashboard from these files and loaded all 41
    panels with no errors, and the shared file imported cleanly through
    /api/dashboards/import with every datasource reference resolved.
  • Regenerating the shared file leaves the tree clean, so the committed copy is
    exactly what the script produces.

Left out on purpose: no template variables, since there is one server per
scrape target here and a datasource picker would just be one more thing to
get wrong on import. No alert rules either, contrib/alerts already owns those.

The dashboard showed eight panels out of a much larger metric set, so most of
what the mod measures had nowhere to appear. It now runs top to bottom as a
story about the server: a glance strip, tick health with the histogram
quantiles and busy time against the budget, players and ping, world and
entity breakdown, worldgen, network on both the per-second families and the
byte totals, suspends and warnings and log levels, and a runtime row for the
dotnet_* families.

Panels whose families are conditional say so in their description. Someone
looking at an empty graph should learn that it needs the engine probe, or
RuntimeMetrics, rather than assume the mod is broken.

The second file is the same dashboard in export-for-sharing form, so an
outsider can import it and be asked for a datasource instead of inheriting
the uid pulse-prom that only exists here. It is generated by make-shared.py
rather than kept in sync by hand.

check-dashboard.py covers the failure mode that has no error message:
overlapping panels, a panel past the 24 column grid, and duplicate ids all
render wrong without Grafana saying a word.
@Pixnop
Pixnop merged commit 5e8754c into dev Sep 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant