joshi425 / minecraft-exporter Goto Github PK
View Code? Open in Web Editor NEWthis is a prometheus minecraft exporter
this is a prometheus minecraft exporter
in the README command, I see that this exporter needs a world to work. I suppose that this is done to collect statistics.
In the case that I am only interested in TPS statistics, can you make an option so that access to a word is not required ?
Hello,
I'm a beginner with prometheus and I sought of all forums but i really don't know how link prometheus and minecraft-exporter on them...
minecraft-export work
prometheus work
how link ?
please help me :(
After the docker container has been running for a while (can take a few minutes or a few hours), I start getting 500 errors on 50% of requests to /metrics. A container restart fixes the issue, albeit temporarily.
According to container logs, it seems to be an index out of range error:
----------------------------------------
Exception happened during processing of request from ('192.168.1.51', 52292)
Traceback (most recent call last):
File "/usr/local/lib/python3.8/socketserver.py", line 683, in process_request_thread
self.finish_request(request, client_address)
File "/usr/local/lib/python3.8/socketserver.py", line 360, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/local/lib/python3.8/socketserver.py", line 747, in __init__
self.handle()
File "/usr/local/lib/python3.8/http/server.py", line 427, in handle
self.handle_one_request()
File "/usr/local/lib/python3.8/http/server.py", line 415, in handle_one_request
method()
File "/usr/local/lib/python3.8/site-packages/prometheus_client/exposition.py", line 152, in do_GET
output = encoder(registry)
File "/usr/local/lib/python3.8/site-packages/prometheus_client/openmetrics/exposition.py", line 14, in generate_latest
for metric in registry.collect():
File "/usr/local/lib/python3.8/site-packages/prometheus_client/registry.py", line 75, in collect
for metric in collector.collect():
File "minecraft_exporter.py", line 310, in collect
for metric in self.get_server_stats():
File "minecraft_exporter.py", line 88, in get_server_stats
overall_tps.add_sample('overall_tps',value=overallregex.findall(resp)[0][1],labels={})
IndexError: list index out of range
----------------------------------------
Hey!
What is this project licensed under? I wonder if i could reuse some of the code for my own project :)
Have a good one!
It will be good to add support for the Raspberry pi 4 model B assuming most Minecraft servers run on such things (mostly servers for friends/family)
While Docker is an easy way to deploy a software, it is hard to manage and keep secure.
As this is python it could easily be provided with a setup.py (python-setuptools) and thus be added to pypi. So you could easily install it to any other system without using docker.
Some metrics are not exported.
I'm using a vanilla Minecraft 1.20.1 server and the exporter in containers.
Especially TPS metrics are important to me.
Exporter ENV file:
RCON_HOST=minecraft-server
RCON_PORT=25575
RCON_PASSWORD=****
FORGE_SERVER=False
PAPER_SERVER=False
DYNMAP_ENABLED=False
Server shows RCON connection:
[18:14:57] [RCON Listener #1/INFO]: Thread RCON Client /172.18.0.4 started
Exporter logs:
RCON is enabled for minecraft-server
Successfully connected to RCON
Exporter started on Port 8000
Exporter excerpt:
# HELP python_gc_objects_collected_total Objects collected during gc
# TYPE python_gc_objects_collected_total counter
python_gc_objects_collected_total{generation="0"} 102.0
python_gc_objects_collected_total{generation="1"} 289.0
python_gc_objects_collected_total{generation="2"} 0.0
# HELP python_gc_objects_uncollectable_total Uncollectable object found during GC
# TYPE python_gc_objects_uncollectable_total counter
python_gc_objects_uncollectable_total{generation="0"} 0.0
python_gc_objects_uncollectable_total{generation="1"} 0.0
python_gc_objects_uncollectable_total{generation="2"} 0.0
# HELP python_gc_collections_total Number of times this generation was collected
# TYPE python_gc_collections_total counter
python_gc_collections_total{generation="0"} 57.0
python_gc_collections_total{generation="1"} 5.0
python_gc_collections_total{generation="2"} 0.0
# HELP python_info Python platform information
# TYPE python_info gauge
python_info{implementation="CPython",major="3",minor="10",patchlevel="7",version="3.10.7"} 1.0
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 3.0449664e+07
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 2.5112576e+07
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.68702569468e+09
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 0.79
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 7.0
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1.048576e+06
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
blocks_mined{block="minecraft:grass",player="Player"} 7.0
blocks_mined{block="minecraft:grass_block",player="Player"} 5.0
blocks_mined{block="minecraft:dirt",player="Player"} 2.0
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
blocks_picked_up{block="minecraft:wheat_seeds",player="Player"} 2.0
blocks_picked_up{block="minecraft:dirt",player="Player"} 7.0
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
player_deaths{player="Player"} 1.0
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
player_jumps{player="Player"} 37.0
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
cm_traveled{method="sprinting",player="Player"} 8028.0
cm_traveled{method="walking",player="Player"} 4921.0
cm_traveled{method="swimming",player="Player"} 384.0
cm_traveled{method="diving",player="Player"} 331.0
cm_traveled{method="falling",player="Player"} 1567.0
cm_traveled{method="flying",player="Player"} 7188.0
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="Player"} 0.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="Player"} 0.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="Player"} 20.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="Player"} 20.0
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="Player"} 0.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
damage_taken{player="Player"} 260.0
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
player_playtime{player="Player"} 16747.0
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="Player"} 11.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP mc_custom_total Custom Minecraft stat
# TYPE mc_custom_total counter
mc_custom{stat="minecraft:time_since_rest"} 15243.0
mc_custom{stat="minecraft:leave_game"} 2.0
mc_custom{stat="minecraft:time_since_death"} 15203.0
mc_custom{stat="minecraft:sneak_time"} 67.0
mc_custom{stat="minecraft:total_world_time"} 16747.0
mc_custom{stat="minecraft:drop"} 1.0
# HELP dim_tps_total TPS of a dimension
# TYPE dim_tps_total counter
# HELP dim_ticktime_total Time a Tick took in a Dimension
# TYPE dim_ticktime_total counter
# HELP overall_tps_total overall TPS
# TYPE overall_tps_total counter
# HELP overall_ticktime_total overall Ticktime
# TYPE overall_ticktime_total counter
# HELP player_online_total is 1 if player is online
# TYPE player_online_total counter
player_online{player="Player"} 1.0
# HELP entities_total type and count of active entites
# TYPE entities_total counter
# HELP paper_tps_1m_total 1 Minute TPS
# TYPE paper_tps_1m_total counter
# HELP paper_tps_5m_total 5 Minute TPS
# TYPE paper_tps_5m_total counter
# HELP paper_tps_15m_total 15 Minute TPS
# TYPE paper_tps_15m_total counter
The README.md mentions spam to the RCON, but I don't see any commands being executed, even when
broadcast-console-to-ops=true
broadcast-rcon-to-ops=true
are enabled.
There being no license means it is closed-source and no one can use your source code or contribute to it.
Hello,
Is there any plan to support 16.3 ? I have been using this exporter for a while on a pretty popular ATM6 server, but the integration with 16.3 is a bit problematic (CPU burst when it crashes or when I stop it).
Just curious to know if you are still developing here. If not no worries !
I have RCON configured:
- RCON_HOST=111.222.3.4
- RCON_PORT=25575
- RCON_PASSWORD=supersecretpassword
Here is what the end of the /metrics endpoint looks like:
# HELP dim_tps_total TPS of a dimension
# TYPE dim_tps_total counter
# HELP dim_ticktime_total Time a Tick took in a Dimension
# TYPE dim_ticktime_total counter
# HELP overall_tps_total overall TPS
# TYPE overall_tps_total counter
# HELP overall_ticktime_total overall Ticktime
# TYPE overall_ticktime_total counter
# HELP player_online_total is 1 if player is online
# TYPE player_online_total counter
player_online{player="ImaKlutz"} 1.0
# HELP entities_total type and count of active entites
# TYPE entities_total counter
# HELP paper_tps_1m_total 1 Minute TPS
# TYPE paper_tps_1m_total counter
# HELP paper_tps_5m_total 5 Minute TPS
# TYPE paper_tps_5m_total counter
# HELP paper_tps_15m_total 15 Minute TPS
# TYPE paper_tps_15m_total counter
Running container both through docker and through docker-compose doesn't seem to work properly.
Minecraft forge server version 12.2.2.
$ sudo docker run -e RCON_HOST=127.0.0.1 -e RCON_PORT=25575 -e RCON_PASSWORD="password" -e FORGE_SERVER="True" -p 9700:8000 -v /opt/minecraft/tekkit/world:/world joshi425/minecraft_exporter
version: '3.1'
services:
minecraft-exporter:
image: 'joshi425/minecraft_exporter'
environment:
RCON_HOST: localhost
RCON_PORT: 25575
RCON_PASSWORD: password
FORGE_SERVER: "True"
ports:
- 9700:8000
volumes:
- /opt/minecraft/tekkit/world:/world:ro
Both of these options return this:
RCON is enabled for 127.0.0.1
Traceback (most recent call last):
File "minecraft_exporter.py", line 302, in <module>
REGISTRY.register(MinecraftCollector())
File "/usr/local/lib/python3.8/site-packages/prometheus_client/registry.py", line 24, in register
names = self._get_names(collector)
File "/usr/local/lib/python3.8/site-packages/prometheus_client/registry.py", line 64, in _get_names
for metric in desc_func():
File "minecraft_exporter.py", line 291, in collect
for metric in self.update_metrics_for_player(player):
File "minecraft_exporter.py", line 153, in update_metrics_for_player
name = self.uuid_to_player(uuid)
File "minecraft_exporter.py", line 40, in uuid_to_player
self.map[uuid] = result.json()[-1]['name']
File "/usr/local/lib/python3.8/site-packages/requests/models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/local/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/local/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/lib/python3.8/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
I'm running 1.16.1 Paper and I'm getting all the usual stats except the RCON ones.
RCON seems to connect fine since I don't get any errors in the logs.
Hi, not all my metrics are exported on my 1.15.2 server, for example I can't see the online players and use the Player Stats dashboard.
Here is my /metrics dump:
# TYPE python_gc_objects_collected_total counter
python_gc_objects_collected_total{generation="0"} 98.0
python_gc_objects_collected_total{generation="1"} 257.0
python_gc_objects_collected_total{generation="2"} 0.0
# HELP python_gc_objects_uncollectable_total Uncollectable object found during GC
# TYPE python_gc_objects_uncollectable_total counter
python_gc_objects_uncollectable_total{generation="0"} 0.0
python_gc_objects_uncollectable_total{generation="1"} 0.0
python_gc_objects_uncollectable_total{generation="2"} 0.0
# HELP python_gc_collections_total Number of times this generation was collected
# TYPE python_gc_collections_total counter
python_gc_collections_total{generation="0"} 4240.0
python_gc_collections_total{generation="1"} 385.0
python_gc_collections_total{generation="2"} 35.0
# HELP python_info Python platform information
# TYPE python_info gauge
python_info{implementation="CPython",major="3",minor="8",patchlevel="2",version="3.8.2"} 1.0
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 2.9622272e+07
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 1.6920576e+07
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.58896752382e+09
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 19.169999999999998
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 9.0
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1.048576e+06
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="Chlorouquine"} 100.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="Chlorouquine"} 7.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="Chlorouquine"} 14.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="Chlorouquine"} 15.0
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="Chlorouquine"} 100.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="Chlorouquine"} 237.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="iRony7"} 92.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="iRony7"} 7.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="iRony7"} 20.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="iRony7"} 20.0
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="iRony7"} 92.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="iRony7"} 344.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="froit16"} 780.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="froit16"} 14.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="froit16"} 20.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="froit16"} 20.0
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="froit16"} 780.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="froit16"} 218.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="Xyoh_"} 418.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="Xyoh_"} 17.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="Xyoh_"} 20.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="Xyoh_"} 20.0
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="Xyoh_"} 418.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="Xyoh_"} 184.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="h0rperr"} 708.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="h0rperr"} 22.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="h0rperr"} 20.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="h0rperr"} 20.0
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="h0rperr"} 708.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="h0rperr"} 202.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="Sluber11"} 66.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="Sluber11"} 5.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="Sluber11"} 20.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="Sluber11"} 20.0
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="Sluber11"} 66.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="Sluber11"} 112.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="SargasmX"} 906.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="SargasmX"} 17.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="SargasmX"} 6.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="SargasmX"} 15.600003242492676
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="SargasmX"} 906.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="SargasmX"} 340.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP blocks_mined_total Blocks a Player mined
# TYPE blocks_mined_total counter
# HELP blocks_picked_up_total Blocks a Player picked up
# TYPE blocks_picked_up_total counter
# HELP player_deaths_total How often a Player died
# TYPE player_deaths_total counter
# HELP player_jumps_total How often a Player has jumped
# TYPE player_jumps_total counter
# HELP cm_traveled_total How many cm a Player traveled, whatever that means
# TYPE cm_traveled_total counter
# HELP player_xp_total_total How much total XP a player has
# TYPE player_xp_total_total counter
player_xp_total{player="Pyronimbus"} 1043.0
# HELP player_current_level_total How much current XP a player has
# TYPE player_current_level_total counter
player_current_level{player="Pyronimbus"} 21.0
# HELP player_food_level_total How much food the player currently has
# TYPE player_food_level_total counter
player_food_level{player="Pyronimbus"} 20.0
# HELP player_health_total How much Health the player currently has
# TYPE player_health_total counter
player_health{player="Pyronimbus"} 20.0
# HELP player_score_total The Score of the player
# TYPE player_score_total counter
player_score{player="Pyronimbus"} 1043.0
# HELP entities_killed_total Entities killed by player
# TYPE entities_killed_total counter
# HELP damage_taken_total Damage Taken by Player
# TYPE damage_taken_total counter
# HELP damage_dealt_total Damage dealt by Player
# TYPE damage_dealt_total counter
# HELP blocks_crafted_total Items a Player crafted
# TYPE blocks_crafted_total counter
# HELP player_playtime_total Time in Minutes a Player was online
# TYPE player_playtime_total counter
# HELP player_advancements_total Number of completed advances of a player
# TYPE player_advancements_total counter
player_advancements{player="Pyronimbus"} 277.0
# HELP player_slept_total Times a Player slept in a bed
# TYPE player_slept_total counter
# HELP player_used_crafting_table_total Times a Player used a Crafting Table
# TYPE player_used_crafting_table_total counter
# HELP player_quests_finished_total Number of quests a Player has finished
# TYPE player_quests_finished_total counter
# HELP dim_tps_total TPS of a dimension
# TYPE dim_tps_total counter
# HELP dim_ticktime_total Time a Tick took in a Dimension
# TYPE dim_ticktime_total counter
# HELP overall_tps_total overall TPS
# TYPE overall_tps_total counter
overall_tps 20.0
# HELP overall_ticktime_total overall Ticktime
# TYPE overall_ticktime_total counter
overall_ticktime 11.972
# HELP player_online_total is 1 if player is online
# TYPE player_online_total counter
# HELP entities_total type and count of active entites
# TYPE entities_total counter
entities{entity="minecraft:pig"} 67.0
entities{entity="minecraft:item"} 66.0
entities{entity="minecraft:chicken"} 51.0
entities{entity="minecraft:sheep"} 39.0
entities{entity="minecraft:skeleton"} 29.0
entities{entity="minecraft:bat"} 23.0
entities{entity="minecraft:zombie"} 22.0
entities{entity="minecraft:creeper"} 19.0
entities{entity="minecraft:wolf"} 17.0
entities{entity="minecraft:cow"} 12.0
entities{entity="minecraft:salmon"} 11.0
entities{entity="minecraft:chest_minecart"} 9.0
entities{entity="minecraft:bee"} 7.0
entities{entity="minecraft:squid"} 5.0
entities{entity="minecraft:donkey"} 4.0
entities{entity="minecraft:horse"} 4.0
entities{entity="minecraft:spider"} 4.0
entities{entity="minecraft:rabbit"} 3.0
entities{entity="minecraft:trader_llama"} 2.0
entities{entity="minecraft:enderman"} 1.0
entities{entity="minecraft:iron_golem"} 1.0
entities{entity="minecraft:player"} 1.0
entities{entity="minecraft:wandering_trader"} 1.0```
I'm using Purpur 1.20.1 with Application Management Panel and I have enabled the RCON port and everything configured correctly I believe. I just installed the docker a few minutes ago and set everything up, but I am getting no metrics from either the world and RCON.
I receive the error message mcrcon.MCRconException: Incorrect padding
(followed by at what line) after about 5 minutes of the docker container running. The full log is here. minecraft-exporter-log.txt. The full metrics it gives me at the IP http://192.168.1.100:5042/metrics
are here exporter-metrics.txt. Not really sure what else to do to make it work.
My docker container config look like this:
docker run
-d
--name='minecraft-exporter'
--net='dockernet'
-e TZ="America/New_York"
-e HOST_OS="Unraid"
-e HOST_HOSTNAME="Dragon"
-e HOST_CONTAINERNAME="minecraft-exporter"
-e 'RCON_HOST'='192.168.1.100'
-e 'RCON_PORT'='9940'
-e 'RCON_PASSWORD'='Password'
-e 'PAPER_SERVER'='True'
-e 'FORGE_SERVER'='False'
-e 'DYNMAP_ENABLED'='False'
-l net.unraid.docker.managed=dockerman
-p '5042:8000/tcp'
-v '/mnt/user/appdata/amp/instances/MineLime01/Minecraft/world/':'/world':'ro' 'joshi425/minecraft-exporter'
My Prometheus config looks like this:
- job_name: Minecraft Export
metrics_path: /metrics
static_configs:
- targets: ['192.168.1.100:5042']
Need to investigate why ghcr builds fail and work to fix them to enable use of ghcr.io registry.
For players who have had name changes, it it not reflected. Instead, the first username is always used
Example of name changes: https://api.mojang.com/user/profiles/6e8e4f6fa4144f13962c6d914363788a/names
minecraft-exporter/minecraft_exporter.py
Lines 31 to 33 in e120364
From this documentation: https://prometheus.io/docs/practices/naming/#metric-names
Should have a (single-word) application prefix relevant to the domain the metric belongs to.
I'm suggesting to add a minecraft_
prefix to every metric to follow Prometheus's best practices. Having this prefix would make it much easier to browse the exposed metrics.
For example:
player_score -> minecraft_player_score
damage_taken -> minecraft_player_damage_taken
mc_custom -> minecraft_custom
This is now erroring out :(
https://github.com/Joshi425/minecraft-exporter/blob/master/minecraft_exporter.py#L42-L52
https://help.minecraft.net/hc/en-us/articles/8969841895693-Username-History-API-Removal-FAQ-
It does look like the player name is located in the .dat file though. I'm currently digging through the nbt.py docs to see how to query it
The metrics you name are not documented, so I cannot know the amount of information that is actually exported.
For example, I didn't know it exported all the entity types separately until I looked at the example panels
Hi, I got some error when execute exporter
Docker version 19.03.2, build 6a30dfc
docker-compose version 1.24.1, build 4667896b
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
minecraft server version 1.15.2
$ docker-compose up
Recreating minecraft-exporter_minecraft-exporter_1 ... done
Attaching to minecraft-exporter_minecraft-exporter_1
minecraft-exporter_1 | RCON is enabled for 1.2.3.4
minecraft-exporter_1 | Traceback (most recent call last):
minecraft-exporter_1 | File "minecraft_exporter.py", line 199, in <module>
minecraft-exporter_1 | REGISTRY.register(MinecraftCollector())
minecraft-exporter_1 | File "/usr/local/lib/python3.8/site-packages/prometheus_client/registry.py", line 24, in register
minecraft-exporter_1 | names = self._get_names(collector)
minecraft-exporter_1 | File "/usr/local/lib/python3.8/site-packages/prometheus_client/registry.py", line 64, in _get_names
minecraft-exporter_1 | for metric in desc_func():
minecraft-exporter_1 | File "minecraft_exporter.py", line 190, in collect
minecraft-exporter_1 | for metric in self.update_metrics_for_player(player)+self.get_server_stats():
minecraft-exporter_1 | File "minecraft_exporter.py", line 106, in update_metrics_for_player
minecraft-exporter_1 | data = self.get_player_stats(uuid)
minecraft-exporter_1 | File "minecraft_exporter.py", line 98, in get_player_stats
minecraft-exporter_1 | if value["done"] == True:
minecraft-exporter_1 | TypeError: 'int' object is not subscriptable
minecraft-exporter_minecraft-exporter_1 exited with code 1
btw, there is a typo on first line in yours Dockerfile, should be FROM
not from
I noticed that in the README, your commands sets both PAPER_SERVER and FORGE_SERVER to true. But is it really possible for a server to be both a paper and forge server ?
Getting the following on my TNP Limitless 5 Curseforge pack server (MInecraft v1.18.2, forge v40.1.80):
2022-09-19 13:19:10 | RCON is enabled for tnp-minecraft-rcon.minecraft
2022-09-19 13:19:10 | Successfully connected to RCON
2022-09-19 13:19:10 | Exporter started on Port 8000
2022-09-19 13:19:13 | Traceback (most recent call last):
2022-09-19 13:19:13 | Traceback (most recent call last):
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/wsgiref/handlers.py", line 137, in run
2022-09-19 13:19:13 | self.result = application(self.environ, self.start_response)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/wsgiref/handlers.py", line 137, in run
2022-09-19 13:19:13 | self.result = application(self.environ, self.start_response)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 122, in prometheus_app
2022-09-19 13:19:13 | status, header, output = _bake_output(registry, accept_header, params)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 104, in _bake_output
2022-09-19 13:19:13 | output = encoder(registry)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 122, in prometheus_app
2022-09-19 13:19:13 | status, header, output = _bake_output(registry, accept_header, params)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 104, in _bake_output
2022-09-19 13:19:13 | output = encoder(registry)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 176, in generate_latest
2022-09-19 13:19:13 | for metric in registry.collect():
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 176, in generate_latest
2022-09-19 13:19:13 | for metric in registry.collect():
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/registry.py", line 83, in collect
2022-09-19 13:19:13 | for metric in collector.collect():
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/registry.py", line 83, in collect
2022-09-19 13:19:13 | for metric in collector.collect():
2022-09-19 13:19:13 | File "//minecraft_exporter.py", line 368, in collect
2022-09-19 13:19:13 | for metric in self.get_server_stats():
2022-09-19 13:19:13 | File "//minecraft_exporter.py", line 368, in collect
2022-09-19 13:19:13 | for metric in self.get_server_stats():
2022-09-19 13:19:13 | File "//minecraft_exporter.py", line 112, in get_server_stats
2022-09-19 13:19:13 | resp = self.rcon_command("forge tps")
2022-09-19 13:19:13 | File "//minecraft_exporter.py", line 158, in get_server_stats
2022-09-19 13:19:13 | resp = self.rcon_command("list")
2022-09-19 13:19:13 | File "//minecraft_exporter.py", line 70, in rcon_command
2022-09-19 13:19:13 | response = self.rcon.command(command)
2022-09-19 13:19:13 | File "//minecraft_exporter.py", line 70, in rcon_command
2022-09-19 13:19:13 | response = self.rcon.command(command)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/mcrcon.py", line 129, in command
2022-09-19 13:19:13 | result = self._send(2, command)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/mcrcon.py", line 129, in command
2022-09-19 13:19:13 | result = self._send(2, command)
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/mcrcon.py", line 112, in _send
2022-09-19 13:19:13 | in_id, in_type = struct.unpack("<ii", in_payload[:8])
2022-09-19 13:19:13 | File "/usr/local/lib/python3.10/site-packages/mcrcon.py", line 112, in _send
2022-09-19 13:19:13 | in_id, in_type = struct.unpack("<ii", in_payload[:8])
2022-09-19 13:19:13 | struct.error: unpack requires a buffer of 8 bytes
2022-09-19 13:19:13 | struct.error: unpack requires a buffer of 8 bytes
2022-09-19 13:19:23 | Traceback (most recent call last):
2022-09-19 13:19:23 | File "/usr/local/lib/python3.10/wsgiref/handlers.py", line 137, in run
2022-09-19 13:19:23 | self.result = application(self.environ, self.start_response)
2022-09-19 13:19:23 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 122, in prometheus_app
2022-09-19 13:19:23 | status, header, output = _bake_output(registry, accept_header, params)
2022-09-19 13:19:23 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 104, in _bake_output
2022-09-19 13:19:23 | output = encoder(registry)
2022-09-19 13:19:23 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/exposition.py", line 176, in generate_latest
2022-09-19 13:19:23 | for metric in registry.collect():
2022-09-19 13:19:23 | File "/usr/local/lib/python3.10/site-packages/prometheus_client/registry.py", line 83, in collect
2022-09-19 13:19:23 | for metric in collector.collect():
2022-09-19 13:19:23 | File "//minecraft_exporter.py", line 368, in collect
2022-09-19 13:19:23 | for metric in self.get_server_stats():
2022-09-19 13:19:23 | File "//minecraft_exporter.py", line 112, in get_server_stats
2022-09-19 13:19:23 | resp = self.rcon_command("forge tps")
2022-09-19 13:19:23 | File "//minecraft_exporter.py", line 70, in rcon_command
2022-09-19 13:19:23 | response = self.rcon.command(command)
2022-09-19 13:19:23 | File "/usr/local/lib/python3.10/site-packages/mcrcon.py", line 129, in command
2022-09-19 13:19:23 | result = self._send(2, command)
2022-09-19 13:19:23 | File "/usr/local/lib/python3.10/site-packages/mcrcon.py", line 112, in _send
2022-09-19 13:19:23 | in_id, in_type = struct.unpack("<ii", in_payload[:8])
2022-09-19 13:19:23 | struct.error: unpack requires a buffer of 8 bytes
2022-09-19 13:19:28 | Traceback (most recent call last):
2022-09-19 13:19:28 | File "//minecraft_exporter.py", line 385, in <module>
2022-09-19 13:19:28 | time.sleep(1)
2022-09-19 13:19:28 | File "/usr/local/lib/python3.10/site-packages/mcrcon.py", line 20, in timeout_handler
2022-09-19 13:19:28 | raise MCRconException("Connection timeout error")
2022-09-19 13:19:28 | mcrcon.MCRconException: Connection timeout error
2022-09-19 13:19:28 |
2022-09-19 13:19:28 | During handling of the above exception, another exception occurred:
2022-09-19 13:19:28 |
2022-09-19 13:19:28 | Traceback (most recent call last):
2022-09-19 13:19:28 | File "//minecraft_exporter.py", line 389, in <module>
2022-09-19 13:19:28 | collector.rcon_disconnect()
2022-09-19 13:19:28 | NameError: name 'collector' is not defined
Hello!
I've been running a little Minecraft server on a Pi 4 and encountered this "Exec format error".
After a bit of googling around, I found out, that it might be because the docker image was compiled for an intel 32x/64x kernel (Whilst the Pi is running an ARM kernel.) (Source: edgedb/edgedb-docker#2)
Can you help me with that issue somehow?
Also, I wondered if it is possible to somehow run that container externally on another system, by using a network share or something.
Thanks in advance!
! minecraft-exporter The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
Some metrics in Prometheus are not tracked at all even though both the world is mapped and RCON is enabled. I am using a docker compose to bring up both a minecraft server and the exporter. Here is my compose file:
version: "2.2"
services:
mc:
image: itzg/minecraft-server
environment:
VERSION: 1.15.2
TYPE: FORGE
MEMORY: 6G
EULA: "true"
ENABLE_RCON: "true"
RCON_PASSWORD: "***"
RCON_PORT: 25575
ports:
- 25565:25565
- 25575:25575
volumes:
- server-data:/data
restart: always
prometheus-exporter:
image: theparaguard/minecraft-exporter
environment:
RCON_PORT: 25575
RCON_HOST: 10.0.0.11
RCON_PASSWORD: "***"
DYNMAP_ENABLED: "True"
ports:
- 8000:8000
volumes_from:
- mc:ro
restart: always
depends_on:
mc:
condition: service_healthy
volumes:
server-data:
As a note, the exporter image I am using is something I tweaked from your image/code. Instead of pumping the world directly into the /world
folder, I created a higher /data
folder that contains the /world
folder.
All I changed were lines 14
, 15
, 16
, 17
in minecraft-exporter.py
the stats directory was now /data/world/stats
rather than /world/stats
.
Regardless, here is an example of what I am seeing as the error:
The metric overall_ticktime
is tracked but not the player_online
metric though supposedly they're bundled together. I suspect it might be because I am running a forge world, but your example volume seems to support forge servers so I'm not sure that is the problem. If you need any more information from me let me know.
When trying to add this as a data source to grafana, it barfs due to the lines starting with comments
Error reading Prometheus: bad_response: readObjectStart: expect { or n, but found #, error found in #1 byte of ...|# HELP pyth|..., bigger context ...|# HELP python_gc_objects_collected_total Objects co|...
Fabric in the server is increasing in popularity, thanks to the likes of mods like C2ME, Lithium, Carpet, Starlight etc. which bring in performance increases without sacrificing vanilla behaviour.
Carpet Mod is often used to report ticks-per-second (TPS) and milliseconds-per-tick (MSPT). This can be logged and accessed via API or rcon.
Adding support for retrieving TPS and MSPT via Carpet effectively adds support for Fabric servers.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.