Protokol IoT

Prometheus & Grafana: Monitoring Infrastructure

TOKEN

Tutorial komprehensif Prometheus dan Grafana dari arsitektur, instalasi, tipe metrik, PromQL, integrasi Grafana, alerting rules, Node Exporter, hingga monitoring metrik IoT

1. Apa itu Prometheus?

Prometheus adalah sistem monitoring dan alerting open-source yang awalnya dikembangkan oleh SoundCloud pada tahun 2012 dan sekarang menjadi proyek di bawah Cloud Native Computing Foundation (CNCF). Prometheus menjadi standar de facto untuk monitoring di ekosistem cloud-native dan container (Kubernetes, Docker).

Dalam konteks IoT, Prometheus sangat berguna untuk memantau kesehatan server, broker MQTT, gateway, dan bahkan data sensor dari perangkat embedded. Dikombinasikan dengan Grafana untuk visualisasi, duo ini menjadi stack monitoring yang sangat powerful.

Diagram: Stack Monitoring IoT dengan Prometheus + Grafana
📡
Targets
Server, Broker MQTT,
Gateway, ESP32
→ Scrape
🔥
Prometheus
Mengambil metrik secara
berkala (pull model)
→ Query
📊
Grafana
Visualisasi & dashboard
real-time

Fitur Utama Prometheus

💡 Mengapa Pull Model?

Prometheus menggunakan pull model (mengambil data) alih-alih push model (menerima data). Kelebihannya: Prometheus yang mengontrol kapan dan seberapa sering data diambil, sehingga lebih mudah dikelola. Push model (seperti InfluxDB) cocok untuk short-lived jobs yang tidak bisa menunggu di-scrape. Prometheus mendukung keduanya melalui Pushgateway.

2. Arsitektur Prometheus

Arsitektur Prometheus terdiri dari beberapa komponen utama yang bekerja sama:

2.1 Komponen Inti

2.2 Alur Kerja

Alur Kerja Prometheus
# === Alur Kerja Monitoring ===

# 1. Target (server, broker, ESP32) mengekspos metrik
#    di endpoint HTTP: http://target:9100/metrics

# 2. Prometheus Server melakukan SCRAPE setiap N detik
#    Mengambil metrik dari semua target yang dikonfigurasi

# 3. Metrik disimpan di Time Series Database (lokal)

# 4. User membuat QUERY menggunakan PromQL
#    Contoh: rate(http_requests_total[5m])

# 5. GRAFANA mengambil data dari Prometheus dan menampilkan
#    dalam bentuk grafik, tabel, dan dashboard

# 6. ALERT RULES mengevaluasi metrik secara periodik
#    Jika kondisi terpenuhi → kirim ke Alertmanager

# 7. ALERTMANAGER mengirim notifikasi
#    Email, Slack, Telegram, PagerDuty, webhook, dll.

2.3 Format Metrik Prometheus

Metrik Prometheus menggunakan format teks sederhana:

Format Metrik Prometheus
# === Format: metric_name{label="value"} timestamp value ===

# Contoh metrik dari Node Exporter
node_cpu_seconds_total{cpu="0",mode="idle"} 1.23456789e+06
node_cpu_seconds_total{cpu="0",mode="user"} 56789.123
node_memory_MemAvailable_bytes 4.294967296e+09
node_filesystem_avail_bytes{mountpoint="/",device="/dev/sda1"} 5.0e+10

# Contoh metrik dari HTTP server
http_requests_total{method="GET",handler="/api/sensor",status="200"} 12345
http_requests_total{method="POST",handler="/api/sensor",status="201"} 678

# Contoh metrik custom IoT
iot_sensor_temperature_celsius{device="esp32-001",room="ruang_tamu"} 28.5
iot_sensor_humidity_percent{device="esp32-001",room="ruang_tamu"} 65.2
iot_device_uptime_seconds{device="esp32-001"} 86400
iot_messages_received_total{topic="rumah/suhu"} 45678

3. Instalasi Prometheus

3.1 Instalasi Manual (Binary)

