Second Brain

Sebuah catatan perjalanan menekuni bidang IT Infra, Cloud, DevOps, dan Security

IMPLEMENTASI FULL-STACK OBSERVABILITY

Proyek ini bertujuan membangun sistem monitoring terpusat untuk memantau kesehatan server (Infrastructure Level) dan performa aplikasi (Application Level). Sistem ini menggunakan pendekatan “Pull-Based Mechanism” di mana server monitoring secara aktif mengambil data metrics dari target.

Komponen Utama:

  1. Prometheus: Time-series database untuk pengumpulan metrik.

  2. Grafana: Platform visualisasi dashboard.

  3. Node Exporter: Agen pengirim metrik hardware (CPU/RAM/Disk).

  4. cAdvisor: Agen pengirim metrik container Docker.

  5. MySQL Exporter: Agen pengirim metrik internal database (QPS, Slow Query).

Topologi Infrastruktur:

Disini saya menggunakan 2 VPS terpisah untuk mensimulasikan lingkungan produksi yang aman.

  • VPS 1 (Monitoring Node):

    • IP: 43.xx.xx.113

    • Service: Prometheus, Grafana.

  • VPS 2 (Target Node / App Server):

    • IP: 43.xx.xx.238

    • Service: Docker (WordPress, MySQL), Node Exporter, cAdvisor, MySQL Exporter.

Langkah Implementasi:

Setup Monitoring Node (VPS 1):

Instalasi Prometheus & Grafana

Untuk instalasi Grafana dan Prometheus saya menggunakan scipr bash berikut untuk mempercepat proses instalasi:

#!/bin/bash
# Script Instalasi Prometheus & Grafana
# Jalankan dengan: sudo bash setup_monitoring.sh

echo "=== [1/4] Update System & Dependencies ==="
# Fix potensi error dpkg lock sebelum mulai
killall unattended-upgrades 2>/dev/null
dpkg --configure -a
apt-get update && apt-get install -y wget curl gnupg2 software-properties-common

echo "=== [2/4] Install Prometheus (Versi 2.45.0) ==="
useradd --no-create-home --shell /bin/false prometheus
mkdir -p /etc/prometheus /var/lib/prometheus

# Download Binary
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar -xvf prometheus-2.45.0.linux-amd64.tar.gz

# Pindahkan Binary & Config
cp prometheus-2.45.0.linux-amd64/prometheus /usr/local/bin/
cp prometheus-2.45.0.linux-amd64/promtool /usr/local/bin/
cp -r prometheus-2.45.0.linux-amd64/consoles /etc/prometheus
cp -r prometheus-2.45.0.linux-amd64/console_libraries /etc/prometheus
cp prometheus-2.45.0.linux-amd64/prometheus.yml /etc/prometheus/prometheus.yml

# Set Permission
chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
chown prometheus:prometheus /usr/local/bin/prometheus

# Buat Systemd Service
cat <<EOF > /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/

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now prometheus

echo "=== [3/4] Install Grafana OSS ==="
mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | tee /etc/apt/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | tee /etc/apt/sources.list.d/grafana.list

apt-get update
apt-get install -y grafana
systemctl enable --now grafana-server

echo "=== [4/4] Setup Selesai ==="
MY_IP=$(hostname -I | cut -d' ' -f1)
echo "Akses Prometheus: http://$MY_IP:9090"
echo "Akses Grafana   : http://$MY_IP:3000 (User: admin/admin)"

Setup Infrastructure Monitoring (VPS 2):

Instalasi Node Exporter

Agar mempercepat proses instalasi saya menggunakan script bash berikut:

#!/bin/bash
# Script Instalasi Node Exporter
# Jalankan dengan: sudo bash setup_node_exporter.sh

echo "=== Install Node Exporter ==="
useradd --no-create-home --shell /bin/false node_exporter

# Download
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz

# Install Binary
mv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
chown node_exporter:node_exporter /usr/local/bin/node_exporter

# Buat Systemd Service
cat <<EOF > /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now node_exporter

# Setup Firewall (UFW)
ufw allow 9100/tcp  # Node Exporter
ufw allow 8080/tcp  # cAdvisor
ufw allow 9104/tcp  # MySQL Exporter
ufw reload

echo "✅ Node Exporter berjalan di Port 9100"

