Утилита для проверки подключений к базам данных MySQL и MongoDB с поддержкой экспорта метрик для Prometheus.
В этом режиме приложение пытается подключиться к указанным базам данных и завершает работу с соответствующим кодом выхода.
Коды выхода:
0- все подключения успешны1- ошибка конфигурации или подключения2- все попытки подключения исчерпаны
В этом режиме приложение запускает HTTP-сервер с эндпоинтом /metrics для Prometheus. Проверки выполняются периодически в фоновом режиме.
git clone https://github.com/TAPCLAP/db-connect-checker.git
cd db-connect-checker
go build -o db-connect-checker .docker build -f docker/checker/Dockerfile -t db-connect-checker .export DB_TYPE=mysql
export TRIES=10
# Конфигурация первой БД
export MYSQL_NAME_0=mydb
export MYSQL_USER_0=root
export MYSQL_PASS_0=password
export MYSQL_HOST_0=localhost
export MYSQL_PORT_0=3306
# Конфигурация второй БД (опционально)
export MYSQL_NAME_1=anotherdb
export MYSQL_USER_1=admin
export MYSQL_PASS_1=secret
export MYSQL_HOST_1=db.example.com
export MYSQL_PORT_1=3306
export MYSQL_TLS_1=true # Включить TLS
./db-connect-checkerexport DB_TYPE=mongodb
export MONGODB_URI="mongodb://user:password@localhost:27017/mydb"
export TRIES=10
./db-connect-checkerexport EXPORTER=true
export DB_TYPE=mysql
export EXPORTER_PORT=38080
export CHECK_INTERVAL=30
# MySQL конфигурация
export MYSQL_NAME_0=mydb
export MYSQL_USER_0=root
export MYSQL_PASS_0=password
export MYSQL_HOST_0=localhost
export MYSQL_PORT_0=3306
./db-connect-checkerМетрики будут доступны по адресу: http://localhost:38080/metrics
| Переменная | Описание | Значение по умолчанию |
|---|---|---|
DB_TYPE |
Тип базы данных (mysql или mongodb) |
mysql |
EXPORTER |
Включить режим экспортера (true/false) |
false |
TRIES |
Количество попыток подключения | 10 |
| Переменная | Описание | Значение по умолчанию |
|---|---|---|
EXPORTER_PORT |
Порт для HTTP сервера | 38080 |
CHECK_INTERVAL |
Интервал проверки в секундах | 30 |
Для каждой базы данных используйте индекс N (начиная с 0):
| Переменная | Описание | Обязательная |
|---|---|---|
MYSQL_NAME_N |
Имя базы данных | Да |
MYSQL_USER_N |
Имя пользователя | Да |
MYSQL_PASS_N |
Пароль | Да |
MYSQL_HOST_N |
Хост | Да |
MYSQL_PORT_N |
Порт | Нет (по умолчанию 3306) |
MYSQL_TLS_N |
Использовать TLS (true/false) |
Нет (по умолчанию false) |
_N - не обязателен. Можно указать только один сервер без индексов: MYSQL_NAME, MYSQL_USER, MYSQL_PASS, MYSQL_HOST, MYSQL_PORT, MYSQL_TLS.
Пример для нескольких баз:
export MYSQL_NAME_0=db1
export MYSQL_USER_0=user1
export MYSQL_PASS_0=pass1
export MYSQL_HOST_0=host1
export MYSQL_NAME_1=db2
export MYSQL_USER_1=user2
export MYSQL_PASS_1=pass2
export MYSQL_HOST_1=host2
export MYSQL_TLS_1=true| Переменная | Описание | Обязательная |
|---|---|---|
MONGODB_URI |
URI подключения к MongoDB | Да (если DB_TYPE=mongodb) |
Подробное описание метрик доступно в METRICS_USAGE.md.
mysql_connection_available (Gauge)
- Доступность подключения (1 = доступно, 0 = недоступно)
- Labels:
host,port,database
mysql_connection_duration_seconds (Gauge)
- Время выполнения проверки в секундах
- Labels:
host,port,database
# HELP mysql_connection_available MySQL connection availability (1 = available, 0 = unavailable)
# TYPE mysql_connection_available gauge
mysql_connection_available{database="mydb",host="localhost",port="3306"} 1
mysql_connection_available{database="anotherdb",host="db.example.com",port="3306"} 1
# HELP mysql_connection_duration_seconds MySQL connection check duration in seconds
# TYPE mysql_connection_duration_seconds gauge
mysql_connection_duration_seconds{database="mydb",host="localhost",port="3306"} 0.045
mysql_connection_duration_seconds{database="anotherdb",host="db.example.com",port="3306"} 0.123
Добавьте в prometheus.yml:
scrape_configs:
- job_name: 'mysql-connection-checker'
static_configs:
- targets: ['localhost:38080']
scrape_interval: 30sdocker build -f docker/checker/Dockerfile -t db-connect-checker .docker run --rm \
-e DB_TYPE=mysql \
-e MYSQL_NAME=mydb \
-e MYSQL_USER=root \
-e MYSQL_PASS=password \
-e MYSQL_HOST=mysql-server \
-e MYSQL_PORT=3306 \
db-connect-checkerdocker run -d \
--name db-checker \
-e EXPORTER=true \
-e DB_TYPE=mysql \
-e EXPORTER_PORT=38080 \
-e CHECK_INTERVAL=30 \
-e MYSQL_NAME=mydb \
-e MYSQL_USER=root \
-e MYSQL_PASS=password \
-e MYSQL_HOST=mysql-server \
-e MYSQL_PORT=3306 \
-p 38080:38080 \
db-connect-checkerПроверка метрик:
curl http://localhost:38080/metricsИспользуйте для ожидания готовности базы данных перед запуском основного контейнера:
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
initContainers:
- name: wait-for-db
image: db-connect-checker:latest
env:
- name: DB_TYPE
value: "mysql"
- name: TRIES
value: "30"
- name: MYSQL_NAME
value: "mydb"
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: MYSQL_PASS
valueFrom:
secretKeyRef:
name: db-credentials
key: password
- name: MYSQL_HOST
value: "mysql-service"
- name: MYSQL_PORT
value: "3306"
containers:
- name: myapp
image: myapp:latestapiVersion: apps/v1
kind: Deployment
metadata:
name: db-connection-exporter
spec:
replicas: 1
selector:
matchLabels:
app: db-connection-exporter
template:
metadata:
labels:
app: db-connection-exporter
spec:
containers:
- name: exporter
image: db-connect-checker:latest
env:
- name: EXPORTER
value: "true"
- name: DB_TYPE
value: "mysql"
- name: EXPORTER_PORT
value: "38080"
- name: CHECK_INTERVAL
value: "30"
- name: MYSQL_NAME
value: "mydb"
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: MYSQL_PASS
valueFrom:
secretKeyRef:
name: db-credentials
key: password
- name: MYSQL_HOST
value: "mysql-service"
ports:
- containerPort: 38080
name: metrics
---
apiVersion: v1
kind: Service
metadata:
name: db-connection-exporter
labels:
app: db-connection-exporter
spec:
ports:
- port: 38080
targetPort: metrics
name: metrics
selector:
app: db-connection-exporterПроверка доступности БД перед деплоем:
#!/bin/bash
# check-db-before-deploy.sh
docker run --rm \
-e DB_TYPE=mysql \
-e TRIES=5 \
-e MYSQL_NAME=production_db \
-e MYSQL_USER="${DB_USER}" \
-e MYSQL_PASS="${DB_PASS}" \
-e MYSQL_HOST="${DB_HOST}" \
-e MYSQL_PORT=3306 \
db-connect-checker
if [ $? -eq 0 ]; then
echo "Database is ready, proceeding with deployment"
# deploy commands here
else
echo "Database is not ready, aborting deployment"
exit 1
figo test ./...go build -o db-connect-checker .go vet ./...
golangci-lint runЕсли у вас возникли проблемы или есть предложения, создайте Issue.