Terminal — Instalasi Prometheus di Linux
# Download Prometheus terbaru
PROM_VERSION="2.52.0"
wget https://github.com/prometheus/prometheus/releases/download/v${PROM_VERSION}/prometheus-${PROM_VERSION}.linux-amd64.tar.gz

# Extract
tar xvfz prometheus-${PROM_VERSION}.linux-amd64.tar.gz
cd prometheus-${PROM_VERSION}.linux-amd64/

# Buat direktori
sudo mkdir -p /etc/prometheus /var/lib/prometheus

# Copy binary dan konfigurasi
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo cp prometheus.yml /etc/prometheus/

# Buat user dan set permissions
sudo useradd --no-create-home --shell /bin/false prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

# Verifikasi
prometheus --version

3.2 Konfigurasi Dasar

prometheus.yml — Konfigurasi
# /etc/prometheus/prometheus.yml
# Konfigurasi dasar Prometheus

global:
  scrape_interval: 15s      # Scrape setiap 15 detik (default)
  evaluation_interval: 15s  # Evaluasi alert rules setiap 15 detik
  scrape_timeout: 10s       # Timeout untuk setiap scrape

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - 'localhost:9093'

# Rules files
rule_files:
  - "alert_rules.yml"
  - "recording_rules.yml"

# Scrape targets
scrape_configs:
  # Monitor Prometheus sendiri
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # Monitor Node Exporter (server)
  - job_name: 'node-exporter'
    static_configs:
      - targets:
          - '192.168.1.100:9100'   # Server utama
          - '192.168.1.101:9100'   # Server backup
          - '192.168.1.102:9100'   # Gateway IoT

  # Monitor MQTT Broker (Mosquitto exporter)
  - job_name: 'mqtt-broker'
    static_configs:
      - targets: ['192.168.1.100:9234']

  # Monitor custom IoT metrics
  - job_name: 'iot-gateway'
    scrape_interval: 5s     # Scrape lebih sering untuk IoT
    static_configs:
      - targets: ['192.168.1.50:8000']
        labels:
          environment: 'production'
          location: 'rumah'

3.3 Instalasi dengan Docker

Docker Compose — Prometheus + Grafana
# docker-compose.yml
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    ports:
      - "9100:9100"
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

# Jalankan:
# docker-compose up -d

# Akses:
# Prometheus: http://localhost:9090
# Grafana: http://localhost:3000 (admin/admin123)
Output terminal: $ docker-compose up -d Creating prometheus ... done Creating grafana ... done Creating node-exporter ... done $ docker ps CONTAINER ID IMAGE STATUS PORTS a1b2c3d4e5f6 prom/prometheus:latest Up 2 minutes 0.0.0.0:9090->9090/tcp f6e5d4c3b2a1 grafana/grafana:latest Up 2 minutes 0.0.0.0:3000->3000/tcp b2a1f6e5d4c3 prom/node-exporter:latest Up 2 minutes 0.0.0.0:9100->9100/tcp

4. Tipe-Tipe Metrik

Prometheus mendefinisikan empat tipe metrik dasar yang masing-masing memiliki karakteristik dan penggunaan yang berbeda:

📊
Counter
  • Nilai hanya bisa naik (atau reset ke 0)
  • Cocok untuk menghitung jumlah kejadian
  • Contoh: total request, total error, total pesan MQTT
  • Tidak bisa turun (selain reset)
📏
Gauge
  • Nilai bisa naik dan turun
  • Cocok untuk pengukuran saat ini
  • Contoh: suhu, kelembaban, RAM usage, CPU %
  • Tidak cocok untuk menghitung total
📉
Histogram
  • Mengelompokkan nilai dalam bucket
  • Menghitung persentil (percentile)
  • Contoh: durasi request, ukuran respons
  • Menggunakan lebih banyak memori
📐
Summary
  • Menghitung persentil di sisi client
  • Lebih akurat untuk percentile
  • Contoh: request latency quantile
  • Tidak bisa di-agregasi antar instance

4.1 Contoh Penggunaan di Kode

Python — Custom Metrics dengan prometheus_client
# app.py — Custom IoT Metrics dengan Prometheus
# pip install prometheus_client flask

from prometheus_client import Counter, Gauge, Histogram, generate_latest
from flask import Flask, Response
import random
import time

