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/exporterscat > 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 обычно требует минимальные шаги:
- Добавить источник данных Prometheus;
- создать дашборд и виджеты;
- настроить панели под ваши метрики (например,
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 или сопровождение внедрения — обращайтесь в РыбинскЛАБ. Мы поможем выстроить мониторинг так, чтобы он работал надёжно и поддерживался без лишних затрат времени.