We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Интеграция распределённой системы мониторинга Prometheus + Grafana в Termux с поддержкой custom exporters

Termux — практичная среда для запуска утилит и сервисов на Android, особенно когда нужно быстро развернуть сбор метрик «на месте»: в поле, на удалённых объектах, в тестовых стендах или для небольших распределённых систем. При этом для полноценного мониторинга обычно требуется связка Prometheus + Grafana, а также возможность подключать custom exporters под конкретные источники данных.

В этой статье разберём, как организовать интеграцию так, чтобы:

  • Prometheus собирал метрики с устройств/узлов;
  • Grafana визуализировала показатели и строила дашборды;
  • custom exporters расширяли систему под ваши метрики;
  • масштабирование было управляемым и воспроизводимым.

Важно: приведённые команды демонстрационного характера. На реальном устройстве корректируйте пути, порты, сетевые настройки и режим работы под требования вашей инфраструктуры и политики безопасности.

Архитектура решения

Рассмотрим практичную схему, где Prometheus и Grafana могут быть размещены как на одном «контроллере», так и распределённо.

Вариант A (часто удобен): Prometheus + Grafana работают на сервере/ПК, а Termux на Android выступает в роли узла-экспортёра.

  • Termux: запускает exporter (например, node/text/custom) и отдаёт метрики по HTTP;
  • Prometheus: опрашивает endpoint exporter’а;
  • Grafana: читает данные из Prometheus и строит дашборды.

Вариант B: Prometheus и Grafana частично/полностью могут быть подняты и в Termux, но это сложнее по ресурсам и удобству обслуживания. Ниже акцент сделаем на универсальном подходе: exporter в Termux + Prometheus на координаторе.

Подготовка Termux

Начните с установки базовых пакетов. В Termux требуется рабочая среда для Python/Go (в зависимости от exporter’а), а также сеть для отдачи HTTP.

pkg update
pkg upgrade -y
pkg install -y python git wget curl proot

Для некоторых custom exporters может понадобиться дополнительные пакеты (например, clang для сборки, либо runtime для конкретной программы). На первом этапе достаточно базового набора.

Сетевая связность: как подключить Termux к мониторингу

Чтобы Prometheus мог опрашивать exporter’ы в Termux, важна маршрутизация. На практике используют один из вариантов:

  • Тот же Wi‑Fi/LAN-сегмент, где доступны IP устройства;
  • Локальная сеть через создание локальной сети с использованием VPN (только для объединения локальных подсетей, не для обхода блокировок).

Для отладки проверьте доступность порта на Android с компьютера, где запущен Prometheus (примерно с помощью curl).

Пример проверки, что endpoint exporter’а отвечает:

curl -v http://IP_АДРЕСА_ANDROID:PORT/metrics

Базовый exporter в Termux: пример на Python

Custom exporter’ы обычно отдают метрики в формате Prometheus (text exposition format). Самый простой путь — поднять HTTP-сервер и отдавать содержимое под ключ /metrics.

Ниже — минимальный exporter, который публикует примерные метрики (демонстрационно). В реальной системе вы заменяете логику на сбор ваших показателей (CPU, память, диски, приложения, очереди, телеметрию и т.п.).

mkdir -p ~/monitoring/exporters
cd ~/monitoring/exporters
cat > custom_exporter.py <<'PY'
import time
from http.server import BaseHTTPRequestHandler, HTTPServer

START = time.time()

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path != "/metrics":
            self.send_response(404)
            self.end_headers()
            return

        uptime = time.time() - START
        # Примерные метрики. В production замените на реальные сборы.
        body = []
        body.append('# TYPE termux_uptime_seconds gauge')
        body.append(f'termux_uptime_seconds {uptime:.3f}')
        body.append('# TYPE termux_exporter_scrapes_total counter')
        # Пример счётчика; обычно хранится/увеличивается на каждом запросе.
        body.append('termux_exporter_scrapes_total 1')

        payload = "
".join(body) + "
"

        self.send_response(200)
        self.send_header("Content-Type", "text/plain; version=0.0.4")
        self.end_headers()
        self.wfile.write(payload.encode("utf-8"))

def run(host="0.0.0.0", port=9100):
    httpd = HTTPServer((host, port), Handler)
    print(f"Custom exporter listening on http://{host}:{port}/metrics")
    httpd.serve_forever()

if name == "main":
    run()
PY

Запуск:

python custom_exporter.py

Проверка с устройства/сети:

curl -v http://localhost:9100/metrics

Если Prometheus на другом узле, замените localhost на IP Android в вашей локальной сети.

systemd и автозапуск на Android: важные нюансы

В классическом Linux обычно используют systemd. В Termux это зависит от версии Android и используемых решений. Чаще применяют:

  • планировщик Termux (запуски через приложение/скрипты);
  • встроенный механизм Termux:Widget/Boot (если доступен) или пользовательские автостарт-сценарии;
  • запуск экспортеров в сессии, контролируемой пользователем.

