Tích hợp Prometheus metrics vào code nâng cao hiệu quả monitor

·

7 min read

Trong thời đại ứng dụng ngày càng phức tạp và đòi hỏi độ sẵn sàng cao, việc theo dõi và giám sát hiệu năng của hệ thống là một yêu cầu không thể thiếu. Prometheus, với mô hình dữ liệu mạnh mẽ và khả năng mở rộng linh hoạt, đã trở thành một công cụ phổ biến để thu thập và lưu trữ các chỉ số (metrics) của hệ thống.

Bài viết này sẽ hướng dẫn bạn cách tích hợp Prometheus metrics vào ứng dụng của mình để xây dựng một hệ thống giám sát hiệu quả, giúp bạn:

  • Phát hiện sớm các vấn đề: Nhận biết và xử lý kịp thời các sự cố, lỗi hệ thống trước khi chúng ảnh hưởng đến người dùng.

  • Tối ưu hóa hiệu năng: Xác định các điểm nghẽn và cải thiện hiệu suất của ứng dụng.

  • Tăng cường khả năng phục hồi: Theo dõi trạng thái của hệ thống và nhanh chóng khôi phục khi xảy ra sự cố.

Prometheus là gì?

Prometheus là một hệ thống giám sát thời gian thực, mã nguồn mở, được sử dụng để thu thập và lưu trữ các metrics. Nó có các đặc điểm chính sau:

  • Mô hình dữ liệu mạnh mẽ: Dựa trên các nhãn (labels), Prometheus cho phép bạn tạo các metrics đa chiều và linh hoạt.

  • Khả năng mở rộng: Prometheus có thể dễ dàng mở rộng để theo dõi các hệ thống lớn và phức tạp.

  • Cộng đồng lớn: Prometheus có một cộng đồng người dùng và phát triển rất lớn, cung cấp nhiều công cụ và thư viện hỗ trợ.

Tại sao nên sử dụng Prometheus metrics?

  • Chi tiết và linh hoạt: Prometheus cho phép bạn thu thập các metrics ở cấp độ rất chi tiết, từ các chỉ số hệ thống cơ bản đến các metrics tùy chỉnh của ứng dụng.

  • Lưu trữ lâu dài: Prometheus lưu trữ các metrics theo thời gian, cho phép bạn phân tích xu hướng và so sánh hiệu năng.

  • Tích hợp dễ dàng: Prometheus cung cấp nhiều client library và integration cho các ngôn ngữ lập trình phổ biến, giúp bạn dễ dàng tích hợp vào ứng dụng.

  • Cộng đồng và hệ sinh thái phong phú: Prometheus có một hệ sinh thái các công cụ và dịch vụ xung quanh, giúp bạn xây dựng một hệ thống giám sát toàn diện.

Observability là chìa khóa cho sự ổn định của hệ thống. Khi ứng dụng của bạn phát triển và trở nên phức tạp hơn, bạn cần các công cụ giám sát để theo dõi hiệu suất, tài nguyên và phát hiện sự cố kịp thời. Prometheus giúp bạn giám sát các số liệu quan trọng (metrics) như số lượng request, thời gian phản hồi, mức sử dụng tài nguyên, v.v.

Việc tích hợp Prometheus metrics vào ứng dụng giúp bạn:

  • Hiểu rõ hơn về ứng dụng: Bạn có thể theo dõi chi tiết các chỉ số như số lượng yêu cầu, người dùng trực tuyến, mức sử dụng bộ nhớ, v.v.

  • Phát hiện và khắc phục sự cố nhanh hơn: Thông qua các cảnh báo (alerts) dựa trên các metrics được thu thập.

  • Nâng cao hiệu quả vận hành: Giúp tối ưu hoá hiệu suất ứng dụng bằng cách phân tích các chỉ số hiệu suất.

2. Cách tích hợp Prometheus metrics vào ứng dụng Python

Prometheus có thể tích hợp dễ dàng vào các ứng dụng Python thông qua thư viện prometheus_client. Hãy xem cách bạn có thể thực hiện điều này trong một ứng dụng đơn giản sử dụng Flask.

2.1. Cài đặt thư viện prometheus_client

Trước tiên, hãy cài đặt thư viện prometheus_client bằng pip:

bashCopy codepip install prometheus_client

2.2. Đo lường các chỉ số trong ứng dụng Python

Sau khi cài đặt, bạn có thể bắt đầu đo lường các chỉ số trong ứng dụng của mình. Ví dụ dưới đây minh họa cách đo lường số lượng yêu cầu HTTP (request count) và số lượng người dùng đang trực tuyến.

from flask import Flask, Response
from prometheus_client import Counter, Gauge, generate_latest, CONTENT_TYPE_LATEST

app = Flask(__name__)

# Tạo Counter để đếm số lượng yêu cầu HTTP
REQUEST_COUNT = Counter('app_requests_total', 'Total number of requests to this webserver')

# Tạo Gauge để theo dõi số lượng người dùng trực tuyến
USER_ONLINE = Gauge('app_users_online', 'Number of users currently online')

@app.route('/')
def index():
    REQUEST_COUNT.inc()  # Tăng số lượng yêu cầu mỗi khi có request
    USER_ONLINE.inc()     # Giả định rằng mỗi request sẽ thêm một người dùng online
    return "Hello, World!"

@app.route('/metrics')
def metrics():
    # Trả về các metrics dưới dạng Prometheus
    return Response(generate_latest(), content_type=CONTENT_TYPE_LATEST)

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

