↩️ Назад

Категории

Диагностика хостинга и сайта

21.05.2026 | коды из категории: Создание сайтов

Что на выходе?

Этот скрипт будет ходить на сайт, замерять время ответа и в конце построит красивый график прямо в HTML-файле.
После работы скрипт создаст:
CSV-файл со всеми замерами — можно открыть в Excel
HTML-отчёт с графиком (в PowerShell-версии)
Консольную статистику — среднее, максимум, количество ошибок
Просто через 8-24 часа скиньте этот CSV-файл или скриншот графика в техподдержку — и они увидят те самые пики до 5 секунд.

PowerShell с HTML-отчётом (самый наглядный)

# 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

Bash-скрипт для Linux/Mac/WSL

#!/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"

Простой .bat для Windows (минимализм)

@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

Как запустить? Для PowerShell:

# Сохранить как monitor.ps1
# Открыть PowerShell от имени администратора (один раз):
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# Запустить:
.\monitor.ps1 -Url "https://ваш-сайт.ru" -IntervalSec 30 -DurationHours 8

Как запустить? Для Bash (Linux/WSL):

chmod +x latency-monitor.sh
./latency-monitor.sh



Категории:

Категории

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку

Посетителей сегодня: 0
о блоге | карта блога | 📡 Подписаться на RSS

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA