376.57K

Презентация_Пульс_мониторинг_хостов

1.

ГБПОУ «Курганский технологический колледж имени Героя Советского Союза Н.Я.
Анфиногенова»
Проектирование модуля сетевой проверки хостов
и реализация многопоточного мониторинга
Выполнил: ____________________
Группа: ______________________
Специальность: _______________
Руководитель: ________________
Курган, 2026

2.

Актуальность, объект, предмет, цель и задачи
Актуальность
Объект и предмет
Цель и задачи
Нужно автоматизировать
контроль доступности
сетевых узлов.
Объект — консольное
приложение мониторинга
хостов.
Цель — реализовать
модуль сетевой проверки.
Требуется разовая
проверка и постоянный
мониторинг.
• Предмет — функции
проверки доступности,
логирования и
конкурентной обработки.
• Результаты должны
выводиться в консоль и
записываться в лог.
• Задачи: чтение файла,
pingHost, режим -monitor,
отдельная горутина на
хост, graceful shutdown.
2

3.

1 Проектирование модуля сетевой проверки хостов
Файл
hosts.txt
readHosts()
checkHost()
Результат
PingResult
Список
адресов
Чтение и
фильтрация
Проверка TCP
Статус, время, ошибка
Ключевые решения
проекта
Для проверки выбран TCP, так как он не требует
прав суперпользователя.
Базовый адрес нормализуется к host:80.
type PingResult struct {
Timestamp time.Time
Host string
Status string
Latency time.Duration
Error string
}
Структура данных
• Единый формат результата упрощает вывод и
логирование.
3

4.

Структура программы и параметры запуска
Файлы проекта
Флаги командной
строки
путь к файлу со списком
main.go
парсинг флагов и запуск
режима
hosts.go
чтение списка адресов из
файла
-c 3
число повторов в разовой
проверке
ping.go
pingHost(), checkHost(),
PingResult
-monitor
переход в постоянный режим
-interval 5s
пауза между циклами воркера
-timeout 2s
лимит ожидания TCPсоединения
-log
monitor.log
путь к файлу журнала
monitor.g воркеры, канал, вывод,
o
логирование
hosts.txt
исходный перечень
проверяемых хостов
-f hosts.txt
хостов
4

5.

2 Реализация функций сетевой проверки
Функция
pingHost()
1 func pingHost(host string, timeout time.Duration) (bool,
time.Duration, error) {
2
target, err := normalizeAddress(host)
3
if err != nil {
4
return false, 0, err
5
}
6
7
start := time.Now()
8
conn, err := net.DialTimeout("tcp", target, timeout)
9
latency := time.Since(start)
10
if err != nil {
11
return false, latency, err
12
}
13
defer conn.Close()
14
return true, latency, nil
15 }
Логика проверки
Адрес нормализуется: host →
host:80.
Соединение создаётся через
net.DialTimeout.
Латентность измеряется как
time.Since(start).
•Результат
При ошибке возвращаются
OK — соединение открыто
статус и текст причины.
Timeout — время ожидания
вышло
Error — иная сетевая ошибка
5

6.

2.1 Реализация проверки доступности хоста
1
Чтение
хоста
2
3
Нормализа
ция
адреса
4
TCP
DialTimeou
t
Пример запуска
go run main.go
-f hosts.txt -c
3
Статус и
latency
Фрагмент вывода разовой
проверки
Хост
Статус
Время ответа
Попытка
google.com
OK
45ms
1/3
google.com
OK
47ms
2/3
localhost
OK
0ms
1/3
192.168.1.1
Timeout
0ms
1/3
6

7.

3 Реализация многопоточного мониторинга
main
Консоль
N
ворке
ров
Преимущес
тва канала
нет гонки при
записи
chan
monitor.
log
единый
формат
вывода
• масштабир
ование по
числу
хостов
Модель: один воркер на один хост; все воркеры отправляют PingResult в
общий канал, а отдельный слушатель выводит строку в консоль и пишет её в
журнал.
7

8.

3.1 Создание для каждого хоста отдельной горутины
1 for _, host := range hosts {
2
workers.Add(1)
Воркеры
3
go hostWorker(ctx, host, interval, timeout, results,
мониторинга
&workers)
4 }
5
6 func hostWorker(ctx context.Context, host string,
7
interval, timeout time.Duration,
8
results chan<- PingResult, wg *sync.WaitGroup) {
9
defer wg.Done()
10
ticker := time.NewTicker(interval)
11
defer ticker.Stop()
12
13
for {
14
result := checkHost(host, timeout)
15
select {
16
case results <- result:
17
case <-ctx.Done():
18
return
19
}
20
select {
21
case <-ticker.C:
22
case <-ctx.Done():
23
return
24
}
25
}
26 }
Что делает каждая
горутина
проверяет один закреплённый
хост;
ждёт interval между циклами;
отправляет результат в канал;
• завершается по ctx.Done().
Принцип
масштабирования:
количество активных
горутин = количество
хостов.
8

9.

Логирование и корректное завершение программы
sigChan
:= make(chan os.Signal,
Graceful shutdown
1)
signal.Notify(sigChan,
syscall.SIGINT, syscall.SIGTERM)
<-sigChan
cancel()
workers.Wait()
close(results)
Ctrl+C отменяет context.
Формат журнала
monitor.log
2026-03-16 14:35:02 | google.com |
OK | 42ms |
2026-03-16 14:35:07 | 192.168.1.1 |
Timeout | 0s | i/o timeout
Каждая успешная и неуспешная попытка
фиксируется с timestamp, статусом, временем
ответа и текстом ошибки.
Воркеры завершаются без утечки ресурсов.
• После Wait() канал закрывается безопасно.
OK | Timeout | Error
9

10.

Заключение
Итоги
выполнения
Соответствие
заданию
Спроектирован модуль
сетевой проверки хостов.
1
Проектирование
модуля
Перспективы
развития
поддержка ICMP ping;
2
Функции сетевой
проверки
выбор порта 80/443;
2.1
Проверка
доступности хоста
сбор статистики
доступности;
3
Многопоточный
мониторинг
3.1
Отдельная горутина
на хост
Реализованы функции
pingHost() и checkHost().
Создан режим постоянного
многопоточного
мониторинга.
• Для каждого хоста
запускается отдельная
горутина.
• экспорт отчётов и
метрик.
10
English     Русский Rules