ansible_playbooks/roles/node_exporter_install/files/docker-cpu-metrics.sh
2026-07-21 14:37:34 +03:00

45 lines
No EOL
1.8 KiB
Bash
Executable file

#!/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"