<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director
Вход / Регистрация

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

Александр Бархатов
Александр Бархатов
Технический писатель
22 апреля 2025 г.
18
20 минут чтения
Средний рейтинг статьи: 5

С развитием микросервисной архитектуры появляются новые инструменты, которые облегчают и упрощают работу с микросервисными приложениями. Одним из таких инструментов является Apache Kafka — популярная платформа и система для обработки потоковых данных и обмена сообщениями в режиме реального времени. Ее используют различные компании по всему миру для построения масштабируемых систем передачи сообщений, аналитики данных и для интеграции с микросервисными приложениями.

Kafka, будучи основным сервисом в архитектуре приложений, требует наличия мониторинга. Без должного мониторинга кластер может столкнуться со сбоями в работе, что может привести к потере данных или утечкам информации. Сегодня мы подробно разберем, как организовать мониторинг Apache Kafka.

Архитектура Apache Kafka

Прежде чем приступать к процессу организации мониторинга и защиты Kafka, разберем архитектуру программы. 

Kafka — это распределенная система, которая состоит из нескольких ключевых компонентов:

  • Брокеры — физические или виртуальные серверы (хосты), которые принимают, хранят и обрабатывают сообщения. Каждый брокер отвечает за определенные партиции топиков.
  • Топики — логические категории, в которые поступают сообщения. Топики делятся на партиции для параллельной обработки.
  • Производители (Producers) — источники данных или же, более простым языком, клиенты, отправляющие данные в топики.
  • Потребители (Consumers) — клиенты, которые читают данные из топиков, часто объединенные в группы для распределения нагрузки.
  • ZooKeeper — используется для координации брокеров, а также хранит метаданные и конфигурацию. Начиная с версии 3.3+ появляется возможность работы без ZooKeeper благодаря KRaft (протокол для хранения метаданных и управления ими внутри Kafka). Главная особенность KRaft заключается в устранении зависимости Apache Kafka от внешнего сервиса ZooKeeper.

Сообщения в Kafka представляют собой пары ключ-значение, которые записываются в партиции в виде логов. Потребители читают эти сообщения, отслеживая свое положение в логе. Такая архитектура обеспечивает высокую пропускную способность, но делает систему уязвимой к сбоям, если не уделять внимания мониторингу и безопасности.

Мониторинг

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

  • Контроль производительности. Производительность брокера снижается при появлении случаев задержки в доставке сообщений или перегрузки самого брокера сообщений. Эти действия замедляют всю цепочку обработки данных.
  • Контроль целостности данных. При контроле целостности данных удается минимизировать проблемы, связанные с потерей сообщений, дублированием или повреждением данных.
  • Планирование масштабирования. Мониторинг помогает понять, когда нужно добавить брокеры (горизонтальное масштабирование) или увеличить ресурсы сервера (вертикальное масштабирование).

Ключевые метрики для мониторинга

Эффективный мониторинг требует отслеживания метрик на всех уровнях системы. Рассмотрим основные категории и примеры.

1. Метрики брокеров

  • Входящий и исходящий трафик. Показывает, сколько данных брокер принимает и отправляет. Если значения приближаются к лимитам сети или дисков, это сигнал к масштабированию.
  • Задержка при выполнении запросов. Среднее время обработки запросов от клиентов. Рост задержки может указывать на нехватку ресурсов.
  • Количество активных соединений. Аномально высокое число соединений может быть признаком атаки или некорректной работы клиентов.
  • Использование ресурсов. Процент загрузки CPU, оперативной памяти и дискового пространства.

2. Метрики топиков и партиций

  • Размер логов. Общий объём данных в топике. Если он растет бесконтрольно, стоит пересмотреть политику очистки.
  • Количество сообщений. Скорость поступления данных. Резкие скачки могут указывать на пиковые нагрузки.
  • Смещение. Позиция последнего записанного сообщения и позиция, до которой дочитали потребители.

3. Метрики потребителей и производителей

  • Consumer Lag. Отставание потребителей от производителей. Например, если lag превышает 10 000 сообщений, это может означать, что потребители не успевают обрабатывать данные.
  • Producer Request Rate. Частота запросов от производителей. Падение этого показателя может сигнализировать о сбоях на стороне отправителей.
  • Fetch Latency. Время, необходимое потребителю для получения данных. Высокие значения указывают на проблемы с сетью или брокерами.
vds

Практическая настройка мониторинга для Kafka

Разберем настройку мониторинга для Kafka на практике.

Предварительные требования

Нам понадобится один сервер или одна виртуальная машина с любым предустановленным дистрибутивом Linux. В данной статье в качестве примера мы будем использовать дистрибутив Ubuntu версии 24.04.

