From 1e8c399c3beca5b3073e1f1d7b0171ba36c886f1 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 24 Mar 2022 19:22:09 +0100 Subject: [PATCH 1/7] add datadog monitoring --- backend/requirements.txt | 3 ++- backend/server.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index a2c7e4e..3963313 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -7,4 +7,5 @@ python-socketio==4.6.1 six==1.16.0 pytest==7.1.1 requests==2.27.1 -discord-webhook==0.15.0 \ No newline at end of file +discord-webhook==0.15.0 +datadog==0.44.0 \ No newline at end of file diff --git a/backend/server.py b/backend/server.py index 4ad60d5..fad557d 100644 --- a/backend/server.py +++ b/backend/server.py @@ -1,5 +1,6 @@ import os import json +import time import random from typing import List import eventlet @@ -10,6 +11,17 @@ from bang.players import Player, PendingAction import requests from discord_webhook import DiscordWebhook +from datadog import initialize, api + + +send_metrics = False +if "DATADOG_API_KEY" in os.environ and "DATADOG_APP_KEY" in os.environ: + initialize() + send_metrics = True + api.Event.create(title="Backend start", text="", tags=["server:backend", f"host:{os.environ['HOST']}"], alert_type="info")]) +else: + print("Datadog not configured") + import sys sys.setrecursionlimit(10**6) # this should prevents bots from stopping @@ -43,6 +55,8 @@ blacklist: List[str] = [] def advertise_lobbies(): sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players), 'locked': g.password != ''} for g in games if not g.started and len(g.players) < 10 and not g.is_hidden]) sio.emit('spectate_lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players), 'locked': g.password != ''} for g in games if g.started]) + if send_metrics: + api.Metric.send(metric='lobbies', points=[(int(time.time()), len(games))], tags=["server:backend", "type:lobbies", f"host:{os.environ['HOST']}"]) @sio.event def connect(sid, environ): @@ -51,6 +65,8 @@ def connect(sid, environ): print('connect ', sid) sio.enter_room(sid, 'lobby') sio.emit('players', room='lobby', data=online_players) + if send_metrics: + api.Metric.send(metric='online_players', points=[(int(time.time()), online_players)], tags=["server:backend", f"host:{os.environ['HOST']}"]) @sio.event def get_online_players(sid): @@ -73,6 +89,8 @@ def report(sid, text): sio.emit('chat_message', room=sid, data={'color': f'green','text':f'Report OK'}) else: print("WARNING: DISCORD_WEBHOOK not found") + if send_metrics: + api.Event.create(title="BUG REPORT", text=data, tags=["server:backend", f"host:{os.environ['HOST']}"]) print(f'New bug report, replay at https://www.toptal.com/developers/hastebin/{key}') @sio.event @@ -156,6 +174,8 @@ def disconnect(sid): games.pop(games.index(sio.get_session(sid).game)) print('disconnect ', sid) advertise_lobbies() + if send_metrics: + api.Metric.send(metric='online_players', points=[(int(time.time()), online_players)], tags=["server:backend", f"host:{os.environ['HOST']}"]) @sio.event def create_room(sid, room_name): @@ -263,6 +283,8 @@ def start_game(sid): ses: Player = sio.get_session(sid) ses.game.start_game() advertise_lobbies() + if send_metrics: + api.Metric.send(metric='start_game', points=[(int(time.time()), 1)], tags=["server:backend", f"host:{os.environ['HOST']}"]) @sio.event def set_character(sid, name): From e88a8f8f1245f580e5dccc21bc3709acb61f692f Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 24 Mar 2022 19:51:05 +0100 Subject: [PATCH 2/7] fix typo --- backend/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/server.py b/backend/server.py index fad557d..9da19df 100644 --- a/backend/server.py +++ b/backend/server.py @@ -18,7 +18,7 @@ send_metrics = False if "DATADOG_API_KEY" in os.environ and "DATADOG_APP_KEY" in os.environ: initialize() send_metrics = True - api.Event.create(title="Backend start", text="", tags=["server:backend", f"host:{os.environ['HOST']}"], alert_type="info")]) + api.Event.create(title="Backend start", text="", tags=["server:backend", f"host:{os.environ['HOST']}"], alert_type="info")) else: print("Datadog not configured") From 391640861452faa23883e185a1f6fc491f3146e8 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 24 Mar 2022 20:19:41 +0100 Subject: [PATCH 3/7] fix issues --- backend/server.py | 2 +- backend/tests/cards_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/server.py b/backend/server.py index 9da19df..8d19e3e 100644 --- a/backend/server.py +++ b/backend/server.py @@ -18,7 +18,7 @@ send_metrics = False if "DATADOG_API_KEY" in os.environ and "DATADOG_APP_KEY" in os.environ: initialize() send_metrics = True - api.Event.create(title="Backend start", text="", tags=["server:backend", f"host:{os.environ['HOST']}"], alert_type="info")) + api.Event.create(title="Backend start", text="", tags=["server:backend", f"host:{os.environ['HOST']}"], alert_type="info") else: print("Datadog not configured") diff --git a/backend/tests/cards_test.py b/backend/tests/cards_test.py index 2aa46d8..115a4f9 100644 --- a/backend/tests/cards_test.py +++ b/backend/tests/cards_test.py @@ -479,7 +479,7 @@ def test_saloon(): assert p.lives == p.max_lives # test WellsFargo -def test_diligenza(): +def test_wells_fargo(): sio = DummySocket() g = Game('test', sio) ps = [Player(f'p{i}', f'p{i}', sio) for i in range(4)] From 2cc441ea7ebcae01d66a4b4c0e55a4fce5967117 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 24 Mar 2022 20:15:57 +0100 Subject: [PATCH 4/7] Create pylint.yml --- .github/workflows/pylint.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/pylint.yml diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml new file mode 100644 index 0000000..5c5a3ac --- /dev/null +++ b/.github/workflows/pylint.yml @@ -0,0 +1,23 @@ +name: Pylint + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10"] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pylint + - name: Analysing the code with pylint + run: | + pylint $(git ls-files '*.py') -E From 68122a78e76f5f24255e4ef444036fd479d0eb82 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 24 Mar 2022 20:28:58 +0100 Subject: [PATCH 5/7] fix pylint --- .github/workflows/pylint.yml | 2 +- backend/bang/expansions/__init__.py | 1 + backend/bang/expansions/dodge_city/cards.py | 1 + backend/bang/expansions/dodge_city/characters.py | 1 + backend/bang/players.py | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 5c5a3ac..7ffbe10 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9", "3.10"] + python-version: ["3.7"] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} diff --git a/backend/bang/expansions/__init__.py b/backend/bang/expansions/__init__.py index 07b515a..616b8c7 100644 --- a/backend/bang/expansions/__init__.py +++ b/backend/bang/expansions/__init__.py @@ -1,3 +1,4 @@ +# pylint: skip-file class DodgeCity(): def get_characters(): diff --git a/backend/bang/expansions/dodge_city/cards.py b/backend/bang/expansions/dodge_city/cards.py index f503bb3..6e0a055 100644 --- a/backend/bang/expansions/dodge_city/cards.py +++ b/backend/bang/expansions/dodge_city/cards.py @@ -395,6 +395,7 @@ class FucileDaCaccia(Card): else: return False +# pylint: disable=function-redefined def get_starting_deck() -> List[Card]: cards = [ Barile(Suit.CLUBS, 'A'), diff --git a/backend/bang/expansions/dodge_city/characters.py b/backend/bang/expansions/dodge_city/characters.py index 0cf8545..d2c96de 100644 --- a/backend/bang/expansions/dodge_city/characters.py +++ b/backend/bang/expansions/dodge_city/characters.py @@ -134,6 +134,7 @@ class DocHolyday(Character): return True return False +# pylint: disable=function-redefined def all_characters() -> List[Character]: cards = [ PixiePete(), diff --git a/backend/bang/players.py b/backend/bang/players.py index cf819cc..34ec4a2 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -63,6 +63,7 @@ class Player: self.committed_suit_manette = None self.not_chosen_character = None try: + # pylint: disable=no-member del self.win_status except: pass From 4473886486d72c9b1567f95ad5fe0a7692b7f771 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 24 Mar 2022 20:30:44 +0100 Subject: [PATCH 6/7] add requirements to pylint --- .github/workflows/pylint.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 7ffbe10..b6f6869 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -17,6 +17,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip + cd backend + pip install --user -r requirements.txt pip install pylint - name: Analysing the code with pylint run: | From 95a3061f7401e098077dcf4853ad25ee11c33839 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Fri, 25 Mar 2022 00:35:18 +0100 Subject: [PATCH 7/7] add more metrics --- backend/server.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/server.py b/backend/server.py index 8d19e3e..388c040 100644 --- a/backend/server.py +++ b/backend/server.py @@ -284,12 +284,14 @@ def start_game(sid): ses.game.start_game() advertise_lobbies() if send_metrics: - api.Metric.send(metric='start_game', points=[(int(time.time()), 1)], tags=["server:backend", f"host:{os.environ['HOST']}"]) + api.Metric.send(metric='start_game', points=[(int(time.time()), 1)], tags=["server:backend", f"host:{os.environ['HOST']}", [f"exp:{e}" for e in ses.game.expansions]]) @sio.event def set_character(sid, name): ses: Player = sio.get_session(sid) ses.game.rpc_log.append(f'{ses.name};set_character;{name}') + if send_metrics: + api.Metric.send(metric='set_character', points=[(int(time.time()), 1)], tags=["server:backend", f"host:{os.environ['HOST']}", f"char:{name}"]) ses.set_character(name) @sio.event