Archived
1

feat: Сбор метрик

This commit is contained in:
2024-05-21 19:22:50 +03:00
parent 8e24e5c972
commit da7a261910
20 changed files with 1002 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@@ -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": ""
}

View File

@@ -10,3 +10,4 @@
build-and-run build-and-run
build-for-prod build-for-prod
prod-advenced prod-advenced
metrics

395
source/metrics.rst Normal file
View File

@@ -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
<a href="https://prometheus.io/download/" target="_blank">страницу загрузки</a>
.. |link_grafana| raw:: html
<a href="https://grafana.com/grafana/download?edition=oss" target="_blank">страницу загрузки</a>