Сервер должен соответствовать следующим требованиям:

  • Минимум 4 ГБ оперативной памяти. Данный объем подойдет только для настройки и тестового использования Apache Kafka и не предназначен для решения высокоресурсных задач. Для более серьезных задач необходимо минимум 8 ГБ оперативной памяти.

  • Минимум одноядерный процессор для базовой конфигурации. Для выполнения реальных задач (например, для работы с большим объемом данных, для работы с математическими и научными вычислениями) рекомендуется 4-ядерный процессор.

  • Наличие публичного IP-адреса, который можно арендовать на этапе создания сервера в разделе «Сеть».

Сервер можно создать в панели управления в разделе «Облачные серверы». В процессе рекомендуем выбрать регион с минимальным пингом для быстрой передачи данных. Остальные параметры можно оставить без изменений.

Сервер будет запущен через пару минут, и вы сможете найти IP-адрес, логин и пароль для подключения на Дашборде сервера.

Установка и запуск Apache Kafka

Для начала установим Kafka, используя следующие шаги:

1) Обновляем индекс репозиториев и устанавливаем пакет OpenJDK 11, который необходим для запуска Kafka:

apt update && apt -y install openjdk-11-jdk

2) Проверяем что Java была успешно установлена путем вывода ее версии:

java -version

Image35

Если в ответ команда вернула версию, то Java успешно установлена в системе.

3) Далее с помощью утилиты wget скачиваем архив с программой (используемая версия — 3.9.0):

wget https://downloads.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.tgz

4) Разархивируем скачанный архив при помощи команды:

tar -xvzf kafka_2.13-3.9.0.tgz

На выходе появится директория с именем kafka_2.13-3.9.0. Переместим ее в директорию /opt/kafka:

mv kafka_2.13-3.9.0 /opt/kafka

5) Далее для удобного управления Kafka создадим systemd-юниты. Начнем с Zookeeper. При помощи любого текстового редактора создаем файл zookeeper.service:

nano /etc/systemd/system/zookeeper.service

Используем следующее содержимое:

[Unit]
Description=Apache Zookeeper service
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
ExecStart=/opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties
ExecStop=/opt/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

Image36

Сохраняем изменения и выходим из файла.

Также создаем systemd-файл для kafka:

nano /etc/systemd/system/kafka.service

Содержимое будет следующим:

[Unit]
Description=Apache Kafka Service
Requires=zookeeper.service

[Service]
Type=simple
Environment="JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64"
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh

[Install]
WantedBy=multi-user.target

6) Перечитываем конфигурационные файлы демонов при помощи команды:

systemctl daemon-reload

7) Запускаем сначала Zookeeper:

systemctl start zookeeper

И проверяем его статус:

systemctl status zookeeper

Image26

В статусе должно отображаться active (running), что свидетельствует об успешном запуске Zookeeper.

Далее запускаем Kafka:

systemctl start kafka

И также проверяем статус:

systemctl status kafka

Image17

В статусе должно отображаться active (running), что свидетельствует об успешном запуске Kafka.

8) Дополнительно создадим отдельного пользователя, которого далее назначим владельцем всех файлов и директорий, используемых Kafka:

useradd -r -m -s /bin/false kafka

9) Задаем необходимые права:

chown -R kafka:kafka /opt/kafka

Тестирование установки

После того как оба сервиса — ZooKeeper и Kafka — были запущены, проверим работоспособность Kafka.

Все команды ниже необходимо выполнять из директории /opt/kafka. Перейти в нее можно так:

cd /opt/kafka

1) Создадим новый топик с именем new-topic1:

bin/kafka-topics.sh --create --topic new-topic1 --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

Image38

При успешном создании топика в терминале будет выведено сообщение «Created topic new-topic1».

2) Также выполним команду для вывода всех топиков в текущем инстансе Kafka:

bin/kafka-topics.sh --list --bootstrap-server localhost:9092

Image11

Ранее созданный топик с именем new-topic1 был успешно создан.

3) Далее проверим работоспособность производителя (Producer). Запускаем производителя при помощи команды:

bin/kafka-console-producer.sh --topic  new-topic1  --bootstrap-server localhost:9092

4) Отправим тестовое сообщение:

Hello from kafka!

Image21

5) Не закрывая текущую сессию SSH, открываем новую сессию и переходим в директорию /opt/kafka:

cd /opt/kafka

Запускаем потребителя (Consumer) при помощи команды:

bin/kafka-console-consumer.sh --topic new-topic1 --from-beginning --bootstrap-server localhost:9092

Image9

Если все работает правильно, то мы увидим ранее отправленное сообщение. 

