How it works
- You create a Telemetry registry from the SDK and define metrics (Counter, Gauge, Histogram, Summary).
- Each metric pushes samples into a small client-side buffer.
- Zyntex flushes that buffer automatically every
flushEveryseconds (default 10s) or when you call:flush()manually.
The ingestion limit is 1 flush per 9 seconds per server. The default flush period (10s) keeps you under this limit.
Plans, retention & resolution
Telemetry samples are retained according to your plan:- Free: 1 day
- Standard: 7 days
- Business: 30 days
Zyntex may downsample/aggregate visually for longer time ranges in dashboards. Raw sample retention follows the limits above.
Labels & cardinality
- No enforced label limits – but keep label cardinality reasonable for fast queries and clean charts.
- Zyntex automatically injects a
server_idlabel for every telemetry sample.
Query language (Mini‑PromQL)
Zyntex supports a simplified PromQL (“Mini‑PromQL”) with most operators you need for game metrics. If you know PromQL, this will feel familiar. See the full PromQL docs here: PromQL documentation. Supported aggregates:sum, avg, min, max (with optional by(...) / without(...)).
Functions: rate, avg_over_time, sum_over_time, min_over_time, max_over_time, topk, bottomk, histogram_quantile.
Selectors: instant vectors like metric{label="value"} and range vectors like metric{label="value"}[5m].
Examples
Mini‑PromQL intentionally omits some advanced PromQL features to keep queries fast and simple, while covering common game‑telemetry needs.
Metrics at a glance
- Counter: Monotonically increasing totals (e.g.,
players_joined_total,robux_spent_total). - Gauge: Values that go up/down (e.g.,
cpu_utilisation_percent,server_health_percent). - Histogram: Distributions with optional buckets (e.g., ping, damage). If you omit
buckets, Zyntex applies backend bucketing that may evolve over time. - Summary: Distribution summaries optimized for percentiles (p50/p90/p99).
Naming: Prefer
snake_case and include units, e.g. server_uptime_seconds_total, ping_milliseconds. Use labels (e.g., {region="NA"}) for slicing.