{% extends "layout.twig" %} {% block content %}

{{ server.name }} {% if server.group_name %} {{ server.group_name }} {% endif %}

Редактировать Назад к списку
Информация о сервере
Название: {{ server.name }}
Адрес: {{ server.address|default('-') }}
Группа: {% if server.group_name %} {{ server.group_name }} {% else %} - {% endif %}
Описание: {{ server.description|default('-') }}
Последние метрики: {% if server.last_metrics_at %} {{ server.last_metrics_at|date('d.m.Y H:i:s') }} {% else %} Нет данных {% endif %}
Время работы
{% if latestUptime is defined %} {% set uptime_sec = latestUptime.value %}
{% if uptime_sec >= 86400 %} {{ (uptime_sec / 86400)|round(0, 'floor') }}д {% endif %} {% if uptime_sec >= 3600 %} {{ ((uptime_sec % 86400) / 3600)|round(0, 'floor') }}ч {% endif %} {% if uptime_sec >= 60 %} {{ ((uptime_sec % 3600) / 60)|round(0, 'floor') }}м {% endif %}
{{ server.last_seen|date('d.m.Y H:i') }} {% else %}

Нет данных

{% endif %}
Период:
💡 Колёсико мыши = зум, перетаскивание = выделение области, Shift+колёсико = панорама
{% for metricName, metricData in metrics %} {% if metricName!="top_cpu_proc" and metricName!="top_ram_proc" and metricName!="disk_used" and not (metricName starts with "disk_used_") and not (metricName starts with "disk_total_gb_") and metricName!="ram_total_gb" and not (metricName starts with "net_in_") and not (metricName starts with "net_out_") and metricName!="network_rx" and metricName!="network_tx" and not (metricName starts with "temp_") %}
{{ metricName|replace({'_': ' ', 'load': 'загрузка', 'used': 'использование'})|title }} {% if metricData[0].unit %}({{ metricData[0].unit }}){% endif %}
{% if metricData %}

{{ metricData[0].value|round(2) }}{{ metricData[0].unit|default('') }}

{{ metricData[0].created_at|date('d.m.Y H:i:s') }}

{% else %}

Нет данных за этот период

{% endif %}
{% endif %} {% endfor %} {% if metrics|length == 0 %}
Нет данных о метриках за выбранный период
{% endif %}
{% set net_interfaces = [] %} {% for metricName in metrics|keys %} {% if metricName starts with 'net_in_' %} {% set iface = metricName|replace({'net_in_': ''}) %} {% set net_interfaces = net_interfaces|merge([iface]) %} {% endif %} {% endfor %} {% if net_interfaces|length > 0 %} {% for iface in net_interfaces %} {% if metrics['net_in_' ~ iface] is defined and metrics['net_out_' ~ iface] is defined %}
Сеть: {{ iface }}
{% endif %} {% endfor %} {% else %}
Данные о сетевых интерфейсах не получены
{% endif %} {% set has_temps = false %} {% for metricName in metrics|keys %} {% if metricName starts with 'temp_' %} {% set has_temps = true %} {% endif %} {% endfor %}
Температуры
{% if has_temps %} {% else %}
Температурные датчики недоступны (возможно виртуальный сервер)
{% endif %}
{% set has_disk_parts = false %} {% for metricName in metrics|keys %} {% if metricName starts with 'disk_used_' and metricName != 'disk_used' %} {% set has_disk_parts = true %} {% endif %} {% endfor %}
{% if has_disk_parts %} {% for metricName, metricData in metrics %} {% if metricName starts with 'disk_used_' and metricName != 'disk_used' %}
{% if metricName == 'disk_used_root' %}/ (корень) {% elseif metricName == 'disk_used_home' %}/home {% elseif metricName == 'disk_used_boot' %}/boot {% elseif metricName == 'disk_used_mnt_data' %}/mnt/data {% else %}{{ metricName|replace({'disk_used_': '', '_': ' '})|title }} {% endif %}
{% set pct = metricData[0].value|round(1) %} {% set iface = metricName|replace({'disk_used_': ''}) %} {% set totalGB = metrics['disk_total_gb_' ~ iface][0].value|default(0) %} {% set usedGB = (pct / 100 * totalGB)|round(1) %} {% set freeGB = (totalGB - usedGB)|round(1) %}
Свободно: {{ freeGB }} ГБ Занято: {{ usedGB }} ГБ

