GithubHelp home page GithubHelp logo

minecraft-exporter's People

Contributors

arkrissym avatar br337 avatar casparchou avatar dependabot[bot] avatar joshi425 avatar markusfreitag avatar ndragon798 avatar surdaft avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

minecraft-exporter's Issues

Support not needing a world

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 ?

500 errors affecting approx. 50% of requests

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
----------------------------------------

License?

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!

Don't use docker

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.

Metrics not exported on 1.20

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.

Any plans for future releases - This project is just awesome

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 !

Forge 1.16.5 server with RCON enabled but not getting tps, ticktime or player_online metrics

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

Mojang API returns 204 status code (no content) response to invalid UUID (most likely added by forge mods)

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)

RCON Stats not exported with 1.16.1

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.

Not all metrics exported for 1.15.2

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```

No server metrics - Error mcrcon.MCRconException: Incorrect padding

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']

Update metric names to follow Prometheus's best practices

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

Document the metrics

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

TypeError: 'int' object is not subscriptable

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

1.18.2 (Forge) error

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

standard_init_linux.go:211: exec user process caused "exec format error"

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!

No support for arm64 architecture

! 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 Not Exported

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.

Cannot add as a prometheus source in grafana due to comments

When trying to add this as a data source to grafana, it barfs due to the lines starting with comments
image

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|...

Add support for Fabric/Carpet to retrieve tick information

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.