Facebook PixelObservability vs Monitoring: Hướng dẫn thực hiện Observability | 200Lab Blog

Observability vs Monitoring: Hướng dẫn thực hiện Observability

11 Mar, 2025

Monitoring và Observability không phải là hai lựa chọn đối lập mà là hai yếu tố bổ trợ lẫn nhau để đảm bảo hệ thống của bạn hoạt động hiệu quả

Observability vs Monitoring: Hướng dẫn thực hiện Observability

Mục Lục

Monitoring và Observability không phải là hai lựa chọn đối lập mà là hai yếu tố bổ trợ lẫn nhau để đảm bảo hệ thống của bạn hoạt động hiệu quả. Monitoring giúp bạn biết khi nào có vấn đề xảy ra, trong khi Observability giúp bạn hiểu rõ tại sao vấn đề đó xảy ra.

1. Monitoring là gì?

Monitoring (giám sát) là quá trình thu thập, phân tích và sử dụng thông tin của hệ thống để theo dõi trạng thái hoạt động của nó. Hiểu một cách đơn giản, monitoring là việc đo lường những gì bạn đã biết và đưa ra cảnh báo khi có vấn đề.

Đặc điểm của Monitoring

  • Tập trung vào các chỉ số cố định đã được xác định trước như: CPU, RAM, dung lượng ổ cứng, tỷ lệ yêu cầu (request rate), tỷ lệ lỗi (error rate)…
  • Dựa trên ngưỡng cảnh báo (thresholds): Khi một chỉ số vượt qua giới hạn định sẵn, hệ thống sẽ kích hoạt cảnh báo.
  • Giải đáp hai câu hỏi cơ bản: "Điều gì đang xảy ra?" và "Có vấn đề không?"
  • Mang tính thụ động: Chỉ cảnh báo khi vấn đề đã xảy ra.

Ví dụ đơn giản về Monitoring: Bạn thiết lập monitoring để theo dõi tỷ lệ lỗi HTTP 500 trong hệ thống. Nếu tỷ lệ này vượt mức 1%, bạn sẽ nhận được thông báo qua Slack hoặc email.

Các công cụ Monitoring phổ biến:

  • Prometheus: Thu thập và cảnh báo metrics
  • Grafana: Visualize metrics
  • Nagios/Zabbix: Monitoring hệ thống truyền thống
  • Datadog: Giải pháp SaaS toàn diện
  • New Relic: APM và monitoring

2. Observability là gì?

Observability (khả năng quan sát) là khả năng hiểu trạng thái bên trong của một hệ thống thông qua các dữ liệu mà nó tạo ra. Khái niệm này xuất phát từ lý thuyết điều khiển và tập trung vào việc giúp bạn hiểu được những điều chưa biết trước về hệ thống.

Đặc điểm của Observability:

  • Tập trung vào dữ liệu chi tiết: Bao gồm logs, metrics, traces và events.
  • Khám phá linh hoạt: Bạn có thể đặt ra các câu hỏi mới mà không cần phải cấu hình trước.
  • Trả lời câu hỏi: "Tại sao điều này xảy ra?".
  • Mang tính chủ động: Giúp bạn hiểu rõ hệ thống ngay cả khi gặp lỗi chưa xảy ra.

Ví dụ về Observability: Một giao dịch thanh toán gặp lỗi. Nhờ dữ liệu trace chi tiết, bạn có thể theo dõi toàn bộ hành trình của request qua các service khác nhau, xác định rằng bottleneck nằm ở service xử lý thẻ tín dụng, và phát hiện nguyên nhân là do timeout khi gọi đến API của bên thứ ba.

💡
Như vậy, Monitoring là một phần của Observability. Observability không thay thế mà bổ sung cho monitoring, giúp bạn có cái nhìn toàn diện hơn về hệ thống.

Công cụ Observability phổ biến:

  • Jaeger/Zipkin: Distributed tracing
  • OpenTelemetry: Framework thu thập telemetry data
  • ELK Stack: Elasticsearch, Logstash, Kibana cho logging
  • Honeycomb: Observability platform
  • Lightstep: Observability cho hệ thống phức tạp

