<p class="wp-block-paragraph">Camunda 8 имеет кардинально отличающуюся от 7-й версии архитектуру. Движок (Zeebe) написан на Quarkus, а компоненты Operate, Tasklist и Connectors работают на Spring Boot. Это создает сложности при настройке единого конвейера сбора метрик, так как разные компоненты используют разные механизмы и пути для их отдачи.</p>
<p class="wp-block-paragraph">В данной статье описан пошаговый процесс интеграции Camunda 8.4+ с Prometheus и Grafana, а также разобраны типичные ошибки, с которыми сталкиваются инженеры при настройке мониторинга на production-окружении.</p>
<h2 class="wp-block-heading">Архитектура решения</h2>
<p class="wp-block-paragraph">Мониторинг строится по классической схеме: Prometheus опрашивает (scrape) эндпоинты Camunda, агрегирует данные и выступает источником данных (Data Source) для Grafana, где отображаются дашборды и срабатывают алерты.</p>
<p class="wp-block-paragraph">Особенность заключается в разделении портов и путей:</p>
<ul class="wp-block-list">
<li><strong>Zeebe Broker</strong> отдает бизнес-метрики и метрики здоровья кластера.</li>
<li><strong>Spring Boot компоненты</strong> (Operate, Tasklist, Connectors) отдают метрики через Spring Actuator.</li>
</ul>
<h2 class="wp-block-heading">Шаг 1: Включение экспорта метрик в Camunda</h2>
<p class="wp-block-paragraph">По умолчанию экспорт метрик в Camunda 8 отключен. Необходимо добавить переменные окружения в <code>docker-compose.yml</code> на сервере Camunda.</p>
<p class="wp-block-paragraph"><strong>Для Zeebe Broker:</strong> Включает встроенный Prometheus экспортер на порту 9600 (порт мониторинга Zeebe).</p>
<pre class="wp-block-code"><code>zeebe:<br>environment:<br>- ZEEBE_BROKER_EXPORTERS_PROMETHEUS_ENABLED=true</code></pre>
<p class="wp-block-paragraph"><strong>Для Operate, Tasklist, Connectors:</strong> Включает Spring Boot Actuator для Prometheus на внутренних портах 8080.</p>
<pre class="wp-block-code"><code>operate:<br>environment:<br>- MANAGEMENT_PROMETHEUS_METRICS_EXPORT_ENABLED=true</code></pre>
<pre class="wp-block-code"><code>tasklist:<br>environment:<br>- MANAGEMENT_PROMETHEUS_METRICS_EXPORT_ENABLED=true</code></pre>
<pre class="wp-block-code"><code>connectors:<br>environment:<br>- MANAGEMENT_PROMETHEUS_METRICS_EXPORT_ENABLED=true</code></pre>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Важно для Production:</strong> Добавление переменных требует перезапуска контейнеров. Рекомендуется выполнять плавающий рестарт (<code>docker-compose up -d --force-recreate <service_name></code>), начиная с Zeebe, чтобы минимизировать даунтайм.</p>
</blockquote>
<h2 class="wp-block-heading">Шаг 2: Настройка Prometheus</h2>
<p class="wp-block-paragraph">На сервере мониторинга (где установлен Prometheus) необходимо сконфигурировать файл <code>prometheus.yml</code>.</p>
<p class="wp-block-paragraph">Ключевой момент: для Zeebe используется путь <code>/metrics</code>, а для Spring Boot компонентов — <code>/actuator/prometheus</code>.</p>
<p class="wp-block-paragraph">global:<br>scrape_interval: 15s</p>
<p class="wp-block-paragraph">scrape_configs:<br># Zeebe Broker (порт 9600)</p>
<ul class="wp-block-list">
<li>job_name: ‘zeebe’<br>metrics_path: ‘/metrics’<br>static_configs:<ul><li>targets: [‘IP_CAMUNDA:9600’]</li></ul>Operate (внешний порт 8081)</li>
<li>job_name: ‘operate’<br>metrics_path: ‘/actuator/prometheus’<br>static_configs:<ul><li>targets: [‘IP_CAMUNDA:8081’]</li></ul>Tasklist (внешний порт 8082)</li>
<li>job_name: ‘tasklist’<br>metrics_path: ‘/actuator/prometheus’<br>static_configs:<ul><li>targets: [‘IP_CAMUNDA:8082’]</li></ul>Connectors (внешний порт 8085)</li>
<li>job_name: ‘connectors’<br>metrics_path: ‘/actuator/prometheus’<br>static_configs:
<ul class="wp-block-list">
<li>targets: [‘IP_CAMUNDA:8085’]</li>
</ul>
</li>
</ul>
<h2 class="wp-block-heading">Шаг 3: Настройка Grafana и алертов</h2>
<ol start="1" class="wp-block-list">
<li>В Grafana добавьте Data Source типа Prometheus (URL: <code>http://prometheus:9090</code>).</li>
<li>Импортируйте дашборд. Из-за несовпадения ID на grafana.com, надежнее импортировать дашборд через JSON-модель.</li>
<li>Настройте базовые алерты (см. таблицу рекомендуемых алертов ниже).</li>
</ol>
<h3 class="wp-block-heading">Рекомендуемые алерты для Camunda 8</h3>
<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Название алерта</th><th>PromQL выражение</th><th>Порог / Условие</th><th>Описание проблемы</th></tr></thead><tbody><tr><td><strong>Zeebe Service Down</strong></td><td><code>up{job="zeebe"} == 0</code></td><td>Состояние = 0 на протяжении 2 мин</td><td>Prometheus не может достучаться до Zeebe Broker. Упал сервис или сеть.</td></tr><tr><td><strong>Incidents Growing</strong></td><td><code>sum(rate(zeebe_incident_events_total{action="created"}[5m])) > 0</code></td><td>Больше 0 на протяжении 5 мин</td><td>В процессах возникают ошибки (инциденты), требующие ручного вмешательства.</td></tr><tr><td><strong>ES Export Latency High</strong></td><td><code>histogram_quantile(0.95, sum(rate(zeebe_elasticsearch_exporter_flush_latency_seconds_bucket[5m])) by (le)) > 1</code></td><td>Больше 1 секунды на протяжении 5 мин</td><td>ElasticSearch не справляется с нагрузкой. Zeebe начнет тормозить.</td></tr><tr><td><strong>Job Processing Backlog</strong></td><td><code>rate(zeebe_job_events_total{action="created"}[5m]) > rate(zeebe_job_events_total{action="completed"}[5m]) * 2</code></td><td>Условие истинно 10 мин</td><td>Задачи создаются быстрее, чем воркеры их обрабатывают.</td></tr></tbody></table></figure>
<h2 class="wp-block-heading">Возможные ошибки и их решения (Troubleshooting)</h2>
<p class="wp-block-paragraph">В процессе интеграции на Production-окружении могут возникать следующие ошибки.</p>
<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Ошибка / Симптом</th><th>Причина</th><th>Решение</th></tr></thead><tbody><tr><td><strong><code>HTTP status 404</code> при запросе на <code>IP:9600/metrics</code></strong></td><td>По умолчанию порт 9600 слушает Zeebe Gateway (Spring Boot обертка), а не Broker. У обертки выключен Actuator, а встроенный экспортер Broker не активирован.</td><td>Добавить переменную <code>ZEEBE_BROKER_EXPORTERS_PROMETHEUS_ENABLED=true</code> в <code>docker-compose.yml</code> и перезапустить Zeebe.</td></tr><tr><td><strong><code>HTTP status 404</code> при запросе на <code>IP:8081/metrics</code> (Operate/Tasklist)</strong></td><td>Spring Boot компоненты не отдают метрики по пути <code>/metrics</code>.</td><td>Изменить путь скрейпинга в <code>prometheus.yml</code> с <code>/metrics</code> на <code>/actuator/prometheus</code>.</td></tr><tr><td><strong>Prometheus показывает статус <code>0</code> (Down) в Targets, но curl с сервера Grafana работает</strong></td><td>1. IPv6 глюк Linux (Prometheus стучится по IPv6, Docker отбрасывает).<br>2. Фаервол блокирует запросы от демона Prometheus, но пропускает ручные curl.</td><td>1. Указать в <code>prometheus.yml</code> цель в виде IP-адреса без DNS-разрешения.<br>2. Проверить <code>ufw</code> / <code>iptables</code> на сервере Camunda, разрешить входящие соединения с IP Prometheus на порты 9600, 8081, 8082, 8085.</td></tr><tr><td><strong>Переменные окружения добавлены в <code>docker-compose.yml</code>, но изменений нет</strong></td><td>Docker Compose не пересоздает контейнеры, если не изменился образ (image).</td><td>Использовать флаг принудительного пересоздания: <code>docker-compose up -d --force-recreate <service_name></code>.</td></tr><tr><td><strong><code>context deadline exceeded</code> в Prometheus Targets</strong></td><td>Zeebe отдает слишком большой объем метрик (мегабайты), и Prometheus не успевает скачать их за дефолтный таймаут (10 сек).</td><td>Увеличить <code>scrape_timeout</code> в <code>prometheus.yml</code> для job <code>zeebe</code> (например, до 20с), при этом <code>scrape_interval</code> должен быть больше таймаута.</td></tr><tr><td><strong>Дашборд импортирован, но графики пустые (No Data)</strong></td><td>В импортированном JSON дашборда не сопоставлена переменная Data Source с реальным Prometheus.</td><td>Зайти в Settings -> Variables дашборда, раскрыть переменную <code>DS_PROMETHEUS</code> и из выпадающего списка выбрать ваш созданный Data Source.</td></tr></tbody></table></figure>
Camunda 8 имеет кардинально отличающуюся от 7-й версии архитектуру. Движок (Zeebe) написан на Quarkus, а компоненты Operate, Tasklist и Connectors работают на Spring Boot. Это создает сложности при настройке единого конвейера сбора метрик, так как разные компоненты используют разные механизмы и пути для их отдачи.
В данной статье описан пошаговый процесс интеграции Camunda 8.4+ с Prometheus и Grafana, а также разобраны типичные ошибки, с которыми сталкиваются инженеры при настройке мониторинга на production-окружении.
Архитектура решения
Мониторинг строится по классической схеме: Prometheus опрашивает (scrape) эндпоинты Camunda, агрегирует данные и выступает источником данных (Data Source) для Grafana, где отображаются дашборды и срабатывают алерты.
Особенность заключается в разделении портов и путей:
Zeebe Broker отдает бизнес-метрики и метрики здоровья кластера.
Spring Boot компоненты (Operate, Tasklist, Connectors) отдают метрики через Spring Actuator.
Шаг 1: Включение экспорта метрик в Camunda
По умолчанию экспорт метрик в Camunda 8 отключен. Необходимо добавить переменные окружения в docker-compose.yml на сервере Camunda.
Для Zeebe Broker: Включает встроенный Prometheus экспортер на порту 9600 (порт мониторинга Zeebe).
Важно для Production: Добавление переменных требует перезапуска контейнеров. Рекомендуется выполнять плавающий рестарт (docker-compose up -d --force-recreate <service_name>), начиная с Zeebe, чтобы минимизировать даунтайм.
Шаг 2: Настройка Prometheus
На сервере мониторинга (где установлен Prometheus) необходимо сконфигурировать файл prometheus.yml.
Ключевой момент: для Zeebe используется путь /metrics, а для Spring Boot компонентов — /actuator/prometheus.
Задачи создаются быстрее, чем воркеры их обрабатывают.
Возможные ошибки и их решения (Troubleshooting)
В процессе интеграции на Production-окружении могут возникать следующие ошибки.
Ошибка / Симптом
Причина
Решение
HTTP status 404 при запросе на IP:9600/metrics
По умолчанию порт 9600 слушает Zeebe Gateway (Spring Boot обертка), а не Broker. У обертки выключен Actuator, а встроенный экспортер Broker не активирован.
Добавить переменную ZEEBE_BROKER_EXPORTERS_PROMETHEUS_ENABLED=true в docker-compose.yml и перезапустить Zeebe.
HTTP status 404 при запросе на IP:8081/metrics (Operate/Tasklist)
Spring Boot компоненты не отдают метрики по пути /metrics.
Изменить путь скрейпинга в prometheus.yml с /metrics на /actuator/prometheus.
Prometheus показывает статус 0 (Down) в Targets, но curl с сервера Grafana работает
1. IPv6 глюк Linux (Prometheus стучится по IPv6, Docker отбрасывает). 2. Фаервол блокирует запросы от демона Prometheus, но пропускает ручные curl.
1. Указать в prometheus.yml цель в виде IP-адреса без DNS-разрешения. 2. Проверить ufw / iptables на сервере Camunda, разрешить входящие соединения с IP Prometheus на порты 9600, 8081, 8082, 8085.
Переменные окружения добавлены в docker-compose.yml, но изменений нет
Docker Compose не пересоздает контейнеры, если не изменился образ (image).
Использовать флаг принудительного пересоздания: docker-compose up -d --force-recreate <service_name>.
context deadline exceeded в Prometheus Targets
Zeebe отдает слишком большой объем метрик (мегабайты), и Prometheus не успевает скачать их за дефолтный таймаут (10 сек).
Увеличить scrape_timeout в prometheus.yml для job zeebe (например, до 20с), при этом scrape_interval должен быть больше таймаута.
Дашборд импортирован, но графики пустые (No Data)
В импортированном JSON дашборда не сопоставлена переменная Data Source с реальным Prometheus.
Зайти в Settings -> Variables дашборда, раскрыть переменную DS_PROMETHEUS и из выпадающего списка выбрать ваш созданный Data Source.