Skip to content

Commit 99b447b

Browse files
Adds lint config for Python and link checks
Signed-off-by: Adrian Cole <[email protected]>
1 parent 8946183 commit 99b447b

File tree

14 files changed

+436
-308
lines changed

14 files changed

+436
-308
lines changed

.github/workflows/lint.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: lint
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
8+
jobs:
9+
lint:
10+
runs-on: ubuntu-24.04
11+
steps:
12+
- uses: actions/checkout@v4
13+
- name: Set up Python 3.12
14+
uses: actions/setup-python@v5
15+
with:
16+
python-version: 3.12
17+
- name: Install pre-commit
18+
run: |
19+
python -m pip install --upgrade pip
20+
pip install pre-commit
21+
- run: make lint

.pre-commit-config.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
default_language_version:
2+
python: python3.12
3+
repos:
4+
- repo: https://github.com/astral-sh/ruff-pre-commit
5+
rev: v0.11.0
6+
hooks:
7+
- id: ruff
8+
args: [
9+
"--fix",
10+
"--line-length", "120",
11+
"--extend-select=PLC,PLE,Q,A",
12+
]
13+
- id: ruff-format
14+
args: [
15+
"--line-length", "120"
16+
]
17+

Elastiflix/locustfile.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
from time import sleep
44
import random
55

6+
67
class HelloWorldUser(HttpUser):
78
@task
89
def hello_world(self):
9-
1010
self.client.get("/api/favorites")
1111

1212
if random.random() < 0.5:
1313
self.client.post("/api/favorites", json={"id": random.randint(1, 100)})
14-
14+
1515
# in 50% of the cases, call the login endpoint
1616
if random.random() < 0.5:
1717
self.client.get("/api/login")
18-
sleep(1)
18+
sleep(1)
Lines changed: 82 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,43 @@
11
from flask import Flask, request
2-
import sys
32

43
from elasticapm.contrib.flask import ElasticAPM
5-
import elasticapm
6-
import logging
7-
import redis
4+
import elasticapm
5+
import logging
6+
import redis
87
import os
98
import ecs_logging
109
import datetime
1110
import random
12-
import time
11+
import time
1312

14-
delay_time = os.environ.get('TOGGLE_SERVICE_DELAY')
15-
if delay_time is "" or delay_time is None:
13+
delay_time = os.environ.get("TOGGLE_SERVICE_DELAY")
14+
if delay_time == "" or delay_time is None:
1615
delay_time = 0
1716
delay_time = int(delay_time)
1817

19-
redis_host = os.environ.get('REDIS_HOST') or 'localhost'
20-
redis_port = os.environ.get('REDIS_PORT') or 6379
18+
redis_host = os.environ.get("REDIS_HOST") or "localhost"
19+
redis_port = os.environ.get("REDIS_PORT") or 6379
2120

22-
application_port = os.environ.get('APPLICATION_PORT') or 5000
21+
application_port = os.environ.get("APPLICATION_PORT") or 5000
2322

24-
service_name = os.environ.get('ELASTIC_APM_SERVICE_NAME') or 'python-favorite-elastic-manual'
25-
secret_token = os.environ.get('ELASTIC_APM_SECRET_TOKEN')
23+
service_name = os.environ.get("ELASTIC_APM_SERVICE_NAME") or "python-favorite-elastic-manual"
24+
secret_token = os.environ.get("ELASTIC_APM_SECRET_TOKEN")
2625
# fail if secret token not set
2726
if secret_token is None:
28-
raise Exception('ELASTIC_APM_SECRET_TOKEN environment variable not set')
29-
server_url = os.environ.get('ELASTIC_APM_SERVER_URL')
27+
raise Exception("ELASTIC_APM_SECRET_TOKEN environment variable not set")
28+
server_url = os.environ.get("ELASTIC_APM_SERVER_URL")
3029
# fail if server url not set
3130
if server_url is None:
32-
raise Exception('ELASTIC_APM_SERVER_URL environment variable not set')
33-
environment = os.environ.get('ENVIRONMENT') or 'dev'
31+
raise Exception("ELASTIC_APM_SERVER_URL environment variable not set")
32+
environment = os.environ.get("ENVIRONMENT") or "dev"
3433

3534

