Giám sát microservices Flask với Prometheus

Một vài dòng mã và ứng dụng của bạn sẽ tạo ra các số liệu, thật tuyệt vời!

Để hiểu prometheus_ hoạt động như thế nàobình giữ nhiệt_nhà xuất khẩu một ví dụ tối thiểu là đủ:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def main():
    return 'OK'

Đó là tất cả những gì bạn cần để bắt đầu! Bằng cách thêm một lần nhập và một dòng để khởi tạo PrometheusSố liệu, bạn sẽ nhận được số liệu thời lượng yêu cầu и quầy yêu cầu, hiển thị ở điểm cuối /số liệu ứng dụng Flask mà nó được đăng ký, cũng như tất cả các số liệu mặc định bạn nhận được từ cơ sở Thư viện khách hàng Prometheus.

bạn có thể tìm ví dụ dễ sử dụng trong kho GitHub chạy phiên bản Prometheus и grafana cùng với một ứng dụng demo để tạo các số liệu trông giống như thế này:

Giám sát microservices Flask với Prometheus

Bạn cũng sẽ tìm thấy danh sách các chỉ số trong README các ví dụ xuất hiện trong bảng thông tin, cùng với các truy vấn Prometheus có trong bảng thông tin.

điều chỉnh

Có nhiều tùy chọn cấu hình trong thư viện, hãy xem README ví dụ dự án của họ với một lời giải thích ngắn gọn.

Cấu hình cơ bản được hiển thị ở trên. Chỉ cần tạo một ví dụ PrometheusSố liệu, hãy gọi nó là số liệu, sau đó sử dụng nó để xác định các số liệu bổ sung mà bạn muốn thu thập bằng cách trang trí các hàm:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Bộ đếm đếm cuộc gọi và những bộ đếm khác thu thập số liệu dựa trên thời lượng của những cuộc gọi đó. Bạn có thể xác định nhãn cho từng nhãn này, có thể sử dụng thuộc tính yêu cầu hoặc phản hồi. Ví dụ:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# group by endpoint rather than path
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Number of invocations per collection', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

Trong ví dụ trên, nhấp vào điểm cuối /bộ sưu tập/10002/mục/76 sẽ làm cho bộ đếm tăng lên, ví dụ cnt_collection{collection = "10002", trạng thái = "200"}, ngoài ra bạn sẽ nhận được các số liệu mặc định (cho từng điểm cuối trong ví dụ này) từ thư viện mặc định:

  • flask_http_request_duration_seconds — Thời lượng yêu cầu HTTP tính bằng giây cho tất cả các yêu cầu Flask theo phương thức, đường dẫn và trạng thái

  • flask_http_request_total — Tổng số yêu cầu HTTP theo phương thức và trạng thái

Có các tùy chọn để bỏ qua việc theo dõi các điểm cuối cụ thể, ghi lại các số liệu mặc định bổ sung hoặc bỏ qua những số liệu được liệt kê ở trên hoặc áp dụng cùng một số liệu tùy chỉnh cho nhiều điểm cuối. Thủ tục thanh toán README dự án để xem những gì có sẵn.

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def main():
    pass  # requests tracked by default

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # default metrics are not collected

# custom metric to be applied to multiple endpoints
common_counter = metrics.counter(
    'by_endpoint_counter', 'Request count by endpoints',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # tracked by the custom and the default metrics

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # also tracked by the custom and the default metrics

# register additional default metrics
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Request count by request paths',
        labels={'path': lambda: request.path}
    )
)

Thư viện có các tiện ích mở rộng tiện lợi cho các thư viện đa xử lý phổ biến như uWSGI và Gunicorn. Bạn cũng có thể tìm thấy các ví dụ nhỏ về các trường hợp sử dụng được nhắm mục tiêu, bao gồm cả đa xử lý.

Bộ sưu tập số liệu

Như đã đề cập ở trên, thư viện cung cấp điểm cuối theo mặc định /số liệu trong một ứng dụng Flask, ứng dụng này có thể đóng vai trò là mục tiêu cho Người xây dựng Prometheus.

Trong ví dụ về bảng điều khiển ở trên, bạn có thể nhắm mục tiêu Prometheus của mình đến ứng dụng Flask với cài đặt mặc định với cấu hình này:

scrape_configs:
  - job_name: 'example'

    dns_sd_configs:
      - names: ['app']
        port: 5000
        type: A
        refresh_interval: 5s

Xem ví dụ đầy đủ tại kho GitHub. Điều này giả định rằng Prometheus có thể tìm thấy các phiên bản ứng dụng Flask của bạn trên http://app:5000/metrics, trong đó tên miền ứng dụng có thể phân giải thành nhiều địa chỉ IP, chẳng hạn như khi chạy trong Kubernetes hoặc Docker bầy.

Nếu việc hiển thị điểm cuối số liệu theo cách này không phù hợp với bạn, có lẽ vì bạn không muốn cho phép truy cập từ bên ngoài vào nó, bạn có thể dễ dàng vô hiệu hóa nó bằng cách chuyển đường dẫn=Không có khi tạo một cá thể PrometheusSố liệu.

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app, path=None)

...

metrics.start_http_server(5099)

Sau đó, bạn có thể sử dụng start_http_server(cổng)để mở điểm cuối này trên một cổng HTTP khác, 5099 trong ví dụ trên. Ngoài ra, nếu bạn hài lòng với điểm cuối nằm trong cùng một ứng dụng Flask, nhưng bạn cần thay đổi đường dẫn của nó từ /số liệu, bạn có thể chuyển một URI khác làm tham số đường dẫn hoặc sử dụng register_endpoint(..)để cài đặt nó sau.

tài liệu tham khảo

Nếu bạn quyết định dùng thử, vui lòng mở một vấn đề trên GitHub hoặc để lại nhận xét, phản hồi và đề xuất của bạn!

Cảm ơn bạn!

Nguồn: www.habr.com

Thêm một lời nhận xét