スマフォアプリゲーム開発における問題と対策 その２


[スマフォアプリゲーム開発における問題と対策 その１](http://qiita.com/wapa5pow/items/352a199efc8674c20f29)の続きです。


# 誰がどのタスクを現在やっているのかわからない

自分は現在、サーバチームのリードとしてやってますが、その上で問題になるのはメンバーのタスク管理です。

タスクはバックログ上になれべられており、ガントチャートを毎朝見て管理しています。

![backlog_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/cbf56563-0401-7734-cb0d-42d94c42165c.png "backlog_1.png")

基本タスクは作っても担当者が振られていない状態にしておき、タスクが終わったメンバーに、担当者の振られていないタスクを実装してもらいます。

作成されたタスクはメンバーに振り以下の状態遷移となります。


| ステータス |説明 |
|:-----------|:------------|
|デフォルト(赤)|タスクが作られた状態。担当がふられてもこのまま|
|処理中(青)|担当者がタスクを開始しだしたら、担当者が処理中にする|
|処理済み(緑)|担当者がタスクを完了した場合、担当者が処理済みにする|
|完了|処理済みのものを、確認し、リーダが完了にする。担当者は実装した本人にし、変えない|

上記のようにすれば、後からメンバーがどのタスクを処理したかは、担当者別でフィルタすれば確認できるので、振り返りにも便利です。

# 将来やるタスクが忘れ去られてしまう

忘れないために、実行する必要のあるタスクはすべてbacklog上にのせて、さらに将来の適当な日付をうって、backlogのガントチャート上にのるようにしております。
これで忘れない！はず。

# クライアントからサーバにエラーが起きていると言われるがどのようなリクエストを投げたかわからない

よくあるのがクライアントがサーバレスポンスが原因で、アプリが落ちた(500とかがかえってきた)けど調べてくださいというパターンです。
デバッガからの報告などの場合もあり、どうしても時間差があるので、どのリクエストかわからなくなってしまいます。
**ユーザID**をもらっても多くのリクエストから探すのは骨がおれます。

そのための対策としては以下が考えられます。

* 管理画面でユーザIDごとに、リクエストとレスポンスが見れるようにする
* SentryでユーザIDで検索できるようにする
* NewRelicでErrorsを確認する

## 管理画面でユーザIDごとに、リクエストとレスポンスが見れるようにする

もともと他のチームで使っていたものが便利そうだったので移植してチームのメンバーに改良してもらいました。

サーバに来たリクエストを、ユーザIDで絞り込んで検索できます。
またサーバ処理時間も記録しているので、レスポンスが遅いリクエストもフィルタリング出来ます。

![api_res_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/1393468d-7cc3-d378-76e7-b9e5ee4e38af.png "api_res_1.png")

開くメニューを押すと、リクエストとレスポンスの内容が見れます。

![api_res_2.png](https://qiita-image-store.s3.amazonaws.com/0/30079/7a7d9548-9ad2-b8d4-93d1-0da791591b5a.png "api_res_2.png")

上記はクライアントの方もリクエスト・レスポンスを直感的に見れるので重宝しております。

## SentryでユーザIDで検索できるようにする

会社ではSentryを例外を捕捉して記録するサービスとして使っています。

このSentryのログを送る際に、ユーザIDもカスタムメトリックスとして送れるようにしております。

    class ErrorHandleMiddleware(object):
        ...
        def process_exception(self, request, exception):
            if not self._can_emit(exception):
                return
            data = self._gen_data(request)
            if getattr(request, 'device_id', None):
                tags = {'device_id': request.device_id}
            else:
                tags = None
            client.captureException(data=data,
                                    tags=tags,
                                    exc_info=sys.exc_info())
        ...

これにより、ユーザIDで検索すれば該当のエラーが発見できます。

例外が発生すると各種ログがSentryに送られ、以下のように見れます。

![sentry_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/ed34945c-a1d6-1d6f-4219-89330d12b9d4.png "sentry_1.png")

![sentry_2.png](https://qiita-image-store.s3.amazonaws.com/0/30079/b01ef3ed-9848-d594-383f-60d22c2c693b.png "sentry_2.png")


## NewRelicでErrorsを確認する

NewRelicでも[ここ](http://qiita.com/wapa5pow/items/0a4132c62d807286af9d#%E3%82%B1%E3%83%BC%E3%82%B93-%E4%BE%8B%E5%A4%96%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E3%81%9D%E3%81%AE%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BCid%E3%81%8C%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84)のようにすればユーザIDを送ることができます。

## リリースされる前に、遅いAPIを洗い出しリリースされるのを防ぎたい

[以前書いた](http://qiita.com/wapa5pow/items/e3ef018af270cc2ad014#%E3%82%B1%E3%83%BC%E3%82%B91-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%BF%9C%E7%AD%94%E3%81%8C%E9%81%85%E3%81%84%E3%81%91%E3%81%A9%E3%82%82%E3%81%A3%E3%81%A8%E6%97%A9%E3%81%8F%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%81%8B)ようにNewRelicを使うといいと思います。

## サーバの性能が出るか確かめたい

負荷試験をすればいいと思います。
locustがpythonで書かれており、いい感じです。ここらへんのノウハウは別途書こうと思います。

# 本番環境のユーザを開発環境に再現したい

開発環境でテストする際に、本番環境と同じユーザ情報を使いたいときがあります。
例えば、レベルが上がった状態、指定のユニットが所持された状態などです。

上記は管理画面で実現できるようになっており、jsonでimport/export出来るようになっております。