Skip to content

Last-Guy-In-Stars/system_metrics

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Схема системы мониторинга

                    ┌─────────────────────────────┐
                    │           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 ↔ агенты

✅ 1️⃣ Параллельный опрос агентов

Цель: backend не ждёт по очереди, пока один агент ответит, а сразу опрашивает всех.

  • Создать goroutine для каждого агента.
  • Внутри goroutine сделать GetMetrics с context.WithTimeout.
  • После получения метрик просто логировать их.

Результат: backend сразу видит метрики всех агентов, нет задержки на медленного агента.


2️⃣ Постоянные соединения с агентами

Цель: не делать grpc.Dial каждый раз → ускоряет работу.

  • При старте backend подключается к каждому агенту один раз.
  • Держать *grpc.ClientConn и proto.AgentServiceClient.
  • Использовать этот клиент многократно в goroutine.

Результат: экономия времени и ресурсов сети.


3️⃣ Heartbeat (жизнеспособность агента)

Цель: backend сразу видит, если агент упал или сеть пропала.

  • Агент каждые N секунд отправляет “ping” на backend или backend опрашивает Heartbeat() RPC.
  • Если heartbeat не приходит → помечаем агента как “offline”.
  • Можно логировать “жив/мертв” для мониторинга.

Результат: backend всегда знает, кто жив, кто нет.


4️⃣ Graceful shutdown агента

Цель: при закрытии процесса все соединения закрываются аккуратно.

  • В агенте ловим SIGINT и SIGTERM через os/signal.
  • На сигнал вызываем grpcServer.GracefulStop().
  • Закрываем все ресурсы (файлы, соединения).

Результат: безопасное завершение работы без зависших соединений.


5️⃣ Health check для агента

Цель: backend или внешний монитор может проверить, что агент готов.

  • Добавить простой gRPC метод CheckHealth() → возвращает SERVING.
  • Можно проверять через curl / grpcurl для теста.

Результат: видно, что агент жив даже без GetMetrics.


6️⃣ Улучшение backend: очередь и таймауты

Цель: если агентов много, не создавать слишком много goroutines.

  • Завести task queue: каждый тик опроса всех агентов добавляется в очередь.
  • Несколько “worker goroutines” берут агента из очереди и делают GetMetrics.
  • Контролируется количество одновременно опрашиваемых агентов.

Результат: backend не перегружает CPU/сеть, масштабируемо для сотен агентов.


7️⃣ (Опционально) Dynamic agent registration

Цель: агенты сами “регестрируются” на backend → не нужно вручную список адресов.

  • Агент при старте делает Register() на backend, передавая IP + порт.
  • Backend хранит список живых агентов.
  • Heartbeat → удаляет мёртвых.

Результат: легко масштабировать на десятки и сотни агентов, IP может быть динамическим.


8️⃣ (Опционально) SQL база данных

Что делать:

  1. Создать таблицу 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'
);
  1. При каждом опросе агентского RPC сервер обновляет:

    • last_seen
    • status = online/offline
  2. Можно добавить таблицу metrics для хранения истории:

CREATE TABLE metrics (
    id SERIAL PRIMARY KEY,
    agent_id INT REFERENCES agents(id),
    cpu INT,
    memory INT,
    timestamp TIMESTAMP DEFAULT NOW()
);

9️⃣ Дашборд (UI)

  1. Веб-интерфейс на Go (например Gin / Fiber / Echo).

  2. Основные функции:

    • Добавление/удаление агента (IP + порт).
    • Просмотр списка агентов с их статусом (online/offline).
    • Просмотр метрик последних опросов.
  3. Backend берёт список агентов из SQL для опроса.

  4. Backend обновляет базу после каждого опроса и логирует статусы.


Данные и Взаимодействие

  1. Дашборд добавляет агента → пишет в базу.
  2. Backend берёт агента из базы → делает RPC GetMetrics.
  3. Backend обновляет last_seen и status.
  4. Дашборд читает данные из базы → отображает текущие метрики и статус.

💡Результат:

  • Дашборд показывает метрики и управляет списком агентов и их статусами.
  • SQL база хранит адреса, статусы и метрики.
  • Backend использует базу как источник правды для опроса.

Пример работы

Get metrics from windows and linux system

Окружение для запуска системы мониторинга

Быстрый старт

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 

В папке объектов вызовов, где лежит main.go сделать:

go run .

About

A metrics system in the Golang programming language

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages