Подсчёт запросов по endpoint в логе
Python
Middle
Яндекс
01.01.2025
Дан файл access.log, в котором каждая строка имеет формат:
```text
<ip> - - [<date>] "GET /api/v1/users HTTP/1.1" 200 123
```
Нужно написать функцию `count_endpoints(path: str) -> list[tuple[str, int]]`, которая:
1. Принимает путь к файлу.
2. Считывает файл построчно.
3. Извлекает путь (например `/api/v1/users`).
4. Подсчитывает, сколько раз каждый путь встречался.
5. Возвращает **список из трёх самых популярных endpoint'ов** в формате:
```python
[("/api/v1/users", 150), ("/api/v1/orders", 120), ("/health", 80)]
```
Если уникальных endpoint'ов меньше трёх — вернуть все.
Файл может быть большим, нужно читать его построчно, а не целиком в память.
Ответы
Решение 1
```python
from collections import Counter
from typing import List, Tuple
def count_endpoints(path: str) -> List[Tuple[str, int]]:
counter: Counter[str] = Counter()
with open(path, "r", encoding="utf-8") as f:
for line in f:
# Простейший парсинг по кавычкам
parts = line.split('"')
if len(parts) < 2:
continue
request = parts[1] # например: GET /api/v1/users HTTP/1.1
req_parts = request.split()
if len(req_parts) < 2:
continue
endpoint = req_parts[1]
counter[endpoint] += 1
return counter.most_common(3)
```