Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/scalingo logs #365

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions app/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from app.domain.regulations import compute_regulation_for_user
from app.domain.vehicle import find_vehicle
from app.helpers.oauth.models import ThirdPartyApiKey
from app.helpers.scalingo_logs import get_long_requests, get_user_requests
from app.helpers.xml.greco import temp_write_greco_xml
from app.models.controller_control import ControllerControl
from app.models.user import User
Expand Down Expand Up @@ -303,3 +304,14 @@ def load_company_stats():
def temp_command_generate_xm_control(id):
control = ControllerControl.query.get(id)
temp_write_greco_xml(control)


@app.cli.command("log_long_requests", with_appcontext=False)
def log_long_requests():
get_long_requests(nb_results=20, nb_lines=100000)


@app.cli.command("log_user_requests", with_appcontext=False)
@click.argument("user_id", required=True)
def log_user_requests(user_id):
get_user_requests(user_id=user_id, nb_results=20, nb_lines=1000000)
70 changes: 70 additions & 0 deletions app/helpers/scalingo_logs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import re
import subprocess


def extract_timestamp_from_log(log):
return log[:19]


def extract_endpoint_from_log(log):
endpoint_pattern = r'/graphql "(\w+)"'
endpoint_match = re.search(endpoint_pattern, log)
return endpoint_match.group(1) if endpoint_match else ""


def extract_time_from_log(log):
time_pattern = r"time=(\d+)ms"
time_match = re.search(time_pattern, log)
return int(time_match.group(1)) if time_match else None


def extract_user_from_log(log):
username_pattern = r"user=([\w\s]+) user_id"
userid_pattern = r"user_id=([\d]+)"

username_match = re.search(username_pattern, log)
userid_match = re.search(userid_pattern, log)

username = username_match.group(1) if username_match else ""
userid = userid_match.group(1) if userid_match else ""

return (username, userid)


def get_long_requests(nb_results=20, nb_lines=10000):
cmd = f"scalingo --region osc-fr1 --app mobilic-api logs --lines {nb_lines} | grep '\[web-' | awk 'NF'"

lines = [
l.decode("utf-8")
for l in subprocess.check_output(cmd, shell=True).splitlines()
]

data = []
for line in lines:
time = extract_time_from_log(line)
if time is None:
continue
data.append((time, line))
data.sort(key=lambda l: l[0], reverse=True)
for d in data[:nb_results]:
(ms, text) = d
(username, userid) = extract_user_from_log(text)
ts = extract_timestamp_from_log(text)
endpoint = extract_endpoint_from_log(text)
print(
" - ".join(
[f"{ms} ms", ts, endpoint, f"id={userid}", f"name={username}"]
)
)


def get_user_requests(user_id, nb_results=20, nb_lines=10000):
cmd = f"scalingo --region osc-fr1 --app mobilic-api logs --lines {nb_lines} | grep 'user_id={user_id}'"

lines = [
l.decode("utf-8")
for l in subprocess.check_output(cmd, shell=True).splitlines()
]

for l in lines[:nb_results]:
print(l)