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

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

Termux + Prometheus & Grafana: мониторинг системных метрик Android‑устройства и визуализация в реальном времени через веб‑дашборд

Пошаговая инструкция по развёртыванию мониторинга на Android через Termux: сбор метрик, запуск Prometheus и Grafana, настройка визуализации в веб‑дашборде и проверка работы.

Современные Android‑устройства способны выступать полноценными источниками системных метрик, а Termux позволяет организовать сбор данных и отправку их в Prometheus для последующей визуализации в Grafana. В результате вы получаете веб‑дашборд, который показывает состояние устройства в реальном времени: CPU, память, дисковое потребление, сетевую активность и другие показатели.

Важно: в статье рассмотрен сценарий локального мониторинга в пределах вашей сети (без использования VPN для обхода ограничений). Для наглядности приведены варианты размещения компонентов в зависимости от того, где вам удобнее запускать Prometheus/Grafana.

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

Есть два распространённых подхода:

  • Вариант A (рекомендуется): Prometheus и Grafana запускаются на компьютере/сервере в локальной сети, а Termux на Android отдаёт метрики по HTTP эндпоинтом. Это проще в эксплуатации и удобнее для длительной работы.
  • Вариант B: Prometheus и Grafana также запускаются в Termux. Подходит для экспериментов, но ограничивает ресурсы и усложняет обслуживание.

Ниже разобран в основном вариант A — он наиболее практичен для веб‑визуализации.

Что понадобится

  • Android‑устройство с установленным Termux.
  • Компьютер/сервер в той же локальной сети (Windows/Linux/macOS) для запуска Prometheus и Grafana.
  • Доступ по IP устройства (вы сможете обратиться к Android по адресу Termux‑сервера метрик).
  • Достаточно свободного места под дашборды/логи.

Если требуется, можно использовать VPN только для создания локальной сети между устройствами (например, для стабильного доступа к адресам в разных подсетях).

Шаг 1. Подготовка Termux и установка инструментов

Запустите Termux и выполните установку пакетов. В зависимости от сборки Android некоторые пакеты могут вести себя по‑разному, поэтому используйте актуальный менеджер пакетов Termux.

pkg update && pkg upgrade -y
pkg install -y prometheus-client python termux-api procps net-tools curl

Пояснение по ключевым пакетам:

  • prometheus-client — библиотека для экспонирования метрик в формате Prometheus.
  • python — запуск небольшого HTTP‑сервера с метриками.
  • procps — утилиты для получения показателей CPU/памяти (например, top, free и аналоги в Termux‑экосистеме).

Шаг 2. Создание скрипта экспортёра метрик (Android → Prometheus)

Мы сделаем простой экспортер, который открывает HTTP‑эндпоинт /metrics. Prometheus будет периодически опрашивать его.

Создайте файл, например metrics_exporter.py.

nano metrics_exporter.py

Вставьте содержимое:

#!/data/data/com.termux/files/usr/bin/python

from prometheus_client import start_http_server, Gauge
import subprocess
import time

# Метрики
cpu_usage = Gauge('android_cpu_usage_percent', 'CPU usage percent (approx)')
memory_total = Gauge('android_memory_total_kb', 'Total memory (KB)')
memory_used = Gauge('android_memory_used_kb', 'Used memory (KB)')
memory_free = Gauge('android_memory_free_kb', 'Free memory (KB)')

# Простейшая оценка CPU из /proc/stat (можно улучшить, но для наглядности достаточно)
prev_idle = None
prev_total = None

def read_cpu_usage_percent():
    global prev_idle, prev_total
    with open('/proc/stat', 'r') as f:
        line = f.readline()

    parts = line.split()
    # В /proc/stat первая строка: cpu user nice system idle iowait irq softirq steal guest guest_nice
    user = int(parts[1])
    nice = int(parts[2])
    system = int(parts[3])
    idle = int(parts[4])
    iowait = int(parts[5]) if len(parts) > 5 else 0
    irq = int(parts[6]) if len(parts) > 6 else 0
    softirq = int(parts[7]) if len(parts) > 7 else 0
    steal = int(parts[8]) if len(parts) > 8 else 0

    total = user + nice + system + idle + iowait + irq + softirq + steal

    if prev_idle is None or prev_total is None:
        prev_idle = idle
        prev_total = total
        return 0.0

    diff_idle = idle - prev_idle
    diff_total = total - prev_total
    prev_idle = idle
    prev_total = total

    if diff_total == 0:
        return 0.0

    usage = (diff_total - diff_idle) / diff_total * 100.0
    return max(0.0, min(100.0, usage))


def read_memory_kb():
    # Пытаемся получить через free; если недоступно — парсим /proc/meminfo
    try:
        out = subprocess.check_output(['free', '-k'], text=True)
        # Ожидаем строку с "Mem:" где поля: total used free ...
        for line in out.splitlines():
            if line.lower().startswith('mem:'):
                parts = line.split()
                total = int(parts[1])
                used = int(parts[2])
                free = int(parts[3])
                return total, used, free
    except Exception:
        pass

    mem = {}
    with open('/proc/meminfo', 'r') as f:
        for line in f:
            key, val = line.split(':', 1)
            mem[key.strip()] = val.strip().split()[0]

    total = int(mem.get('MemTotal', 0))
    free = int(mem.get('MemFree', 0))
    # Используем оценку: used = total - free (упрощение)
    used = max(0, total - free)
    return total, used, free