Deployment Aplikasi & Monitoring Stack (Node 2):

Kita akan men-deploy WordPress, MySQL, dan agen monitoring khusus container.

Buat File Konfigurasi Database:

Demi keamanan (Security Best Practice), kita gunakan file config, bukan environment variable. Buat file my.cnf di folder project:

[client]
user=root
password=root_password_anda  # Ganti dengan password yang sama di docker-compose
host=db
port=3306

Buat Docker Compose:

Buat file docker-compose.yml

version: '3.8'

services:
  # --- APLIKASI UTAMA ---
  wordpress:
    image: wordpress:latest
    container_name: wp_app
    restart: always
    ports: ["80:80"]
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: root_password_anda
    depends_on:
      - db

  db:
    image: mysql:5.7
    container_name: wp_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_password_anda
    volumes:
      - db_data:/var/lib/mysql

  # --- MONITORING STACK ---
  
  # 1. cAdvisor (Monitor Container Resource)
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    restart: always
    ports: ["8080:8080"]
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

  # 2. MySQL Exporter (Monitor Database Query)
  mysql-exporter:
    image: prom/mysqld-exporter
    container_name: mysql_exporter
    restart: always
    ports: ["9104:9104"]
    volumes:
      - ./my.cnf:/cfg/my.cnf  # Mount file config yg dibuat di langkah A
    command:
      - '--config.my-cnf=/cfg/my.cnf' # Perintah load config
    depends_on:
      - db

volumes:
  db_data:

Kemudian jalan kan perintah

sudo docker compose up -d

Integrasi dengan Node 1

Edit konfigurasi Prometheus agar mengenali Node 2. File yang baru kita tambahkan: /etc/prometheus/prometheus.yml. Tambahkan di bagian scrape_configs:

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  # --- TARGET NODE 2 ---
  - job_name: "vps_infrastructure"
    static_configs:
      - targets: ["IP_VPS_NODE_2:9100"]

  - job_name: "docker_containers"
    static_configs:
      - targets: ["IP_VPS_NODE_2:8080"]

  - job_name: "mysql_database"
    static_configs:
      - targets: ["IP_VPS_NODE_2:9104"]

Visualisasi pada Dashboard Grafana

Masuk ke Grafana, tambahkan Data Source Prometheus, lalu Import Dashboard berikut:

  1. Node Exporter Full (ID: 1860)

    • Fungsi: Monitoring kesehatan Server (CPU/RAM Global).

  2. MySQL Overview (ID: 7362)

    • Fungsi: Monitoring kinerja Database (QPS/Slow Query).

    • Note: Jika panel RAM menunjukan “No Data”, edit query panel tersebut dan ganti variabel dengan total RAM server (contoh: / 2147483648).

  3. CADvisor Exporter (ID: 14282)

    • Fungsi: Monitoring penggunaan RAM/CPU per Container Docker.

Validasi & Stress Test

Untuk melihat grafik pada dashboard grafana kita bisa melakukan pengujian pada aplikasi WordPress yang sudah kita deploy tersebut dengan menggunakan tool apache2-utils.

Install tool apache2-utils

sudo apt install apache2-utils

Skenarionya kita akan mencoba melakukan tes dengan membanjiri traffic yang berbeda beda untuk melihat perbedaan kenaikan grafik pada dashboard grafana

Percobaan 1 :

Pada percobaan ini berfokus pada traffic keseluruhan di sistem dan juga pada container, dengan pengujian ini otomatis grafik akan naik sesuai dengan beban dan kemampuan dari server dalam menangani traffic yang tinggi.

ab -n 500 -c 10 http://43.xx.xx.238/2025/12/31/test/

Percobaan 2 : 

Pada percobaan 2 ini berfokus pada pengujian dari database. Pada saat pengujian menunjukkan kenaikan pada monitoring terkait aktivitas database yang tinggi.

ab -n 500 -c 10 http://43.157.211.238/?s=aaaaaaa

Kesimpulan

Proyek ini berhasil mendemonstrasikan implementasi sistem Full-Stack Observability yang mampu memisahkan dan memvisualisasikan beban kerja pada layer yang berbeda. Melalui serangkaian uji beban (stress testing) menggunakan Apache Bench, sistem monitoring terbukti mampu memberikan data real-time yang akurat untuk kebutuhan Root Cause Analysis.