COSMOS WIKI
September 20, 2022

Мониторинг СOSMOS (node-exporter, cosmos-exporter / grafana, prometheus)

Данная инструкция о том, как настроить мониторинг для нод Сosmos с помощью Prometheus, Node Exporter, Cosmos Exporter и Grafana. Упор в мониторинге будет делаться на данные о сети и валидаторе

Node Exporter и Cosmos Exporter будут установлены на одном сервере - для этого можно использовать сервер валидатора или запустить ноду на отдельном сервере. Prometheus и Grafana будут установлены на отдельном сервере. Данные от Node Exporter будут передаваться в Prometheus, а данные с Prometheus будут предаваться в Grafana

Также можно не устанавливать Cosmos Exporter, в том случае, если его не будет использовать дашборд для Grafana

Prometheus является открытой СУБД, написанной на языке Go. Интересной особенностью Prometheus является то, что он сам вытягивает метрики с заданного множества сервисов. За счет этого у Prometheus не могут забиться какие-либо очереди данных, а значит мониторинг никогда не станет узким местом системы

Node Exporter - это сервис, задача которого заключается в экспорте информации о машине в формате, понятном Prometheus. На самом деле для Prometheus существует много других exporter’ов, но нам отлично подойдет Node Exporter

Cosmos Exporter - это сервис, задача которого заключается в экспорте информации из полного узла блокчейна на основе Cosmos через gRPC. Cosmos Exporter создан solarlabsteam

Grafana представляет собой открытый веб-фронтенд к различным time series СУБД, таким, как Graphite, InfluxDB, и, конечно, Prometheus. С помощью Grafana мы сможем наблюдать красивые графики через наш браузер. Характерно, что у Prometheus есть и собственный веб-интерфейс, но даже сами разработчики Prometheus рекомендуют использовать Grafana

