┌─────────────────────────────┐
│ Backend │
│ │
│ ┌─────────────────────┐ │
│ │ Agent List │<───┐
│ │ (from DB / GUI) │ │
│ └─────────────────────┘ │
│ ┌─────────────────────┐ │
│ │ Worker Pool │ │
│ │ (goroutines) │ │
│ └─────────────────────┘ │
│ │ │
│ ▼ │
│ GetMetrics RPC │
└─────────────┬───────────────┘
│
▼
┌─────────────────────────────┐
│ SQL Database │
│ │
│ ┌───────────────┐ │
│ │ agents │ │
│ │ (ip, port, │ │
│ │ status, │ │
│ │ last_seen) │ │
│ └───────────────┘ │
│ ┌───────────────┐ │
│ │ metrics │ │
│ │ (cpu, memory,│ │
│ │ timestamp) │ │
│ └───────────────┘ │
└───────┬───────────────┬─────┘
│ │
▼ ▼
┌───────────────┐ ┌───────────────┐
│ Дашборд │ │ Дашборд │
│ (Web UI) │ │ (Web UI) │
│ │ │ │
│ - Добавление │ │ - Просмотр │
│ /удаление │ │ агентов │
│ агентов │ │ - Просмотр │
│ - Статусы │ │ метрик │
└───────────────┘ └───────────────┘
│
▼
┌─────────────────────────────┼─────────────────────────────┐
│ │ │
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Agent #1 │ │ Agent #2 │ │ Agent #3 │
│ │ │ │ │ │
│ gRPC Server │ │ gRPC Server │ │ gRPC Server │
│ Listen on port│ │ Listen on port│ │ Listen on port│
└───────────────┘ └───────────────┘ └───────────────┘
Цель: backend не ждёт по очереди, пока один агент ответит, а сразу опрашивает всех.
- Создать goroutine для каждого агента.
- Внутри goroutine сделать
GetMetricsсcontext.WithTimeout. - После получения метрик просто логировать их.
Результат: backend сразу видит метрики всех агентов, нет задержки на медленного агента.
Цель: не делать grpc.Dial каждый раз → ускоряет работу.
- При старте backend подключается к каждому агенту один раз.
- Держать
*grpc.ClientConnиproto.AgentServiceClient. - Использовать этот клиент многократно в goroutine.
Результат: экономия времени и ресурсов сети.
Цель: backend сразу видит, если агент упал или сеть пропала.
- Агент каждые N секунд отправляет “ping” на backend или backend опрашивает
Heartbeat()RPC. - Если heartbeat не приходит → помечаем агента как “offline”.
- Можно логировать “жив/мертв” для мониторинга.
Результат: backend всегда знает, кто жив, кто нет.
Цель: при закрытии процесса все соединения закрываются аккуратно.
- В агенте ловим
SIGINTиSIGTERMчерезos/signal. - На сигнал вызываем
grpcServer.GracefulStop(). - Закрываем все ресурсы (файлы, соединения).
Результат: безопасное завершение работы без зависших соединений.
Цель: backend или внешний монитор может проверить, что агент готов.
- Добавить простой gRPC метод
CheckHealth()→ возвращаетSERVING. - Можно проверять через curl / grpcurl для теста.
Результат: видно, что агент жив даже без GetMetrics.
Цель: если агентов много, не создавать слишком много goroutines.
- Завести task queue: каждый тик опроса всех агентов добавляется в очередь.
- Несколько “worker goroutines” берут агента из очереди и делают
GetMetrics. - Контролируется количество одновременно опрашиваемых агентов.
Результат: backend не перегружает CPU/сеть, масштабируемо для сотен агентов.
Цель: агенты сами “регестрируются” на backend → не нужно вручную список адресов.
- Агент при старте делает
Register()на backend, передавая IP + порт. - Backend хранит список живых агентов.
- Heartbeat → удаляет мёртвых.
Результат: легко масштабировать на десятки и сотни агентов, IP может быть динамическим.
Что делать:
- Создать таблицу
agents:
CREATE TABLE agents (
id SERIAL PRIMARY KEY,
ip VARCHAR(50) NOT NULL,
port INT NOT NULL,
hostname VARCHAR(100),
os VARCHAR(50),
last_seen TIMESTAMP,
status VARCHAR(20) DEFAULT 'offline'
);-
При каждом опросе агентского RPC сервер обновляет:
last_seenstatus = online/offline
-
Можно добавить таблицу
metricsдля хранения истории:
CREATE TABLE metrics (
id SERIAL PRIMARY KEY,
agent_id INT REFERENCES agents(id),
cpu INT,
memory INT,
timestamp TIMESTAMP DEFAULT NOW()
);-
Веб-интерфейс на Go (например Gin / Fiber / Echo).
-
Основные функции:
- Добавление/удаление агента (IP + порт).
- Просмотр списка агентов с их статусом (online/offline).
- Просмотр метрик последних опросов.
-
Backend берёт список агентов из SQL для опроса.
-
Backend обновляет базу после каждого опроса и логирует статусы.
- Дашборд добавляет агента → пишет в базу.
- Backend берёт агента из базы → делает RPC
GetMetrics. - Backend обновляет
last_seenиstatus. - Дашборд читает данные из базы → отображает текущие метрики и статус.
💡Результат:
- Дашборд показывает метрики и управляет списком агентов и их статусами.
- SQL база хранит адреса, статусы и метрики.
- Backend использует базу как источник правды для опроса.
export PATH=$PATH:/usr/local/go/bin
export PATH="$PATH:$(go env GOPATH)/bin"
go mod init project
go mod tidy
sudo apt install -y protobuf-compiler # For debian based distros
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
protoc --go_out=. --go-grpc_out=. proto/agent.proto go run .