Apex Legendsの戦績をDatadogで可視化してみた

# はじめに
本記事はDatadog Japan 2022年アドベントカレンダーの19日目の投稿です。

みなさん本カレンダー12/14に@ddkyouheiさんによって投稿された、身の回りのメトリクスを可視化してみたという以下の記事はご覧になりましたでしょうか。

私はMeet Upでこのプレゼン拝見したのですが、めちゃくちゃ面白かったです。
私もやってみたくなりました。

やってみます。
（二番煎じご容赦ください）

https://qiita.com/ddkyouhei/items/1be3e7ef5eb7ebd79c74


# Apex Legendsについて
今回私が可視化したのは、こちらのゲームの戦績です。

https://www.ea.com/ja-jp/games/apex-legends

これはFPS（First Person Shooting）というジャンルの、要は銃を拾って撃ち合うゲームです。
3人1チームとなり、合計20チームで優勝を争います。

最近はタレントさんなんかもプレイを配信してたりで、知っている方も多いのではないでしょうか。
Hey Say Jumpの山田涼介君もやってて話題になりましたね。

このゲームにはランクシステムがあって、勝てば勝つほどポイントが貯まりランクが上がっていくシステムがあります。
上位ランクを目指して日々戦場に身を置く中で、このポイントの上下だったり、友人間での競争を可視化できたら面白いなと思ったので、やってみます。

# 情報取得〜可視化する全体イメージ
以下が今回の全体イメージです。
Apex Legends（以下Apex）の戦績情報を公開しているサイトがあるので、そこに対してEC2から情報を取得し、Agent経由でDatadogに送ります。
<img width="800" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003473/41fb3a59-d305-4dbe-91bd-75fdbf043b83.png>

「戦績情報を公開しているサイトがある？ならいらないじゃん」って思いました？
そこに関しては作る前から作った後の今でも、全く同意見です。


# 戦績情報の取得
では、Apexのトラッカーサイトから情報を取得していきます。
今の時代はとても便利で、誰かしら何かしらやってます。
この辺の先駆者の知恵をお借りしました。

https://qiita.com/hayapo/items/2ade5e149f98ec19afc1#resdatasegments0statsrankscore

これを真似するだけで情報は取得できました。

# Datadogへ送信
ではこの取得した情報をDatadogに送ります。

Datadogは600を超えるテクノロジーとのIntegrationをサポートしていて、その中に含まれるもの（Apacheとかnginxとか、、、）のデータは、とっても簡単に取得、送信できます。

ただ、場合によってはアプリケーション独自のメトリクスを取得したい等のニーズがあるかと思います。
そのような、Integrationが対応していないメトリクスを送信するためには作り込みが必要なのです。
その方法はいくつかあり、以下が公式のマニュアルです。

https://docs.datadoghq.com/ja/metrics/custom_metrics/

今回はこの中の以下二つを試しましたので、それぞれについて記載していきます。
・カスタムエージェントチェック
・DogstatsD


## カスタムエージェントチェックで送る
カスタムエージェントチェックとは

https://docs.datadoghq.com/ja/metrics/custom_metrics/agent_metrics_submission/?tab=gauge

その書き方

https://docs.datadoghq.com/ja/developers/custom_checks/write_agent_check/

私Pythonどころかコーディングの経験０なんですが上記を見て実装できたので細かい説明は省きます。
以下がコードです。温かい目で見てください。

```Python
import requests, json, sys, simplejson
from pprint import pprint
from datadog_checks.base import AgentCheck

#トラッカーサイトのAPI取得
header = {"TRN-Api-Key":'xxxxxxxxxxxx'}

#トラッカーサイトから情報取得
res = requests.get('https://public-api.tracker.gg/v2/apex/standard/profile/psn/アカウント名', headers=header).json()
data = res['data']['segments'][0]['stats']['rankScore']['value']

#カスタムエージェントチェック
class CheckValue(AgentCheck):
  def check(self, instance):

      self.gauge('apex.rank.score', data)
```


以下のようにMetricsの取得を確認できました。

<img width="800" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003473/2a851d25-7af2-b624-a3be-6469a78cfb2b.png>

めっちゃ簡単、、、

## Dogstasdで送る
せっかくなのでDogstatsDでも送ってみます。

DogstatsDについて

https://docs.datadoghq.com/ja/developers/dogstatsd/?tab=hostagent

その実装方法

https://docs.datadoghq.com/ja/metrics/custom_metrics/dogstatsd_metrics_submission/

ふむふむ、カスタムエージェントチェックはDatadog Agentのチェック機構に組み込む感じでしたが、DogstasDはアプリに組み込む感じですね。色々な言語での実装がサポートされています。

なんと言っても、DogstatsDなら**タグ付け**ができるんです！
タグをつけられることによってダッシュボードの作り方の幅が広がります。後のセクションでどんな感じになるのか書きますのでお楽しみに。

コードはこんな感じになりました。温かい目で見てください。

