-
Notifications
You must be signed in to change notification settings - Fork 2
6. Custom dashboards
This guide covers the default dashboards provided by ServerPulse and how to create custom dashboards in Grafana for all supported platforms: Bukkit/Paper, Velocity, and Fabric.
ServerPulse provides pre-configured dashboards for each supported platform:
- Bukkit Server Metrics: TPS, memory, disk space, entities, chunks
- Bukkit Players and Ping: Player count and ping statistics
- Velocity System Metrics: Memory and disk usage
- Velocity Players and Ping: Player count and ping statistics
- Fabric Server Metrics: TPS, memory, disk space, entities, chunks
- Fabric Players and Ping: Player count and ping statistics
- In Grafana, click "+ New Dashboard"
- Click "Add visualization"
- Select "InfluxDB_v2_Flux" data source
- Create a basic query:
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "your_metric_here")
|> filter(fn: (r) => r.server == "your-server-name")
- TPS:
tps_1m
,tps_5m
,tps_15m
- World data:
entities_count
,loaded_chunks
- Memory:
used_memory
,available_memory
- Disk:
total_disk_space
,usable_disk_space
- Players:
players_online
- Ping:
min_ping
,max_ping
,avg_ping
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "tps_1m")
|> filter(fn: (r) => r.server == "your-server-name")
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "players_online")
|> filter(fn: (r) => r.server == "your-server-name")
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "used_memory")
|> filter(fn: (r) => r.server == "your-server-name")
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "avg_ping")
|> filter(fn: (r) => r.server == "your-server-name")
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "entities_count")
|> filter(fn: (r) => r.world != "")
|> filter(fn: (r) => r.server == "your-server-name")
To show metrics from multiple servers:
-
Add a dashboard variable:
- Click the gear icon (Dashboard settings)
- Select "Variables"
- Click "Add variable"
- Set Name:
server
- Set Type:
Query
- Set Data source:
InfluxDB_v2_Flux
- Set Query:
import "influxdata/influxdb/schema" schema.measurementTagValues( bucket: "metrics_db", measurement: "minecraft_stats", tag: "server" )
- Click "Update" and "Save dashboard"
-
In your queries, replace the server name with the variable:
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "players_online")
|> filter(fn: (r) => r.server == "${server}")
You can create a dashboard that compares metrics across different platforms. Here's an example query that shows TPS for all Bukkit and Fabric servers:
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "tps_1m")
|> filter(fn: (r) => r.server =~ /^(bed|fabric)/)
For Bukkit/Paper and Fabric, you can create a dashboard focusing on specific worlds:
-
Add a world variable:
- Create a variable named
world
- Use this query:
import "influxdata/influxdb/schema" schema.measurementTagValues( bucket: "metrics_db", measurement: "minecraft_stats", tag: "world" )
- Create a variable named
-
Create queries that filter by world:
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "entities_count")
|> filter(fn: (r) => r.world == "${world}")
|> filter(fn: (r) => r.server == "${server}")
You can add annotations to mark important events:
- Create a new annotation in Grafana
- Add a query to detect when TPS drops below a threshold:
from(bucket: "metrics_db")
|> range(start: v.timeRangeStart)
|> filter(fn: (r) => r._measurement == "minecraft_stats")
|> filter(fn: (r) => r._field == "tps_1m")
|> filter(fn: (r) => r.server == "${server}")
|> filter(fn: (r) => r._value < 15)
To create an alert when metrics reach critical values:
- Edit a panel
- Go to "Alert" tab
- Click "Create Alert Rule"
- Configure conditions (e.g., alert when TPS < 15 for 5 minutes)
- Gauge: Great for current TPS or memory usage
- Stat: Shows single values like player count
- Time Series: For tracking metrics over time
- Bar Gauge: Comparing values across servers
- Heatmap: Visualizing ping distribution
A complete dashboard might include:
- Header Row: Server selector and key stats (online players, TPS status)
-
Performance Row:
- TPS graphs for Bukkit/Paper and Fabric servers
- Memory usage for all servers
- Disk space remaining
-
Players Row:
- Player count across all platforms
- Ping statistics
-
Per-World Row (for Bukkit/Paper and Fabric):
- Entity counts
- Chunk loading
To share your custom dashboard:
- Click the share icon in the dashboard
- Select "Export" tab
- Click "Save to file"
- The JSON file can be imported to other Grafana instances
- No data points: Check server tags in configuration
- Missing metrics: Verify the platform supports that metric
- Query errors: Ensure field names are correct (case sensitive)
- Server not appearing in variables: Check if the server is sending data