3. Hướng dẫn thực hiện Observability

Phần này mình sẽ hướng dẫn các bạn thực hiện Observability nhé, các bạn có thể tham khảo thêm phần Setup Mornitoring với Prometheus và Grafana trên blog 200Lab hoặc các nguồn khác.

3.1 Triển khai tracing

  • Cài đặt thư viện OpenTelemetry
Bash
npm install @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-http
  • Tạo file tracing.js
Javascript
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');

const traceExporter = new OTLPTraceExporter({
  url: 'http://localhost:4318/v1/traces',
});

const sdk = new NodeSDK({
  traceExporter,
  instrumentations: [getNodeAutoInstrumentations()]
});

sdk.start();
  • Khởi động ứng dụng với tracing
Bash
node -r ./tracing.js app.js

3.2  Thiết lập structured logging

Ví dụ với Winston và JSON format:

Javascript
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  defaultMeta: { service: 'user-service' },
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

// Ví dụ sử dụng với trace ID để liên kết logs và traces
function logWithTraceId(message, traceId, level = 'info') {
  logger.log({
    level,
    message,
    traceId
  });
}

// Sử dụng
logWithTraceId('User payment processed', 'abc-123-def-456', 'info');

3.3 Kết hợp metrics, logs và traces

Sử dụng Jaeger hoặc Zipkin để theo dõi traces:

Bash
docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 14250:14250 \
  -p 9411:9411 \
  jaegertracing/all-in-one

3.4 Thực hiện truy vấn phân tích

Với ELK Stack (Elasticsearch, Logstash, Kibana):

  • Bạn có thể truy vấn logs kết hợp với traceID
Bash
service:payment-service AND message:*failed* AND traceId:abc-123-def-456
  • Theo dõi hành trình của request thông qua các service bằng Jaeger UI
  • Tạo dashboard trong Kibana để phân tích các patterns trong dữ liệu logs

3.5 Debug một lỗi transaction với Observability

Giả sử bạn nhận được báo cáo từ monitoring rằng tỷ lệ lỗi đang tăng cao trong hệ thống thanh toán. Với observability, quy trình debug có thể như sau:

  1. Bắt đầu từ alert - Bạn nhận được cảnh báo từ Prometheus rằng error rate vượt quá 5%
  2. Xem dashboard - Trên Grafana, bạn thấy lỗi bắt đầu xảy ra 15 phút trước và chỉ ảnh hưởng đến payment service
  3. Tìm kiếm logs - Truy vấn Kibana để tìm logs liên quan:
Bash
service:payment-service AND level:error AND @timestamp:[now-15m TO now]
  1. Xác định pattern - Phát hiện các lỗi timeout khi gọi đến third-party payment provider
  2. Phân tích traces - Từ traceID trong log, tìm trace tương ứng trong Jaeger:
Bash
traceID: 7ad2d08e9a354592
  1. Quan sát toàn bộ request - Trong Jaeger UI, bạn thấy rằng service payment-gateway mất 8.5 giây để phản hồi, vượt quá timeout 5 giây
  2. Kiểm tra metrics - Quay lại Grafana, bạn xem metrics của payment-gateway và thấy latency tăng đột biến đúng thời điểm bắt đầu xảy ra lỗi
  3. Giải quyết vấn đề - Bạn tạm thời tăng timeout lên 10 giây và liên hệ với nhà cung cấp payment gateway để báo cáo vấn đề

Với Monitoring đơn thuần, bạn chỉ biết có lỗi xảy ra mà không thể truy vết được nguyên nhân một cách chi tiết như vậy.

4. Kết luận

Trong bối cảnh phát triển phần mềm hiện đại với các kiến trúc microservices phức tạp, việc kết hợp cả Monitoring và Observability sẽ giúp các developer xây dựng hệ thống bền vững hơn, khắc phục sự cố nhanh chóng hơn, và quan trọng nhất là tăng độ tin cậy cho sản phẩm.

Bài viết liên quan

Đăng ký nhận thông báo

Đừng bỏ lỡ những bài viết thú vị từ 200Lab