MQTT 브로커 모니터링: Prometheus와 Grafana 연동
Prometheus와 Grafana로 MQTT 브로커의 상태와 성능을 수집·시각화하는 구성 흐름, 설정 예시, 주요 매트릭 설명
목차
개요
IoT 환경에서 MQTT 브로커는 메시지 흐름의 중심이다. 브로커의 가용성과 성능을 모니터링하면 장애를 조기에 감지하고 서비스 품질을 유지할 수 있다. 이 글에서는 mqtt prometheus 모니터링을 위해 필요한 구성 요소와 설정 방식, Grafana에서 대시보드를 구성하는 방법을 단계별로 설명한다. 처음 접하는 사람도 이해하기 쉽도록 예제와 절차를 중심으로 정리한다.
필요한 구성 요소
- MQTT 브로커(예: Mosquitto, EMQX, VerneMQ)
- MQTT Exporter 또는 브로커 자체의 Prometheus 메트릭 엔드포인트
- Prometheus(메트릭 수집기)
- Grafana(시각화 및 대시보드)
- 옵션: Alertmanager(알림 전송)
모니터링 설계 원칙
설계는 단순하고 확장 가능해야 한다. 우선 브로커에서 노출 가능한 핵심 매트릭을 정의한다. 이후 Prometheus가 이를 주기적으로 스크랩하도록 설정한다. 마지막으로 Grafana에서 현실적인 대시보드를 만들어 운영자가 빠르게 상태를 파악하도록 한다.
주요 모니터링 대상 매트릭
- 연결 수(active_connections, client_count)
- 구독 수(subscriptions_total)
- 퍼블리시/구독 메시지 처리량(pub_in, pub_out, msg_rate)
- 큐 대기 및 레이턴시(delivery_latency, queue_length)
- 에러 및 재시도(alertable_errors, reconnects)
- 리소스 사용량(CPU, 메모리, 네트워크 I/O)
MQTT Exporter 설정
브로커가 자체적으로 Prometheus 메트릭을 노출하지 않는 경우 MQTT Exporter를 사용한다. 일부 브로커는 플러그인 형태로 메트릭을 제공하므로 환경에 맞는 방법을 선택한다. 아래는 간단한 docker-compose 예시로 Mosquitto와 mqtt-exporter를 함께 실행하는 구성이다.
version: '3.7'
services:
mosquitto:
image: eclipse-mosquitto:2
ports:
- 1883:1883
volumes:
- ./mosquitto.conf:/mosquitto/config/mosquitto.conf
mqtt-exporter:
image: prometheuscommunity/mqtt-exporter:latest
ports:
- 9300:9300
environment:
- MQTT_BROKER=mosquitto:1883
- SCRAPE_INTERVAL=15s
Prometheus 스크랩 설정
Prometheus는 exporter의 HTTP 엔드포인트를 스크랩한다. scrape_configs에 exporter 주소를 추가한다. 다음은 prometheus.yml의 예시 항목이다.
scrape_configs:
- job_name: 'mqtt_exporter'
static_configs:
- targets: ['mqtt-exporter:9300']
scrape_interval: 15s
AlertRule 예시
간단한 경고 규칙은 연결 수 급감, 메시지 처리 지연, 에러 증가 등을 감시한다. 아래 예시는 활성 연결 수가 임계값보다 낮을 때 경고를 발생시킨다.
groups:
- name: mqtt.rules
rules:
- alert: MQTTClientsDown
expr: mqtt_client_connected_count < 10
for: 5m
labels:
severity: critical
annotations:
summary: "MQTT 연결 수가 낮음"
description: "활성 MQTT 클라이언트 수가 5분 동안 10 미만"
Grafana에서 대시보드 구성
Grafana에서는 브로커의 상태를 한눈에 볼 수 있도록 패널을 구성한다. 추천 패널은 다음과 같다.
- 총 연결 수(타임라인)
- 메시지 입출력률(RPS)
- 지연(latency) 히스토그램
- 에러 비율 및 알림 패널
- 리소스 사용량(CPU/Memory)
Grafana의 Explore에서 Prometheus 쿼리를 작성해 패널을 만들면 된다. 예를 들어 메시지 처리율은 다음과 같은 쿼리로 표현할 수 있다.
rate(mqtt_messages_total[1m])
실제 운영에서 고려할 점
- 스케일: 브로커 수가 늘어나면 exporter와 Prometheus의 스크랩 부하를 고려한다.
- 보안: exporter와 Prometheus 접근을 내부 네트워크나 인증으로 제한한다.
- 레텐션: Prometheus의 데이터 보존 기간을 운영 목적에 따라 조정한다.
- 대시보드 가독성: 운영자는 핵심 지표를 한 화면에서 바로 확인할 수 있어야 한다.
문제 해결 팁
스크랩이 되지 않을 때는 네트워크, 방화벽, 포트 매핑을 먼저 확인한다. 수치가 이상할 때는 브로커 로그와 exporter 로그를 통해 원인을 좁힌다. 또한 Prometheus의 대상 페이지(/targets)에서 상태를 확인하면 원인 파악에 도움이 된다.
요약
mqtt prometheus 모니터링과 grafana mqtt 대시보드 구성을 통해 브로커의 상태를 실시간으로 관찰할 수 있다. 구성 요소는 단순하다. 브로커, exporter, Prometheus, Grafana를 차례로 준비하고 핵심 매트릭을 정의한 다음 시각화와 알림을 설정하면 운영 효율이 크게 개선된다.
참고 예제 모음
다음은 주요 구성 파일의 핵심만을 모아둔 예시다. 운영 환경에 맞춰 경로와 옵션을 조정한다.
# prometheus.yml (요약)
scrape_configs:
- job_name: 'mqtt_exporter'
static_configs:
- targets: ['mqtt-exporter:9300']
scrape_interval: 15s
# 간단한 alert rule 예
groups:
- name: mqtt.rules
rules:
- alert: MQTTClientsDown
expr: mqtt_client_connected_count < 10
for: 5m