Hoặc:

from flask import Flask, Response
from prometheus_client import Counter, generate_latest, CONTENT_TYPE_LATEST
from kubernetes import client, config

app = Flask(__name__)

# Tạo một Counter metric để đếm số lượng request
REQUEST_COUNT = Counter('app_requests_total', 'Total number of requests to this webserver')

# Tạo một Gauge metric để theo dõi số lượng người dùng online
USER_ONLINE = Gauge('app_users_online', 'Number of users currently online')

# Load Kubernetes config
config.load_incluster_config()
v1 = client.CustomObjectsApi()

def update_metric_crd(request_count, users_online):
    body = {
        "spec": {
            "request_count": request_count,
            "users_online": users_online
        }
    }
    v1.patch_namespaced_custom_object(
        group="example.com",
        version="v1",
        namespace="default",
        plural="metrics",
        name="my-metric",
        body=body
    )

@app.route('/')
def index():
    REQUEST_COUNT.inc()  # Tăng giá trị của counter mỗi lần có request
    update_metric_crd(REQUEST_COUNT._value.get(), USER_ONLINE._value.get())
    return "Hello, World!"

@app.route('/set_users/<int:num_users>')
def set_users(num_users):
    USER_ONLINE.set(num_users)  # Thiết lập giá trị của gauge
    update_metric_crd(REQUEST_COUNT._value.get(), num_users)
    return f"Set number of users to {num_users}"

@app.route('/metrics')
def metrics():
    # Trả về các metrics ở định dạng Prometheus
    return Response(generate_latest(), content_type=CONTENT_TYPE_LATEST)

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

2.3. Triển khai ứng dụng và kiểm tra metrics

Khi chạy ứng dụng Python này, bạn có thể truy cập vào /metrics để xem các số liệu Prometheus đã thu thập. Prometheus sẽ scrape endpoint này và lưu trữ các số liệu để phân tích sau này.

Ví dụ, bạn có thể thấy số lượng request đến endpoint chính của ứng dụng hoặc số lượng người dùng online.

3. Tích hợp với Prometheus và Kubernetes

Trong môi trường sản xuất, bạn thường chạy ứng dụng của mình trên Kubernetes và cần tích hợp với hệ thống giám sát Prometheus. Để làm điều này, bạn cần:

  • Tạo một Service để mở endpoint /metrics.

  • Sử dụng ServiceMonitor để Prometheus có thể tự động scrape metrics từ ứng dụng.

3.1. Tạo một Service cho ứng dụng

apiVersion: v1
kind: Service
metadata:
  name: my-python-app
  labels:
    app: my-python-app
spec:
  selector:
    app: my-python-app
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000

3.2. Tạo một ServiceMonitor để Prometheus thu thập metrics

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-python-app-monitor
  labels:
    release: prometheus-operator
spec:
  selector:
    matchLabels:
      app: my-python-app
  endpoints:
    - port: 8000
      path: /metrics
      interval: 30s

Chú ý:

Nhãn release: prometheus-operator trong tệp YAML của ServiceMonitor thường được sử dụng để Prometheus Operator có thể nhận diện và quản lý các tài nguyên như ServiceMonitor. Nhãn này có ý nghĩa đặc biệt trong ngữ cảnh của Prometheus Operator được cài đặt qua Helm, vì Helm sử dụng các nhãn này để liên kết các tài nguyên với bản cài đặt cụ thể của Prometheus Operator.

Chi tiết về nhãn release: prometheus-operator

  • Helm và Prometheus Operator: Khi bạn cài đặt Prometheus Operator bằng Helm, Helm sẽ thêm nhãn releasevào tất cả các tài nguyên mà nó quản lý. Nhãn này thường có giá trị tương ứng với tên của bản phát hành (release name) mà bạn đã chỉ định khi cài đặt Prometheus Operator.

  • Liên kết tài nguyên: Nhãn release: prometheus-operator giúp Prometheus Operator tìm và quản lý các tài nguyên ServiceMonitor, PodMonitor, Prometheus, Alertmanager, v.v. thuộc cùng một bản phát hành. Điều này đảm bảo rằng các tài nguyên này được cấu hình và hoạt động chính xác với bản phát hành cụ thể của Prometheus Operator.

Điều chỉnh nhãn cho phù hợp

Nếu bạn đã cài đặt Prometheus Operator với một tên bản phát hành khác, bạn cần điều chỉnh nhãn release cho phù hợp. Ví dụ, nếu bạn cài đặt Prometheus Operator với tên my-prometheus, bạn cần thay đổi nhãn thành release: my-prometheus.

Tích hợp Prometheus metrics vào ứng dụng là một cách hiệu quả để nâng cao khả năng giám sát và quản lý hệ thống. Bằng cách thu thập và phân tích các metrics, bạn có thể phát hiện sớm các vấn đề, tối ưu hóa hiệu năng và đảm bảo sự ổn định của ứng dụng.

Các chủ đề mở rộng:

  • Tạo các alerts: Cấu hình các alerts để nhận thông báo khi các metrics vượt quá ngưỡng cho phép.

  • Phân tích dữ liệu: Sử dụng các công cụ phân tích dữ liệu để tìm hiểu sâu hơn về hiệu năng của ứng dụng.

  • Tích hợp với các hệ thống khác: Tích hợp Prometheus với các hệ thống CI/CD, log management để xây dựng một pipeline DevOps hoàn chỉnh.