5.8 KiB
🛠️ testmontools
Лёгкий HTTP-сервис для сетевой диагностики. Оборачивает ping, traceroute и curl в REST API — удобно для мониторинга, дебага и автоматизации.
📋 Содержание
Требования
- Python 3.8+
- Flask
- Утилиты
ping,traceroute,curlв системе
pip install flask
Запуск
python app.py
Сервер стартует на http://0.0.0.0:7088.
API Reference
Все эндпоинты принимают Content-Type: application/json и возвращают JSON.
Формат входных данных
В теле каждого запроса передаётся одно из полей:
| Поле | Тип | Описание |
|---|---|---|
url |
string | Полный URL (https://example.com/path) |
host |
string | Хост или IP (example.com, 8.8.8.8) |
Если передан URL, хост извлекается автоматически там, где нужен именно он (ping, traceroute).
POST /testmontools/ping
Запускает ping -c 4 до указанного хоста.
Запрос
{ "host": "example.com" }
Ответ
{
"input": "example.com",
"resolved_host": "example.com",
"stdout": "PING example.com (93.184.216.34) ...",
"stderr": "",
"returncode": 0
}
POST /testmontools/traceroute
Запускает traceroute до указанного хоста.
Запрос
{ "host": "8.8.8.8" }
Ответ
{
"input": "8.8.8.8",
"resolved_host": "8.8.8.8",
"stdout": "traceroute to 8.8.8.8 (8.8.8.8), 30 hops max ...",
"stderr": "",
"returncode": 0
}
POST /testmontools/curl
Выполняет curl к указанному URL с подробными тайминговыми метриками.
Запрос
{ "url": "https://example.com" }
Дополнительные параметры:
| Поле | Тип | Описание |
|---|---|---|
headers |
boolean | Если true — запрашивает только заголовки (-I) |
Ответ
{
"input": "https://example.com",
"url": "https://example.com",
"timing": {
"dns_lookup": 0.012,
"tcp_connect": 0.034,
"tls_handshake":0.098,
"pre_transfer": 0.099,
"first_byte": 0.215,
"total": 0.216,
"size_bytes": 1256,
"speed_bps": 5814,
"http_code": 200
},
"trace": "* Connected to example.com ...",
"body": "<!doctype html>...",
"returncode": 0
}
Тайминговые поля
| Поле | Описание |
|---|---|
dns_lookup |
Время разрешения DNS (сек) |
tcp_connect |
Время установки TCP-соединения (сек) |
tls_handshake |
Время TLS-хендшейка (сек) |
pre_transfer |
Время до начала передачи (сек) |
first_byte |
Время до первого байта ответа (сек) |
total |
Общее время запроса (сек) |
size_bytes |
Размер скачанного тела (байт) |
speed_bps |
Скорость загрузки (байт/сек) |
http_code |
HTTP-код ответа |
POST /testmontools/all
Запускает ping, traceroute и curl параллельно и возвращает сводный результат.
Запрос
{ "url": "https://example.com" }
Ответ
{
"input": "https://example.com",
"ping": { ... },
"traceroute": { ... },
"curl": { ... }
}
Структура каждого вложенного объекта совпадает с ответами соответствующих отдельных эндпоинтов.
Примеры
curl из терминала
# Ping
curl -s -X POST http://localhost:7088/testmontools/ping \
-H 'Content-Type: application/json' \
-d '{"host": "google.com"}' | jq
# Только заголовки
curl -s -X POST http://localhost:7088/testmontools/curl \
-H 'Content-Type: application/json' \
-d '{"url": "https://google.com", "headers": true}' | jq
# Полная диагностика
curl -s -X POST http://localhost:7088/testmontools/all \
-H 'Content-Type: application/json' \
-d '{"url": "https://google.com"}' | jq
Python
import requests
r = requests.post(
"http://localhost:7088/testmontools/all",
json={"url": "https://example.com"}
)
data = r.json()
print(data["curl"]["timing"]["first_byte"])
Коды ответов
| HTTP-код | Описание |
|---|---|
200 |
Успешно, результат в теле ответа |
400 |
Не передан обязательный параметр |