```Python
import requests, json, sys, simplejson, time
from pprint import pprint
from datadog import statsd
from datadog import initialize
header = {"TRN-Api-Key":'xxxxxxxxxxxx'}

#マニュアル通りに書く
options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}

initialize(**options)

#player名 - 後に複数人分作るのでここだけ変えればいいように
player = "プレイヤー名"      

#情報取得 - 継続して取得できるように繰り返し
while(1):
    res = requests.get('https://public-api.tracker.gg/v2/apex/standard/profile/psn/' + player, headers=header).json()
    rankscore = res['data']['segments'][0]['stats']['rankScore']['value']
    rankpercentile = res['data']['segments'][0]['stats']['rankScore']['percentile']
    rankrank = res['data']['segments'][0]['stats']['rankScore']['rank']

#DogstatsDで送る処理
    metric0="apex.rank.score"
    statsd.gauge(metric0, rankscore, tags=["game:apex",f"player:{player}"])

    metric1="apex.rank.percentile"
    statsd.gauge(metric1, rankpercentile, tags=["game:apex",f"player:{player}"])

    metric2="apex.rank.rank"
    statsd.gauge(metric2, rankrank, tags=["game:apex",f"player:{player}"]) 

　　#一試合長くても20分なのでこれくらいの間隔で    
    time.sleep(1200)

```

statsd.gauge(metric0, rankscore, tags=["game:apex",f"player:{player}"])
ここで、gameタグとplayerタグをつけてます。

違うゲームをやることになった際にタグで切り替えられるように、また複数のプレイヤーの情報を取り込んでタグで切り替えられるようにしました。

<img width="800" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003473/375cc57b-4216-36e7-fb4a-1658f4f578ed.png>

先ほどと同じメトリクスですがタグで絞り込みができます。

# ダッシュボード作成
同じ要領で他にもいくつかメトリクスを取得し、二つのダッシュボードができました。
- 個人用ダッシュボード
- グループ用ダッシュボード

## 個人用ダッシュボード

<img width="800" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003473/1f182048-061b-ff20-76de-05b5760c3bde.png>
<img width="800" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003473/07ba2bff-714b-55ff-ca7b-ce098ef55c96.png>


- **ポイント①**
このグラフはランクポイントを折れ線グラフで表示させているものですが、右側半分がForecastと記載され薄青い範囲が表示されています。
これは、Datadogの機械学習がメトリクスの変化を学習して今後の予測を立ててくれるものです。
変動がなくて面白いグラフになっていませんが、ある程度プレイして行けば、何日後に何ポイントになりそうだという目安がわかります。
Datadogではこのような機械学習の機能が動いていて、他にも、普段と違う動きをしたときに教えてくれるAnomalyだったり、集団と違う動きをするOutlierなど色々ありますのでぜひ試してみてください。

- **ポイント②**
これはDatadogのポイントではないのですが、、、
取得した情報の中に、プレイヤーが位置付けられているランクに応じた画像のURLがあったので、それをどうにかDatadog上に表示させたいと試行錯誤したポイントです。
結果、取得したURLから画像をurlretrieveでローカルに保存し、それをupload_fileでS3に保管し、そのパスをダッシュボードで指定した形を取りました。
うまくいくと気持ちいいですね。

- **ポイント③**
これは取得した情報にはなかったものです。両脇の、順位と上位何％かという情報はあったので、割り算をして表示させてます。これがめっちゃ簡単。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003473/070a9c24-05c1-aa53-032b-7c0c7e21ee60.png)
こんな感じで、二つのメトリクスを指定して後は下に式を書くだけです。

## グループ用ダッシュボード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003473/2019aa80-1f85-2f72-9a96-4b6d5449f48a.png)

よく一緒にプレイする友人の情報をひとまとめにしたダッシュボードです。
このダッシュボード上のグラフでは、タグが大活躍しています。

同じグラフ上でタグを利用し人ごとのデータを表示するグラフを簡単に作成できます。
設定画面はこんな感じです。これだけです。めっちゃ簡単。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003473/a81a7382-eedc-9f85-3e18-c79fd5789797.png)
ランク表示や変化量表示で競争心を煽られますね。

# おわりに
いかがでしたでしょうか。
Datadogはアプリケーションが出す情報を簡単にメトリクス化して可視化することができるので、従来の監視から一歩踏み出して、ビジネス的な観点でメトリクスを可視化してみてはいかがでしょう。

今回を通して私の所感は以下です。

- コーディング経験はなかったのですが、試行錯誤してうまく行った時めちゃくちゃ気持ちいい
- Datadogでダッシュボード作るの簡単に思い通りにできて楽しい
- APEX楽しい
誰か強い人キャリーしてください。その代わりこのダッシュボード作って提供します。（いらない）

@ddkyouheiさん改めてパクらせていただきありがとうございます。
この一連の作業に取り組んでる時間はとても楽しかったです。

ではみなさま、
Happy Datadog Life!