Этот скрипт будет ходить на сайт, замерять время ответа и в конце построит красивый график прямо в HTML-файле.
После работы скрипт создаст:
CSV-файл со всеми замерами — можно открыть в Excel
HTML-отчёт с графиком (в PowerShell-версии)
Консольную статистику — среднее, максимум, количество ошибок
Просто через 8-24 часа скиньте этот CSV-файл или скриншот графика в техподдержку — и они увидят те самые пики до 5 секунд.
# Website-Latency-Monitor.ps1
# Сохрани этот файл, укажи свой URL и запусти
param(
[string]$Url = "https://ваш-сайт.ru",
[int]$IntervalSec = 60, # Интервал между проверками (сек)
[int]$DurationHours = 24, # Сколько часов мониторить
[string]$LogFile = "latency_log.csv"
)
Write-Host "🚀 Запуск мониторинга $Url" -ForegroundColor Green
Write-Host "📊 Интервал: $IntervalSec сек | Длительность: $DurationHours ч" -ForegroundColor Yellow
Write-Host "💾 Лог будет сохранён в: $LogFile" -ForegroundColor Cyan
# Заголовки CSV
"Timestamp;TimeTotalSeconds;HTTPCode;StatusMessage" | Out-File $LogFile -Encoding UTF8
$endTime = (Get-Date).AddHours($DurationHours)
$checkNum = 0
while ((Get-Date) -lt $endTime) {
$checkNum++
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
try {
# Измеряем время полной загрузки страницы
$measure = Measure-Command {
$response = Invoke-WebRequest -Uri $Url -UseBasicParsing -TimeoutSec 10
}
$timeTotal = [math]::Round($measure.TotalSeconds, 3)
$statusCode = $response.StatusCode
$statusMsg = $response.StatusDescription
$color = if ($timeTotal -gt 3) { "Red" } elseif ($timeTotal -gt 1) { "Yellow" } else { "Green" }
Write-Host "[$timestamp] #$checkNum → ${timeTotal}s (HTTP $statusCode)" -ForegroundColor $color
} catch {
$timeTotal = -1
$statusCode = $_.Exception.Response.StatusCode.value__
$statusMsg = $_.Exception.Message
Write-Host "[$timestamp] #$checkNum → ОШИБКА: $statusMsg" -ForegroundColor Red
}
# Пишем в лог
"$timestamp;$timeTotal;$statusCode;`"$statusMsg`"" | Out-File $LogFile -Append -Encoding UTF8
# Ждём перед следующим запросом
Start-Sleep -Seconds $IntervalSec
}
Write-Host "`n✅ Мониторинг завершён!" -ForegroundColor Green
Write-Host "📁 Лог сохранён: $LogFile" -ForegroundColor Green
# Генерируем HTML-отчёт с графиком
$htmlReport = @"
<!DOCTYPE html>
<html>
<head>
<title>Latency Report - $Url</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
body { font-family: Arial; padding: 20px; background: #1e1e2f; color: #eee; }
.container { max-width: 1200px; margin: auto; background: #2d2d44; padding: 20px; border-radius: 10px; }
canvas { background: #fff; border-radius: 8px; margin-top: 20px; }
.stats { display: flex; gap: 20px; margin-top: 20px; }
.stat-card { background: #3d3d5c; padding: 15px; border-radius: 8px; flex: 1; }
.bad { color: #ff6b6b; }
.good { color: #51cf66; }
.warn { color: #ffd43b; }
</style>
</head>
<body>
<div class="container">
<h1>📈 Мониторинг времени ответа сайта</h1>
<p><strong>Цель:</strong> $Url</p>
<p><strong>Период:</strong> с $((Get-Date).AddHours(-$DurationHours)) по $(Get-Date)</p>
<canvas id="latencyChart" width="800" height="400"></canvas>
<div class="stats">
<div class="stat-card"><strong>📊 Среднее время</strong><br><span id="avgTime">-</span> сек</div>
<div class="stat-card"><strong>⚠️ Максимальное время</strong><br><span id="maxTime">-</span> сек</div>
<div class="stat-card"><strong>✅ Успешных запросов</strong><br><span id="successCount">-</span></div>
<div class="stat-card"><strong>❌ Ошибок</strong><br><span id="errorCount">-</span></div>
</div>
</div>
<script>
const rawData = `@"
"@
// Тут будет разбор CSV
</script>
</body>
</html>
"@
$htmlFile = [System.IO.Path]::ChangeExtension($LogFile, ".html")
$htmlReport | Out-File $htmlFile -Encoding UTF8
Write-Host "📊 HTML-отчёт создан: $htmlFile" -ForegroundColor Cyan
Start-Process $htmlFile
#!/bin/bash
# latency-monitor.sh
URL="https://ваш-сайт.ru"
INTERVAL=60 # секунд
DURATION=24 # часов
LOG_FILE="latency_$(date +%Y%m%d_%H%M%S).csv"
echo "🚀 Запуск мониторинга $URL"
echo "📊 Интервал: $INTERVAL сек | Длительность: $DURATION ч"
echo "💾 Лог: $LOG_FILE"
# Заголовки CSV
echo "Timestamp;TimeTotalSeconds;HTTPCode" > "$LOG_FILE"
END_TIME=$(($(date +%s) + DURATION * 3600))
CHECK_NUM=0
while [ $(date +%s) -lt $END_TIME ]; do
CHECK_NUM=$((CHECK_NUM + 1))
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# Замеряем время curl'а (полное время ответа)
START=$(date +%s.%N)
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$URL")
END=$(date +%s.%N)
TIME_TOTAL=$(echo "$END - $START" | bc)
if [ "$HTTP_CODE" = "200" ]; then
if (( $(echo "$TIME_TOTAL > 3" | bc -l) )); then
COLOR="\033[31m" # красный
elif (( $(echo "$TIME_TOTAL > 1" | bc -l) )); then
COLOR="\033[33m" # жёлтый
else
COLOR="\033[32m" # зелёный
fi
echo -e "[$TIMESTAMP] #$CHECK_NUM → ${COLOR}${TIME_TOTAL}s\033[0m (HTTP $HTTP_CODE)"
else
TIME_TOTAL=-1
echo -e "[$TIMESTAMP] #$CHECK_NUM → \033[31mОШИБКА HTTP $HTTP_CODE\033[0m"
fi
echo "$TIMESTAMP;$TIME_TOTAL;$HTTP_CODE" >> "$LOG_FILE"
sleep $INTERVAL
done
echo -e "\n✅ Мониторинг завершён! Лог: $LOG_FILE"
echo "📊 Быстрая статистика:"
awk -F';' 'NR>1 && $3==200 {sum+=$2; count++} END {printf "Среднее время: %.3f сек\n", sum/count}' "$LOG_FILE"
awk -F';' 'NR>1 && $3==200 && $2>max {max=$2} END {printf "Максимальное время: %.3f сек\n", max}' "$LOG_FILE"
awk -F';' 'NR>1 && $3!=200 {errors++} END {print "Ошибок: " errors}' "$LOG_FILE"
@echo off
set URL=https://ваш-сайт.ru
set INTERVAL=60
set DURATION=24
set LOGFILE=latency_log_%date:~0,2%%date:~3,2%%date:~6,4%_%time:~0,2%%time:~3,2%.csv
echo Timestamp;TimeTotalSeconds;HTTPCode > %LOGFILE%
echo Запущен мониторинг %URL% на %DURATION% часа
set STARTTIME=%time%
set /a ENDSECONDS = %DURATION% * 3600
set CHECKNUM=0
:loop
set CHECKNUM=%CHECKNUM% + 1
set TIMESTAMP=%date% %time%
:: Замеряем время curl
for /f %%i in ('curl -s -o nul -w "%%{time_total}" --max-time 10 %URL%') do set TIMETOTAL=%%i
:: Определяем HTTP код
for /f %%i in ('curl -s -o nul -w "%%{http_code}" --max-time 10 %URL%') do set HTTPCODE=%%i
echo [%TIMESTAMP%] #%CHECKNUM% → %TIMETOTAL% сек (HTTP %HTTPCODE%)
echo %TIMESTAMP%;%TIMETOTAL%;%HTTPCODE% >> %LOGFILE%
:: Ожидание
timeout /t %INTERVAL% /nobreak > nul
goto loop
# Сохранить как monitor.ps1
# Открыть PowerShell от имени администратора (один раз):
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Запустить:
.\monitor.ps1 -Url "https://ваш-сайт.ru" -IntervalSec 30 -DurationHours 8
chmod +x latency-monitor.sh
./latency-monitor.sh
Комментарии
Пока нет комментариев. Будьте первым!