Добавлено подробное описание всех 26 поддерживаемых сервисов: **Кластерные сервисы (9):** - PostgreSQL с Patroni - etcd - Kubernetes - DragonflyDB - Elasticsearch - Greenplum - MinIO - Redpanda - NATS **Автономные сервисы (17):** - Redis, ClickHouse, RabbitMQ, Kafka, MongoDB - BIND9, Grafana, Prometheus, Loki - Harbor, Jenkins, Keycloak, Neo4j - Sentry, Apache Superset, InfluxDB, VictoriaMetrics **Обновления документации:** - Подробные методы обнаружения для каждого сервиса - Описание портов и команд для получения версий - Информация о кластерных командах - Обновленная структура выходных данных с полем cluster_nodes - Расширенный список системных зависимостей - Примеры использования для новых сервисов - Результаты тестирования на реальных серверах - Обновленные ограничения и требования Автор: Сергей Антропов Сайт: https://devops.org.ru
450 lines
16 KiB
Markdown
450 lines
16 KiB
Markdown
# Коллектор proxvmservices
|
||
|
||
## Описание
|
||
|
||
Коллектор `proxvmservices` предназначен для обнаружения и мониторинга сервисов на виртуальных машинах и контейнерах Proxmox. Он автоматически определяет запущенные сервисы, их конфигурацию, состояние кластеров и соединения между сервисами.
|
||
|
||
## Поддерживаемые сервисы
|
||
|
||
### Кластерные сервисы
|
||
- **PostgreSQL** с Patroni - обнаружение кластера, репликации, конфигурации
|
||
- **etcd** - обнаружение кластера, членов, лидера, здоровья
|
||
- **Kubernetes** - обнаружение кластера, версии, портов
|
||
- **DragonflyDB** - Redis-совместимая БД с кластерной поддержкой
|
||
- **Elasticsearch** - поисковая система с кластерной поддержкой
|
||
- **Greenplum** - аналитическая БД с кластерной поддержкой
|
||
- **MinIO** - S3-совместимое хранилище с кластерной поддержкой
|
||
- **Redpanda** - Kafka-совместимый брокер с кластерной поддержкой
|
||
- **NATS** - система сообщений с кластерной поддержкой
|
||
|
||
### Автономные сервисы
|
||
- **Redis** - версия, порты, конфигурация
|
||
- **ClickHouse** - версия, порты, конфигурация
|
||
- **RabbitMQ** - версия, порты, конфигурация
|
||
- **Kafka** - порты, конфигурация
|
||
- **MongoDB** - версия, порты, конфигурация
|
||
- **BIND9** - DNS сервер
|
||
- **Grafana** - мониторинг и дашборды
|
||
- **Prometheus** - система мониторинга
|
||
- **Loki** - система логирования
|
||
- **Harbor** - реестр контейнеров
|
||
- **Jenkins** - CI/CD сервер
|
||
- **Keycloak** - система управления идентификацией
|
||
- **Neo4j** - графовая база данных
|
||
- **Sentry** - система отслеживания ошибок
|
||
- **Apache Superset** - BI платформа
|
||
- **InfluxDB** - временная база данных
|
||
- **VictoriaMetrics** - система мониторинга
|
||
|
||
## Методы обнаружения
|
||
|
||
### 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`
|
||
|
||
### Новые кластерные сервисы
|
||
|
||
#### DragonflyDB
|
||
1. **Процессы**: проверка `dragonfly`
|
||
2. **Порты**: 6379 (client), 6380 (admin)
|
||
3. **Версия**: через `dragonfly --version`
|
||
4. **Кластер**: команда `dragonfly cluster nodes`
|
||
|
||
#### Elasticsearch
|
||
1. **Процессы**: проверка `elasticsearch`, `java.*elasticsearch`
|
||
2. **Порты**: 9200 (HTTP), 9300 (transport)
|
||
3. **Версия**: через HTTP API `http://localhost:9200`
|
||
4. **Кластер**: 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`
|
||
|
||
### Новые автономные сервисы
|
||
|
||
#### BIND9
|
||
1. **Процессы**: проверка `named`, `bind9`
|
||
2. **Порты**: 53 (DNS), 953 (control)
|
||
3. **Версия**: через `named -v`
|
||
|
||
#### Grafana
|
||
1. **Процессы**: проверка `grafana-server`, `grafana`
|
||
2. **Порты**: 3000 (HTTP)
|
||
3. **Версия**: через `grafana-server --version`
|
||
|
||
#### Prometheus
|
||
1. **Процессы**: проверка `prometheus`
|
||
2. **Порты**: 9090 (HTTP)
|
||
3. **Версия**: через `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`
|
||
|
||
### Остальные сервисы
|
||
- **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"
|
||
}
|
||
},
|
||
"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
|
||
|
||
#### Основные сервисы
|
||
- `psql` или `postgres` - для PostgreSQL
|
||
- `patronictl` - для Patroni
|
||
- `etcdctl` - для etcd
|
||
- `kubectl` - для Kubernetes
|
||
- `redis-cli` - для Redis
|
||
- `clickhouse-client` - для ClickHouse
|
||
- `rabbitmqctl` - для RabbitMQ
|
||
- `mongosh` - для MongoDB
|
||
|
||
#### Новые сервисы
|
||
- `dragonfly` - для DragonflyDB
|
||
- `gpstate` - для Greenplum
|
||
- `minio`, `mc` - для MinIO
|
||
- `rpk` - для Redpanda
|
||
- `nats-server`, `nats` - для NATS
|
||
- `named` - для BIND9
|
||
- `grafana-server` - для Grafana
|
||
- `prometheus` - для Prometheus
|
||
- `loki` - для Loki
|
||
- `influxd` - для InfluxDB
|
||
- `victoria-metrics` - для VictoriaMetrics
|
||
|
||
### Права доступа
|
||
- Чтение конфигурационных файлов сервисов
|
||
- Выполнение команд управления сервисами
|
||
- Доступ к портам для проверки состояния
|
||
|
||
## Примеры использования
|
||
|
||
### Обнаружение 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
|
||
```
|
||
|
||
### Обнаружение 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
|
||
```
|
||
|
||
## Ограничения
|
||
|
||
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.
|