ตรวจสอบไมโครเซอร์วิสของ Flask ด้วย Prometheus

โค้ดสองสามบรรทัดและแอปพลิเคชันของคุณสร้างเมตริก ว้าว!

เพื่อให้เข้าใจว่าโพรมีธีอุสทำงานอย่างไร_กระติกน้ำ_ผู้ส่งออก ตัวอย่างขั้นต่ำก็เพียงพอแล้ว:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

นั่นคือทั้งหมดที่คุณต้องเริ่มต้น! โดยเพิ่มการนำเข้าและบรรทัดสำหรับการเริ่มต้น โพรเมตริกคุณจะได้รับเมตริก ระยะเวลาขอ и ขอเคาน์เตอร์แสดงที่ปลายทาง /ตัวชี้วัด แอพ Flask ที่ลงทะเบียนไว้ รวมถึงเมตริกเริ่มต้นที่คุณได้รับจากฐาน ห้องสมุดไคลเอนต์ Prometheus.

คุณสามารถหา ตัวอย่างการใช้งานง่าย ในที่เก็บ GitHub ที่เรียกใช้อินสแตนซ์ โพร и กราฟาน่า พร้อมกับแอปพลิเคชันสาธิตสำหรับสร้างเมตริกที่จะมีลักษณะดังนี้:

ตรวจสอบไมโครเซอร์วิสของ Flask ด้วย Prometheus

คุณจะพบรายการตัวบ่งชี้ใน README ตัวอย่างที่ปรากฏในแดชบอร์ดพร้อมกับคิวรี Prometheus ที่เติมแดชบอร์ด

การตั้งค่า

ห้องสมุดมีตัวเลือกการกำหนดค่ามากมาย ลองดูที่ README แสดงตัวอย่างของพวกเขาพร้อมคำอธิบายสั้น ๆ

การกำหนดค่าพื้นฐานแสดงไว้ด้านบน เพียงแค่ยกตัวอย่าง โพรเมตริกขอเรียกมันว่า ตัวชี้วัดแล้วใช้เพื่อกำหนดเมตริกเพิ่มเติมที่คุณต้องการรวบรวมโดยการตกแต่งฟังก์ชัน:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

ตัวนับจะนับการโทรและส่วนที่เหลือจะรวบรวมเมตริกตามระยะเวลาของการโทรเหล่านั้น คุณสามารถกำหนดป้ายกำกับสำหรับแต่ละรายการ โดยอาจใช้คุณสมบัติคำขอหรือการตอบสนอง ตัวอย่างเช่น:

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

ในตัวอย่างด้านบน ให้คลิกที่จุดสิ้นสุด /collection/10002/item/76 จะทำให้ตัวนับเพิ่มขึ้นเช่น cnt_collection{collection = "10002", สถานะ = "200"}และคุณจะได้รับเมตริกเริ่มต้น (สำหรับแต่ละจุดสิ้นสุดในตัวอย่างนี้) จากไลบรารีเริ่มต้น:

  • flask_http_request_duration_seconds - ระยะเวลาคำขอ HTTP เป็นวินาทีสำหรับคำขอ Flask ทั้งหมดตามวิธีการ เส้นทาง และสถานะ

  • flask_http_request_total — จำนวนคำขอ HTTP ทั้งหมดตามวิธีการและสถานะ

มีตัวเลือกในการข้ามการติดตามปลายทางบางจุด ลงทะเบียนเมตริกเริ่มต้นเพิ่มเติมหรือข้ามรายการข้างต้น หรือใช้เมตริกที่กำหนดเองเดียวกันกับปลายทางหลายรายการ เช็คเอาท์ README โครงการเพื่อดูว่ามีอะไรบ้าง

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}
    )
)

ไลบรารีมีส่วนขยายที่มีประโยชน์สำหรับไลบรารีมัลติโปรเซสเซอร์ยอดนิยม เช่น uWSGI และ Gunicorn คุณยังสามารถหาตัวอย่างเล็กๆ น้อยๆ ของกรณีการใช้งานเป้าหมาย รวมถึงการประมวลผลหลายตัว

การรวบรวมเมตริก

ตามที่กล่าวไว้ข้างต้น ไลบรารีเริ่มต้นจัดเตรียมจุดสิ้นสุด /ตัวชี้วัด ในแอปพลิเคชัน Flask ซึ่งสามารถทำหน้าที่เป็นเป้าหมายสำหรับ ผู้ประกอบ Prometheus.

ในตัวอย่างแดชบอร์ดด้านบน คุณสามารถกำหนดเป้าหมาย Prometheus ของคุณไปยังแอป Flask ด้วยการตั้งค่าเริ่มต้นดังนี้:

scrape_configs:
  - job_name: 'example'

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

ดูตัวอย่างเต็มได้ที่ ที่เก็บ GitHub. สิ่งนี้ถือว่า Prometheus สามารถค้นหาอินสแตนซ์แอปพลิเคชัน Flask ของคุณได้ที่ http://app:5000/metricsซึ่งชื่อโดเมนของแอปพลิเคชันอาจแปลงเป็นที่อยู่ IP ได้หลายที่อยู่ เช่น เมื่อเรียกใช้ Kubernetes หรือ ฝูงนักเทียบท่า.

หากการเปิดเผยปลายทางเมตริกเช่นนี้ไม่เหมาะกับคุณ อาจเป็นเพราะคุณไม่ต้องการอนุญาตการเข้าถึงจากภายนอก คุณสามารถปิดใช้งานได้โดยผ่าน เส้นทาง = ไม่มี เมื่อยกตัวอย่าง โพรเมตริก.

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

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

...

metrics.start_http_server(5099)

จากนั้นคุณสามารถใช้ start_http_server (พอร์ต)เพื่อเปิดตำแหน่งข้อมูลนี้บนพอร์ต HTTP อื่น 5099 ในตัวอย่างข้างต้น อีกทางหนึ่ง หากคุณพอใจกับจุดสิ้นสุดที่อยู่ในแอป Flask เดียวกัน แต่จำเป็นต้องเปลี่ยนเส้นทางจาก /ตัวชี้วัดคุณสามารถส่ง URI อื่นเป็นพารามิเตอร์เส้นทางหรือใช้ register_endpoint(..)เพื่อติดตั้งในภายหลัง

การอ้างอิง

หากคุณตัดสินใจที่จะลองใช้ อย่าลังเลที่จะเปิดประเด็นบน GitHub หรือแสดงความคิดเห็น ข้อเสนอแนะ และข้อเสนอแนะของคุณ!

ขอบคุณ!

ที่มา: will.com

เพิ่มความคิดเห็น