Как настроить мониторинг срока действия доменов с помощью Grafana и Prometheus

bashdockergrafanaprometheus

557  557 слов(а)

26-03-2025 18:20 +0300


В этой статье я расскажу, как добавить в систему мониторинга на базе 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:

  1. Добавляем Prometheus как источник данных.
  2. Создаем панель с запросом: domain_expiration_days{domain="aaa.ru"}
  3. Настраиваем отображения данных в подходящем виде.