# Коллектор 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.