def main():
    # Порт для HTTP-экспортёра
    port = 9105
    start_http_server(port)

    while True:
        cpu = read_cpu_usage_percent()
        total, used, free = read_memory_kb()

        cpu_usage.set(cpu)
        memory_total.set(total)
        memory_used.set(used)
        memory_free.set(free)

        time.sleep(2)


if name == 'main':
    main()

Сделайте файл исполняемым и запустите:

chmod +x metrics_exporter.py
python metrics_exporter.py

Теперь Android начнёт отдавать метрики на http://<IP_вашего_Android>:9105/metrics.

Проверьте адрес и доступность из Termux (или с компьютера):

termux-setup-storage
ip addr show

В Termux вы можете дополнительно проверить, что эндпоинт отвечает:

curl -s http://127.0.0.1:9105/metrics | head

Шаг 3. Разрешение сетевого доступа (локальная сеть)

На Android SELinux и сетевые политики могут ограничивать доступ к приложениям и портам. Чаще всего сервер метрик Termux доступен в пределах локальной сети, но в некоторых сценариях могут потребоваться действия на стороне сети/роутера.

Минимальная проверка:

  • Android и компьютер должны находиться в одной Wi‑Fi сети или маршрутизироваться без NAT‑изоляции.
  • Порт 9105 должен быть доступен для входящих соединений в пределах локальной сети.

Если на практике доступа из компьютера нет, проверьте IP Android (сейчас важен именно IP устройства, а не localhost).

Шаг 4. Настройка Prometheus для сбора метрик

На компьютере откройте конфигурацию Prometheus. Если Prometheus уже установлен, найдите файл prometheus.yml.

Пример минимальной конфигурации (добавьте scrape конфигурацию для Android):

global:
  scrape_interval: 5s

scrape_configs:
  - job_name: 'android_termux'
    static_configs:
      - targets: ['<IP_вашего_Android>:9105']

Перезапустите Prometheus.

После запуска проверьте статус целей:

  • Откройте веб‑интерфейс Prometheus (обычно http://localhost:9090).
  • Перейдите в Targets и убедитесь, что job android_termux в состоянии UP.

Шаг 5. Подключение Grafana и создание дашборда

Запустите Grafana и подключите Prometheus как источник данных.

  1. Откройте Grafana (обычно http://localhost:3000).
  2. Перейдите в Connections → Data sources.
  3. Выберите Prometheus и укажите URL (например, http://localhost:9090 или адрес Prometheus в вашей сети).
  4. Сохраните.

Далее создайте панели:

  • CPU: запрос android_cpu_usage_percent
  • Память: android_memory_used_kb, android_memory_free_kb, android_memory_total_kb

В Grafana обычно удобно сделать:

  • Линейный график для CPU %.
  • Стек/график для памяти (используемая/свободная) либо вычисление доли (например, used / total — в зависимости от предпочтений).

Шаг 6. Реальное время и проверка стабильности

Для реального “живого” отображения держите в голове два параметра:

  • scrape_interval в Prometheus (например, 5s).
  • Частоту обновления метрик в экспортере (в примере — каждую 2 секунды).

Если вы замечаете “рывки” на графиках:

  • Проверьте доступность /metrics с компьютера: curl или браузер.
  • Посмотрите логи Prometheus и убедитесь, что ошибок scraping нет.
  • Убедитесь, что Android не уходит в жёсткий режим сна, который может прервать работу процессов.

Расширение набора метрик

Приведённый экспортер демонстрационный. Для промышленной практики часто добавляют:

  • Сетевую активность: байты/пакеты по интерфейсам.
  • Дисковые показатели: свободное место по разделам (в Android может отличаться способом доступа).
  • Температуры и частоты (если доступны через подсистемы устройства).

Подход остаётся тот же: добавляете новые Gauge/Counter, читаете значения из /proc или системных утилит и обновляете метрики в цикле.

Важные замечания по безопасности

  • Держите мониторинг в пределах локальной сети. Для доступа извне используйте безопасные механизмы, согласованные с вашей инфраструктурой.
  • Не выставляйте метрики на публичный интернет без необходимости.
  • Следите за тем, чтобы Android‑устройство не теряло IP (например, при смене Wi‑Fi сети).

Заключение

Связка Termux → Prometheus → Grafana позволяет организовать удобный веб‑мониторинг системных метрик Android‑устройства в реальном времени. Вы получаете прозрачную картину по CPU и памяти, а при желании легко расширяете набор метрик под свои задачи.

Если вам нужно быстро спроектировать и развернуть мониторинг “под ключ”, подобрать оптимальные интервалы, добавить нужные метрики и подготовить готовые дашборды — обращайтесь в РыбинскЛАБ. Мы поможем организовать стабильный сбор данных и визуализацию для ваших стендов и устройств.

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

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

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

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