> For the complete documentation index, see [llms.txt](https://utm-1.gitbook.io/utm-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/monitoring/prometheus/monitoring-kafka.md).

# Мониторинг Kafka

## Общее описание

### Мониторинг Kafka через JMX Exporter и Prometheus

#### Суть решения

Система обеспечивает **непрерывный мониторинг двух независимых Kafka‑кластеров** (в режиме KRaft) с помощью:

* **JMX Exporter** — агента, собирающего метрики из JVM Kafka и предоставляющего их в формате Prometheus;
* **Prometheus** — системы мониторинга, регулярно опрашивающей экспортеры и сохраняющей метрики;
* **Docker Compose** — инструмента для развёртывания и управления Kafka‑кластерами.

#### Компоненты и их роль

1. **Kafka‑кластеры (2 шт.)**
   * Работают в режиме **KRaft** (без Zookeeper).
   * Каждый имеет уникальный `CLUSTER_ID`.
   * Обрабатывают потоки данных и генерируют JMX‑метрики (потребление памяти, число сообщений, состояние реплик и др.).
2. **JMX Exporter (внутри каждого контейнера Kafka)**
   * Подключается к Kafka как **Java‑агент** через параметр `-javaagent` в `KAFKA_OPTS`.
   * Собирает метрики через локальный JMX (не требует удалённого подключения).
   * Преобразует JMX‑метрики в формат Prometheus (`/metrics`).
   * Слушает HTTP‑порт (`9191` для первого кластера, `9192` для второго).
3. **Prometheus (в Kubernetes)**
   * Регулярно опрашивает экспортеры по адресам:
     * `http://192.168.4.11:9191/metrics` (кластер 1);
     * `http://192.168.4.11:9192/metrics` (кластер 2).
   * Сохраняет метрики в долговременное хранилище.
   * Предоставляет API для визуализации (например, через Grafana).
4. **Docker Compose**
   * Описывает конфигурацию контейнеров Kafka.
   * Обеспечивает сетевую связность между компонентами.
   * Управляет монтированием конфигов и JAR‑файлов.

#### Как это работает

1. **Запуск Kafka с агентом**\
   При старте контейнера Kafka:
   * JVM загружает JMX Exporter через `-javaagent`.
   * Экспортер начинает слушать указанный порт (`9191`/`9192`) для HTTP‑запросов.
   * Метрики JMX автоматически преобразуются в формат Prometheus.
2. **Опрос метрик Prometheus**\
   Prometheus:
   * Каждые `scrape_interval` (по умолчанию 30 с) отправляет HTTP‑запросы на `9191` и `9192`.
   * Получает ответ в формате:

     ```
     # HELP kafka_broker_topic_messages_in_per_sec ...
     kafka_broker_topic_messages_in_per_sec{topic="test"} 123
     ```
   * Сохраняет данные в TSDB.
3. **Доступ к данным**\
   Метрики доступны:
   * В интерфейсе Prometheus (`http://<prometheus-ip>:9090/graph`).
   * Через API Prometheus для интеграции с Grafana, Alertmanager и др.

#### Ключевые параметры конфигурации

* **Порты метрик**:
  * Кластер 1 (Confluent Kafka): `9191`.
  * Кластер 2 (Apache Kafka): `9192`.
* **IP сервера Kafka**: `192.168.4.11` (доступен для Prometheus).
* **Конфиг JMX Exporter**: `kafka-jmx-config.yaml` (без `hostPort`, только `rules`).
* **Запуск агента**: через `KAFKA_OPTS` с указанием порта и пути к конфигу.

#### Преимущества решения

* **Минимальные накладные расходы** — экспортер работает внутри JVM Kafka.
* **Совместимость** — формат метрик соответствует стандартам Prometheus.
* **Масштабируемость** — легко добавить новые кластеры, указав новый порт и обновив конфиг Prometheus.
* **Надёжность** — Docker Compose обеспечивает восстановление контейнеров при сбоях.

#### Требования к инфраструктуре

* Сервер с Docker и Docker Compose.
* Kubernetes с развёрнутым Prometheus.
* Открытые порты `9191` и `9192` на фаерволе сервера Kafka.
* Сетевая связность между сервером Kafka и Prometheus.

#### Итог

Решение позволяет:

* В реальном времени отслеживать ключевые метрики Kafka (загрузку брокеров, состояние реплик, потребление памяти).
* Интегрировать мониторинг в существующую экосистему Prometheus/Grafana.
* Быстро выявлять и устранять проблемы (например, рост числа `UnderReplicatedPartitions`).
* Масштабировать мониторинг на дополнительные кластеры без изменения архитектуры.

## Установка JMX Exporter

Отдельно JMX Exporter не устанавливается. Он запускается внутри Docker контейнеров с серверами Kafka. Настройка описчана [тут](/utm-docs/dokumentaciya/utm-it/resheniya/brokery-soobshenii/kafka/instansy/razvertyvanie-na-utm-mb4-11.md).

## Настройка Prometheus

### Регистрация target

В файле `argocd\env-prod\apps\monitoring\prometheus\values.yaml`&#x20;

<details>

<summary>Изменения в файле <code>argocd\env-prod\apps\monitoring\prometheus\values.yaml</code></summary>

Добавить ip сервера в секцию&#x20;

prometheus\prometheusSpec\additionalScrapeConfigs

```yaml
    additionalScrapeConfigs: |
      - job_name: 'kafka_jmx_exporter'
        static_configs:
          - targets:
            - 192.168.4.11:9191  # JMX Exporter для utm-cp-kafka37
            - 192.168.4.11:9192  # JMX Exporter для utm-kafka41
        scrape_interval: 30s      # Частота опроса (по умолчанию 30 с)
        scrape_timeout: 10s       # Таймаут запроса
        metrics_path: '/metrics'  # Путь к метрикам (стандартный для JMX Exporter)
```

Сделать коммит в репозиторий GitHub с обновлением файла `values.yaml`&#x20;

Дождаться, когда Argo CD обновить приложение k8s-prometheus.

</details>

### Настройка оповещений

{% hint style="info" %}
**ПРОРАБОТАТЬ!!!**
{% endhint %}

## Настройка Grafana

### Импорт дашбордов из Argo CD

В файле `argocd\env-prod\apps\monitoring\grafana\values.yaml` добавить

<details>

<summary>Изменения в файле <code>argocd\env-prod\apps\monitoring\grafana\values.yaml</code></summary>

```yaml
dashboardProviders:
    - name: 'kafka'
      orgId: 1
      folder: 'Kafka'
      type: file
      disableDeletion: false
      editable: true
      options:
        path: /var/lib/grafana/dashboards/kafka
        foldersFromFilesStructure: false
```

Сделать коммит в репозиторий GitHub с обновлением файла `values.yaml`&#x20;

Дождаться, когда Argo CD обновить приложение k8s-grafana.

</details>

#### Дашборды

<details>

<summary>Описание импортируемых дашбордов</summary>

Пока нет

</details>

### Ручной импорт дашбордов

В Grafana: Dashboards → Import → вставь ID  → выбери источник Prometheus.

Каталог в дашбордах: `Kafka`

#### Дашборды

<details>

<summary>Описание импортируемых дашбордов</summary>

#### Kafka Exporter Overview

Ссылка: [grafana.com](https://grafana.com/grafana/dashboards/7589-kafka-exporter-overview/)

ID: 7589

<figure><img src="/files/ProWPblx187rFRibQYgs" alt=""><figcaption></figcaption></figure>

#### Kafka Overview

Ссылка: [grafana.com](https://grafana.com/grafana/dashboards/721-kafka/)

ID: 721

<figure><img src="/files/1WjgarbueVVYobdkYJDn" alt=""><figcaption></figcaption></figure>

#### Kafka Metrics

Ссылка: [grafana.com](https://grafana.com/grafana/dashboards/11962-kafka-metrics/)

ID: 11962

<figure><img src="/files/fZPvuXolcXuyQJIlgbwm" alt=""><figcaption></figcaption></figure>

#### Kafka Dashboard

Ссылка: [grafana.com](https://grafana.com/grafana/dashboards/18276-kafka-dashboard/)

ID: 18276

<figure><img src="/files/FmPx2dx2rIzaMLsY7yFO" alt=""><figcaption></figcaption></figure>

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/monitoring/prometheus/monitoring-kafka.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
