# Коллектор proxvmservices ## Описание Коллектор `proxvmservices` предназначен для обнаружения и мониторинга сервисов на виртуальных машинах и контейнерах Proxmox. Он автоматически определяет запущенные сервисы, их конфигурацию, состояние кластеров и соединения между сервисами. **Поддерживаемые способы развертывания:** - Нативные процессы (systemd, init) - Docker-контейнеры - Docker Compose ## Поддерживаемые сервисы ### Кластерные сервисы - **PostgreSQL** с Patroni - обнаружение кластера, репликации, конфигурации - **etcd** - обнаружение кластера, членов, лидера, здоровья - **Kubernetes** - обнаружение кластера, версии, портов - **ClickHouse** - аналитическая БД с кластерной поддержкой - **Redis** - Redis кластер с поддержкой cluster nodes - **RabbitMQ** - RabbitMQ кластер с поддержкой cluster_status - **Kafka** - Kafka кластер (базовая поддержка) - **MongoDB** - MongoDB replica set с поддержкой rs.status() - **DragonflyDB** - Redis-совместимая БД с кластерной поддержкой - **Elasticsearch** - поисковая система с кластерной поддержкой - **Greenplum** - аналитическая БД с кластерной поддержкой - **MinIO** - S3-совместимое хранилище с кластерной поддержкой - **Redpanda** - Kafka-совместимый брокер с кластерной поддержкой - **NATS** - система сообщений с кластерной поддержкой - **Zookeeper** - координатор распределенных систем с кластерной поддержкой ### Автономные сервисы - **BIND9** - DNS сервер - **Grafana** - мониторинг и дашборды - **Prometheus** - система мониторинга - **Loki** - система логирования - **Harbor** - реестр контейнеров - **Jenkins** - CI/CD сервер - **Keycloak** - система управления идентификацией - **Neo4j** - графовая база данных - **Sentry** - система отслеживания ошибок - **Apache Superset** - BI платформа - **InfluxDB** - временная база данных - **VictoriaMetrics** - система мониторинга ## Методы обнаружения ### PostgreSQL с Patroni 1. **Процессы**: проверка `postgres` и `patroni` 2. **Docker**: проверка контейнеров `postgres`, `patroni`, образов `postgres`, `bitnami/postgresql` 3. **Порты**: 5432 (PostgreSQL), 8008 (Patroni REST API) 4. **Версия**: через `psql --version` или `postgres --version` 5. **Конфигурация**: парсинг файлов `/etc/patroni/patroni.yml`, `/etc/patroni.yml` 6. **Кластер**: команда `patronictl list` для получения информации о членах кластера 7. **Репликация**: SQL-запрос `SELECT client_addr, state FROM pg_stat_replication` ### etcd 1. **Процессы**: проверка `etcd` 2. **Docker**: проверка контейнеров `etcd`, образов `etcd` 3. **Порты**: 2379 (client), 2380 (peer) 4. **Версия**: через `etcdctl version` 5. **Конфигурация**: парсинг файлов `/etc/etcd/etcd.conf`, systemd unit 6. **Кластер**: команды `etcdctl member list`, `etcdctl endpoint status`, `etcdctl endpoint health` ### Kubernetes 1. **Процессы**: проверка `kubelet`, `kube-apiserver` 2. **Docker**: проверка контейнеров `kubelet`, образов `k8s.gcr.io/kubelet` 3. **Порты**: 6443 (API server), 10250 (kubelet) 4. **Версия**: через `kubectl version --client --short` ### ClickHouse 1. **Процессы**: проверка `clickhouse-server` 2. **Docker**: проверка контейнеров `clickhouse`, образов `clickhouse/clickhouse-server` 3. **Порты**: 8123 (HTTP), 9000 (native) 4. **Версия**: через `clickhouse-client --version` 5. **Кластер**: SQL-запрос `SELECT host_name FROM system.clusters` ### Redis 1. **Процессы**: проверка `redis-server` 2. **Docker**: проверка контейнеров `redis`, образов `redis` 3. **Порты**: 6379 (client) 4. **Версия**: через `redis-cli --version` 5. **Кластер**: команда `redis-cli cluster nodes` ### RabbitMQ 1. **Процессы**: проверка `rabbitmq-server` 2. **Docker**: проверка контейнеров `rabbitmq`, образов `rabbitmq` 3. **Порты**: 5672 (AMQP), 15672 (management) 4. **Версия**: через `rabbitmqctl version` 5. **Кластер**: команда `rabbitmqctl cluster_status` ### Kafka 1. **Процессы**: проверка `kafka.Kafka` 2. **Docker**: проверка контейнеров `kafka`, образов `confluentinc/cp-kafka` 3. **Порты**: 9092 (broker) 4. **Версия**: через конфигурационные файлы 5. **Кластер**: команда `kafka-topics --bootstrap-server localhost:9092 --list` ### MongoDB 1. **Процессы**: проверка `mongod` 2. **Docker**: проверка контейнеров `mongo`, образов `mongo` 3. **Порты**: 27017 (mongod) 4. **Версия**: через `mongosh --version` 5. **Кластер**: команда `mongosh --eval "rs.status().members.map(m => m.name)"` ### Новые кластерные сервисы #### DragonflyDB 1. **Процессы**: проверка `dragonfly` 2. **Docker**: проверка контейнеров `dragonfly`, образов `docker.dragonflydb.io/dragonflydb/dragonfly` 3. **Порты**: 6379 (client), 6380 (admin) 4. **Версия**: через `dragonfly --version` 5. **Кластер**: команда `dragonfly cluster nodes` #### Elasticsearch 1. **Процессы**: проверка `elasticsearch`, `java.*elasticsearch` 2. **Docker**: проверка контейнеров `elasticsearch`, образов `elasticsearch` 3. **Порты**: 9200 (HTTP), 9300 (transport) 4. **Версия**: через HTTP API `http://localhost:9200` 5. **Кластер**: HTTP API `/_cluster/state/nodes` #### Greenplum 1. **Процессы**: проверка `postgres.*greenplum`, `gpdb` 2. **Docker**: проверка контейнеров `greenplum`, образов `greenplum/greenplum` 3. **Порты**: 5432 (PostgreSQL), 28080 (GPAdmin) 4. **Версия**: через `psql --version` 5. **Кластер**: команда `gpstate -s` #### MinIO 1. **Процессы**: проверка `minio` 2. **Docker**: проверка контейнеров `minio`, образов `minio/minio` 3. **Порты**: 9000 (API), 9001 (Console) 4. **Версия**: через `minio --version` 5. **Кластер**: команда `mc admin info local` #### Redpanda 1. **Процессы**: проверка `redpanda` 2. **Docker**: проверка контейнеров `redpanda`, образов `redpandadata/redpanda` 3. **Порты**: 9092 (Kafka API), 9644 (Admin API) 4. **Версия**: через `rpk version` 5. **Кластер**: команда `rpk cluster info` #### NATS 1. **Процессы**: проверка `nats-server` 2. **Docker**: проверка контейнеров `nats`, образов `nats` 3. **Порты**: 4222 (client), 8222 (monitoring) 4. **Версия**: через `nats-server --version` 5. **Кластер**: команда `nats server list` #### Zookeeper 1. **Процессы**: проверка `zookeeper`, `java.*zookeeper` 2. **Порты**: 2181 (client), 2888 (follower), 3888 (election) 3. **Версия**: через `zkCli version` 4. **Кластер**: команда `zkCli ls /` (базовая поддержка) ### Новые автономные сервисы #### BIND9 1. **Процессы**: проверка `named`, `bind9` 2. **Docker**: проверка контейнеров `bind9`, образов `internetwache/bind9` 3. **Порты**: 53 (DNS), 953 (control) 4. **Версия**: через `named -v` #### Grafana 1. **Процессы**: проверка `grafana-server`, `grafana` 2. **Docker**: проверка контейнеров `grafana`, образов `grafana/grafana` 3. **Порты**: 3000 (HTTP) 4. **Версия**: через `grafana-server --version` #### Prometheus 1. **Процессы**: проверка `prometheus` 2. **Docker**: проверка контейнеров `prometheus`, образов `prom/prometheus` 3. **Порты**: 9090 (HTTP) 4. **Версия**: через `prometheus --version` #### Loki 1. **Процессы**: проверка `loki` 2. **Docker**: проверка контейнеров `loki`, образов `grafana/loki` 3. **Порты**: 3100 (HTTP) 4. **Версия**: через `loki --version` #### Harbor 1. **Процессы**: проверка `harbor`, `nginx.*harbor` 2. **Docker**: проверка контейнеров `harbor`, образов `goharbor/harbor-core` 3. **Порты**: 80 (HTTP), 443 (HTTPS), 8080 (API) 4. **Версия**: через HTTP API `/api/v2.0/systeminfo` #### Jenkins 1. **Процессы**: проверка `jenkins`, `java.*jenkins` 2. **Docker**: проверка контейнеров `jenkins`, образов `jenkins/jenkins` 3. **Порты**: 8080 (HTTP), 50000 (agent) 4. **Версия**: через HTTP API `/api/json` #### Keycloak 1. **Процессы**: проверка `keycloak`, `java.*keycloak` 2. **Docker**: проверка контейнеров `keycloak`, образов `quay.io/keycloak/keycloak` 3. **Порты**: 8080 (HTTP), 8443 (HTTPS) 4. **Версия**: через HTTP API `/auth/admin/info` или `/admin/info` #### Neo4j 1. **Процессы**: проверка `neo4j`, `java.*neo4j` 2. **Docker**: проверка контейнеров `neo4j`, образов `neo4j/neo4j` 3. **Порты**: 7474 (HTTP), 7687 (Bolt) 4. **Версия**: через HTTP API `/db/data/` #### Sentry 1. **Процессы**: проверка `sentry`, `python.*sentry` 2. **Docker**: проверка контейнеров `sentry`, образов `sentry` 3. **Порты**: 9000 (HTTP), 9001 (WebSocket) 4. **Версия**: через HTTP API `/api/0/` #### Apache Superset 1. **Процессы**: проверка `superset`, `python.*superset` 2. **Docker**: проверка контейнеров `superset`, образов `apache/superset` 3. **Порты**: 8088 (HTTP) 4. **Версия**: через HTTP API `/api/v1/version` #### InfluxDB 1. **Процессы**: проверка `influxd` 2. **Docker**: проверка контейнеров `influxdb`, образов `influxdb` 3. **Порты**: 8086 (HTTP) 4. **Версия**: через `influxd version` #### VictoriaMetrics 1. **Процессы**: проверка `victoria-metrics`, `vmagent` 2. **Docker**: проверка контейнеров `victoria-metrics`, образов `victoriametrics/victoria-metrics` 3. **Порты**: 8428 (HTTP), 8429 (HTTPS) 4. **Версия**: через `victoria-metrics --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" } }, "cluster_nodes": ["10.14.246.75", "10.14.246.76", "10.14.246.77"], "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` - информация о кластере (для кластерных сервисов) - `cluster_nodes` - массив IP-адресов всех нод кластера - `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` - для проверки портов - `curl` - для HTTP API запросов - `getent` - для разрешения hostname в IP - `docker` - для проверки Docker-контейнеров #### Основные сервисы - `psql` или `postgres` - для PostgreSQL - `patronictl` - для Patroni - `etcdctl` - для etcd - `kubectl` - для Kubernetes - `redis-cli` - для Redis кластера - `clickhouse-client` - для ClickHouse кластера - `rabbitmqctl` - для RabbitMQ кластера - `kafka-topics` - для Kafka кластера - `mongosh` - для MongoDB кластера #### Новые сервисы - `dragonfly` - для DragonflyDB - `gpstate` - для Greenplum - `minio`, `mc` - для MinIO - `rpk` - для Redpanda - `nats-server`, `nats` - для NATS - `zkCli` - для Zookeeper - `named` - для BIND9 - `grafana-server` - для Grafana - `prometheus` - для Prometheus - `loki` - для Loki - `influxd` - для InfluxDB - `victoria-metrics` - для VictoriaMetrics ### Права доступа - Чтение конфигурационных файлов сервисов - Выполнение команд управления сервисами - Доступ к портам для проверки состояния ## Примеры использования ### Обнаружение PostgreSQL кластера ```bash # Проверка процессов pgrep -f postgres pgrep -f patroni # Проверка Docker-контейнеров docker ps --filter "name=postgres" docker ps --filter "name=patroni" docker ps --filter "ancestor=postgres" docker ps --filter "ancestor=bitnami/postgresql" # Проверка портов 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 # Проверка Docker-контейнеров docker ps --filter "name=etcd" docker ps --filter "ancestor=etcd" # Проверка портов ss -tln sport = :2379 ss -tln sport = :2380 # Информация о кластере etcdctl member list etcdctl endpoint status --write-out=json etcdctl endpoint health ``` ### Обнаружение ClickHouse кластера ```bash # Проверка процессов pgrep -f clickhouse-server # Проверка Docker-контейнеров docker ps --filter "name=clickhouse" docker ps --filter "ancestor=clickhouse/clickhouse-server" # Проверка портов ss -tln sport = :8123 ss -tln sport = :9000 # Информация о кластере clickhouse-client --query "SELECT host_name FROM system.clusters" clickhouse-client --query "SELECT * FROM system.clusters" ``` ### Обнаружение Redis кластера ```bash # Проверка процессов pgrep -f redis-server # Проверка Docker-контейнеров docker ps --filter "name=redis" docker ps --filter "ancestor=redis" # Проверка портов ss -tln sport = :6379 # Информация о кластере redis-cli cluster nodes redis-cli cluster info ``` ### Обнаружение RabbitMQ кластера ```bash # Проверка процессов pgrep -f rabbitmq-server # Проверка Docker-контейнеров docker ps --filter "name=rabbitmq" docker ps --filter "ancestor=rabbitmq" # Проверка портов ss -tln sport = :5672 ss -tln sport = :15672 # Информация о кластере rabbitmqctl cluster_status rabbitmqctl list_nodes ``` ### Обнаружение Kafka кластера ```bash # Проверка процессов pgrep -f kafka.Kafka # Проверка Docker-контейнеров docker ps --filter "name=kafka" docker ps --filter "ancestor=confluentinc/cp-kafka" # Проверка портов ss -tln sport = :9092 # Информация о кластере kafka-topics --bootstrap-server localhost:9092 --list kafka-broker-api-versions --bootstrap-server localhost:9092 ``` ### Обнаружение MongoDB кластера ```bash # Проверка процессов pgrep -f mongod # Проверка Docker-контейнеров docker ps --filter "name=mongo" docker ps --filter "ancestor=mongo" # Проверка портов ss -tln sport = :27017 # Информация о кластере mongosh --eval "rs.status()" mongosh --eval "rs.status().members.map(m => m.name)" ``` ### Обнаружение Elasticsearch кластера ```bash # Проверка процессов pgrep -f elasticsearch # Проверка портов ss -tln sport = :9200 ss -tln sport = :9300 # Информация о кластере curl -s http://localhost:9200/_cluster/state/nodes curl -s http://localhost:9200/_cluster/health ``` ### Обнаружение MinIO кластера ```bash # Проверка процессов pgrep -f minio # Проверка портов ss -tln sport = :9000 ss -tln sport = :9001 # Информация о кластере mc admin info local mc admin heal local ``` ### Обнаружение Grafana ```bash # Проверка процессов pgrep -f grafana # Проверка портов ss -tln sport = :3000 # Версия grafana-server --version ``` ### Обнаружение Prometheus ```bash # Проверка процессов pgrep -f prometheus # Проверка портов ss -tln sport = :9090 # Версия prometheus --version ``` ### Обнаружение Zookeeper кластера ```bash # Проверка процессов pgrep -f zookeeper # Проверка портов ss -tln sport = :2181 ss -tln sport = :2888 ss -tln sport = :3888 # Информация о кластере zkCli ls / zkCli version ``` ## Ограничения 1. **Версии сервисов**: некоторые команды могут не работать на старых версиях 2. **Конфигурационные файлы**: парсинг ограничен стандартными форматами 3. **Права доступа**: требует sudo для доступа к некоторым командам 4. **Сетевые соединения**: не анализирует содержимое трафика 5. **Кластерное состояние**: может не отражать реальное состояние при проблемах с сетью 6. **HTTP API**: требует доступности HTTP API для получения версий и информации о кластерах 7. **Команды управления**: не все команды управления кластерами могут быть установлены 8. **Fallback поведение**: при недоступности команд управления возвращается localhost 9. **Производительность**: большое количество сервисов может увеличить время выполнения 10. **Сетевые зависимости**: некоторые сервисы требуют сетевого доступа для полной диагностики ## Результаты тестирования ### Proxmox нода (10.14.253.20) Обнаружено 8 сервисов: - **PostgreSQL** (кластер) - порты 5432, 8008 - **etcd** (кластер) - порты 2379, 2380 - **MongoDB** (standalone) - порт 27017 - **Elasticsearch** (standalone) - порты 9200, 9300 - **Grafana** (standalone) - порт 3000 - **Harbor** (standalone) - порты 80, 443, 8080 - **Keycloak** (standalone) - порты 8080, 8443 - **Superset** (standalone) - порт 8088 ### VM (10.14.246.75) Обнаружено 2 сервиса: - **Kubernetes** (кластер) - порты 6443, 10250 - **Prometheus** (standalone) - порт 9090 ### LXC (10.14.246.150) Обнаружен 1 сервис: - **PostgreSQL 11.17** (кластер) - порты 5432, 8008 ## Автор **Сергей Антропов** Сайт: https://devops.org.ru ## Лицензия Проект распространяется под лицензией MIT.