Установка Prometheus

1) Создаем пользователя с именем prometheus:

useradd --no-create-home --shell /bin/false prometheus

2) Создаем директории, где будут храниться конфигурационные файлы Prometheus:

mkdir /etc/prometheus
mkdir /var/lib/prometheus

3) Назначаем владельцем директории /var/lib/prometheus пользователя prometheus:

chown prometheus:prometheus /var/lib/prometheus

4) Переходим в директорию /tmp:

cd /tmp/

И скачиваем архив с программой при помощи утилиты wget:

wget https://github.com/prometheus/prometheus/releases/download/v2.53.4/prometheus-2.53.4.linux-amd64.tar.gz

5) Разархивируем скачанный архив:

tar xvfz prometheus-2.53.4.linux-amd64.tar.gz

6) Переходим в появившуюся директорию:

cd prometheus-2.53.4.linux-amd64

7) Далее перемещаем директорию console конфигурационный файл prometheus.yml, бинарный файл Prometheus и конфигурационные файлы и назначаем для него владельца:

mv console* /etc/prometheus
mv prometheus.yml /etc/prometheus
mv prometheus /usr/local/bin/
chown -R prometheus:prometheus /etc/prometheus
chown prometheus:prometheus /usr/local/bin/prometheus

8) Дополнительно создаем systemd-юнит для Prometheus:

nano /etc/systemd/system/prometheus.service

Используем следующее содержимое:

[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

Image13

9) По умолчанию доступ до Prometheus разрешен только с localhost. Разрешим доступ со всех адресов. Для этого открываем на редактирование основной конфигурационный файл prometheus.yml при помощи любого текстового редактора:

nano /etc/prometheus/prometheus.yml

В конце файла находим параметр targets в опции static_configs:

Image12

И меняем значение localhost на внешний IP-адрес сервера (внешний IP-адрес у вас будет свой):

Image30

Сохраняем изменения и выходим из файла.

10) Запускаем Prometheus, добавляем его в автозагрузку и проверяем статус:

systemctl start prometheus && systemctl enable prometheus && systemctl status prometheus

Image22

В статусе должно отображаться active (running), что свидетельствует об успешном запуске Prometheus.

Перезапускаем демон systemd и prometheus и проверяем его статус:

systemctl daemon-reload && systemctl restart prometheus && systemctl status prometheus

Image8

Если в статусе отображается active (running), то Prometheus успешно запущен.

Переходим в браузере по IP-адресу сервера и порту 9090 (порт по умолчанию для Prometheus):

Image15

Должен открыться веб-интерфейс программы.

Установка Grafana

В связи с тем, что установить Grafana напрямую через официальный репозиторий из России нельзя, мы вручную добавим GPG ключ и воспользуемся репозиторием-зеркалом от Яндекса.

1) Создаем файл, в котором будет храниться GPG-ключ от репозитория Grafana:

nano grafana.key

И вставляем следующий ключ:

-----BEGIN PGP PUBLIC KEY BLOCK-----

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
=J9CI
-----END PGP PUBLIC KEY BLOCK-----

2) Создаем директорию, в которой будет храниться ключ от репозитория:

mkdir -p /etc/apt/keyrings/

3) Далее необходимо сконвертировать текстовый файл с ключом в поддерживаемый формат:

gpg --dearmor -o /etc/apt/keyrings/grafana.gpg grafana.key

4) Добавляем зеркало от Яндекса:

echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://mirror.yandex.ru/mirrors/packages.grafana.com/oss/deb stable main" | tee /etc/apt/sources.list.d/grafana.list

5) Обновляем индекс пакетов и устанавливаем Grafana:

apt update && apt -y install grafana

6) Запускаем сервис при помощи следующих команд:

systemctl daemon-reload && systemctl enable grafana-server && systemctl start grafana-server

И проверяем статус Grafana:

systemctl status grafana-server

Image1

Если в статусе отображается active (running), то Grafana успешно запущена. 

Используя IP-адрес сервера и порт 3000 (порт по умолчанию для Grafana), переходим в веб-интерфейс программы. Первоначальные логин и пароль для входа в веб-интерфейс — admin / admin. При первом входе система предложит задать новый пароль для пользователя admin:

Image7

После аутентификации откроется веб-интерфейс:

Image20

Установка JMX Exporter

JMX Exporter — это утилита, которая собирает и передает метрики из приложений, работающих на Java, в системы мониторинга, например в Prometheus. Для установки JMX Exporter необходимо выполнить следующие шаги:

1) Скачиваем утилиту из официального репозитория при помощи wget:

