Hướng dẫn chi tiết: Tích hợp giám sát hiệu năng Prometheus cho dịch vụ micro HTTP bất đồng bộ Micro

Tại sao cần tích hợp hệ thống giám sát cho dịch vụ Micro?

Trong kiến trúc microservices, khả năng quan sát hệ thống là yếu tố sống còn để đảm bảo độ ổn định. Framework Micro nổi bật với thiết kế tối giản (chỉ ~260 dòng mã) và hiệu năng cao, nhưng vẫn cần giải quyết các vấn đề:

  • Biến động độ trễ yêu cầu ảnh hưởng trải nghiệm người dùng
  • Lỗi hệ thống do sử dụng tài nguyên bất thường
  • Tỷ lệ lỗi tăng cao không được phát hiện kịp thời
  • Khó xác định điểm nghẽn hiệu năng

Prometheus giải quyết những thách thức này nhờ khả năng thu thập dữ liệu chuỗi thời gian và ngôn ngữ truy vấn mạnh mẽ, đồng thời nhẹ nhàng phù hợp với kiến trúc Micro.

Các bước triển khai cụ thể

1. Tạo module thu thập chỉ số

// metrics.js
const promClient = require('prom-client');
const registry = new promClient.Registry();

// Kích hoạt chỉ số hệ thống mặc định
promClient.collectDefaultMetrics({ registry });

// Tạo chỉ số đo độ trễ HTTP
const requestLatencySeconds = new promClient.Histogram({
name: 'http_request_latency_seconds',
help: 'Thời gian xử lý yêu cầu HTTP theo giây',
labelNames: ['method', 'path', 'status'],
buckets: [0.05, 0.1, 0.25, 0.5, 1, 2, 5]
});

registry.registerMetric(requestLatencySeconds);
module.exports = { registry, requestLatencySeconds };

2. Triển khai middleware giám sát

// index.js
const { send } = require('micro');
const { registry, requestLatencySeconds } = require('./metrics');
const url = require('url');

// Middleware ghi nhận chỉ số
const monitoringMiddleware = (handler) => async (req, res) => {
const startTimer = requestLatencySeconds.startTimer();
const requestPath = url.parse(req.url).pathname;

try {
const result = await handler(req, res);
startTimer({ 
method: req.method, 
path: requestPath, 
status: res.statusCode || 200 
});
return result;
} catch (err) {
startTimer({ 
method: req.method, 
path: requestPath, 
status: err.statusCode || 500 
});
throw err;
}
};

// Endpoint xuất chỉ số
const metricsEndpoint = async (req, res) => {
res.setHeader('Content-Type', registry.contentType);
send(res, 200, await registry.metrics());
};

// Xử lý nghiệp vụ chính
const mainHandler = async (req, res) => {
return 'Chào mừng từ Micro!';
};

// Kết hợp middleware
module.exports = monitoringMiddleware((req, res) => {
if (req.url === '/metrics') return metricsEndpoint(req, res);
return mainHandler(req, res);
});

3. Cấu hình Prometheus

# prometheus.yml
global:
scrape_interval: 10s

scrape_configs:
- job_name: 'micro-service'
scrape_timeout: 5s
static_configs:
- targets: ['host.docker.internal:3000']

Các chỉ số hiệu năng quan trọng

  • Độ trễ P95: histogram_quantile(0.95, sum(rate(http_request_latency_seconds_bucket[2m])) by (le, path))
  • Tỷ lệ lỗi: sum(rate(http_request_latency_seconds_count{status=~"5.."}[1m])) / sum(rate(http_request_latency_seconds_count[1m]))
  • Hiệu suất xử lý: rate(http_request_latency_seconds_count[1m])

Khắc phục sự cố thường gặp

  • Không thu thập được chỉ số: Kiểm tra kết nối mạng giữa Prometheus và Micro, xác minh endpoint /metrics hoạt động
  • Hiệu năng giảm: Tối ưu hóa số lượng nhãn và độ phân giải histogram
  • Bộ nhớ cao: Giảm số lượng chỉ số không cần thiết, sử dụng quy tắc aggregation

Thẻ: prometheus Micro.js Node.js monitoring metrics

Đăng vào ngày 11 tháng 7 lúc 04:58