app = Flask(__name__)

# === Counter: menghitung total pesan MQTT yang diterima ===
mqtt_messages_total = Counter(
    'iot_mqtt_messages_total',
    'Total pesan MQTT yang diterima',
    ['topic', 'device']  # Label
)

# === Gauge: menyimpan nilai sensor terkini ===
sensor_temperature = Gauge(
    'iot_sensor_temperature_celsius',
    'Suhu sensor saat ini dalam Celsius',
    ['device', 'room']
)

sensor_humidity = Gauge(
    'iot_sensor_humidity_percent',
    'Kelembaban sensor saat ini dalam persen',
    ['device', 'room']
)

# === Histogram: distribusi waktu pemrosesan pesan ===
message_processing_time = Histogram(
    'iot_message_processing_seconds',
    'Waktu pemrosesan pesan MQTT',
    ['topic'],
    buckets=[0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0]
)

# Endpoint untuk Prometheus scrape
@app.route('/metrics')
def metrics():
    return Response(generate_latest(), mimetype='text/plain')

# Simulasi menerima data sensor
@app.route('/api/sensor', methods=['POST'])
def receive_sensor():
    start = time.time()

    # Simulasi data
    device = "esp32-001"
    room = "ruang_tamu"
    suhu = round(random.uniform(25, 35), 1)
    kelembaban = round(random.uniform(40, 80), 1)

    # Update metrik
    mqtt_messages_total.labels(topic="rumah/suhu", device=device).inc()
    sensor_temperature.labels(device=device, room=room).set(suhu)
    sensor_humidity.labels(device=device, room=room).set(kelembaban)

    # Catat waktu pemrosesan
    duration = time.time() - start
    message_processing_time.labels(topic="rumah/suhu").observe(duration)

    return {"suhu": suhu, "kelembaban": kelembaban}

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

5. PromQL (Prometheus Query Language)

PromQL adalah bahasa query yang powerful untuk memilih dan memproses deret waktu (time series) di Prometheus. PromQL mendukung operasi matematika, fungsi agregasi, dan filtering.

5.1 Selector Dasar

PromQL — Selector dan Filter
# === Selector Dasar ===

# Ambil semua nilai metrik
node_cpu_seconds_total

# Filter berdasarkan label
node_cpu_seconds_total{mode="idle"}

# Filter dengan regex
node_cpu_seconds_total{mode=~"user|system"}

# Kecualikan label tertentu
node_cpu_seconds_total{mode!="idle"}

# Filter berdasarkan nama metrik
{__name__=~"node_.*"}

# === Instant Vector (nilai saat ini) ===
# Mengembalikan satu nilai terakhir untuk setiap time series
node_memory_MemAvailable_bytes

# === Range Vector (nilai dalam rentang waktu) ===
# Mengembalikan kumpulan nilai dalam periode waktu
http_requests_total[5m]          # 5 menit terakhir
node_cpu_seconds_total[1h]       # 1 jam terakhir
iot_sensor_temperature[15m]      # 15 menit terakhir

5.2 Fungsi dan Agregasi

PromQL — Fungsi dan Agregasi
# === Rate & Increase (untuk Counter) ===

# Rate: rata-rata per detik dalam 5 menit terakhir
rate(http_requests_total[5m])

# Increase: total penambahan dalam 1 jam
increase(http_requests_total[1h])

# === Agregasi ===

# Sum total request semua instance
sum(rate(http_requests_total[5m]))

# Rata-rata suhu semua device
avg(iot_sensor_temperature_celsius)

# Suhu maksimum
max(iot_sensor_temperature_celsius)

# Suhu minimum per room
min by(room) (iot_sensor_temperature_celsius)

# Jumlah device unik
count(iot_sensor_temperature_celsius)

# Top 5 suhu tertinggi
topk(5, iot_sensor_temperature_celsius)

# === Matematika ===

# Konversi byte ke GB
node_memory_MemTotal_bytes / 1024 / 1024 / 1024

# Persentase penggunaan CPU
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100

# Persentase penggunaan memori
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# Suhu dalam Fahrenheit
iot_sensor_temperature_celsius * 9/5 + 32

# === Fungsi Waktu ===