wget https://repo.maven.apache.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.20.0/jmx_prometheus_javaagent-0.20.0.jar

2) Перемещаем скаченный JAR-файл в директорию /opt/kafka/libs:

mv jmx_prometheus_javaagent-0.20.0.jar  /opt/kafka/libs/

3) Открываем на редактирование файл kafka-server-start.sh:

nano /opt/kafka/bin/kafka-server-start.sh

И добавляем следующие строки в самый конец файла:

KAFKA_OPTS="-javaagent:/opt/kafka/libs/jmx_prometheus_javaagent-0.20.0.jar=9091:/etc/prometheus/prometheus.yml"
KAFKA_OPTS="-javaagent:/opt/kafka/libs/jmx_prometheus_javaagent-0.20.0.jar=9091:/opt/kafka/config/sample_jmx_exporter.yml"

1b3a96cc 6ff9 4708 8faf 196033ba5de1

Сохраняем изменения и выходим из файла.

4) Перезапускаем Kafka при помощи команд:

systemctl daemon-reload && systemctl restart kafka

Настройка JMX Exporter

Произведем настройку JMX Exporter.

1) Переходим в директорию /opt/kafka/config:

cd /opt/kafka/config

2) Создаем файл sample_jmx_exporter.yml:

nano sample_jmx_exporter.yml

И используем следующее содержимое:

lowercaseOutputName: true

rules:
# Special cases and very specific rules
- pattern : kafka.server<type=(.+), name=(.+), clientId=(.+), topic=(.+), partition=(.*)><>Value
  name: kafka_server_$1_$2
  type: GAUGE
  labels:
    clientId: "$3"
    topic: "$4"
    partition: "$5"
- pattern : kafka.server<type=(.+), name=(.+), clientId=(.+), brokerHost=(.+), brokerPort=(.+)><>Value
  name: kafka_server_$1_$2
  type: GAUGE
  labels:
    clientId: "$3"
    broker: "$4:$5"
- pattern : kafka.coordinator.(\w+)<type=(.+), name=(.+)><>Value
  name: kafka_coordinator_$1_$2_$3
  type: GAUGE

# Generic per-second counters with 0-2 key/value pairs
- pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*, (.+)=(.+), (.+)=(.+)><>Count
  name: kafka_$1_$2_$3_total
  type: COUNTER
  labels:
    "$4": "$5"
    "$6": "$7"
- pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*, (.+)=(.+)><>Count
  name: kafka_$1_$2_$3_total
  type: COUNTER
  labels:
    "$4": "$5"
- pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*><>Count
  name: kafka_$1_$2_$3_total
  type: COUNTER

- pattern: kafka.server<type=(.+), client-id=(.+)><>([a-z-]+)
  name: kafka_server_quota_$3
  type: GAUGE
  labels:
    resource: "$1"
    clientId: "$2"

- pattern: kafka.server<type=(.+), user=(.+), client-id=(.+)><>([a-z-]+)
  name: kafka_server_quota_$4
  type: GAUGE
  labels:
    resource: "$1"
    user: "$2"
    clientId: "$3"

# Generic gauges with 0-2 key/value pairs
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+), (.+)=(.+)><>Value
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    "$4": "$5"
    "$6": "$7"
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+)><>Value
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    "$4": "$5"
- pattern: kafka.(\w+)<type=(.+), name=(.+)><>Value
  name: kafka_$1_$2_$3
  type: GAUGE

# Emulate Prometheus 'Summary' metrics for the exported 'Histogram's.
#
# Note that these are missing the '_sum' metric!
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+), (.+)=(.+)><>Count
  name: kafka_$1_$2_$3_count
  type: COUNTER
  labels:
    "$4": "$5"
    "$6": "$7"
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.*), (.+)=(.+)><>(\d+)thPercentile
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    "$4": "$5"
    "$6": "$7"
    quantile: "0.$8"
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+)><>Count
  name: kafka_$1_$2_$3_count
  type: COUNTER
  labels:
    "$4": "$5"
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.*)><>(\d+)thPercentile
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    "$4": "$5"
    quantile: "0.$6"
- pattern: kafka.(\w+)<type=(.+), name=(.+)><>Count
  name: kafka_$1_$2_$3_count
  type: COUNTER
- pattern: kafka.(\w+)<type=(.+), name=(.+)><>(\d+)thPercentile
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    quantile: "0.$4"

Сохраняем изменения и выходим из файла.

3) Далее открываем на редактирование основной конфигурационный файл Prometheus — prometheus.yml:

nano /etc/prometheus/prometheus.yml

