免責事項
この記事はInfluxData Blogの投稿 Mineflux: Building a Telegraf plugin to collect data from your Minecraft Server をユーザが翻訳したものであり、InfluxData公式の文書ではありません。
概要
InfluxData での最初の1週間を、私たちは InluxData の背後にあるデータベースである InfluxDB について学ぶのに費やしました。私たちはその他のコンポーネントがいかに簡単に利用できるかということを言われていたので、この主張を検証することに決めて、Telegraf プラグインを書き、それを使ってメトリクスやイベントを収集して InfluxDB に 入れ、Chronograf で可視化してみることにしました。Telegraf とは Go で書かれたエージェントで、InfluxData の一部であり、メトリクスの収集、処理、集計、InfluxDB への書き込みを行います。私たちはこの機会に私たちの Go の腕前を試すチャンスを得られたと興奮していましたが、まず私たちは何かしらデータを取得してくるものが必要でした。InfluxData では オンラインゲームの Minecraft が一般に好まれているので、ほんのすぐにこのアイデアは浮かんできました。私たちはリモートの社員が本社の社員と交流できるような、会社の Minecraft サーバーまで持っています。
これは平均的なプレイヤーにとっては明らかではありませんが、Minecraft には収集できる統計情報が実に充実しています。ゲーム自体に数多くの数値があり、プレイヤーの酸素レベルから牛を殺した数までなんでも測定することができます。私たちは Minecraft 用の Telegraf のプラグインを書くことが、プラグインの書き方を学ぶ簡単な第一歩となり、オフィス全体で使うのにも楽しいものだと考えました。もしあなたが TICK stack をセットアップして、あなたの Minecraft の統計情報を測定するのに興味があるなら、続きを読んでください。
Telegraf プラグインの書き方
最初に、Mincraft からデータを取り出す方法を理解する必要がありました。私たちは RCON プロトコル(後述)を使うことに決めました。このプロトコルにより、クライアントはサーバ上でのゲーム内の特定のコマンドの出力を収集することができます。しかしこの出力は使いやすい形に整形されておらず、私たちはプラグインを書くための作業のほとんどはこのデータの解析になることをすぐに理解しました。このデータ処理は Telegraf プラグインの開発の中でも困難な部分でした。
簡単だった部分は、Telegraf 自体の機能を使う部分です。 一旦データ処理のコードを書いたら、あとは私たちのコードを Telegraf が認識できるインタフェースに変更し、必要なプラグインオプションと共に設定ファイルを作成するだけでした。 Minecraft Telegraf プラグイン は以下のように動作します。
このプラグインは Minecraft サーバーからデータを取得するのに RCON(Remote CONsole) プロトコルを使います。RCON は元はValve社により、同社のゲームサーバー用に開発されたものですが、ゲームサーバー通信において広く受け入れられている手法となっています。RCONによりサーバーの所有者は、サーバ自体へのアクセスが出来なくても、ゲーム内のコンソールを使用できます。
Minecraft での使われ方にも違いはありません。 Minecraft は既に高度なインゲームのコンソールシステムがあり(チートを行うために多くの人が知っていますが!)、これによりプレイヤーは、コマンドを入力して世界の振る舞いを変えることが出来ます。例えば、以下のコマンドで現在の時刻が夜明けになります。
/time set 0
これは厄介なモブから攻撃を受けている時には、非常に有用です。
これらの世界的に影響のあるコマンドに加えて、Minecraft には、ゲーム内で /scoreboard
コマンドファミリでアクセスできる組み込みのスコアボードがあります。
Minecraft のスコアボードにより、サーバー管理者はプレイヤーの達成度合いを様々な異なる方法で見ることが出来ます。例えば、各プレイヤーのキル数や、ユーザのインベントリ内のダイヤのツルハシの数を見ることができます。
サーバー管理者は、Minecraft が内部的に監視し、スコアボードに追加している特定の統計情報(ゲーム内では objectives と呼ばれるもの)の監視を追加することも出来ます。
プレイヤーのジャンプを監視する objectives を追加するには、下記のコマンドを使用します。
/scoreboard objectives add jump stat.jump
/scoreboard objectives add ... ...
のコマンドにより、管理者は objectives をスコアボードに追加できます。
上記のコマンドの次の引数 jump
は、監視する統計情報の別名です。最後の引数は、実際の統計情報そのものです。
もう1つの例は、
/scoreboard objectives add pickaxe stat.useItem.iron_pickaxe
これはプレイヤーが鉄のツルハシを使用した回数を監視する objectives、 pickaxe を追加します。
「一般的な」スコアボードの統計情報 のリストはこちらにあります。
... そして スコアボードの評価基準 の詳細なリストはこちらにあります。
Minecraft の統計情報をどうやって監視するか
このブログを読み進めるにあたり、以下のものをインストールしておく必要があるでしょう。
InfluxDB
Telegraf
Chronograf
InfluxDB、Telegraf、Chronograf は各プラットフォーム用のものをダウンロードすることが出来ます。
このブログでは、3つ全ての実行ファイルに $PATH
が通っているものとみなします。
Step 1: Minecraft サーバーを用意する
Minecraft サーバーがRCON接続できるようになっていることを確認するのに、いくつかの手順を実行する必要があるでしょう。
以下を(passwordとportを実際の値に置き換えて) Minegraftサーバーのserver.properties
ファイルに追加します。
enable-rcon=true
rcon.password=
rcon.port=<1-65535>
これにより RCON プロトコルが有効になり、クライアントの認証用パスワードがセットされ、RCONが待機するポートが設定されます。
Step 2: InfluxDB を起動する
InfluxDBがローカルにインストールされ、パスが通っているなら、単に以下を実行することで起動できます。
$ influxd
InfluxDBを起動してサービスとして稼動させるためのガイド をチェックしてください。もしまだインストールしていなければ、その方法が記載されています。
Step 3: Telegraf をセットアップする
TICK スタック用の適当なディレクトリを見つけて以下のコマンドを実行し、Minecraft プラグインを有効にした設定ファイルのテンプレートを生成します:
$ telegraf --sample-config --input-filter minecraft --output-filter influxdb > minecraft.conf
次に、必要に応じて設定ファイルを編集する必要があります。
設定ファイルの [[outputs.influxdb]]
セクションに移動します:
[[outputs.influxdb]]
## The HTTP or UDP URL for your InfluxDB instance. Each item should be
## of the form:
## scheme "://" host [ ":" port]
##
## Multiple urls can be specified as part of the same cluster,
## this means that only ONE of the urls will be written to each interval.
# urls = ["udp://localhost:8089"] # UDP endpoint example
urls = ["http://localhost:8086"] # required
url
をInfluxd のインスタンスが稼動している IPアドレス/ポートに変更します。influxd がローカルマシンで直接稼動している場合は、デフォルトの localhost:8086
でいいはずですが、もし異なるセットアップをしている場合はこのフィールドをクラスタ/コンテナ/リモートサーバーのIPアドレスに変更する必要があるでしょう。
次に、設定ファイルの [[inputs.minecraft]]
セクションに移動し、server
、port
、password
フィールドを設定します。"#"を削除して、これらのコメントアウトを忘れずに解除してください。このセクションの設定は、Minecraft の server.properties
ファイルとほぼ同じ内容を含むはずです。
[[inputs.minecraft]]
# server address for minecraft
server = "localhost"
# port for RCON
port = "25575"
# password RCON for mincraft server
password = "replace_me"
必要に応じて設定ファイルを変更したら、下記のコマンドを実行します。これにより Minecraft プラグインをデータ入力として、Telegraf サービスが起動します。
$ telegraf --input-filter minecraft --config minecraft.conf
この時点でエラーが出た場合は、influxdが実行されていないか、設定ファイルが正しく設定されていません。
ここからは、Telegraf サービスが継続的に Minecraftサーバのスコアボードに対してポーリングを行い、データポイントを InfluxDBに書き込みます。
Step 4: データを見てみよう!
Minecraft のデータを表示、分析するには、Chronograf が利用できます。このブログをここまで読んでいるのであれば、あなたはすでにそれをインストールしているはずです。Chronograf のセットアップの詳細なウォークスルーについては、 ドキュメントを参照してください。
一旦 Cronograf が InluxDBのインスタンスに接続されると、いくつかダッシュボードを作ることが出来ます。 ここでは、我々はダッシュボードに3つのグラフを作成しました。それぞれプレイヤーの酸素レベル、プレイヤーの空腹レベル、およびプレイヤーの死亡回数を測定するものです。ダッシュボードの作成方法 に関する優れたガイドはこちらにあります。
こちらはプレイヤーのジャンプ回数を測定するクエリの作成例です。
Mineraft のデータがどのようにデータベースに格納されているか:
データには Minecraft サーバーとプレイヤーのインデックスがつけられており、フィールドは objectives を追加した時に設定したエイリアスと同じ名前がつけられています。
InluxDBの line protocol 形式のデータポイントの例は以下のようになるでしょう:
minecraft,player=notch,server=127.0.0.1:25575 jumps=178i 1498261397000000000
Telegrafの使いやすさについて
私たちは始めはTICKスタックのコンポーネントに不慣れでしたが、ほんの5日で Telegraf プラグインを書くことが出来ました。その時間の多くは、Telegraf の使い方を理解することではなく、データ処理のコードを書くことに費やされたものです。さらに、Minecraft サーバーはデータを格納するのにあまり適さない形式でデータを返すため、重要な部分を取り出すのに多くの解析を行う必要がありました。この余分な定型コードが無ければ、プラグインは3日かそれ以下で書けたかもしれません。私たちはこの経験から、Telegraf はかさばらず簡単に構築できる最小のインタフェースを提供しており、この一見困難な作業をはるかに簡単にしていることが証明されたと感じています。
Step 5: 楽しもう!
好きなだけたくさんの objectives を追加しましょう。もしよければ、それら全てを Chronograf で監視してみましょう。このプラグインは、Telegraf が使いやすいフレームワークであり、TICK スタックにシームレスに統合されていることを示すことを、純粋に目的としています。Minecraft の統計を収集する使用例では完全には明らかではないかもしれませんが、私たちは Telegraf がいかにパワフルかを示すためには、楽しい方法だと考えました。
もし TICK スタックについてもっと学びたいのであれば、無料でダウンロードして自身で試してみましょう。
Telegraf
InfluxDB
Chronograf
Kapacitor
プラグインのコード自体に興味がある場合は、私たちの github repo をチェックしてください(そして気軽に contributeしてください):
https://github.com/influxdata/telegraf/tree/master/plugins/inputs/minecraft