feat: добавлен мониторинг температур (CPU, GPU, HDD/SSD)
- Обновлен скрипт установки агента (добавлены lm-sensors, smartmontools) - Агент теперь собирает температуры: CPU (через psutil), Диски (smartctl), GPU (nvidia-smi) - Бэкенд автоматически определяет единицу измерения °C для метрик temp_* - Добавлен общий график Температуры на страницу сервера
This commit is contained in:
parent
91cfbca893
commit
de34962360
|
|
@ -50,7 +50,7 @@ echo 'Установка агента мониторинга...'
|
|||
if ! command -v python3 &> /dev/null; then
|
||||
echo 'Установка Python3...'
|
||||
apt-get update
|
||||
apt-get install -y python3 python3-pip
|
||||
apt-get install -y python3 python3-pip lm-sensors smartmontools
|
||||
fi
|
||||
|
||||
# Устанавливаем psutil
|
||||
|
|
|
|||
|
|
@ -188,7 +188,26 @@
|
|||
|
||||
|
||||
|
||||
<!-- Диски: Doughnut графики -->
|
||||
|
||||
<!-- Температуры -->
|
||||
{% set has_temps = false %}
|
||||
{% for m in metrics %}{% if m starts with 'temp_' %}{% set has_temps = true %}{% endif %}{% endfor %}
|
||||
{% if has_temps %}
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0"><i class="fas fa-thermometer-half"></i> Температуры</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<canvas id="chart-temperatures" width="100%" height="200"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Диски: Doughnut графики -->
|
||||
<div class="row mb-3">
|
||||
{% for metricName, metricData in metrics %}
|
||||
{% if metricName starts with 'disk_used_' and metricName != 'disk_used' %}
|
||||
|
|
@ -834,6 +853,56 @@ document.addEventListener('mousemove', function(e) {
|
|||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
|
||||
// График температур
|
||||
{% set temp_metrics = [] %}
|
||||
{% for m in metrics %}{% if m starts with 'temp_' %}{% set temp_metrics = temp_metrics|merge([m]) %}{% endif %}{% endfor %}
|
||||
{% if temp_metrics %}
|
||||
(function() {
|
||||
var ctx = document.getElementById('chart-temperatures');
|
||||
if (!ctx) return;
|
||||
|
||||
var labels = [];
|
||||
{% if metrics[temp_metrics[0]] is defined %}
|
||||
{% for p in metrics[temp_metrics[0]]|slice(-100) %}
|
||||
labels.push('{{ p.time_bucket|default(p.created_at)|date("d.m H:i") }}');
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
var datasets = [];
|
||||
{% for m in temp_metrics %}
|
||||
var data_{{ m }} = {
|
||||
label: '{{ m|replace({'temp_': '', '_': ' '})|title }}',
|
||||
data: [],
|
||||
fill: false,
|
||||
tension: 0.1,
|
||||
pointRadius: 1,
|
||||
borderWidth: 1
|
||||
};
|
||||
{% for p in metrics[m]|slice(-100) %}
|
||||
data_{{ m }}.data.push({{ p.value }});
|
||||
{% endfor %}
|
||||
datasets.push(data_{{ m }});
|
||||
{% endfor %}
|
||||
|
||||
new Chart(ctx.getContext('2d'), {
|
||||
type: 'line',
|
||||
data: { labels: labels, datasets: datasets },
|
||||
options: {
|
||||
responsive: true,
|
||||
maintainAspectRatio: false,
|
||||
interaction: { mode: 'index', intersect: false },
|
||||
plugins: {
|
||||
legend: { display: true, position: 'top' },
|
||||
tooltip: { enabled: true, mode: 'index', intersect: false },
|
||||
zoom: { zoom: { wheel: { enabled: true }, pinch: { enabled: true }, mode: 'x' }, pan: { enabled: true, mode: 'x' } }
|
||||
},
|
||||
scales: { y: { beginAtZero: false, ticks: { callback: v => v + '°C' } } }
|
||||
}
|
||||
});
|
||||
})();
|
||||
{% endif %}
|
||||
|
||||
// Doughnut графики для разделов дисков
|
||||
{% for metricName, metricData in metrics %}
|
||||
{% if metricName starts with 'disk_used_' and metricName != 'disk_used' %}
|
||||
|
|
|
|||
Loading…
Reference in New Issue