# Data dari 1 jam yang lalu
iot_sensor_temperature_celsius offset 1h

# Perbandingan sekarang vs 1 hari lalu
iot_sensor_temperature_celsius - iot_sensor_temperature_celsius offset 1d

# === Predict (prediksi linear) ===

# Prediksi disk penuh dalam 4 jam ke dejang
predict_linear(node_filesystem_avail_bytes[6h], 4*3600)
💡 Tips PromQL

Gunakan Prometheus UI (http://localhost:9090/graph) untuk bereksperimen dengan PromQL. UI memiliki fitur auto-complete dan grafik bawaan yang sangat membantu untuk memvalidasi query. Setelah query benar, salin ke Grafana untuk visualisasi yang lebih indah.

6. Integrasi dengan Grafana

Grafana adalah platform visualisasi dan analytics open-source yang mendukung berbagai sumber data termasuk Prometheus. Grafana menyediakan dashboard interaktif yang memudahkan monitoring.

6.1 Menambahkan Prometheus sebagai Data Source

  1. Buka Grafana di http://localhost:3000 (default: admin/admin)
  2. Klik ⚙️ Configuration → Data Sources
  3. Klik "Add data source"
  4. Pilih "Prometheus"
  5. Isi URL: http://prometheus:9090 (atau http://localhost:9090)
  6. Klik "Save & Test" — harus muncul "Data source is working"

6.2 Membuat Dashboard

Contoh Query PromQL untuk Grafana Dashboard
# === Panel 1: CPU Usage (%) ===
# Query:
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100
# Grafik: Time Series, unit: percent (0-100)

# === Panel 2: Memory Usage (%) ===
# Query:
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# Grafik: Gauge, unit: percent

# === Panel 3: Disk Usage (%) ===
# Query:
(1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100
# Grafik: Gauge, threshold: warn=80%, crit=90%

# === Panel 4: Network Traffic ===
# Query (RX):
rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8
# Query (TX):
rate(node_network_transmit_bytes_total{device="eth0"}[5m]) * 8
# Grafik: Time Series, unit: bits/sec

# === Panel 5: IoT Sensor Temperature ===
# Query:
iot_sensor_temperature_celsius
# Grafik: Time Series, unit: celsius

# === Panel 6: MQTT Messages Rate ===
# Query:
sum(rate(iot_mqtt_messages_total[5m])) by(topic)
# Grafik: Time Series, unit: msg/sec

# === Panel 7: HTTP Request Rate ===
# Query:
sum(rate(http_requests_total[5m])) by(handler, status)
# Grafik: Stacked Area, unit: req/sec

6.3 Template Variables

Grafana mendukung template variables yang membuat dashboard lebih fleksibel:

Grafana Template Variables
# === Variabel: $device ===
# Type: Query
# Query: label_values(iot_sensor_temperature_celsius, device)
# Result: [esp32-001, esp32-002, esp32-003]

# === Variabel: $room ===
# Type: Query
# Query: label_values(iot_sensor_temperature_celsius{device="$device"}, room)
# Result: [ruang_tamu, kamar_tidur, dapur]

# === Penggunaan dalam query ===
iot_sensor_temperature_celsius{device="$device", room="$room"}

# User bisa memilih device dan room dari dropdown di dashboard
# sehingga satu dashboard bisa memantau semua device

7. Alerting Rules

Prometheus mendukung alerting rules yang secara otomatis mengevaluasi kondisi metrik dan mengirim peringatan ke Alertmanager jika kondisi terpenuhi.

7.1 Mendefinisikan Alert Rules

alert_rules.yml — Aturan Peringatan
# /etc/prometheus/alert_rules.yml

groups:
  - name: server_alerts
    rules:
      # Alert: CPU usage > 80% selama 5 menit
      - alert: HighCpuUsage
        expr: (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU usage tinggi pada {{ $labels.instance }}"
          description: "CPU usage {{ $value | printf \"%.1f\" }}% selama 5 menit terakhir."

      # Alert: Memory usage > 90%
      - alert: HighMemoryUsage
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Memory hampir penuh pada {{ $labels.instance }}"
          description: "Memory usage {{ $value | printf \"%.1f\" }}%."

      # Alert: Disk akan penuh dalam 24 jam
      - alert: DiskWillFillIn24h
        expr: predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 24*3600) < 0
        for: 30m
        labels:
          severity: critical
        annotations:
          summary: "Disk akan penuh dalam 24 jam pada {{ $labels.instance }}"

  - name: iot_alerts
    rules:
      # Alert: Suhu sensor terlalu tinggi
      - alert: HighTemperature
        expr: iot_sensor_temperature_celsius > 40
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Suhu tinggi terdeteksi!"
          description: "Device {{ $labels.device }} di {{ $labels.room }}: {{ $value }}°C"

      # Alert: Device IoT offline (tidak ada metrik selama 1 menit)
      - alert: IoTDeviceOffline
        expr: up{job="iot-gateway"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Device IoT offline!"
          description: "Target {{ $labels.instance }} tidak merespons scrape."

      # Alert: MQTT broker down
      - alert: MQTTBrokerDown
        expr: up{job="mqtt-broker"} == 0
        for: 30s
        labels:
          severity: critical
        annotations:
          summary: "MQTT Broker tidak merespons!"

      # Alert: Rate pesan MQTT turun drastis
      - alert: LowMQTTMessageRate
        expr: sum(rate(iot_mqtt_messages_total[5m])) < 0.1
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "Rate pesan MQTT sangat rendah"
          description: "Kemungkinan device berhenti mengirim data."

7.2 Konfigurasi Alertmanager

alertmanager.yml — Konfigurasi Notifikasi
# /etc/alertmanager/alertmanager.yml

global:
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'alert@beebanelabs.com'
  smtp_auth_username: 'alert@beebanelabs.com'
  smtp_auth_password: 'app-password-here'

route:
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default-receiver'

  routes:
    - match:
        severity: critical
      receiver: 'critical-receiver'
      repeat_interval: 15m

receivers:
  - name: 'default-receiver'
    email_configs:
      - to: 'admin@beebanelabs.com'
        subject: '[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }}'

  - name: 'critical-receiver'
    email_configs:
      - to: 'admin@beebanelabs.com'
    webhook_configs:
      - url: 'http://localhost:5001/webhook/telegram'

8. Node Exporter & Metrik IoT

Node Exporter adalah exporter resmi Prometheus yang mengekspos metrik sistem operasi (CPU, memori, disk, jaringan) dari server Linux. Untuk IoT, kita juga bisa membuat custom exporter untuk perangkat embedded.

8.1 Instalasi Node Exporter

Terminal — Instalasi Node Exporter
# Download dan instal Node Exporter
NODE_EXP_VERSION="1.7.0"
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXP_VERSION}/node_exporter-${NODE_EXP_VERSION}.linux-amd64.tar.gz
tar xvfz node_exporter-${NODE_EXP_VERSION}.linux-amd64.tar.gz
sudo cp node_exporter-${NODE_EXP_VERSION}.linux-amd64/node_exporter /usr/local/bin/

# Buat systemd service
sudo tee /etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=prometheus
ExecStart=/usr/local/bin/node_exporter
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# Jalankan
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter

# Verifikasi — buka di browser:
# http://server-ip:9100/metrics

8.2 Metrik Node Exporter yang Penting

Metrik Deskripsi PromQL Contoh
node_cpu_seconds_totalWaktu CPU per mode (idle, user, system)rate(node_cpu_seconds_total{mode="idle"}[5m])
node_memory_MemTotal_bytesTotal memorinode_memory_MemTotal_bytes/1024/1024/1024
node_memory_MemAvailable_bytesMemori tersedia1 - node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes
node_filesystem_size_bytesUkuran filesystemnode_filesystem_avail_bytes/node_filesystem_size_bytes
node_network_receive_bytes_totalTotal byte diterimarate(node_network_receive_bytes_total[5m])
node_load1Load average 1 menitnode_load1

8.3 Custom Exporter untuk IoT

Untuk memantau perangkat IoT yang tidak bisa menjalankan Node Exporter, buat custom exporter yang mengambil data dari MQTT broker dan mengeksposnya sebagai metrik Prometheus:

Python — Custom MQTT-to-Prometheus Exporter
# mqtt_exporter.py — Mengambil data MQTT dan mengekspos sebagai Prometheus metrics
# pip install prometheus_client paho-mqtt

from prometheus_client import start_http_server, Gauge, Counter
import paho.mqtt.client as mqtt
import json
import time

# === Prometheus Metrics ===
temperature = Gauge(
    'iot_sensor_temperature_celsius',
    'Suhu sensor',
    ['device', 'room']
)
humidity = Gauge(
    'iot_sensor_humidity_percent',
    'Kelembaban sensor',
    ['device', 'room']
)
messages_total = Counter(
    'iot_mqtt_messages_total',
    'Total pesan MQTT diterima',
    ['topic']
)
device_last_seen = Gauge(
    'iot_device_last_seen_timestamp',
    'Timestamp terakhir device mengirim data',
    ['device']
)

# === MQTT Callback ===
def on_connect(client, userdata, flags, rc, properties=None):
    print(f"[MQTT] Terhubung (rc={rc})")
    client.subscribe("iothub/sensor/#")

def on_message(client, userdata, msg):
    try:
        data = json.loads(msg.payload.decode('utf-8'))
        device = data.get('device', 'unknown')
        topic = msg.topic

        messages_total.labels(topic=topic).inc()

        if 'suhu' in data:
            temperature.labels(device=device, room=data.get('room', 'unknown')).set(data['suhu'])
        if 'kelembaban' in data:
            humidity.labels(device=device, room=data.get('room', 'unknown')).set(data['kelembaban'])

        device_last_seen.labels(device=device).set(time.time())
        print(f"[DATA] {device}: suhu={data.get('suhu')}, kelembaban={data.get('kelembaban')}")

    except Exception as e:
        print(f"[ERROR] {e}")

# === Main ===
if __name__ == '__main__':
    # Start Prometheus HTTP server di port 8000
    start_http_server(8000)
    print("[PROM] Metrics tersedia di http://localhost:8000/metrics")

    # Koneksi MQTT
    client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect("localhost", 1883, 60)
    client.loop_forever()
💡 Memantau Kesehatan Device IoT

Dengan metrik iot_device_last_seen_timestamp, Anda bisa membuat alert jika device tidak mengirim data dalam periode tertentu. Gunakan query: time() - iot_device_last_seen_timestamp > 300 untuk memicu alert jika device tidak aktif selama 5 menit. Ini jauh lebih reliable daripada hanya mengandalkan ping.

9. Quiz: Uji Pemahamanmu!

Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Prometheus dan Grafana:

Pertanyaan 1: Model pengambilan data apa yang digunakan oleh Prometheus?

a) Push model — target mengirim data ke Prometheus
b) Pull model — Prometheus secara aktif mengambil (scrape) metrik dari target
c) Event-driven model — target mengirim event ke Prometheus
d) Polling model — client meminta data dari Prometheus

Pertanyaan 2: Tipe metrik apa yang cocok untuk menyimpan suhu sensor (bisa naik turun)?

a) Counter — karena suhu selalu berubah
b) Histogram — karena suhu memiliki distribusi
c) Gauge — karena nilainya bisa naik dan turun
d) Summary — karena suhu perlu dihitung persentilnya

Pertanyaan 3: PromQL query apa yang digunakan untuk menghitung rata-rata penggunaan CPU dalam persen?

a) node_cpu_seconds_total
b) rate(node_cpu_seconds_total{mode="idle"}[5m])
c) (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100
d) sum(node_cpu_seconds_total) / 100

Pertanyaan 4: Di endpoint mana target mengekspos metrik agar bisa di-scrape oleh Prometheus?

a) /api/metrics
b) /prometheus/data
c) /metrics
d) /status

Pertanyaan 5: Apa fungsi dari Alertmanager dalam stack Prometheus?

a) Menyimpan data metrik secara permanen
b) Melakukan scraping metrik dari target
c) Menerima alert dari Prometheus dan mengirim notifikasi (email, Slack, webhook)
d) Menampilkan grafik dan dashboard visual
← Sebelumnya Wireshark: Analisis Jaringan Selanjutnya → Panduan Lengkap MQTT