Порты по умолчанию:

  • validator prometheus - 26660

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):26660/\033[0m"

  • prometheus - 9090

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9090/\033[0m"

  • node exporter - 9100

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m"

  • cosmos exporter - 9300
  • grafana - 3000

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):3000/\033[0m"

Сервер с нодой для Node Exporter и Cosmos Exporter

Validator Prometheus

Для начала убедитесь, что Вы включили соединение с prometheus в$HOME/.nolus/config/config.toml, если нет:

directory=.nolus
binary=nolusd

sed -i -e "s/prometheus = false/prometheus = true/" $HOME/$directory/config/config.toml
systemctl restart $binary

Порт по умолчанию 26660

Теперь самое время проверить метрики в браузере: http://<node_IP>:26660/

# узнаем адрес и вставляем в браузер
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):26660/\033[0m"
# http://108.108.108.108:26660/

Node Exporter

Node Exporter мы установим на сервер с нодой и также при желании можем установить на сервер с Prometheus, чтобы наблюдать за всеми серверами при необходимости. В целях безопасности создадим учетную запись node_exporter

# используем параметры --no-create-home и --shell /bin/false, 
# чтобы этот пользователь не мог войти на сервер
useradd --no-create-home --shell /bin/false node_exporter

Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Prometheus

cd
wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
tar xvf node_exporter-1.5.0.linux-amd64.tar.gz

# скопируем бинарные файлы в /usr/local/bin
cp node_exporter-1.5.0.linux-amd64/node_exporter /usr/local/bin
chown node_exporter:node_exporter /usr/local/bin/node_exporter
node_exporter --version
#node_exporter, version 1.5.0 (branch: HEAD, revision: 1b48970ffcf5630534fb00bb0687d73c66d1c959)

# удаляем ненужные файлы
rm -r node_exporter-*

Создаем сервисный файл

tee /etc/systemd/system/node_exporterd.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=default.target
EOF
systemctl daemon-reload
systemctl enable node_exporterd
systemctl restart node_exporterd && journalctl -u node_exporterd -f -o cat

Проверяем, что метрики отдаются

curl 'localhost:9100/metrics'

Теперь самое время проверить метрики в браузере

# узнаем адрес и вставляем в браузер
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m"
# http://108.108.108.108:9100/
Нажимаем на Metrics
Видим, что все отлично и мы получаем нужные данные, которые позже будут отображаться в Grafana

Cosmos Exporter

Cosmos Exporter мы установим на сервер с нодой. В целях безопасности создадим учетную запись cosmos_exporter

# используем параметры --no-create-home и --shell /bin/false, 
# чтобы этот пользователь не мог войти на сервер
useradd --no-create-home --shell /bin/false cosmos_exporter

Вы можете найти последние двоичные файлы вместе с их контрольными суммами на solarlabsteam

cd
wget https://github.com/solarlabsteam/cosmos-exporter/releases/download/v0.3.0/cosmos-exporter_0.3.0_Linux_x86_64.tar.gz
tar xvf cosmos-exporter*

# скопируем бинарные файлы в /usr/local/bin
cp cosmos-exporter /usr/local/bin
chown cosmos_exporter:cosmos_exporter /usr/local/bin/cosmos-exporter

# удаляем ненужные файлы
rm -rf cosmos-exporter*

Добавляем нужные переменные denom иbench_prefix

Вы можете передать аргументы в исполняемый файл - здесь список

DENOM=unls
BECH_PREFIX=nolus
# --denom-coefficient (число десятичных знаков по умолчанию 1)
DENOM_COEFFICIENT=1000000
# --tendermint-rpc (порт RPC по умолчанию http://localhost:26657)
TENDERMINT_RPC=http://localhost:26657
# --node (порт gRPC по умолчанию localhost:9090)
NODE=localhost:9090

Создаем сервисный файл

tee /etc/systemd/system/cosmos-exporterd.service > /dev/null <<EOF
[Unit]
Description=Cosmos Exporter
After=network-online.target

[Service]
User=cosmos_exporter
Group=cosmos_exporter
TimeoutStartSec=0
CPUWeight=95
IOWeight=95
ExecStart=/usr/local/bin/cosmos-exporter --denom $DENOM --denom-coefficient $DENOM_COEFFICIENT --bech-prefix $BECH_PREFIX --node $NODE --tendermint-rpc $TENDERMINT_RPC
Restart=always
RestartSec=2
LimitNOFILE=800000
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable cosmos-exporterd
systemctl restart cosmos-exporterd && journalctl -u cosmos-exporterd -f -o cat

Сервер для Prometheus и Grafana

Для Prometheus и Grafana используем отдельный сервер. Можно арендовать VPS 1/2/20

Шаг 1 - Подготовка сервера

# обновляем репозитории
apt update && apt upgrade -y

# устанавливаем необходимые утилиты
apt install curl iptables build-essential git wget jq make gcc nano tmux htop nvme-cli pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev -y
apt install python3-pip -y
pip install yq

File2Ban - подробнее здесь

# устанавливаем и копируем конфиг, который будет иметь больший приоритет
apt install fail2ban -y && \
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && \
nano /etc/fail2ban/jail.local
# раскомментировать и добавить свой IP: ignoreip = 127.0.0.1/8 ::1 <ip>
systemctl restart fail2ban

# проверяем status 
systemctl status fail2ban
# проверяем, какие jails активны (по умолчанию только sshd)
fail2ban-client status
# проверяем статистику по sshd
fail2ban-client status sshd
# смотрим логи
tail /var/log/fail2ban.log
# останавливаем работу и удаляем с автозагрузки
#systemctl stop fail2ban && systemctl disable fail2ban

Шаг 2 - Создание пользователя Prometheus

В целях безопасности создадим учетную запись prometheus

# используем параметры --no-create-home и --shell /bin/false, 
# чтобы этот пользователь не мог войти на сервер
useradd --no-create-home --shell /bin/false prometheus

# создадим необходимые каталоги для хранения файлов и данных Prometheus
mkdir /etc/prometheus
mkdir /var/lib/prometheus

# установим права пользователя и группы в новых каталогах для пользователя prometheus
chown prometheus:prometheus /etc/prometheus
chown prometheus:prometheus /var/lib/prometheus

Шаг 3 - Установка Prometheus

Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Prometheus

cd && \
wget https://github.com/prometheus/prometheus/releases/download/v2.38.0/prometheus-2.38.0.linux-amd64.tar.gz && \
tar xvf prometheus-2.38.0.linux-amd64.tar.gz
# скопируем бинарные файлы в /usr/local/bin
cp prometheus-2.38.0.linux-amd64/prometheus /usr/local/bin/
cp prometheus-2.38.0.linux-amd64/promtool /usr/local/bin/

# установим права собственности пользователя и группы на бинарные файлы
chown prometheus:prometheus /usr/local/bin/prometheus
chown prometheus:prometheus /usr/local/bin/promtool

# скопируем consoles, console_libraries и prometheus.yml в /etc/prometheus
cp -r prometheus-2.38.0.linux-amd64/consoles /etc/prometheus
cp -r prometheus-2.38.0.linux-amd64/console_libraries /etc/prometheus
cp prometheus-2.38.0.linux-amd64/prometheus.yml /etc/prometheus/

# установим права собственности пользователя и группы в каталогах для пользователя prometheus
# флаг -R гарантирует, что право собственности также будет установлено для файлов внутри каталога
chown -R prometheus:prometheus /etc/prometheus

# удаляем ненужные файлы
rm -rf prometheus-2.38.0.linux-amd64.tar.gz prometheus-2.38.0.linux-amd64

# проверим версии
prometheus --version
promtool --version

Шаг 4 - Настройка Prometheus

Теперь нам необходимо настроить prometheus.yml и добавить в него 1 или несколько параметров в зависимости от количества серверов и используемых нод

Предупреждение: конфигурационный файл Prometheus использует формат YAML, который строго запрещает табуляцию и требует двух пробелов для отступа. Prometheus не запустится, если файл конфигурации неправильно отформатирован


Info: Prometheus использует job_nameдля обозначения экспортеров в запросах и на графиках, поэтому обязательно заполняем данное значение

В некоторых случая, к примеру для APTOS необходимо также указывать chain:

И, поскольку Prometheus экспортирует важные данные о себе, которые можно использовать для мониторинга производительности и отладки, то переопределимscrape_intervalс 15 секунд до 5 секунд для более частых обновлений

Наконец, Prometheus использует директивы static_configsиtargets, чтобы определить, где работают экспортеры. Поскольку этот конкретный экспортер работает на том же сервере, что и сам Prometheus, мы можем использовать localhostвместо IP-адреса вместе с портом по умолчанию, 9090

Копируем дефолтный конфиг

curl -sSL https://raw.githubusercontent.com/lesnikutsa/cosmos-monitoring/main/prometheus.yml > /etc/prometheus/prometheus.yml

Создаем каталог и запускаем скрипт обновления конфига (ОПЦИОНАЛЬНО)

mkdir -p $HOME/prometheus && cd prometheus
wget -q -O add_node.sh https://raw.githubusercontent.com/lesnikutsa/cosmos-monitoring/main/add_node.sh && chmod +x add_node.sh

Задаем переменные для нашего конфига. Для добавления других нод, просто запустите данную команду еще раз

VALIDATOR_IP=<YOUR_VALIDATOR_IP>
VALOPER_ADDRESS=<YOUR_VALOPER_ADDRESS>
WALLET_ADDRESS=<YOUR_WALLET_ADDRESS>
PROJECT_NAME=<YOUR_PROJECT_NAME>
$HOME/prometheus/add_node.sh $VALIDATOR_IP $VALOPER_ADDRESS $WALLET_ADDRESS $PROJECT_NAME

Теперь примерный файл конфигурации должен выглядеть следующим образом:

nano /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
rule_files: null
scrape_configs:
  - job_name: prometheus
    metrics_path: /metrics
    static_configs:
      - targets:
          - localhost:9090
  - job_name: cosmos
    metrics_path: /metrics
    static_configs:
      - targets:
          - 135.181.46.247:26660
        labels: {}
      - targets:
          - 135.181.46.247:26660
        labels: {}
  - job_name: node
    metrics_path: /metrics
    static_configs:
      - targets:
          - 135.181.46.247:9100
        labels:
          instance: nolus
      - targets:
          - 135.181.46.247:9100
        labels:
          instance: nolus
  - job_name: validators
    metrics_path: /metrics/validators
    static_configs:
      - targets:
          - 135.181.46.247:9300
        labels: {}
      - targets:
          - 135.181.46.247:9300
        labels: {}
  - job_name: validator
    metrics_path: /metrics/validator
    relabel_configs:
      - source_labels:
          - address
        target_label: __param_address
    static_configs:
      - targets:
          - 135.181.46.247:9300
        labels:
          address: nolusvaloper1rp9sy3rzdavu2f5764r2304ftetm3ytc5fyswa
      - targets:
          - 135.181.46.247:9300
        labels:
          address: nolusvaloper1rp9sy3rzdavu2f5764r2304ftetm3ytc5fyswa
  - job_name: wallet
    metrics_path: /metrics/wallet
    relabel_configs:
      - source_labels:
          - address
        target_label: __param_address
    static_configs:
      - targets:
          - 135.181.46.247:9300
        labels:
          address: nolus1rp9sy3rzdavu2f5764r2304ftetm3ytcde34dq
      - targets:
          - 135.181.46.247:9300
        labels:
          address: nolus1rp9sy3rzdavu2f5764r2304ftetm3ytcde34dq

После завершения настройки мы готовы протестировать Prometheus, запустив его в первый раз.

Создаем сервисный файл

tee /etc/systemd/system/prometheusd.service > /dev/null <<EOF
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && \
systemctl enable prometheusd && \
systemctl restart prometheusd && sudo systemctl status prometheusd
#journalctl -u prometheusd -f -o cat

Проверяем, что метрики отдаются

curl 'localhost:9090/metrics'

Теперь самое время проверить информацию в браузере

# узнаем адрес и вставляем в браузер
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9090/\033[0m"
# http://108.108.108.108:9090/
Переходим в Targets

Шаг 5 - Установка Grafana

Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Grafana

sudo apt-get install -y adduser libfontconfig1 && \
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_9.1.3_amd64.deb && \
sudo dpkg -i grafana-enterprise_9.1.3_amd64.deb
systemctl daemon-reload && \
systemctl enable grafana-server && \
systemctl restart grafana-server && sudo systemctl status grafana-server

Cмотрим логи

journalctl -u grafana-server -f

Теперь самое время перейти в браузер

# узнаем адрес и вставляем в браузер
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):3000/\033[0m"
# http://108.108.108.108:3000/
При первом открытии необходимо ввести логин и пароль
  • Логин - admin
  • Пароль - admin
Система сразу просит придумать нам новый пароль. Не пропускайте это!!!
Переходим в Data sources, чтобы настроить Grafana

Теперь нам необходимо указать в графе URL адрес к своему серверу с Prometheus. Если Prometheus находится на том же сервере, что и Grafana, то задаем http://localhost:9090 и сохраняем настройки

При правильном подключении отобразится зеленая галочка

Теперь самое интересное и нам необходимо загрузить json файлы для нашего дашборда. Для этого необходимо знать ID json файла или скачать его у кого-то или создать самому

  • Найти json по душе можно здесь

или:

Если у нас есть скачанный json, то загружаем его самостоятельно

Можно загрузить сразу несколько json и переключаться между ними. Или создать свой собственный, потратив на это определенное количество времени)

Пример 1
Пример 2
Пример 3