{{ pct }}% из {{ totalGB }} ГБ

{{ metricData[0].created_at|date('d.m.Y H:i') }}

{% endif %} {% endfor %} {% else %}
Данные о разделах диска не получены. Проверьте работу агента.
{% endif %}

Сервисы сервера {% if allServices is defined %} (найдено: {{ allServices|length }}) {% endif %}


{% if allServices is defined and allServices|length > 0 %} {# Сортируем сервисы: сначала running, потом stopped, потом unknown, затем по имени #} {% set runningServices = allServices|filter(s => s.status == 'running')|sort((a, b) => a.service_name|lower > b.service_name|lower) %} {% set stoppedServices = allServices|filter(s => s.status == 'stopped')|sort((a, b) => a.service_name|lower > b.service_name|lower) %} {% set unknownServices = allServices|filter(s => s.status != 'running' and s.status != 'stopped')|sort((a, b) => a.service_name|lower > b.service_name|lower) %} {# Выводим все сервисы по порядку #} {% for service in runningServices %}
running
Load: {{ service.load_state|default('-') }} | Active: {{ service.active_state|default('-') }}
{% endfor %} {% for service in stoppedServices %}
stopped
Load: {{ service.load_state|default('-') }} | Active: {{ service.active_state|default('-') }}
{% endfor %} {% for service in unknownServices %}
unknown
Load: {{ service.load_state|default('-') }} | Active: {{ service.active_state|default('-') }}
{% endfor %} {% else %}
Агент не отправил список сервисов или не установлен
{% endif %}

Настройка порогов

0 = алерт сразу при превышении, >0 = алерт только если превышено дольше указанного времени. Оставьте поле пустым для отключения порога.

{% for metricType in allMetricTypes %} {% set metricUnit = '%' %} {% set metricLabel = metricType.name %} {% if metricType.name starts with 'temp_' %} {% set metricUnit = '°C' %} {% set metricLabel = 'Температура ' ~ (metricType.name|replace({'temp_': '', '_': ' '}))|title %} {% elseif metricType.name == 'cpu_load' %} {% set metricLabel = 'Загрузка CPU' %} {% elseif metricType.name == 'ram_used' %} {% set metricLabel = 'Использование RAM' %} {% elseif metricType.name starts with 'disk_used_' %} {% set iface = metricType.name|replace({'disk_used_': ''}) %} {% if iface == 'root' %}{% set metricLabel = 'Диск (корень /)' %} {% elseif iface == 'home' %}{% set metricLabel = 'Диск (/home)' %} {% elseif iface == 'boot' %}{% set metricLabel = 'Диск (/boot)' %} {% elseif iface == 'mnt_data' %}{% set metricLabel = 'Диск (/mnt/data)' %} {% else %}{% set metricLabel = 'Диск (/' ~ (iface|replace({'_': '/'})) ~ ')' %} {% endif %} {% elseif metricType.name starts with 'net_in_' %} {% set iface = metricType.name|replace({'net_in_': ''}) %} {% set metricLabel = 'Сеть входящая (' ~ iface ~ ')' %} {% elseif metricType.name starts with 'net_out_' %} {% set iface = metricType.name|replace({'net_out_': ''}) %} {% set metricLabel = 'Сеть исходящая (' ~ iface ~ ')' %} {% endif %}
{{ metricLabel }} ({{ metricUnit }})
{{ metricUnit }}
{{ metricUnit }}
мин
{% endfor %}
{% endblock %}