3635
app = Flask(__name__)
37-
app.config['ELASTIC_APM'] = {
38-
'SERVICE_NAME': service_name,
39-
'SECRET_TOKEN': secret_token,
40-
'SERVER_URL': server_url,
41-
'ENVIRONMENT': environment
36+
app.config["ELASTIC_APM"] = {
37+
"SERVICE_NAME": service_name,
38+
"SECRET_TOKEN": secret_token,
39+
"SERVER_URL": server_url,
40+
"ENVIRONMENT": environment,
4241
}
4342
apm = ElasticAPM(app)
4443
elasticapm.instrument()
@@ -51,8 +50,8 @@
5150
handler = logging.StreamHandler()
5251
handler.setFormatter(ecs_logging.StdlibFormatter())
5352
logger.addHandler(handler)
54-
logging.getLogger('werkzeug').setLevel(logging.ERROR)
55-
logging.getLogger('werkzeug').addHandler(handler)
53+
logging.getLogger("werkzeug").setLevel(logging.ERROR)
54+
logging.getLogger("werkzeug").addHandler(handler)
5655

5756
r = redis.Redis(host=redis_host, port=redis_port, decode_responses=True)
5857

@@ -62,56 +61,67 @@ def after_request(response):
6261
print(response)
6362
# timestamp in iso8601
6463
timestamp = datetime.datetime.utcnow().isoformat()
65-
logger.info('%s %s %s %s %s %s', timestamp, request.remote_addr, request.method, request.scheme, request.full_path, response.status, extra={
66-
"event.dataset": "favorite.log",
67-
"http.request.method": request.method,
68-
"http.request.path": request.full_path,
69-
"source.ip": request.remote_addr,
70-
"http.response.status_code": response.status
71-
})
64+
logger.info(
65+
"%s %s %s %s %s %s",
66+
timestamp,
67+
request.remote_addr,
68+
request.method,
69+
request.scheme,
70+
request.full_path,
71+
response.status,
72+
extra={
73+
"event.dataset": "favorite.log",
74+
"http.request.method": request.method,
75+
"http.request.path": request.full_path,
76+
"source.ip": request.remote_addr,
77+
"http.response.status_code": response.status,
78+
},
79+
)
7280
return response
7381

74-
@app.route('/')
82+
83+
@app.route("/")
7584
def hello():
76-
logger.info('Main request successfull')
77-
return 'Hello World!'
85+
logger.info("Main request successfull")
86+
return "Hello World!"
87+
7888

79-
@app.route('/favorites', methods=['GET'])
89+
@app.route("/favorites", methods=["GET"])
8090
def get_favorite_movies():
8191
# add artificial delay if enabled
8292
if delay_time > 0:
83-
time.sleep(max(0, random.gauss(delay_time/1000, delay_time/1000/10)))
93+
time.sleep(max(0, random.gauss(delay_time / 1000, delay_time / 1000 / 10)))
8494

85-
user_id = str(request.args.get('user_id'))
95+
user_id = str(request.args.get("user_id"))
96+
97+
logger.info(
98+
"Getting favorites for user " + user_id,
99+
extra={"event.dataset": "favorite.log", "user.id": request.args.get("user_id")},
100+
)
86101

87-
logger.info('Getting favorites for user ' + user_id, extra={
88-
"event.dataset": "favorite.log",
89-
"user.id": request.args.get('user_id')
90-
})
91-
92102
favorites = r.smembers(user_id)
93-
103+
94104
# convert to list
95105
favorites = list(favorites)
96-
logger.info('User ' + user_id + ' has favorites: ' + str(favorites), extra={
97-
"event.dataset": "favorite.log",
98-
"user.id": user_id
99-
})
100-
return { "favorites": favorites}
106+
logger.info(
107+
"User " + user_id + " has favorites: " + str(favorites),
108+
extra={"event.dataset": "favorite.log", "user.id": user_id},
109+
)
110+
return {"favorites": favorites}
101111

102-
@app.route('/favorites', methods=['POST'])
112+
113+
@app.route("/favorites", methods=["POST"])
103114
def add_favorite_movie():
104115
# add artificial delay if enabled
105116
if delay_time > 0:
106-
time.sleep(max(0, random.gauss(delay_time/1000, delay_time/1000/10)))
117+
time.sleep(max(0, random.gauss(delay_time / 1000, delay_time / 1000 / 10)))
107118

108-
user_id = str(request.args.get('user_id'))
109-
movie_id = request.json['id']
119+
user_id = str(request.args.get("user_id"))
120+
movie_id = request.json["id"]
110121

111-
logger.info('Adding or removing favorites for user ' + user_id, extra={
112-
"event.dataset": "favorite.log",
113-
"user.id": user_id
114-
})
122+
logger.info(
123+
"Adding or removing favorites for user " + user_id, extra={"event.dataset": "favorite.log", "user.id": user_id}
124+
)
115125

116126
# add movie to the user's favorite list. If it already exists, remove it from the list
117127
redisRespone = r.srem(user_id, int(movie_id))
@@ -122,32 +132,32 @@ def add_favorite_movie():
122132
# convert to list
123133
favorites = list(favorites)
124134

125-
logger.info('User ' + user_id + ' has favorites: ' + str(favorites), extra={
126-
"event.dataset": "favorite.log",
127-
"user.id": user_id
128-
})
135+
logger.info(
136+
"User " + user_id + " has favorites: " + str(favorites),
137+
extra={"event.dataset": "favorite.log", "user.id": user_id},
138+
)
129139

130140
# if enabled, in 50% of the cases, sleep for 2 seconds
131-
sleep_time = os.getenv('TOGGLE_CANARY_DELAY')
132-
if sleep_time is None or sleep_time == "":
141+
sleep_time = os.getenv("TOGGLE_CANARY_DELAY")
142+
if sleep_time is None or sleep_time == "":
133143
sleep_time = 0
134-
144+
135145
sleep_time = int(sleep_time)
136146

137147
if sleep_time > 0 and random.random() < 0.5:
138-
time.sleep(max(0, random.gauss(sleep_time/1000, sleep_time/1000/10)))
148+
time.sleep(max(0, random.gauss(sleep_time / 1000, sleep_time / 1000 / 10)))
139149
# add label to transaction
140-
logger.info('Canary enabled')
150+
logger.info("Canary enabled")
141151
elasticapm.label(quiz_solution="correlations")
142152
elasticapm.label(canary="test-new-feature")
143-
if(random.random() < float(os.getenv('TOGGLE_CANARY_FAILURE', 0))):
153+
if random.random() < float(os.getenv("TOGGLE_CANARY_FAILURE", 0)):
144154
# throw an exception in 50% of the cases
145-
logger.error('Something went wrong')
146-
raise Exception('Something went wrong')
147-
148-
return { "favorites": favorites}
155+
logger.error("Something went wrong")
156+
raise Exception("Something went wrong")
157+
158+
return {"favorites": favorites}
149159

150160

151-
logger.info('App startup')
152-
app.run(host='0.0.0.0', port=application_port)
153-
logger.info('App Stopped')
161+
logger.info("App startup")
162+
app.run(host="0.0.0.0", port=application_port)
163+
logger.info("App Stopped")

0 commit comments

Comments
 (0)