Нам необходимо добавить endpoint Kafka, чтобы Prometheus смог собирать данные. Для этого в самом внизу добавляем следующий блок, где 103.88.242.227 — это внешний IP-адрес сервера (не забудьте поменять на свой внешний IP-адрес):

 - job_name: 'kafka'
    static_configs:
      - targets: ["103.88.242.227:9091"]

Image14

Сохраняем изменения и выходим из файла.

4) Перезапускаем Prometheus и проверяем его статус:

systemctl daemon-reload && systemctl restart prometheus && systemctl status prometheus

Image29

Настройка Kafka

Далее необходимо внести изменения при запуске Kafka, добавив путь до файлов Prometheus и JMX Exporter.

1) Открываем на редактирование systemd-файл Kafka:

nano /etc/systemd/system/kafka.service

И добавляем следующие строки в блок [Service]:

Environment="KAFKA_OPTS=-javaagent:/opt/kafka/libs/jmx_prometheus_javaagent-0.20.0.jar=9091:/etc/prometheus/prometheus.yml"
Environment="KAFKA_OPTS=-javaagent:/opt/kafka/libs/jmx_prometheus_javaagent-0.20.0.jar=9091:/opt/kafka/config/sample_jmx_exporter.yml"

F6a7512d 59fe 4011 B6e1 2de49fb83a2c

Сохраняем изменения и выходим из файла.

2) Перезапускаем Kafka и проверяем статус:

systemctl daemon-reload && systemctl restart kafka && systemctl status kafka

Image33

3) Переходим в веб-интерфейс Prometheus, далее в раздел «Status» и в выпадающем меню выбираем пункт «Targets»:

Image23

У нас появится новый источник данных Kafka:

Image28

Подключение метрик Prometheus к Grafana

Финальный этап заключается в добавление метрик из Prometheus в Grafana для построения визуализации с помощью графиков.

1) Переходим в веб-интерфейс Grafana. На панели слева выбираем меню «Connections», далее в выпадающем списке переходим в раздел «Data sources»:

Image24

2) В открывшемся разделе нажимаем на кнопку «Add data source»:

Image3

3) Далее выбираем Prometheus в качестве источника данных:

Image18

4) В качестве имени источника зададим Kafka (можно любое другое незанятое имя), а в качестве адреса укажем IP-адрес и порт, где расположен Prometheus:

Image27

5) Нажимаем на кнопку «Save & test»:

Image4

При успешном подключении к Prometheus будет выведено соответствующее сообщение:

Image6

Создание визуализации в Prometheus

После того как мы настроили мониторинг, самое время добавить dashboard для визуализации в Grafana.

1) На панели слева переходим в раздел «Dashboards»:

Image19

2) В открывшемся окне, нажимаем на кнопку «New» справа и в выпадающем меню выбираем «New dashboard»:

Image2

3) Далее переходим в раздел «Import dashboard»:

Image25

4) Используем номер 11962 графика, чтобы добавить его в Grafana, и нажимаем на кнопку «Load»:

Image31

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

Image16

Нажимаем на кнопку «Import».

Создание тестовой нагрузки

Добавленный график сейчас не отображает нагрузку. Сымитируем ее самостоятельно. 

1) На сервере переходим в директорию /opt/kafka:

cd /opt/kafka

2) Создаем новый топик с именем test-load:

bin/kafka-topics.sh --create --topic test-load --bootstrap-server localhost:9092 --partitions 4 --replication-factor 1

3) В Kafka имеется встроенный инструмент kafka-producer-perf-test.sh, который позволяет имитировать отправку сообщений производителем (producer). Запустим его для создания тестовой загрузки:

bin/kafka-producer-perf-test.sh --topic test-load --num-records 1000000 --record-size 100 --throughput -1 --producer-props bootstrap.servers=localhost:9092

Команда выше сгенерирует и отправит 1000000 сообщений.

4) Также создадим нагрузку путем обработки еще 1000000 сообщений потребителем (consumer):

bin/kafka-consumer-perf-test.sh --topic test-load --messages 1000000 --broker-list localhost:9092 --group test-group

5) Переходим в dashboard Grafana и мы можем наблюдать за графиками:

Image5

Разверните Kafka на собственном сервере

Заключение

Мониторинг Apache Kafka — это сложный и комплексный процесс, который требует максимального внимания к деталям. Процесс начинается со сбора метрик, который можно организовать при помощи современных инструменты вроде Prometheus и Grafana. После того как метрики будут настроены, необходимо регулярно проверять состояние кластера на наличие возможных проблем. Грамотный мониторинг обеспечит стабильность работы. Apache Kafka — это мощный инструмент, который раскроет свой потенциал только при правильной настройке и эксплуатации.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
22 апреля 2025 г.
18
20 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев