Docker check
This commit is contained in:
parent
efb980d47f
commit
e1ddd0b656
2 changed files with 47 additions and 31 deletions
21
README.md
21
README.md
|
|
@ -12,6 +12,7 @@
|
||||||
| `-m` | Проверка совпадений портов Angie ↔ Docker (+ проверка запуска контейнеров) |
|
| `-m` | Проверка совпадений портов Angie ↔ Docker (+ проверка запуска контейнеров) |
|
||||||
| `-l` | Проверка обновления файлов PT AF access logs |
|
| `-l` | Проверка обновления файлов PT AF access logs |
|
||||||
| `-sv` | Проверка работоспособности служб |
|
| `-sv` | Проверка работоспособности служб |
|
||||||
|
| `-dv` или `-d` | Проверка работоспособности контейнеров |
|
||||||
|
|
||||||
## Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
|
|
@ -33,7 +34,9 @@ auspex/
|
||||||
│ └── matchcheck/
|
│ └── matchcheck/
|
||||||
│ | └── matchcheck.go # -m: совпадения Angie ↔ Docker
|
│ | └── matchcheck.go # -m: совпадения Angie ↔ Docker
|
||||||
│ └── servicecheck/
|
│ └── servicecheck/
|
||||||
│ └── servicecheck.go # -sv: проверка работоспособности служб
|
│ | └── servicecheck.go # -sv: проверка работоспособности служб
|
||||||
|
│ └── dockercheck/
|
||||||
|
│ └── dockercheck.go # -dv или -d: проверка работоспособности служб
|
||||||
├── go.mod
|
├── go.mod
|
||||||
├── Makefile
|
├── Makefile
|
||||||
└── README.md
|
└── README.md
|
||||||
|
|
@ -59,7 +62,8 @@ go build -o auspex
|
||||||
./auspex -m # Проверка Angie ↔ Docker (все клиенты)
|
./auspex -m # Проверка Angie ↔ Docker (все клиенты)
|
||||||
./auspex -m client_name # Проверка конкретного клиента
|
./auspex -m client_name # Проверка конкретного клиента
|
||||||
./auspex -l # Проверка свежести логов
|
./auspex -l # Проверка свежести логов
|
||||||
./auspex -sw # Проверка работоспособности служб
|
./auspex -sv # Проверка работоспособности служб
|
||||||
|
./auspex -dv или -d # Проверка работоспособности контейнеров
|
||||||
./auspex -h # Справка
|
./auspex -h # Справка
|
||||||
./auspex -v # Версия
|
./auspex -v # Версия
|
||||||
```
|
```
|
||||||
|
|
@ -68,17 +72,7 @@ go build -o auspex
|
||||||
|
|
||||||
Все настройки находятся в `config.go`.
|
Все настройки находятся в `config.go`.
|
||||||
|
|
||||||
### Текущий режим: хардкод
|
### Переменные окружения
|
||||||
Значения прописаны прямо в коде. Для изменения — отредактируйте переменные и пересоберите.
|
|
||||||
|
|
||||||
### Переключение на переменные окружения
|
|
||||||
В файле `config.go` рядом с каждым хардкод-значением есть закомментированные строки
|
|
||||||
для чтения из переменных окружения. Для переключения:
|
|
||||||
|
|
||||||
1. Раскомментируйте нужные строки в `config.go`
|
|
||||||
2. Или вызовите `config.InitFromEnvOverrides()` в `main.go` (строка уже есть, закомментирована)
|
|
||||||
|
|
||||||
### Переменные окружения (при включении)
|
|
||||||
|
|
||||||
| Переменная | Описание | Значение по умолчанию |
|
| Переменная | Описание | Значение по умолчанию |
|
||||||
|------------|----------|----------------------|
|
|------------|----------|----------------------|
|
||||||
|
|
@ -101,6 +95,7 @@ go build -o auspex
|
||||||
| `cfgDBPort` | Порт БД | `5432` |
|
| `cfgDBPort` | Порт БД | `5432` |
|
||||||
| `cfgPrimaryDBHost` | Основная БД | `10.100.10.8` |
|
| `cfgPrimaryDBHost` | Основная БД | `10.100.10.8` |
|
||||||
| `cfgSecondaryDBHost` | Резервная БД | `10.100.13.5` |
|
| `cfgSecondaryDBHost` | Резервная БД | `10.100.13.5` |
|
||||||
|
| `SERVICES_TO_CHECK ` | Службы для проверки | `ansible,docker` |
|
||||||
|
|
||||||
## Зависимости
|
## Зависимости
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -173,22 +173,24 @@ func runDockerCheck() error {
|
||||||
// ── Получение контейнеров ────────────────────────────────────────────────────
|
// ── Получение контейнеров ────────────────────────────────────────────────────
|
||||||
|
|
||||||
func dcCheckDockerAvailable() error {
|
func dcCheckDockerAvailable() error {
|
||||||
err := exec.Command("docker", "info").Run()
|
cmd := exec.Command("docker", "info")
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("docker info завершился с ошибкой: %v", err)
|
return fmt.Errorf("docker info завершился с ошибкой: %v\n%s", err, string(out))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func dcGetContainers() ([]dcContainerInfo, error) {
|
func dcGetContainers() ([]dcContainerInfo, error) {
|
||||||
// Получаем все контейнеры (включая не-running) через Go-шаблон
|
// Шаг 1: получаем ID, Name, Status, Image без .Health — оно доступно
|
||||||
// Поля: ID, Name, Status, Health, Image — разделитель |
|
// только через docker inspect и отсутствует у контейнеров без healthcheck.
|
||||||
out, err := exec.Command(
|
cmd := exec.Command(
|
||||||
"docker", "ps", "-a",
|
"docker", "ps", "-a",
|
||||||
"--format", "{{.ID}}|{{.Names}}|{{.Status}}|{{.Health}}|{{.Image}}",
|
"--format", "{{.ID}}|{{.Names}}|{{.Status}}|{{.Image}}",
|
||||||
).Output()
|
)
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("docker ps завершился с ошибкой: %v", err)
|
return nil, fmt.Errorf("docker ps завершился с ошибкой: %v\n%s", err, string(out))
|
||||||
}
|
}
|
||||||
|
|
||||||
var containers []dcContainerInfo
|
var containers []dcContainerInfo
|
||||||
|
|
@ -196,28 +198,47 @@ func dcGetContainers() ([]dcContainerInfo, error) {
|
||||||
if line == "" {
|
if line == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
parts := strings.SplitN(line, "|", 5)
|
parts := strings.SplitN(line, "|", 4)
|
||||||
if len(parts) != 5 {
|
if len(parts) != 4 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
c := dcContainerInfo{
|
c := dcContainerInfo{
|
||||||
ID: strings.TrimSpace(parts[0]),
|
ID: strings.TrimSpace(parts[0]),
|
||||||
Name: strings.TrimSpace(parts[1]),
|
Name: strings.TrimSpace(parts[1]),
|
||||||
Image: strings.TrimSpace(parts[4]),
|
Image: strings.TrimSpace(parts[3]),
|
||||||
Health: strings.ToLower(strings.TrimSpace(parts[3])),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status из docker ps выглядит как "Up 2 hours" или "Exited (1) 3 minutes ago"
|
|
||||||
// Нормализуем до короткого статуса
|
|
||||||
c.Status = dcNormalizeStatus(parts[2])
|
c.Status = dcNormalizeStatus(parts[2])
|
||||||
|
|
||||||
containers = append(containers, c)
|
containers = append(containers, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Шаг 2: получаем health отдельно через docker inspect для каждого контейнера.
|
||||||
|
// Контейнеры без healthcheck вернут пустую строку — это нормально.
|
||||||
|
for i := range containers {
|
||||||
|
containers[i].Health = dcGetHealth(containers[i].ID)
|
||||||
|
}
|
||||||
|
|
||||||
return containers, nil
|
return containers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dcGetHealth возвращает health статус контейнера через docker inspect.
|
||||||
|
// Если healthcheck не настроен или inspect завершился с ошибкой — возвращает "none".
|
||||||
|
func dcGetHealth(containerID string) string {
|
||||||
|
out, err := exec.Command(
|
||||||
|
"docker", "inspect",
|
||||||
|
"--format", "{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}",
|
||||||
|
containerID,
|
||||||
|
).Output()
|
||||||
|
if err != nil {
|
||||||
|
return "none"
|
||||||
|
}
|
||||||
|
health := strings.ToLower(strings.TrimSpace(string(out)))
|
||||||
|
if health == "" {
|
||||||
|
return "none"
|
||||||
|
}
|
||||||
|
return health
|
||||||
|
}
|
||||||
|
|
||||||
// dcNormalizeStatus приводит вывод docker ps к короткому статусу
|
// dcNormalizeStatus приводит вывод docker ps к короткому статусу
|
||||||
func dcNormalizeStatus(raw string) string {
|
func dcNormalizeStatus(raw string) string {
|
||||||
raw = strings.TrimSpace(raw)
|
raw = strings.TrimSpace(raw)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue