CSGOの監視– Prometheusにおける Counter-Strike : Global Offensive

By 清水 孝郎 - DECEMBER 24, 2021

SHARE:

Fragment of a malicious script collecting system information

本文の内容は、2021年12月23日にJesus Ángel Samitierが投稿したブログ(https://sysdig.com/blog/monitor-csgo/)を元に日本語に翻訳・再構成した内容となっております。

もうすぐクリスマスです!束の間の時間で Counter-Strike: Global Offensive (CSGO)をプレイしていることでしょう。もしかすると、ご自分の専用サーバーでプレイされているかもしれません。もしそうなら、ゲームを監視する方法を知りたいのではないでしょうか?

この記事では、CSGO サーバーをインストールして、それを監視する方法と、それが実行されているインスタンスについて説明します。

Prometheusはもちろんですが、どのようなエクスポーターですか?

Illustration showing a red haired person playing a first person shooter like videogame, with some lines (metrics) flowing into a cloud with the Prometheus logo on it赤髪の人物がファーストパーソンシューターのようなビデオゲームをプレイしている様子と、Prometheusのロゴが入った雲に流れていく線(メトリクス)が描かれたイラスト。

CSGOサーバー、Prometheus、エクスポーターのインストール方法

今回のプロジェクトでは、EC2インスタンスに空のUbuntu 20.04 LTSインスタンスを使用し、DockerとDocker Composeを使ってCSGOサーバー、Prometheus、exportersを起動しました。

なお、Dockerをインストールする必要があります。今回のシナリオでは、Ubuntuのインストール手順に従いました。

コンテナの設定と起動

まず、Prometheusの設定ファイルを書きましょう。prometheusフォルダーを作成し、その中にprometheus.yaml ファイルを記述します。これがその内容です:

global:
  external_labels:
    origin: prometheus-ec2-csgo
scrape_configs:
  - job_name: prometheus
    static_configs:
    - targets:
       - localhost:9090
       - localhost:9100
       - localhost:8080
       - localhost:9137

次に、CSGOサーバーの設定を行います。 srcds.yamlファイルを作成し、以下の内容を記述します:

options:
  connectTimeout: 60s
  cacheExpiration: 15s
  cacheCleanupInterval: 11s
servers:
  csgo:
    address: localhost:27015
    rconPassword: <CHANGE ME>

ここで、 docker-compose.yamlを見てみましょう:

version: "3.3"
services:
  csgo:
    image: timche/csgo
    container_name: csgo-ds
    environment:
      CSGO_GSLT: <STEAM TOKEN>
      CSGO_HOSTNAME: CSGOSERVER
      CSGO_PW: <CHANGE ME>
      CSGO_RCON_PW: <CHANGE ME>
      CSGO_PORT: 27017
    volumes:
      - type: bind
        source: /opt/csgo/csgo-data/
        target: /opt/app/static
    network_mode: host
    restart: unless-stopped
  csgo-updater:
    image: timche/csgo-updater
    container_name: csgo-updater
    volumes:
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
  prometheus:
    image: quay.io/prometheus/prometheus:v2.31.1
    container_name: prometheus
    volumes:
      - ./prometheus/:/etc/prometheus/
      - /opt/prometheus/prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yaml'
      - '--storage.tsdb.path=/prometheus'
    network_mode: host
  cadvisor:
    image: gcr.io/cadvisor/cadvisor
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - 8080:8080
    restart: always
    deploy:
      mode: global
  node-exporter:
    image: prom/node-exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - --collector.filesystem.ignored-mount-points
      - "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
    ports:
      - 9100:9100
    restart: always
  csgo-exporter:
    image: quay.io/galexrt/srcds_exporter:v0.0.1
    container_name: csgo-exporter
    command: ["/bin/srcds_exporter", "--config.file","/tmp/csgo/srcds.yaml"]
    network_mode: host
    volumes:
      - type: bind
        source: /home/ubuntu/srcds.yaml
        target: /tmp/csgo/srcds.yaml

パスワードの変更を忘れずに、 <CHANGE ME> の文字列を置き換えます。また、スチームトークンを作成し、CSGOサーバー設定用YAMLの <STEAM TOKEN> スロットに配置します。


あとは、以下ですべてのコンテナを起動するだけです:

docker-compose up -d

すべてが問題ないかどうかは、どのコンテナが稼働しているかを確認することでわかります。

docker ps


Prometheus ダッシュボードの確認

通常、クラウド・インスタンスを作成する際、ポートはデフォルトでは公開されていませんし、セキュリティ上の理由からも公開はしません。ここでは、ローカルマシンへのポートフォワードを使って、Prometheus ダッシュボードに安全にアクセスしてみましょう。

ssh -f -N -i "<Path of your PEM file>" -L 9090:localhost:9090 <instance user>@<instance ip>

ブラウザで localhost:9090と入力してください。



CSGO メトリクス

ゲーム内のヒューマンプレイヤーの数は srcds_playercount_humansを使って取得できます。


ゲーム内のボットプレイヤーの数を知るには、 srcds_playercount_botsをご利用ください。


また、サーバーの使用率を計算するには、次のようにします。

srcds_playercount_humans{server=~$server}/ srcds_playercount_limit{server=~$server}

現在プレイされているマップを確認するには、 srcds_map を使用してください。


インスタンス・メトリクス

CSGOのモニタリングは便利ですが、クラウド・インスタンスでのパフォーマンスを把握することも必要です。

これらのメトリクスから貴重な知識を得ることができます。例えば、実際に必要としているよりも強力なマシンを使用しているかもしれません。そうすれば、お金を節約するのに役立つかもしれませんね。

メモリ

まず、インスタンスで使用されているメモリの量をパーセンテージで見てみましょう。

100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes)


もう一つの興味深い指標は、CSGOサーバコンテナが使用するメモリ(秒単位)です。

container_memory_usage_bytes{name="csgo-ds"}


CPU

コンテナの全体的な CPU 使用率がどの程度か、パーセンテージで確認してみましょう。言い換えれば、CPUがどれだけビジー状態かということです。

(((count(count(node_cpu_seconds_total) by (cpu))) - avg(sum by (mode)(irate(node_cpu_seconds_total{mode='idle'}[5m])))) * 100) / count(count(node_cpu_seconds_total) by (cpu))


ここで、CSGO サーバーコンテナがどれだけの CPU を使用しているかを確認します。

rate(container_cpu_user_seconds_total{name="csgo-ds"}[5m])


待てよ、レイテンシーはどうした!?

クライアントはサーバにUDPで接続しているので、サーバは通信のレイテンシーを知ることができないので、レイテンシーを測定していません。

対戦開始!



この記事では、CSGO サーバーをクラウドインスタンスにインストールする方法と、インスタンスと一緒に Prometheus で監視する方法を学びました。

また、このプロジェクトで最も興味深いメトリクスのリストもお読みいただきました。さあ、友達と対戦を始めて、クリスマス休暇を楽しみましょう。メリークリスマス、ハッピーニューイヤー!



今すぐSysdig Monitorの無料トライアルに登録して、SysdigのマネージドPrometheusサービスですぐに監視を始めましょう!