diff --git a/source/_static/grafana_add_source1.png b/source/_static/grafana_add_source1.png new file mode 100644 index 0000000..b2a7808 Binary files /dev/null and b/source/_static/grafana_add_source1.png differ diff --git a/source/_static/grafana_add_source2.png b/source/_static/grafana_add_source2.png new file mode 100644 index 0000000..1d27438 Binary files /dev/null and b/source/_static/grafana_add_source2.png differ diff --git a/source/_static/grafana_add_source3.png b/source/_static/grafana_add_source3.png new file mode 100644 index 0000000..ee08198 Binary files /dev/null and b/source/_static/grafana_add_source3.png differ diff --git a/source/_static/grafana_add_source4.png b/source/_static/grafana_add_source4.png new file mode 100644 index 0000000..43fa2fc Binary files /dev/null and b/source/_static/grafana_add_source4.png differ diff --git a/source/_static/grafana_dashboard1.png b/source/_static/grafana_dashboard1.png new file mode 100644 index 0000000..ace137e Binary files /dev/null and b/source/_static/grafana_dashboard1.png differ diff --git a/source/_static/grafana_dashboard2.png b/source/_static/grafana_dashboard2.png new file mode 100644 index 0000000..22c30f9 Binary files /dev/null and b/source/_static/grafana_dashboard2.png differ diff --git a/source/_static/grafana_dashboard3.png b/source/_static/grafana_dashboard3.png new file mode 100644 index 0000000..6b789ed Binary files /dev/null and b/source/_static/grafana_dashboard3.png differ diff --git a/source/_static/grafana_dashboard4.png b/source/_static/grafana_dashboard4.png new file mode 100644 index 0000000..733500b Binary files /dev/null and b/source/_static/grafana_dashboard4.png differ diff --git a/source/_static/grafana_dashboard5.png b/source/_static/grafana_dashboard5.png new file mode 100644 index 0000000..b3e16f9 Binary files /dev/null and b/source/_static/grafana_dashboard5.png differ diff --git a/source/_static/grafana_link.png b/source/_static/grafana_link.png new file mode 100644 index 0000000..6308ac9 Binary files /dev/null and b/source/_static/grafana_link.png differ diff --git a/source/_static/grafana_login.png b/source/_static/grafana_login.png new file mode 100644 index 0000000..d47089f Binary files /dev/null and b/source/_static/grafana_login.png differ diff --git a/source/_static/grapana_explore1.png b/source/_static/grapana_explore1.png new file mode 100644 index 0000000..2ba7dbe Binary files /dev/null and b/source/_static/grapana_explore1.png differ diff --git a/source/_static/grapana_explore2.png b/source/_static/grapana_explore2.png new file mode 100644 index 0000000..f4ce57d Binary files /dev/null and b/source/_static/grapana_explore2.png differ diff --git a/source/_static/grapana_explore3.png b/source/_static/grapana_explore3.png new file mode 100644 index 0000000..3f4e55c Binary files /dev/null and b/source/_static/grapana_explore3.png differ diff --git a/source/_static/prometheus.png b/source/_static/prometheus.png new file mode 100644 index 0000000..0174599 Binary files /dev/null and b/source/_static/prometheus.png differ diff --git a/source/_static/prometheus_targets.png b/source/_static/prometheus_targets.png new file mode 100644 index 0000000..186e289 Binary files /dev/null and b/source/_static/prometheus_targets.png differ diff --git a/source/_static/prometheus_uptime.png b/source/_static/prometheus_uptime.png new file mode 100644 index 0000000..d32e9ff Binary files /dev/null and b/source/_static/prometheus_uptime.png differ diff --git a/source/_static/ss14.grafana.json b/source/_static/ss14.grafana.json new file mode 100644 index 0000000..5f8d9e6 --- /dev/null +++ b/source/_static/ss14.grafana.json @@ -0,0 +1,606 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "9.0.2" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdhms" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 1 + }, + "id": 8, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "robust_server_uptime", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "uptime", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 18, + "x": 6, + "y": 1 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_server_curtick[1m])", + "legendFormat": "tps", + "range": true, + "refId": "A" + } + ], + "title": "TPS", + "type": "timeseries" + } + ], + "title": "uptime / tps", + "type": "row" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 14, + "panels": [], + "title": "Online", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#07dfff", + "mode": "fixed", + "seriesBy": "last" + } + }, + { + "id": "unit", + "value": "none" + }, + { + "id": "min", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "B" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "unit", + "value": "dthms" + }, + { + "id": "custom.lineInterpolation", + "value": "linear" + } + ] + } + ] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 2, + "options": { + "legend": { + "calcs": [ + "firstNotNull", + "lastNotNull", + "mean", + "min", + "max" + ], + "displayMode": "table", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "robust_player_count", + "instant": false, + "legendFormat": "Игроков", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "ss14_round_length", + "hide": false, + "interval": "1m", + "legendFormat": "Время раунда", + "range": true, + "refId": "B" + } + ], + "title": "Игроков на сервере", + "type": "timeseries" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 13 + }, + "id": 20, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Received: positive \nTransmitted: negative", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "net_recv" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "net_send" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "semi-dark-purple", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 14 + }, + "id": 12, + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "table", + "placement": "right" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_recv_bytes[$__rate_interval])", + "legendFormat": "recv", + "range": true, + "refId": "net_recv" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "rate(robust_net_sent_bytes[$__rate_interval]) * -1", + "hide": false, + "legendFormat": "trans", + "range": true, + "refId": "net_send" + } + ], + "title": "Network Received / Transmitted", + "type": "timeseries" + } + ], + "title": "Network", + "type": "row" + } + ], + "refresh": false, + "schemaVersion": 36, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "1m" + ] + }, + "timezone": "", + "title": "Space Station 14", + "uid": "MoajuA54k", + "version": 29, + "weekStart": "" +} diff --git a/source/index.rst b/source/index.rst index 92f4c39..9875f72 100644 --- a/source/index.rst +++ b/source/index.rst @@ -10,3 +10,4 @@ build-and-run build-for-prod prod-advenced + metrics diff --git a/source/metrics.rst b/source/metrics.rst new file mode 100644 index 0000000..3f12ab1 --- /dev/null +++ b/source/metrics.rst @@ -0,0 +1,395 @@ +Сбор метрик +########### + +Данная инструкция описывает способ сбора метрик **Space Station 14**, таких как +текущий онлайн игроков или нагрузка Сети с использованием програмного стека +**Grafana** и **Prometheus**. + +.. note:: + - Предполагается, что читатель имеет базовые навыки работы с **Linux** системами; + - Предполагается, что читатель умеет подключаться к удалённому серверу через **SSH**; + - В качестве удалённой операционной системы будет использоваться **Debian 12**. + +Prometheus +********** + +Для сбора метрик, нам понадобится установить **Prometheus**. + +**Prometheus** - это бесплатное программное обеспечение, используемое для +мониторинга и оповещения о событиях. + +Принцип его работы достаточно прост: раз в 15 секунд (по-умолчанию), "прометей" +опрашивает указанные в настройках точки интереса и собирает по ним данные в свою +встроенную базу данных. + + +Установка и настройка +===================== + +1. Открываем |link_prometheus| + +2. Выбираем операционную систему **Linux** + +3. Скачиваем архив с отметкой LTS *(Long term support, Долгосрочная поддержка)* + на удалённый сервер + + .. code-block:: bash + + cd /root + wget 'https://github.com/prometheus/prometheus/releases/download/v2.45.5/prometheus-2.45.5.linux-amd64.tar.gz' + +4. Распаковываем полученный архив + + .. code-block:: bash + + mkdir /root/prometheus + tar -xf /root/prometheus-2.45.5.linux-amd64.tar.gz -C /root/prometheus --strip-component=1 + mkdir /root/prometheus/data + +5. Открываем файл ``/root/prometheus/prometheus.yml`` и заменяем всё его + содержимое на следующее + + .. code-block:: yaml + + global: + scrape_interval: 15s + evaluation_interval: 15s + + scrape_configs: + - job_name: 'ss14' + static_configs: + - targets: ['127.0.0.1:9001'] + +6. Создаём новый файл ``/etc/systemd/system/prometheus.service`` и записываем + туда следующее + + .. code-block:: + + [Unit] + Description=Prometheus Service + After=syslog.target network.target + + [Service] + Type=simple + WorkingDirectory=/root/prometheus + ExecStart=/root/prometheus/prometheus \ + --config.file=/root/prometheus/prometheus.yml \ + --storage.tsdb.path=/root/prometheus/data \ + --storage.tsdb.retention.time=14d \ + --web.listen-address="0.0.0.0:9000" + Restart=on-failure + + [Install] + WantedBy=multi-user.target + + .. warning:: + | Т.к. **Prometheus** не предназначен для долговременного хранения метрик, + крайне не рекомендуется указывать срок хранения данных более 14 дней + | (параметр ``--storage.tsdb.retention.time``). + + .. warning:: + | **Обратите внимание:** + | Мы указали в параметре ``--web.listen-address`` широковещательный адрес + ``0.0.0.0``. В инструкции это сделано намеренно для удобной проверки + правильной настройки всех систем. + | На своём сервере, после всех проверок, вы **ОБЯЗАНЫ** заменить адрес + ``0.0.0.0`` на ``127.0.0.1``! + +7. Выполняем повторное считываение сервисов и запускаем сервис **Prometheus** + + .. code-block:: bash + + systemctl daemon-reload + systemctl start prometheus + +Если всё сделано правильно, по адресу ``http://ip-вашего-сервера:9000/`` +будет отображаться интерфейс "прометея". + +.. image:: _static/prometheus.png + :alt: Панель управления Prometheus + + +Настройка игрового сервера +========================== + +Открываем на редактирование конфигурационный файл игрового сервера +``server_config.toml`` и добавляем туда следующую секцию + +.. code-block:: toml + + [metrics] + enabled = true + host = "127.0.0.1" + port = 9001 + runtime = false + +.. note:: + Если игровой сервер был запущен, то перезапустите его для применения новых + настроек + +Если всё сделано правильно, то в панеле "прометея", в разделе "Startus" -> "Targets" +будет отображаться "зелёным" наша точка интереса. + +.. image:: _static/prometheus_targets.png + :alt: Успешно настроенная точка сбора метрик + + +Мы так же можем проверить собранные данные, перейдя в панеле "прометея" в раздел +"Graph" и выбрав любую метрику. Например, ``robust_server_uptime`` показывает +сколько времени (в секундах) "живёт" игровой сервер + +.. image:: _static/prometheus_uptime.png + :alt: График "жизни" игрового сервера + + +Grafana +******* + +Смотреть метрики через интерфейс **Prometheus** можно, но не удобно. Удобнее +будет следить за метриками через другое бесплатное програмное обеспечение +**Grafana**. + + +База данных +=========== + +Начнём с настройки доступов к базе данных **Postgres**. + +1. Подключаемся к интерактивной postgres-консоли + + .. code-block:: bash + + sudo -u postgres psql + + Дальнейшие команды будут выполняться в ней. + +2. Создаём базу данных + + .. code-block:: sql + + CREATE DATABASE grafana; + +3. Добавляем к новосозданной БД пользователя, указываем ему пароль + и предоставляем все права на базу: + + .. code-block:: sql + + CREATE USER grafana_user WITH encrypted password 'ChangeMePlease'; + GRANT ALL PRIVILEGES ON DATABASE grafana TO grafana_user; + ALTER DATABASE grafana OWNER TO grafana_user; + +4. Выходим из интерактивной postgres-консоли + + .. code-block:: + + \q + + +Установка +========= + +1. Открываем |link_grafana| + +2. В поле "Edition" **обязательно** указываем значение "OSS" + +3. Нас интересует строчка загрузки из раздела "Standalone Linux Binaries" + + .. image:: _static/grafana_link.png + :alt: Строка загрузки Grafana + +4. Скачиваем архив на удалённом сервере + + .. code-block:: bash + + cd /root + wget 'https://dl.grafana.com/oss/release/grafana-11.0.0.linux-amd64.tar.gz' + +5. Распаковываем архив + + .. code-block:: bash + + tar -xf /root/grafana-11.0.0.linux-amd64.tar.gz -C /root + mv /root/grafana-v11.0.0 /root/grafana + +6. Подготавливаем папки + + .. code-block:: bash + + mkdir -p /root/grafana/data/log + mkdir -p /root/grafana/data/plugins + +7. Копируем "дефолтный" файл конфигурации + + .. code-block:: bash + + cp /root/grafana/conf/defaults.ini /root/grafana/conf/grafana.ini + +8. Открываем на редактирование новый конфигурационный файл + ``/root/grafana/conf/grafana.ini`` + + 1. В секции ``[paths]`` указываем абсолютные пути к данным, логам и прочему + + .. code-block:: ini + + [paths] + data = /root/grafana/data + logs = /root/grafana/data/log + plugins = /root/grafana/data/plugins + provisioning = /root/grafana/conf/provisioning + + 2. В секции ``[database]`` указываем данные подключения к БД Postgres + + .. code-block:: ini + + [database] + type = postgres + host = 127.0.0.1:5432 + name = grafana + user = grafana_user + password = """ChangeMePlease""" + + 3. В секции ``[security]`` указываем логин и пароль администратора + по-умолчанию + + .. code-block:: ini + + [security] + admin_user = Voomra + admin_password = ChangeMePlease + +9. Создаём новый файл ``/etc/systemd/system/grafana.service`` и записываем туда + следующее + + .. code-block:: + + [Unit] + Description=Grafana Service + After=syslog.target network.target + After=postgresql.service + + [Service] + Type=simple + WorkingDirectory=/root/grafana + ExecStart=/root/grafana/bin/grafana-server --config=/root/grafana/conf/grafana.ini + Restart=on-failure + + [Install] + WantedBy=multi-user.target + +10. Выполняем повторное считываение сервисов и запускаем сервис **Grafana** + + .. code-block:: bash + + systemctl daemon-reload + systemctl start grafana + +Если всё сделано было правильно, то по адресу ``http://ip-вашего-сервера:3000/`` +будет отображаться форма входа в панель управления **Grafana** + +.. image:: _static/grafana_login.png + :alt: Форма входа в панель управления Grafana + + +Настройка +========= + +Добалвение источника данных +--------------------------- + +1. Перейти в "Connection" -> "Data sources" + + .. image:: _static/grafana_add_source1.png + :alt: Меню добавление нового источника данных + +2. Нажимаем на кнопку "Add data source" + +3. Выбираем "Prometheus" + + .. image:: _static/grafana_add_source2.png + :alt: Источник данных "Prometheus" + +4. В поле "Connection" указываем адрес **Prometheus** ``http://127.0.0.1:9000`` + + .. image:: _static/grafana_add_source3.png + :alt: Адрес Prometheus + +5. | Внизу страницы нажимаем на кнопку "Save & test". + | Если появилась "зелёное" оповещение, значит всё хорошо. + + .. image:: _static/grafana_add_source4.png + :alt: Проверка источника данных + + +Исследование в источнике данных +------------------------------- + +После того как был добавлен источник данных, с ним уже можно работать. Для этого +переходим в окно "Explore" + +.. image:: _static/grapana_explore1.png + :alt: Explore + +Дальше, в поле "Metrics" вбиваем нужную метрику, например +``robust_server_uptime`` и жмем на синюю кнопку обновления в правом верхнем углу + +.. image:: _static/grapana_explore2.png + :alt: Выбор метрики + +После этого внизу отобразиться график с данными + +.. image:: _static/grapana_explore3.png + :alt: График метрики + + +Добавляем Dashboard +------------------- + +Вручную помнить все метрики и тем более вручную их искать в источнике данных +совсем не удобное занятие. Гораздо удобнее будет настроить панель с необходимым +набором графиков. + +.. note:: + Объяснение типов метрик, видов графиков и прочей информации, что поможет + вам самостоятельно создавать панели "с нуля" выходит за рамки данной статьи. + А потому здесь будет только предоставлена готовая панель с уже минимальным + набором игровых метрик. + +1. Переходим в "Dashboards" + + .. image:: _static/grafana_dashboard1.png + +2. Выбираем "New" -> "Import" + + .. image:: _static/grafana_dashboard2.png + +3. | Загружаем готовую панельку + | :download:`ss14.grafana.json <_static/ss14.grafana.json>` + + .. image:: _static/grafana_dashboard3.png + +4. Указываем источник данных + + .. image:: _static/grafana_dashboard4.png + +5. Нажимаем кнопку "Import" + +В итоге получаем готовую панель со следующими метриками: + +- Uptime игрового сервера +- TPS (Tick per second) +- Онлайн игроков +- Длительность раунда +- Сетевой трафик + +.. image:: _static/grafana_dashboard5.png + :alt: Панель метрик Space Station 14 + +.. ----------------------------------------------------------------------------- + +.. |link_prometheus| raw:: html + + страницу загрузки + +.. |link_grafana| raw:: html + + страницу загрузки