#!/bin/bash # Настройки METRICS_FILE="/var/lib/node_exporter/textfile_collector/docker_cpu.prom" TEMP_FILE="/tmp/docker_stats.tmp" # Очищаем выходной файл > "$METRICS_FILE" # Получаем актуальные stats от Docker (без потоковой передачи) if ! docker stats --no-stream --format "{{.Name}},{{.CPUPerc}},{{.MemUsage}}" > "$TEMP_FILE"; then echo "Ошибка: не удалось получить данные от Docker" >&2 exit 1 fi # Пропускаем первую строку (заголовок) и обрабатываем каждую строку tail -n +1 "$TEMP_FILE" | while IFS=, read -r container_name cpu_percent mem_usage; do # Проверяем наличие данных if [[ -z "$container_name" ]] || [[ -z "$cpu_percent" ]]; then continue fi # Удаляем % и заменяем запятую на точку cpu_clean=$(echo "$cpu_percent" | sed 's/%//g' | sed 's/,/./g' | xargs) # Валидируем числовое значение if ! [[ "$cpu_clean" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "Предупреждение: некорректное значение CPU '$cpu_percent' для контейнера '$container_name'" >&2 continue fi # Формируем метрику (строго: имя{лейбл} значение) echo "docker_container_cpu_usage_percent{container=\"$container_name\"} $cpu_clean" >> "$METRICS_FILE" done # Удаляем временный файл rm -f "$TEMP_FILE" # Если файл пустой — добавляем заглушку if ! grep -q "." "$METRICS_FILE"; then echo "# NO_DOCKER_CONTAINERS" >> "$METRICS_FILE" fi echo "Метрики обновлены в $METRICS_FILE"