Как настроить мониторинг срока действия доменов с помощью Grafana и Prometheus
В этой статье я расскажу, как добавить в систему мониторинга на базе Grafana и Prometheus проверку срока действия домена. Мы будем использовать простой Bash-скрипт для проверки даты истечения доменов, Pushgateway для передачи данных в Prometheus и Grafana для визуализации результатов, а все сервисы будут упакованы в docker контейнеры.
Установку и настройку prometheus
и grafana
в этом посте рассматривать не будем, предполагается, что они уже установлены.
Общая логика работы
Система состоит из нескольких компонентов:
Bash-скрипт (check_domains.sh): Проверяет срок действия доменов через whois и отправляет данные в Pushgateway.
Pushgateway: Промежуточный сервис для отправки метрик в Prometheus.
Prometheus: Собирает метрики из Pushgateway.
Grafana: Визуализирует данные в виде графиков и панелей.
Работает это так:
Скрипт запускается по расписанию через cron. Он получает дату истечения домена через whois, вычисляет количество дней до истечения и отправляет эти данные в Pushgateway. Prometheus периодически собирает данные из Pushgateway. В Grafana создаем dashboard для отображения данных в подходящем виде.
Для установки Pushgateway
нужно прописать в docker-compose
файле:
pushgateway:
image: prom/pushgateway
container_name: pushgateway
network_mode: host
ports:
- "9091:9091" # Порт Pushgateway
Также, нужно сообщить Prometheus
откуда брать данные, для этого в prometheus.yml пропишем:
- job_name: "pushgateway"
honor_labels: true
static_configs:
- targets: ['prometheus:9091']
Код скрипта check_domains.sh
#!/bin/bash
set -euo pipefail
LOG_FILE="/var/log/check-domains.log"
PUSHGATEWAY_URL="http://localhost:9091"
DOMAINS=("aaa.ru" "bbb.ru")
# Проверка наличия необходимых утилит
for cmd in whois curl; do
command -v "$cmd" >/dev/null || { echo "Error: $cmd is not installed." | tee -a "$LOG_FILE"; exit 1; }
done
# Функция для получения и отправки данных
process_domain() {
local domain=$1
# Получение даты истечения через whois
expiration_date=$(whois "$domain" | grep -i "expiry date" | awk '{print $4}' | head -n 1)
if [[ -z "$expiration_date" ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') Error: Could not retrieve expiration date for $domain" | tee -a "$LOG_FILE"
return 1
fi
# Преобразование даты в формат Unix timestamp
expiration_timestamp=$(date -d "$(echo "$expiration_date" | sed 's/\.[0-9]*Z//; s/T/ /')" +%s 2>>"$LOG_FILE")
current_timestamp=$(date +%s)
# Вычисление количества дней до истечения
days_remaining=$(( (expiration_timestamp - current_timestamp) / 86400 ))
# Отправка метрик в Pushgateway
metric_name="domain_expiration_days"
push_url="$PUSHGATEWAY_URL/metrics/job/domain_expiration/instance/$domain"
metric_data="$metric_name{domain=\"$domain\"} $days_remaining"
echo "$(date '+%Y-%m-%d %H:%M:%S') Pushing data for $domain: $days_remaining days remaining" | tee -a "$LOG_FILE"
echo "$metric_data" | curl -X POST "$push_url" --data-binary @- 2>>"$LOG_FILE"
}
# Основной цикл
for domain in "${DOMAINS[@]}"; do
echo "$(date '+%Y-%m-%d %H:%M:%S') Processing domain: $domain" | tee -a "$LOG_FILE"
process_domain "$domain" || continue # Пропуск домена в случае ошибки
done
Файл crontab для настройки расписания запуска скрипта:
# Запускать скрипт каждый день в 00:00
0 0 * * * /usr/local/bin/check_domains.sh > /var/log/cron.log 2>&1
Файл docker-compose.yml
services:
pushgateway:
image: prom/pushgateway
container_name: pushgateway
network_mode: host
ports:
- "9091:9091" # Порт Pushgateway
check-domains:
build:
context: .
dockerfile: Dockerfile
container_name: check-domains
hostname: check-domains
restart: always
environment:
- PUSHGATEWAY_URL=http://localhost:9091/metrics/job/domain_expiration
depends_on:
- pushgateway
network_mode: host
volumes:
- ./logs:/var/log # Монтируем папку для логов
Файл Dockerfile
# Используем базовый образ Alpine Linux
FROM alpine:latest
# Устанавливаем необходимые пакеты
RUN apk add --no-cache \
bash \
curl \
whois \
dcron
# Копируем скрипт в контейнер
COPY check_domains.sh /usr/local/bin/check_domains.sh
# Делаем скрипт исполняемым
RUN chmod +x /usr/local/bin/check_domains.sh
# Копируем cron-задачу
COPY crontab /etc/cron.d/crontab
# Даем права на выполнение cron-задачи
RUN chmod 0644 /etc/cron.d/crontab
# Создаем лог-файл для cron
RUN touch /var/log/cron.log
# Запускаем cron и логируем вывод
CMD touch /var/log/cron.log && crond && tail -f /var/log/cron.log
Настройка dashboard в Grafana:
- Добавляем Prometheus как источник данных.
- Создаем панель с запросом:
domain_expiration_days{domain="aaa.ru"}
- Настраиваем отображения данных в подходящем виде.