SensusAgent/docs/collectors/proxvmservices.md
Sergey Antropoff 5fa101dfff feat: добавлен коллектор proxvmservices для обнаружения сервисов на VM
- Создан новый коллектор proxvmservices для обнаружения и мониторинга сервисов
- Поддержка PostgreSQL с Patroni (кластер, репликация, конфигурация)
- Поддержка etcd кластера (члены, лидер, здоровье)
- Поддержка остальных сервисов: Redis, ClickHouse, RabbitMQ, Kafka, MongoDB, Kubernetes
- Добавлен в Makefile и конфигурацию агента
- Обновлены групповые переменные Ansible для включения в группу proxvms
- Исправлены проблемы с шаблонами Ansible (конфигурация и systemd unit)
- Создана подробная документация
- Протестирован на удаленных серверах через Ansible

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-09-15 17:04:47 +03:00

234 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Коллектор proxvmservices
## Описание
Коллектор `proxvmservices` предназначен для обнаружения и мониторинга сервисов на виртуальных машинах и контейнерах Proxmox. Он автоматически определяет запущенные сервисы, их конфигурацию, состояние кластеров и соединения между сервисами.
## Поддерживаемые сервисы
### Кластерные сервисы
- **PostgreSQL** с Patroni - обнаружение кластера, репликации, конфигурации
- **etcd** - обнаружение кластера, членов, лидера, здоровья
- **Kubernetes** - обнаружение кластера, версии, портов
### Автономные сервисы
- **Redis** - версия, порты, конфигурация
- **ClickHouse** - версия, порты, конфигурация
- **RabbitMQ** - версия, порты, конфигурация
- **Kafka** - порты, конфигурация
- **MongoDB** - версия, порты, конфигурация
## Методы обнаружения
### PostgreSQL с Patroni
1. **Процессы**: проверка `postgres` и `patroni`
2. **Порты**: 5432 (PostgreSQL), 8008 (Patroni REST API)
3. **Версия**: через `psql --version` или `postgres --version`
4. **Конфигурация**: парсинг файлов `/etc/patroni/patroni.yml`, `/etc/patroni.yml`
5. **Кластер**: команда `patronictl list` для получения информации о членах кластера
6. **Репликация**: SQL-запрос `SELECT client_addr, state FROM pg_stat_replication`
### etcd
1. **Процессы**: проверка `etcd`
2. **Порты**: 2379 (client), 2380 (peer)
3. **Версия**: через `etcdctl version`
4. **Конфигурация**: парсинг файлов `/etc/etcd/etcd.conf`, systemd unit
5. **Кластер**: команды `etcdctl member list`, `etcdctl endpoint status`, `etcdctl endpoint health`
### Kubernetes
1. **Процессы**: проверка `kubelet`, `kube-apiserver`
2. **Порты**: 6443 (API server), 10250 (kubelet)
3. **Версия**: через `kubectl version --client --short`
### Остальные сервисы
- **Redis**: процесс `redis-server`, порт 6379, версия через `redis-cli --version`
- **ClickHouse**: процесс `clickhouse-server`, порты 8123, 9000, версия через `clickhouse-client --version`
- **RabbitMQ**: процесс `rabbitmq-server`, порты 5672, 15672, версия через `rabbitmqctl version`
- **Kafka**: процесс `kafka.Kafka`, порт 9092
- **MongoDB**: процесс `mongod`, порт 27017, версия через `mongosh --version`
## Структура выходных данных
```json
{
"collector_name": "proxvmservices",
"execution_time_ms": 280,
"execution_time_seconds": 0.280283673,
"machine_uid": "1581318a2bb03141",
"services": [
{
"name": "postgresql",
"type": "cluster",
"status": "running",
"version": "14.9",
"ports": [5432, 8008],
"config": {
"config_file": "/etc/patroni/patroni.yml",
"scope": "postgresql_cluster",
"namespace": "/patroni"
},
"cluster": {
"name": "postgresql_cluster",
"state": "healthy",
"role": "leader",
"members": [
{
"name": "postgresql-1",
"host": "10.14.246.75",
"port": 5432,
"state": "running",
"role": "leader",
"lag": 0
}
],
"etcd_endpoint": "10.14.246.77:2379",
"config": {
"scope": "postgresql_cluster",
"namespace": "/patroni"
}
},
"connections": [
{
"type": "replication",
"target": "10.14.246.76",
"status": "streaming"
}
]
}
]
}
```
## Поля данных
### ServiceInfo
- `name` - имя сервиса (postgresql, etcd, redis, etc.)
- `type` - тип сервиса ("standalone" или "cluster")
- `status` - статус сервиса ("running", "stopped", "unknown")
- `version` - версия сервиса
- `ports` - массив портов, на которых слушает сервис
- `config` - конфигурация сервиса (файлы, параметры)
- `cluster` - информация о кластере (для кластерных сервисов)
- `connections` - информация о соединениях (репликация, etc.)
### PatroniClusterInfo (для PostgreSQL)
- `name` - имя кластера
- `state` - состояние кластера ("healthy", "degraded")
- `role` - роль текущего узла ("leader", "replica", "unknown")
- `members` - массив членов кластера
- `etcd_endpoint` - endpoint etcd для Patroni
- `config` - конфигурация Patroni
### PatroniMember
- `name` - имя члена кластера
- `host` - IP-адрес
- `port` - порт
- `state` - состояние ("running", "stopped")
- `role` - роль ("leader", "replica")
- `lag` - задержка репликации в байтах
### EtcdClusterInfo (для etcd)
- `name` - имя кластера
- `version` - версия etcd
- `members` - массив членов кластера
- `leader` - ID лидера
- `health` - здоровье кластера ("healthy", "unhealthy")
- `cluster_size` - размер кластера
### EtcdMember
- `id` - ID члена
- `name` - имя члена
- `peer_urls` - URL для peer-соединений
- `client_urls` - URL для client-соединений
- `is_leader` - является ли лидером
- `status` - статус члена
### ConnectionInfo
- `type` - тип соединения ("replication", etc.)
- `target` - целевой хост
- `status` - статус соединения
## Конфигурация
```yaml
proxvmservices:
enabled: true
type: exec
key: proxvmservices
interval: "300s"
timeout: "60s"
exec: "./collectors/proxvmservices"
platforms: [linux]
```
## Требования
### Системные зависимости
- `pgrep` - для проверки процессов
- `ss` - для проверки портов
- `psql` или `postgres` - для PostgreSQL
- `patronictl` - для Patroni
- `etcdctl` - для etcd
- `kubectl` - для Kubernetes
- `redis-cli` - для Redis
- `clickhouse-client` - для ClickHouse
- `rabbitmqctl` - для RabbitMQ
- `mongosh` - для MongoDB
### Права доступа
- Чтение конфигурационных файлов сервисов
- Выполнение команд управления сервисами
- Доступ к портам для проверки состояния
## Примеры использования
### Обнаружение PostgreSQL кластера
```bash
# Проверка процессов
pgrep -f postgres
pgrep -f patroni
# Проверка портов
ss -tln sport = :5432
ss -tln sport = :8008
# Информация о кластере
patronictl list
patronictl show-config
# Репликация
psql -t -c "SELECT client_addr, state FROM pg_stat_replication;"
```
### Обнаружение etcd кластера
```bash
# Проверка процессов
pgrep -f etcd
# Проверка портов
ss -tln sport = :2379
ss -tln sport = :2380
# Информация о кластере
etcdctl member list
etcdctl endpoint status --write-out=json
etcdctl endpoint health
```
## Ограничения
1. **Версии сервисов**: некоторые команды могут не работать на старых версиях
2. **Конфигурационные файлы**: парсинг ограничен стандартными форматами
3. **Права доступа**: требует sudo для доступа к некоторым командам
4. **Сетевые соединения**: не анализирует содержимое трафика
5. **Кластерное состояние**: может не отражать реальное состояние при проблемах с сетью
## Автор
**Сергей Антропов**
Сайт: https://devops.org.ru
## Лицензия
Проект распространяется под лицензией MIT.