Практический подход: сначала добейтесь стабильного сбора метрик, затем настройте автозапуск под ваш сценарий эксплуатации.

Настройка Prometheus: scrape конфигурация

На стороне Prometheus необходимо описать target’ы exporter’ов. Откройте конфигурацию (например, prometheus.yml).

Пример для нескольких узлов Termux:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'termux-custom-exporters'
    metrics_path: /metrics
    scheme: http
    static_configs:
      - targets:
          - 'IP_ANDROID_1:9100'
          - 'IP_ANDROID_2:9100'

Перезапуск Prometheus:

# В зависимости от способа установки (Docker/Service/Systemd) команды будут отличаться.
# Если Prometheus у вас как контейнер:
docker restart prometheus

Проверка, что Prometheus видит метрики:

  • Откройте web-интерфейс Prometheus (обычно :9090);
  • перейдите в Status > Targets;
  • убедитесь, что targets имеют статус UP.

Графана: подключение источника данных и дашборды

Grafana обычно требует минимальные шаги:

  1. Добавить источник данных Prometheus;
  2. создать дашборд и виджеты;
  3. настроить панели под ваши метрики (например, termux_uptime_seconds).

В веб-интерфейсе Grafana:

  • Data Sources > Add new > Prometheus;
  • укажите URL Prometheus (например, http://PROMETHEUS_HOST:9090);
  • нажмите Save & Test.

Пример PromQL для панели uptime:

termux_uptime_seconds

Для кастомных метрик используйте ваши имена и формируйте графики по месту. Для более зрелой модели добавляйте labels (например, device_id, app, location) — это сильно упрощает построение групповых дашбордов.

Custom exporters: как проектировать правильно

Чтобы custom exporters были удобными и масштабируемыми, придерживайтесь принципов:

  • Единый формат: отдавайте метрики в формате Prometheus; обеспечьте endpoint /metrics и корректные # TYPE;
  • Стабильные имена: используйте «смысловые» имена (например, service_request_duration_seconds);
  • Labels вместо множества метрик: лучше одна метрика с label’ами, чем сотни похожих;
  • Ограничение частоты: scrape interval должен выдерживаться по производительности exporter’а;
  • Отказоустойчивость: при ошибках возвращайте метрики корректно (или применяйте fallback), чтобы Prometheus не терял сигнал полностью.

Также уделите внимание типам:

  • gauge — текущее значение;
  • counter — монотонно растущий счётчик;
  • histogram/summary — распределения (для latencies).

Мульти-узловой сбор: модель меток и группировка

В распределённой системе метрики должны отличаться источником. Удобная стратегия:

  • На exporter стороне добавляйте label device_id (или используйте значение из переменных окружения);
  • На Prometheus в static_configs задавайте соответствия target → метки через relabel_configs (если нужно);
  • В Grafana используйте переменные дашборда (например, $device) для фильтрации.

Пример того, как можно организовать label’ы (упрощённо):

# Внутри custom_exporter.py:
# termux_uptime_seconds{device_id="android-1"} 123.4

Если вы предпочитаете переносить метаданные на уровень Prometheus — обычно используют relabeling.

Безопасность: базовые рекомендации

Даже в локальной сети придерживайтесь безопасного минимума:

  • Открывайте доступ к exporter’у только в нужном сегменте сети;
  • Не публикуйте сервисы наружу без необходимости;
  • Применяйте firewall/правила роутера, если используете нестандартные порты;
  • Не включайте чувствительные данные в метрики;
  • Используйте TLS только при необходимости и при готовности инфраструктуры (в этой статье фокус на базовой связке).

Практический чек-лист запуска

  • Exporter в Termux отвечает по /metrics (проверка через curl).
  • Prometheus скрейпит target’ы (Status > Targets: UP).
  • В PromQL есть данные (например, termux_uptime_seconds возвращает значения).
  • Grafana подключена к Prometheus и панель отображает нужную метрику.
  • Нагрузки и стабильность приемлемы: scrape interval не провоцирует лаги exporter’а.
  • Метаданные (labels) позволяют различать узлы и строить группировки.

Заключение

Интеграция распределённого мониторинга Prometheus + Grafana в связке с Termux и custom exporters позволяет гибко собирать телеметрию с устройств и строить единые дашборды. Ключ к успеху — правильно спроектированный exporter (стабильный endpoint и форматы метрик), корректная конфигурация scrape в Prometheus, а также продуманная модель label’ов для масштабирования по узлам.

Если вам нужен готовый проект под ваш набор метрик, помощь в настройке Prometheus/Grafana, разработке custom exporters или сопровождение внедрения — обращайтесь в РыбинскЛАБ. Мы поможем выстроить мониторинг так, чтобы он работал надёжно и поддерживался без лишних затрат времени.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект