SensusAgent/docs/collectors/proxvmservices.md
Sergey Antropoff 4a36a04d82 feat: добавлена поддержка обнаружения Docker-контейнеров в коллектор proxvmservices
**Новые возможности:**
- Обнаружение сервисов, запущенных в Docker-контейнерах
- Поддержка Docker Compose развертываний
- Проверка как по имени контейнера, так и по образу

**Добавленные функции:**
- isDockerContainerRunning() - проверка контейнеров по имени
- isDockerImageRunning() - проверка контейнеров по образу
- getDockerContainerPorts() - получение портов контейнера
- getDockerContainerVersion() - получение версии из контейнера

**Обновленные сервисы с Docker поддержкой:**
- PostgreSQL: postgres, patroni, bitnami/postgresql
- Redis: redis
- ClickHouse: clickhouse, clickhouse/clickhouse-server
- RabbitMQ: rabbitmq
- MongoDB: mongo
- Elasticsearch: elasticsearch
- Grafana: grafana, grafana/grafana
- Prometheus: prometheus, prom/prometheus

**Обновленная документация:**
- Добавлены способы развертывания (нативные, Docker, Docker Compose)
- Обновлены методы обнаружения с Docker проверками
- Добавлены примеры использования Docker команд
- Добавлен docker в системные зависимости

**Поддерживаемые способы развертывания:**
- Нативные процессы (systemd, init)
- Docker-контейнеры
- Docker Compose

Теперь коллектор может обнаруживать сервисы независимо от способа их развертывания!

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

591 lines
21 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. Он автоматически определяет запущенные сервисы, их конфигурацию, состояние кластеров и соединения между сервисами.
**Поддерживаемые способы развертывания:**
- Нативные процессы (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. **Порты**: 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`
### 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. **Порты**: 9092 (broker)
3. **Версия**: через конфигурационные файлы
4. **Кластер**: команда `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. **Порты**: 6379 (client), 6380 (admin)
3. **Версия**: через `dragonfly --version`
4. **Кластер**: команда `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. **Порты**: 5432 (PostgreSQL), 28080 (GPAdmin)
3. **Версия**: через `psql --version`
4. **Кластер**: команда `gpstate -s`
#### MinIO
1. **Процессы**: проверка `minio`
2. **Порты**: 9000 (API), 9001 (Console)
3. **Версия**: через `minio --version`
4. **Кластер**: команда `mc admin info local`
#### Redpanda
1. **Процессы**: проверка `redpanda`
2. **Порты**: 9092 (Kafka API), 9644 (Admin API)
3. **Версия**: через `rpk version`
4. **Кластер**: команда `rpk cluster info`
#### NATS
1. **Процессы**: проверка `nats-server`
2. **Порты**: 4222 (client), 8222 (monitoring)
3. **Версия**: через `nats-server --version`
4. **Кластер**: команда `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. **Порты**: 53 (DNS), 953 (control)
3. **Версия**: через `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. **Порты**: 3100 (HTTP)
3. **Версия**: через `loki --version`
#### Harbor
1. **Процессы**: проверка `harbor`, `nginx.*harbor`
2. **Порты**: 80 (HTTP), 443 (HTTPS), 8080 (API)
3. **Версия**: через HTTP API `/api/v2.0/systeminfo`
#### Jenkins
1. **Процессы**: проверка `jenkins`, `java.*jenkins`
2. **Порты**: 8080 (HTTP), 50000 (agent)
3. **Версия**: через HTTP API `/api/json`
#### Keycloak
1. **Процессы**: проверка `keycloak`, `java.*keycloak`
2. **Порты**: 8080 (HTTP), 8443 (HTTPS)
3. **Версия**: через HTTP API `/auth/admin/info` или `/admin/info`
#### Neo4j
1. **Процессы**: проверка `neo4j`, `java.*neo4j`
2. **Порты**: 7474 (HTTP), 7687 (Bolt)
3. **Версия**: через HTTP API `/db/data/`
#### Sentry
1. **Процессы**: проверка `sentry`, `python.*sentry`
2. **Порты**: 9000 (HTTP), 9001 (WebSocket)
3. **Версия**: через HTTP API `/api/0/`
#### Apache Superset
1. **Процессы**: проверка `superset`, `python.*superset`
2. **Порты**: 8088 (HTTP)
3. **Версия**: через HTTP API `/api/v1/version`
#### InfluxDB
1. **Процессы**: проверка `influxd`
2. **Порты**: 8086 (HTTP)
3. **Версия**: через `influxd version`
#### VictoriaMetrics
1. **Процессы**: проверка `victoria-metrics`, `vmagent`
2. **Порты**: 8428 (HTTP), 8429 (HTTPS)
3. **Версия**: через `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
# Проверка портов
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
# Проверка портов
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
# Проверка портов
ss -tln sport = :5672
ss -tln sport = :15672
# Информация о кластере
rabbitmqctl cluster_status
rabbitmqctl list_nodes
```
### Обнаружение Kafka кластера
```bash
# Проверка процессов
pgrep -f kafka.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
# Проверка портов
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.