【Spigot】Minecraft Prometheus Exporterをインストールする

Minecraft Prometheus Exporter

最近久しぶりにMinecraftサーバを立てたのですが、最近はForgeではなくてSpigot系のmodが流行なんですね。

自分はModといえば1.7.10という感じだったので、1.19に入って大分進歩したんだなあと思った次第です。

今回はMinecraftサーバの監視もモダンにするため、Prometheusを活用したいと思います。

定番のGrafanaによる可視化までやっていきます。

今回インストールするのは

/minecraft-prometheus-exporter

です。

Minecraft系のエクスポーターでちゃんとメンテナンスされてそうだったというのが選定理由です。

インストール時に調べながらやっていて手間がかかったので、備忘録がてら書き残しておきます。

プラグインをビルドしてインストール

まず前提として、このプラグインはbukkit/spigot系の環境でしか動きません。

今回の環境は下記のdocker-compose.ymlを利用しています。

TYPE: “SPIGOT”だけでspigot環境が作れるのは便利ですね。

$ cat docker-compose.yml
version: "3"
services:
  mc:
    image: itzg/minecraft-server
    ports:
      - 25565:25565
    environment:
      VERSION: "1.19"
      TYPE: "SPIGOT"
      EULA: "TRUE"
    tty: true
    stdin_open: true
    restart: always
    volumes:
      - ./data:/data
    networks:
      nginx-proxy:
networks:
  nginx-proxy:
    external: true

それではdataディレクトリに移動します。

dataディレクトリの中身はこんな感じです。


data$ ls
banned-ips.json      bundler       help.yml   minecraft_server.1.18.2.jar  permissions.yml  server.properties       usercache.json  world
banned-players.json  commands.yml  libraries  minecraft_server.1.19.jar    plugins          spigot.yml              versions        world_nether
bukkit.yml           eula.txt      logs       ops.json                     server-icon.png  spigot_server-1.19.jar  whitelist.json  world_the_end

pluginsディレクトリに移動します。

ここでプラグインのリポジトリをクローンします。

data/plugins$ git clone https://github.com/sladkoff/minecraft-prometheus-exporter.git

そしてmaven installをします。
mavenが無かったらapt get mavenで入手してください。

minecraft-prometheus-exporter内に移動してビルドを行い、jarファイルを生成します。

plugins$ cd minecraft-prometheus-exporter
data/plugins/minecraft-prometheus-exporter$ mvn install

targetフォルダ内にjarができあがるので、これをpluginsディレクトリに移動します。

data/plugins/minecraft-prometheus-exporter $ mv target/minecraft-prometheus-exporter-2.5.1-SNAPSHOT.jar ../
data/plugins/minecraft-prometheus-exporter $ cd ../
data/plugins$ ls
PluginMetrics  minecraft-prometheus-exporter  minecraft-prometheus-exporter-2.5.1-SNAPSHOT.jar

ここでdocker-compose.ymlのあるディレクトリに戻り、docker-compose upをします。

この表示が出ていれば無事読み込まれています。

いったんCtrl+Cで停止させてみるとplugins内にPrometheusExporterというディレクトリが生成されます。

そこでPrometheusがexporterの情報を読み取れるように、中のconfig.ymlのホスト設定をlocalhostから0.0.0.0に変更します。

$ cat data/plugins/PrometheusExporter/config.yml
host: 0.0.0.0
port: 9940
enable_metrics:
entities_total: true
villagers_total: true
loaded_chunks_total: true
jvm_memory: true
players_online_total: true
players_total: true
tps: true
world_size: true
jvm_threads: true
jvm_gc: true
tick_duration_median: true
tick_duration_average: true
tick_duration_min: false
tick_duration_max: true
player_online: false
player_statistic: false

今度はdocker-compose up -dでデーモン化し、Prometheus上のネットワークからアクセスできることを確認してみます。

~$ docker exec -it minecraft_mc_1 bash
root@f253f20320bb:/# curl http://mc:9940/metrics
# HELP mc_tick_duration_max Max duration of server tick (nanoseconds)
# TYPE mc_tick_duration_max gauge
mc_tick_duration_max 2.4799968E7
# HELP mc_villagers_total Villagers total count, labelled by world, type, profession, and level
# TYPE mc_villagers_total gauge
# HELP mc_tick_duration_average Average duration of server tick (nanoseconds)
# TYPE mc_tick_duration_average gauge
mc_tick_duration_average 8086516.0
# HELP mc_world_size World size in bytes
# TYPE mc_world_size gauge
mc_world_size{world="world",} 1.28338086E8
mc_world_size{world="world_nether",} 3867169.0
~以下省略~

無事メトリクスが取得できていますね!

Prometheus側の設定

今度はPrometheus側の設定を行っていきます。

prometheus.ymlのscrape_configにこの設定を書き加えます。

dockerのコンテナ名のmcに対してデータの取得を行います。

- job_name: 'minecraft'
  static_configs:
    - targets: ['mc:9940']
  labels:
    server_name: 'minecraft_server'

ここに詳細は書いていませんが、Prometheusと同一のネットワーク上に展開されるようにしてください。

Prometheusを再起動してprometheus.ymlを再読み込みさせます。

ダッシュボードのインポート

Grafanaは既にPrometheusと連携できているものとして進めます。

よくわからない人はこちらの記事も併せてごらんください。

まずGrafanaのダッシュボードをインポートする画面に移ります。

そしてImport via panel jsonに公式の作ったダッシュボードのjsonを投入します。

データソースをPrometheusにします。

これでOKです!

Players Online=現在のアクティブユーザーが1(自分自身)になっていますね!

これで監視の設定が完了しました!