Metrics
Every family VaniaMetrics can publish, read from the sources of each repository. Names follow mc_<domain>_<subject>[_<unit>]: the domain says where a value comes from, base units are used (seconds, bytes), counters end in _total. A family a platform cannot provide is left out, never published as zero.
Core
Published by the core as soon as it runs, on every platform that can provide them.
mc_server_* — Game server
Ticks, players, connections, commands, blocks.
mc_server_blocks_totalcounteractionBlocks broken and placed. action = break|place.
mc_server_chat_messages_totalcounterChat messages.
mc_server_commands_totalcountercommandCommands run. The label is limited to a fixed list of commands, everything else is "other", to bound cardinality.
mc_server_connections_totalcounterresultJoins and quits. result = join|quit.
mc_server_deaths_totalcountercausePlayer deaths, by cause.
mc_server_items_crafted_totalcounterItems crafted.
mc_server_mob_deaths_totalcounterentity_typeMobs killed. Only kills BY A PLAYER count: a skeleton burning in the sun says nothing about server activity.
mc_server_player_ping_secondsgaugeplayeruuidPing of an online player.
mc_server_player_playtime_secondsgaugeplayeruuidTotal playtime of an online player.
mc_server_player_statisticgaugeplayeruuidstatisticA vanilla statistic, per player. Published while the player is online, which is enough since nothing happens offline.
mc_server_player_statisticsgaugestatisticSum of a vanilla statistic over ONLINE players. Drops when they leave: a gauge, not a counter.
mc_server_players_by_brandgaugebrandPlayers by advertised client brand. A mod can fake it: it describes honest players, not cheaters.
mc_server_players_by_localegaugelocalePlayers by client locale.
mc_server_players_maxgaugePlayer slots advertised by the server.
mc_server_players_onlinegaugeOnline players.
mc_server_players_ping_secondshistogramPing distribution of online players.
mc_server_playtime_seconds_totalcounterCumulative playtime of all online players.
mc_server_session_secondshistogramSession length, measured on quit.
mc_server_tick_average_secondsgaugeAverage tick duration, as computed by the server.
mc_server_tick_duration_secondshistogramTick duration distribution. 0.05 s is the threshold: above it the server falls behind. This is THE alerting signal.
mc_server_ticks_totalcounterTicks since startup.
mc_server_tpsgaugewindowTicks per second, capped at 20. window = 1m|5m|15m. Do NOT alert on it: it only moves once the server is already behind.
mc_world_* — Worlds
Entities, chunks, tile entities, time and weather.
mc_world_chunks_loadedgaugeworldLoaded chunks.
mc_world_entitiesgaugeworldLoaded entities.
mc_world_entities_by_typegaugeworldentity_typeEntities by type. Collected in the background, and only types above the threshold are published, to keep cardinality bounded.
mc_world_playersgaugeworldPlayers in the world.
mc_world_tile_entitiesgaugeworldLoaded tile entities: chests, furnaces, hoppers. Hoppers are the first cause of heavy ticks on a build server.
mc_world_time_ticksgaugeworldWorld time, in ticks.
mc_world_weathergaugeworldWeather. 0 = clear, 1 = rain, 2 = thunder.
mc_proxy_* — Proxy
Players, backend servers, pings and switches.
mc_proxy_backend_max_playersgaugeserverPlayer slots advertised by the backend in its ping response.
mc_proxy_backend_ping_secondsgaugeserverBackend ping response time, as seen from the proxy.
mc_proxy_backend_playersgaugeserverPlayers per backend server.
mc_proxy_backend_upgaugeserver1 if the backend answers the ping, 0 otherwise. The only outside view: a server that is down no longer publishes its own metrics.
mc_proxy_connections_totalcounterresultConnection attempts. result = pre_login|login|disconnect.
mc_proxy_kicks_from_server_totalcounterserverPlayers kicked by a backend server.
mc_proxy_pings_totalcounterServer list pings: clients LOOKING at the server without joining. A measure of attention, not load.
mc_proxy_player_ping_secondshistogramPing distribution between players and the proxy.
mc_proxy_players_by_brandgaugebrandPlayers by advertised client brand.
mc_proxy_players_onlinegaugePlayers connected to the proxy.
mc_proxy_server_switches_totalcounterfromtoMoves from one server to another. from = "none" on first connection.
mc_bedrock_* — Bedrock players
Published by the Geyser extension.
mc_bedrock_players_by_devicegaugedeviceBedrock players by device (android, ios, windows, xbox, ps4, nx...).
mc_bedrock_players_by_inputgaugeinputBedrock players by input mode (keyboard_mouse, touch, controller, vr).
mc_bedrock_players_linkedgaugeBedrock players whose account is linked to a Java account.
mc_jvm_* — JVM
Memory, garbage collection, threads.
mc_jvm_buffer_pool_bytesgaugepoolstateOff-heap buffers. They count toward CONTAINER memory but not the heap, a classic cause of unexplained OOM kills.
mc_jvm_classes_loadedgaugeLoaded classes.
mc_jvm_gc_collections_totalcountergcCollections run, per garbage collector.
mc_jvm_gc_seconds_totalcountergcCumulative collection time. This is collection time, NOT stop-the-world time; for actual pauses use JFR or GC logs.
mc_jvm_memory_bytesgaugeareastateJVM memory. area = heap|nonheap, state = used|committed|max|init.
mc_jvm_memory_pool_bytesgaugepoolstateMemory per garbage collector pool (Eden, Survivor, Old, Metaspace).
mc_jvm_threadsgaugestateJVM threads. state = live|daemon|peak|started.
mc_jvm_threads_deadlockedgaugeDeadlocked threads. Any non-zero value is an incident.
mc_jvm_uptime_secondsgaugeTime since the JVM started.
mc_host_* — Host
CPU, throttling, memory, disk and I/O of the container, read from cgroup v2.
mc_host_cpu_periods_totalcounterElapsed scheduling periods. The ratio with throttled_periods gives the share of throttled time.
mc_host_cpu_quota_coresgaugeCPU quota, in cores. NaN when no limit is set, in which case throttling cannot happen.
mc_host_cpu_system_seconds_totalcounterCPU time in kernel space.
mc_host_cpu_throttled_periods_totalcounterPeriods during which the kernel FROZE the container for lack of quota. A rising value explains low TPS that spark does not see.
mc_host_cpu_throttled_seconds_totalcounterTotal time spent frozen by the kernel.
mc_host_cpu_usage_seconds_totalcounterCPU time used by the container.
mc_host_cpu_user_seconds_totalcounterCPU time in user space.
mc_host_disk_filesgaugepathNumber of files under the path.
mc_host_disk_free_bytesgaugepathFree space on the mount point.
mc_host_disk_total_bytesgaugepathSize of the mount point.
mc_host_disk_usage_bytesgaugepathSize of the contents, computed by walking the tree. Measured in the background, never on scrape.
mc_host_io_bytes_totalcounterdeviceoperationBytes read and written, per device.
mc_host_io_operations_totalcounterdeviceoperationDisk operations, per device.
mc_host_memory_bytesgaugetypeMemory breakdown. type = anon|file|kernel|sock.
mc_host_memory_limit_bytesgaugeContainer memory limit.
mc_host_memory_oom_events_totalcountertypeOut-of-memory events. type = oom (allocation refused) | oom_kill (process killed). The latter is always an incident.
mc_host_memory_page_faults_totalcountertypePage faults. type = minor|major.
mc_host_memory_usage_bytesgaugeMemory used by the CONTAINER, JVM heap included.
mc_exporter_* — Exporter
The health of the exporter and of every collector.
mc_exporter_background_task_age_secondsgaugecollectorAge of a background collector's last successful run. Tells "nothing changes" apart from "nothing is measuring".
mc_exporter_collector_duration_secondshistogramcollectorDuration of one collection, per collector.
mc_exporter_collector_infogaugecollectorsourcemodeAlways 1, one per active collector. source is where its numbers come from: "core" for what the server exposes itself, otherwise the plugin name.
mc_exporter_player_series_droppedgaugePlayers whose detail is NOT published because of the collector.players.max_series cap. A non-zero value means per-player metrics are incomplete.
mc_exporter_scrape_duration_secondshistogramTime spent answering a scrape. If this grows, the exporter is the problem.
mc_exporter_scrape_errors_totalcountercollectorCollections that threw. A failing collector does not stop the others.
mc_exporter_upgauge1 once the exporter has finished starting.
mc_build_* — Build
What is running.
mc_build_infogaugeversionplatformserver_versionserverAlways 1. The version is in the labels, the Prometheus idiom for publishing a string.
Collectors
Published once the collector's jar is installed next to its target plugin.
BetonQuest
mc_quest_conversations_totalcounterConversations started with an NPC.
mc_quest_journal_entries_totalcounterJournal entries written.
mc_quest_player_pointsgaugeplayeruuidcategoryQuest points for an online player, by category. For a skull hunt, category = skulls gives the number of skulls found.
mc_quest_player_tagsgaugeplayeruuidTags added to a player SINCE THEY CONNECTED. Not their lifetime total: the collector doesn't read the database, only what happened while it was watching.
mc_quest_tags_removed_totalcountertagTags removed. A progress reset shows up here.
mc_quest_tags_totalcountertagTags added since startup. For skull hunts, tag = found_<key>: this is THE metric for finds.
Chunky
mc_pregen_chunks_donegaugeworldChunks generated for the current task.
mc_pregen_chunks_totalgaugeworldChunks to generate for the current task.
mc_pregen_progress_ratiogaugeworldPregeneration progress, from 0 to 1. Absent when nothing is running.
mc_pregen_tasks_finished_totalcounterworldPregenerations completed.
EssentialsX (+ VaultUnlocked 2.20.3)
mc_economy_accountsgaugecurrencyAccounts with a balance.
mc_economy_balancegaugecurrencyquantileBalance distribution. quantile = p50|p90|p99|max.
mc_economy_cache_age_secondsgaugecurrencyAge of EssentialsX's ranking cache. If it keeps rising, the displayed total is stale.
mc_economy_ginigaugecurrencyWealth concentration, from 0 (equal) to 1 (one holder).
mc_economy_totalgaugecurrencyMoney in circulation, across all accounts.
mc_server_players_afkgaugePlayers connected but idle.
mc_server_players_afk_secondshistogramHow long they've been idle. Distinguishes "three players away for two minutes" from "three players away for six hours".
ExcellentEconomy
mc_economy_flow_totalcountercurrencydirectionAmounts moved, as absolute values. direction = in|out. The ratio of the two tells whether the economy is creating or destroying currency.
mc_economy_player_balancegaugeplayeruuidcurrencyBalance of an online player. Updated by event, so accurate to the second — no database reads.
mc_economy_transactions_totalcountercurrencytypeAccount movements. type = deposit|withdraw.
GrimAC
mc_anticheat_flags_totalcountercheckViolations flagged by GrimAC, per check. Its RATE is the signal: a few scattered flags are normal, a burst on the same check is not.
mc_anticheat_setbacks_totalcountercheckViolations that caused a player SETBACK — GrimAC actually corrected it, not just logged it.
mc_anticheat_violation_levelhistogramAccumulated violation level at the time of the flag. A rising level distinguishes an isolated incident from sustained behavior.
LuckPerms
mc_permission_group_weightgaugegroupA group's weight, as LuckPerms uses it to resolve conflicts.
mc_permission_groupsgaugeDeclared groups.
mc_permission_online_by_groupgaugegroupPlayers ONLINE by primary group. For the offline total, see the sql module — the API can't count without loading everything.
mc_permission_tracksgaugeDeclared promotion tracks.
mc_permission_usersgaugeUsers known to LuckPerms. Scans the table: collected in the background.
Multiverse-Core
mc_multiverse_world_infogaugeworldaliasenvironmentdifficultyAlways 1. The world's characteristics are in the labels.
mc_multiverse_world_loadedgaugeworld1 if the world is loaded, 0 if it is declared but absent from memory. A world thought to be loaded that isn't is a silent outage.
mc_multiverse_worldsgaugestateWorlds declared in Multiverse. state = loaded|unloaded.
Multiverse-Inventories
mc_inventory_switches_totalcountercauseInventory switches. cause = world|gamemode. Each one reads and writes a profile to disk: it's also a load indicator.
Multiverse-Portals
mc_portal_uses_totalcounterfrom_worldPortal traversals, by departure world.
MythicMobs
mc_mob_deaths_totalcountermob_typekillerCustom mobs killed. "killer" distinguishes the player from everything else — a mob killed by the environment is not content being played.
mc_mob_despawns_totalcountermob_typeCustom mobs despawned WITHOUT being killed: chunk unload, entity limit, cleanup. A high ratio against spawns signals wasted work.
mc_mob_spawns_totalcountermob_typeCustom mobs spawned.
Nova
mc_nova_tile_entitiesgaugeworldNova machines placed, per world. These are what consume tick time — a rising number explains a rising MSPT.
PacketEvents
mc_network_packets_totalcounterdirectionpacket_typePackets crossing the server. direction = in|out. packet_type is bounded by collector.packets.types; everything else falls into "other".
mc_network_players_by_protocolgaugeprotocolversion_namePlayers by protocol version. PacketEvents is the only one that knows it: org.bukkit.entity.Player doesn't expose it.
PhoenixCrates Lite
mc_crate_deliveries_totalcountersourceItem DELIVERIES, not items delivered: eight keys given at once count as one. "source" is key_grant, crate_grant or reward_grant. Only PHYSICAL keys go through here — granting a virtual key fires no event and only shows up as a jump in mc_crate_player_keys.
mc_crate_keysgaugevirtualKeys declared.
mc_crate_open_attempts_totalcountercrateOpens REQUESTED, whether they completed or not. Checks the invariant attempts = opens + failures; a gap means the plugin opened a crate without going through the normal path.
mc_crate_open_cooldown_secondsgaugecrateDelay imposed between two opens of the same crate.
mc_crate_open_costgaugecratecurrencyPrice of an open. "currency" is the configured cost engine, which leaves the door open to multiple currencies, as with the economy module.
mc_crate_open_failures_totalcountercratereasonOpens refused. "reason" is INFERRED from the player's state at the time of the request, since the plugin only returns a translated message: cooldown, no_key, money, cancelled, other.
mc_crate_opens_totalcountercrateOpens completed, across all players.
mc_crate_placements_totalcountercrateworldPhysical crates placed in the world.
mc_crate_player_cooldown_secondsgaugeplayeruuidcrateTime REMAINING before a player can reopen a crate. Zero if they can open right away.
mc_crate_player_keysgaugeplayeruuidkeyVIRTUAL keys in stock for a connected player. Physical keys are in their inventory and are not counted here.
mc_crate_player_opensgaugeplayeruuidcrateA player's opens EVER, by crate type. Persisted by the plugin: the only metric in this module that doesn't reset to zero on restart.
mc_crate_player_opens_totalcounterplayeruuidcrateOpens completed, per player and per crate. Counts SINCE THE EXPORTER STARTED; for the all-time total, see mc_crate_player_opens, which the plugin persists.
mc_crate_player_reward_winsgaugeplayeruuidrewardHow many times a player has won a given reward, ever. WITHOUT a "crate" label: the plugin indexes these wins by reward identifier ALONE, so two crates that both name a reward "diamond" share the counter. That's not a design choice, it's what the data allows.
mc_crate_previews_totalcountercratePreviews opened without opening the crate: interest that doesn't convert.
mc_crate_reward_candidatesgaugecrateRewards actually in play at the last draw. Lower than crate_rewards_configured when win limits or permissions removed rewards: this is what explains why a player can no longer win a reward they already got.
mc_crate_reward_expected_ratiogaugecraterewardEXPECTED probability of a reward, between 0 and 1, normalized BY US (weight / sum of weights). Describes the draw's configuration, not the effective odds: guaranteed rewards, win limits and permissions are applied on top of it.
mc_crate_reward_required_keysgaugecraterewardKeys required to be eligible for a reward. This is the ONLY notion of rarity the plugin has: there is no getRarity() in its API.
mc_crate_reward_weightgaugecraterewardRaw weight of a reward in the draw. This is NOT a percentage.
mc_crate_reward_win_limitgaugecraterewardMaximum number of times a reward can be won. NEGATIVE means unlimited: -1 is what the plugin returns, observed on its sample crates, not 0 as one might assume.
mc_crate_rewards_configuredgaugecrateRewards declared on a crate. The Lite edition caps this at 5: this gauge says when that cap is hit.
mc_crate_rewards_totalcountercraterewardalternativeRewards actually HANDED OUT. "alternative" distinguishes the consolation reward from the drawn one.
mc_crate_selective_confirms_totalcountercraterewardChoices confirmed in selective mode, where the player picks their reward.
mc_crate_typesgaugeenabledCrate types declared.
PlaceholderAPI
mc_placeholder_valuegaugeplaceholderValue of a placeholder, relayed as-is. Only what converts to a number is published — the rest is reported once then ignored.
spark
mc_spark_allocation_bytes_per_secondgaugewindowquantileMemory allocation rate. It's not the memory that's OCCUPIED that causes stutters, it's the rate at which it's requested: every gigabyte allocated ends up collected, hence a micro-pause.
mc_spark_cpu_ratiogaugesourcewindowCPU load, from 0 to 1. source = process|system.
mc_spark_gc_average_frequency_secondsgaugegcAverage time between two collections. Short = the heap fills up fast.
mc_spark_gc_average_secondsgaugegcAverage duration of a collection, per garbage collector.
mc_spark_player_ping_secondsgaugewindowquantilePlayer ping aggregated by spark. quantile = min|mean|median|p95|max.
mc_spark_tick_duration_secondsgaugewindowquantileTick duration as seen by spark. quantile = min|mean|median|p95|max. Gauges frozen on spark's windows: for a real histogram, see mc_tick_duration_seconds.
mc_spark_tpsgaugewindowTPS as seen by spark. window = 5s|10s|1m|5m|15m.
WorldGuard
mc_region_countgaugeworldDeclared protected regions, per world.
mc_region_pvp_denied_totalcounterPlayer-vs-player attacks denied by a region. A FRICTION counter: if it climbs, players are fighting where they can't.