Files
testmontools/README.md
T
2026-05-25 16:45:01 +03:00

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 Не передан обязательный параметр