ฐานข้อมูลที่ทำงานช้าลงหรือหยุดตอบสนองอาจสร้างความเสียหายร้ายแรงต่อธุรกิจ การ Monitoring ประสิทธิภาพของฐานข้อมูลอย่างต่อเนื่องช่วยให้ตรวจจับปัญหาได้ก่อนที่จะส่งผลกระทบต่อผู้ใช้งาน บทความนี้รวบรวมเครื่องมือและเทคนิคสำหรับตรวจสอบประสิทธิภาพของ MySQL, PostgreSQL และ MongoDB ครอบคลุมตั้งแต่คำสั่งพื้นฐานไปจนถึงการตั้ง Alert อัตโนมัติ
ตัวชี้วัดสำคัญที่ต้องติดตาม
ก่อนเริ่ม Monitoring ต้องเข้าใจว่าตัวชี้วัด (Metrics) ใดสำคัญที่สุดสำหรับฐานข้อมูล ตัวชี้วัดหลักที่ควรติดตามแบ่งเป็นกลุ่มใหญ่ ๆ ได้แก่ Query Performance ที่ดูเวลาเฉลี่ยของ Query, จำนวน Slow Query และ Query ที่ใช้เวลานานที่สุด ถัดมาคือ Connection Metrics ที่ดูจำนวน Connection ปัจจุบัน, Connection สูงสุดที่เคยใช้ และอัตราการ Reject กลุ่ม Resource Usage ครอบคลุมการใช้ CPU, Memory, Disk I/O และ Buffer/Cache Hit Rate ส่วน Replication Metrics ดู Lag, สถานะ Replica และ Error Count สุดท้ายคือ Lock และ Deadlock ที่ดูจำนวน Waiting Lock, Deadlock ต่อนาที และ Lock Time เฉลี่ย
Monitoring MySQL/MariaDB
ตรวจสอบสถานะพื้นฐาน
# ดูสถานะ Server แบบรวม
mysqladmin -u root -p status
# ดูสถานะแบบละเอียด
mysqladmin -u root -p extended-status
# ดู Process ที่กำลังทำงาน
mysql -u root -p -e "SHOW PROCESSLIST;"
# ดู Full Query ของ Process ที่กำลังทำงาน
mysql -u root -p -e "SHOW FULL PROCESSLIST;"
# ดู Global Status (ตัวเลขสะสม)
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Threads%';"
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Connections';"
ตรวจสอบ Query Performance
# เปิด Slow Query Log
mysql -u root -p -e "
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';"
# ดู Slow Query จาก Log
mysqldumpslow -s t /var/log/mysql/slow.log | head -20
# ดู Query ที่กิน Resource มากที่สุดจาก Performance Schema
mysql -u root -p -e "
SELECT digest_text, count_star, avg_timer_wait/1000000000 AS avg_ms,
sum_rows_examined, sum_rows_sent
FROM performance_schema.events_statements_summary_by_digest
ORDER BY avg_timer_wait DESC LIMIT 10;"
# ดู Query ที่ Scan Row มากที่สุด (อาจขาด Index)
mysql -u root -p -e "
SELECT digest_text, count_star,
sum_rows_examined/count_star AS avg_rows_examined,
sum_rows_sent/count_star AS avg_rows_sent
FROM performance_schema.events_statements_summary_by_digest
WHERE sum_rows_examined/count_star > 1000
ORDER BY sum_rows_examined DESC LIMIT 10;"
ตรวจสอบ InnoDB Buffer Pool
# ดู Buffer Pool Hit Rate
mysql -u root -p -e "
SELECT
(1 - (
(SELECT variable_value FROM performance_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_reads') /
(SELECT variable_value FROM performance_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_read_requests')
)) * 100 AS buffer_pool_hit_rate;"
# ดูสถานะ InnoDB แบบละเอียด
mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G"
# ดูการใช้ Buffer Pool
mysql -u root -p -e "
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';"
ตรวจสอบ Connection และ Thread
# ดูจำนวน Connection
mysql -u root -p -e "
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL VARIABLES LIKE 'max_connections';"
# ดู Connection ที่ถูก Abort
mysql -u root -p -e "
SHOW GLOBAL STATUS LIKE 'Aborted_connects';
SHOW GLOBAL STATUS LIKE 'Aborted_clients';"
# ดูว่า Connection เต็มหรือไม่
mysql -u root -p -e "
SELECT
(SELECT variable_value FROM performance_schema.global_status
WHERE variable_name = 'Max_used_connections') AS max_used,
(SELECT variable_value FROM performance_schema.global_variables
WHERE variable_name = 'max_connections') AS max_allowed;"
Monitoring PostgreSQL
ตรวจสอบสถานะพื้นฐาน
# ดู Activity ปัจจุบัน
psql -U postgres -c "
SELECT pid, usename, application_name, client_addr,
state, query_start, query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY query_start;"
# ดูจำนวน Connection แยกตาม State
psql -U postgres -c "
SELECT state, COUNT(*)
FROM pg_stat_activity
GROUP BY state
ORDER BY count DESC;"
# ดูขนาดฐานข้อมูล
psql -U postgres -c "
SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;"
ตรวจสอบ Query Performance
pg_stat_statements เป็น Extension ที่สำคัญมากสำหรับ Monitoring Query ต้องเปิดใช้งานก่อน
# เปิด pg_stat_statements (แก้ postgresql.conf)
# shared_preload_libraries = 'pg_stat_statements'
# แล้ว Restart PostgreSQL
# สร้าง Extension
psql -U postgres -d mydb -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;"
# ดู Query ที่ใช้เวลามากที่สุด
psql -U postgres -d mydb -c "
SELECT query, calls, total_exec_time/1000 AS total_sec,
mean_exec_time AS avg_ms, rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC LIMIT 10;"
# ดู Query ที่เรียกบ่อยที่สุด
psql -U postgres -d mydb -c "
SELECT query, calls, total_exec_time/calls AS avg_ms, rows/calls AS avg_rows
FROM pg_stat_statements
ORDER BY calls DESC LIMIT 10;"
# Reset สถิติ (ทำเป็นระยะ)
psql -U postgres -d mydb -c "SELECT pg_stat_statements_reset();"
ตรวจสอบ Cache Hit Rate
# ดู Buffer Cache Hit Rate (ควรมากกว่า 99%)
psql -U postgres -c "
SELECT
sum(blks_hit) * 100.0 / nullif(sum(blks_hit) + sum(blks_read), 0)
AS cache_hit_rate
FROM pg_stat_database;"
# ดู Hit Rate แยกตามตาราง
psql -U postgres -d mydb -c "
SELECT relname,
heap_blks_hit * 100.0 / nullif(heap_blks_hit + heap_blks_read, 0)
AS hit_rate,
heap_blks_hit, heap_blks_read
FROM pg_statio_user_tables
WHERE heap_blks_hit + heap_blks_read > 0
ORDER BY hit_rate ASC LIMIT 10;"
# ดู Index Hit Rate
psql -U postgres -d mydb -c "
SELECT relname, indexrelname,
idx_blks_hit * 100.0 / nullif(idx_blks_hit + idx_blks_read, 0)
AS idx_hit_rate
FROM pg_statio_user_indexes
WHERE idx_blks_hit + idx_blks_read > 0
ORDER BY idx_hit_rate ASC LIMIT 10;"
ตรวจสอบ Table Bloat และ Vacuum
# ดูตารางที่มี Dead Tuples มาก (ต้อง Vacuum)
psql -U postgres -d mydb -c "
SELECT relname, n_dead_tup, n_live_tup,
n_dead_tup * 100.0 / nullif(n_live_tup, 0) AS dead_pct,
last_vacuum, last_autovacuum
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC LIMIT 10;"
# ดูตารางที่ไม่ถูก Vacuum นานเกินไป
psql -U postgres -d mydb -c "
SELECT relname, last_vacuum, last_autovacuum,
n_dead_tup, n_live_tup
FROM pg_stat_user_tables
WHERE last_autovacuum IS NULL
OR last_autovacuum < now() - interval '7 days'
ORDER BY n_dead_tup DESC;"
Monitoring MongoDB
ตรวจสอบสถานะพื้นฐาน
# ดู Server Status แบบรวม
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
const s = db.serverStatus();
print('Uptime:', Math.floor(s.uptime/3600), 'hours');
print('Connections:', JSON.stringify(s.connections));
print('Opcounters:', JSON.stringify(s.opcounters));"
# ดู Current Operations
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
db.currentOp().inprog.forEach(op => {
if (op.secs_running > 5) {
print('Long running:', op.opid, op.op, op.secs_running, 's');
print(' Query:', JSON.stringify(op.command).substring(0, 200));
}
});"
# ดูสถานะ Replica Set
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
rs.status().members.forEach(m => {
print(m.name, m.stateStr, 'lag:', m.optimeDate);
});"
ตรวจสอบ Query Performance
# เปิด Profiler (ระดับ 1 = เฉพาะ Slow Query)
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
use myapp;
db.setProfilingLevel(1, { slowms: 100 });"
# ดู Slow Query จาก Profiler
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
use myapp;
db.system.profile.find().sort({ ts: -1 }).limit(10).forEach(doc => {
print('Time:', doc.millis, 'ms');
print('Op:', doc.op, 'NS:', doc.ns);
print('Command:', JSON.stringify(doc.command).substring(0, 200));
print('---');
});"
# ดู Query ที่ไม่ใช้ Index (Collection Scan)
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
use myapp;
db.system.profile.find({ planSummary: 'COLLSCAN' })
.sort({ millis: -1 }).limit(5).forEach(doc => {
print('COLLSCAN:', doc.ns, doc.millis, 'ms');
print(' Query:', JSON.stringify(doc.command).substring(0, 200));
});"
ตรวจสอบ WiredTiger Cache
# ดู WiredTiger Cache Usage
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
const wt = db.serverStatus().wiredTiger.cache;
const maxBytes = wt['maximum bytes configured'];
const usedBytes = wt['bytes currently in the cache'];
const dirtyBytes = wt['tracked dirty bytes in the cache'];
print('Cache Max:', (maxBytes/1024/1024/1024).toFixed(2), 'GB');
print('Cache Used:', (usedBytes/1024/1024/1024).toFixed(2), 'GB',
'(' + (usedBytes*100/maxBytes).toFixed(1) + '%)');
print('Cache Dirty:', (dirtyBytes/1024/1024).toFixed(2), 'MB');"
# ดู Read/Write จาก Cache
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
const wt = db.serverStatus().wiredTiger.cache;
print('Pages read into cache:', wt['pages read into cache']);
print('Pages written from cache:', wt['pages written from cache']);
print('Pages evicted:', wt['unmodified pages evicted']);"
Monitoring Script อัตโนมัติ
การเขียน Script สำหรับตรวจสอบสถานะฐานข้อมูลเป็นประจำช่วยให้ตรวจจับปัญหาได้ทันเวลา ตัวอย่าง Script ด้านล่างเป็นสำหรับตรวจสอบ MySQL และส่ง Alert เมื่อพบปัญหา
#!/bin/bash
# db_health_check.sh — Database Health Check Script
set -euo pipefail
MYSQL_USER="monitor"
MYSQL_PASS="MonitorPass123"
ALERT_EMAIL="[email protected]"
LOG_FILE="/var/log/db_health_$(date +%Y%m%d).log"
log() { echo "[$(date '+%H:%M:%S')] $1" | tee -a "$LOG_FILE"; }
alert() { echo "$1" | mail -s "DB Alert: $2" "$ALERT_EMAIL" 2>/dev/null || true; log "ALERT: $2"; }
log "=== Database Health Check ==="
# 1. ตรวจสอบว่า MySQL ทำงานอยู่
if ! mysqladmin -u "$MYSQL_USER" -p"$MYSQL_PASS" ping &>/dev/null; then
alert "MySQL is not responding!" "MySQL Down"
exit 1
fi
log "MySQL: Running"
# 2. ตรวจสอบ Connection
THREADS=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASS" -N -e \
"SHOW GLOBAL STATUS LIKE 'Threads_connected';" | awk '{print $2}')
MAX_CONN=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASS" -N -e \
"SHOW GLOBAL VARIABLES LIKE 'max_connections';" | awk '{print $2}')
CONN_PCT=$((THREADS * 100 / MAX_CONN))
log "Connections: $THREADS/$MAX_CONN ($CONN_PCT%)"
if [ "$CONN_PCT" -gt 80 ]; then
alert "Connection usage at ${CONN_PCT}%!" "High Connections"
fi
# 3. ตรวจสอบ Slow Query
SLOW=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASS" -N -e \
"SHOW GLOBAL STATUS LIKE 'Slow_queries';" | awk '{print $2}')
log "Slow Queries (cumulative): $SLOW"
# 4. ตรวจสอบ Replication (ถ้ามี)
SLAVE_STATUS=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASS" -N -e \
"SHOW REPLICA STATUS\G" 2>/dev/null || true)
if [ -n "$SLAVE_STATUS" ]; then
IO_RUNNING=$(echo "$SLAVE_STATUS" | grep "Replica_IO_Running" | awk '{print $2}')
SQL_RUNNING=$(echo "$SLAVE_STATUS" | grep "Replica_SQL_Running" | awk '{print $2}')
LAG=$(echo "$SLAVE_STATUS" | grep "Seconds_Behind_Source" | awk '{print $2}')
log "Replication: IO=$IO_RUNNING SQL=$SQL_RUNNING Lag=${LAG}s"
if [ "$IO_RUNNING" != "Yes" ] || [ "$SQL_RUNNING" != "Yes" ]; then
alert "Replication broken! IO=$IO_RUNNING SQL=$SQL_RUNNING" "Replication Error"
fi
if [ "$LAG" != "NULL" ] && [ "$LAG" -gt 60 ]; then
alert "Replication lag: ${LAG}s" "High Replication Lag"
fi
fi
# 5. ตรวจสอบ Disk Space
DISK_PCT=$(df /var/lib/mysql | tail -1 | awk '{print $5}' | tr -d '%')
log "Disk Usage: ${DISK_PCT}%"
if [ "$DISK_PCT" -gt 85 ]; then
alert "Disk usage at ${DISK_PCT}%!" "Disk Space Low"
fi
log "=== Check Complete ==="
ตั้งค่า Monitoring ด้วย Prometheus และ Grafana
สำหรับ Monitoring ระยะยาวที่ต้องดูกราฟและแนวโน้ม การใช้ Prometheus เก็บ Metrics และ Grafana แสดงผลเป็นทางเลือกที่นิยมมาก ขั้นตอนหลักคือติดตั้ง Exporter ที่เหมาะสมกับฐานข้อมูลแต่ละตัว
MySQL Exporter
# สร้าง User สำหรับ Exporter
mysql -u root -p -e "
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'ExporterPass';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;"
# ติดตั้ง mysqld_exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
tar xzf mysqld_exporter-0.15.1.linux-amd64.tar.gz
sudo mv mysqld_exporter-0.15.1.linux-amd64/mysqld_exporter /usr/local/bin/
# สร้างไฟล์ Config
cat > /etc/.mysqld_exporter.cnf << EOF
[client]
user=exporter
password=ExporterPass
EOF
chmod 600 /etc/.mysqld_exporter.cnf
# สร้าง Systemd Service
sudo tee /etc/systemd/system/mysqld_exporter.service << EOF
[Unit]
Description=MySQL Exporter
After=network.target
[Service]
User=prometheus
ExecStart=/usr/local/bin/mysqld_exporter \
--config.my-cnf=/etc/.mysqld_exporter.cnf \
--collect.auto_increment.columns \
--collect.info_schema.processlist \
--collect.perf_schema.eventsstatements
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now mysqld_exporter
PostgreSQL Exporter
# สร้าง User สำหรับ Exporter
psql -U postgres -c "
CREATE USER exporter WITH PASSWORD 'ExporterPass';
GRANT pg_monitor TO exporter;"
# ติดตั้ง postgres_exporter
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.15.0/postgres_exporter-0.15.0.linux-amd64.tar.gz
tar xzf postgres_exporter-0.15.0.linux-amd64.tar.gz
sudo mv postgres_exporter-0.15.0.linux-amd64/postgres_exporter /usr/local/bin/
# สร้าง Systemd Service
sudo tee /etc/systemd/system/postgres_exporter.service << EOF
[Unit]
Description=PostgreSQL Exporter
After=network.target
[Service]
User=prometheus
Environment="DATA_SOURCE_NAME=postgresql://exporter:ExporterPass@localhost:5432/postgres?sslmode=disable"
ExecStart=/usr/local/bin/postgres_exporter \
--auto-discover-databases
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now postgres_exporter
MongoDB Exporter
# สร้าง User สำหรับ Exporter
mongosh -u adminUser -p 'password' --authenticationDatabase admin --eval "
db.getSiblingDB('admin').createUser({
user: 'exporter',
pwd: 'ExporterPass',
roles: [
{ role: 'clusterMonitor', db: 'admin' },
{ role: 'read', db: 'local' }
]
});"
# ติดตั้ง mongodb_exporter
wget https://github.com/percona/mongodb_exporter/releases/download/v0.40.0/mongodb_exporter-0.40.0.linux-amd64.tar.gz
tar xzf mongodb_exporter-0.40.0.linux-amd64.tar.gz
sudo mv mongodb_exporter-0.40.0.linux-amd64/mongodb_exporter /usr/local/bin/
# สร้าง Systemd Service
sudo tee /etc/systemd/system/mongodb_exporter.service << EOF
[Unit]
Description=MongoDB Exporter
After=network.target
[Service]
User=prometheus
Environment="MONGODB_URI=mongodb://exporter:ExporterPass@localhost:27017/admin"
ExecStart=/usr/local/bin/mongodb_exporter \
--collect-all
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now mongodb_exporter
Prometheus Configuration
# เพิ่มใน /etc/prometheus/prometheus.yml
scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['db-server:9104']
- job_name: 'postgresql'
static_configs:
- targets: ['db-server:9187']
- job_name: 'mongodb'
static_configs:
- targets: ['db-server:9216']
ตั้งค่า Alert Rules
การตั้ง Alert ช่วยให้ทราบปัญหาทันทีโดยไม่ต้องคอยดูหน้าจอตลอดเวลา ตัวอย่าง Alert Rules สำหรับ Prometheus Alertmanager
# /etc/prometheus/alert_rules.yml
groups:
- name: database_alerts
rules:
# MySQL Connection สูงเกิน 80%
- alert: MySQLHighConnections
expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "MySQL connections high"
description: "{{ $value | humanizePercentage }} of max connections used"
# MySQL Replication Lag
- alert: MySQLReplicationLag
expr: mysql_slave_status_seconds_behind_master > 60
for: 5m
labels:
severity: critical
annotations:
summary: "MySQL replication lag > 60s"
# PostgreSQL Connection สูง
- alert: PostgreSQLHighConnections
expr: sum(pg_stat_activity_count) / pg_settings_max_connections > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "PostgreSQL connections high"
# PostgreSQL Cache Hit Rate ต่ำ
- alert: PostgreSQLLowCacheHitRate
expr: pg_stat_database_blks_hit / (pg_stat_database_blks_hit + pg_stat_database_blks_read) < 0.95
for: 10m
labels:
severity: warning
annotations:
summary: "PostgreSQL cache hit rate below 95%"
# MongoDB Connection สูง
- alert: MongoDBHighConnections
expr: mongodb_ss_connections{conn_type="current"} > 500
for: 5m
labels:
severity: warning
annotations:
summary: "MongoDB connections over 500"
# Disk Space ใกล้เต็ม
- alert: DatabaseDiskSpaceLow
expr: (1 - node_filesystem_avail_bytes{mountpoint="/var/lib/mysql"} / node_filesystem_size_bytes{mountpoint="/var/lib/mysql"}) > 0.85
for: 10m
labels:
severity: critical
annotations:
summary: "Database disk usage above 85%"
Best Practices สำหรับ Database Monitoring
- เริ่มจากตัวชี้วัดพื้นฐาน — Connection Count, Query Response Time, Disk Usage และ Replication Lag คือ 4 ตัวที่ต้องมีก่อน
- ตั้ง Baseline ก่อนตั้ง Alert — ดูค่าปกติของระบบก่อน 1-2 สัปดาห์ แล้วค่อยตั้ง Threshold ที่เหมาะสม
- อย่าตั้ง Alert มากเกินไป — Alert ที่มากเกินจะทำให้ทีมเพิกเฉย (Alert Fatigue) เลือกเฉพาะที่ต้องลงมือแก้จริง
- เก็บ Metrics ย้อนหลัง — เก็บข้อมูลอย่างน้อย 30 วันเพื่อดูแนวโน้มและเปรียบเทียบกับช่วงเวลาเดียวกันในอดีต
- แยก Monitoring จาก Production — รัน Prometheus และ Grafana บนเซิร์ฟเวอร์แยกเพื่อไม่ให้กระทบ Performance ของฐานข้อมูล
- ทดสอบ Alert เป็นระยะ — ทดสอบว่า Alert ส่งถึงทีมจริงโดยจำลองสถานการณ์เป็นประจำ
- สร้าง Dashboard ที่อ่านง่าย — Grafana Dashboard ควรแสดงข้อมูลสำคัญหน้าแรกโดยไม่ต้องเลื่อนหา
สรุป
การ Monitoring ประสิทธิภาพของฐานข้อมูลไม่ใช่แค่ดูว่า Server ยังทำงานอยู่หรือไม่ แต่ต้องเข้าใจพฤติกรรมของระบบเพื่อตรวจจับปัญหาก่อนที่จะส่งผลกระทบ เริ่มจากคำสั่งพื้นฐานของแต่ละ Database Engine แล้วค่อยขยายไปสู่ระบบ Monitoring แบบรวมศูนย์ด้วย Prometheus และ Grafana สิ่งสำคัญที่สุดคือต้องลงมือทำจริง ไม่ใช่แค่ติดตั้งเครื่องมือแล้วปล่อยทิ้งไว้
แนะนำบริการ DE
การรัน Monitoring Stack อย่าง Prometheus และ Grafana ควบคู่กับฐานข้อมูลต้องการเซิร์ฟเวอร์ที่มี RAM และ Storage เพียงพอ Cloud VPS ของ DE รองรับการเลือก RAM และ SSD NVMe ตามความต้องการ พร้อม Root Access สำหรับติดตั้ง Exporter และ Monitoring Tools ได้อิสระ
สำหรับโปรเจกต์ที่ไม่ต้องการจัดการ Monitoring เอง Cloud Hosting ของ DE มีระบบ Monitoring พื้นฐานให้พร้อมใช้งาน เหมาะกับเว็บไซต์และแอปพลิเคชันที่ต้องการความสะดวก

