Python 및 Flask 기반 Prometheus 모니터링 작성 방법
8172 단어 PythonFlaskPrometheus모니터링
Prometheus의 기본 원리는 HTTP를 통해 감시된 구성 요소의 상태를 주기적으로 캡처하는 것이다.
모든 구성 요소는 대응하는 HTTP 인터페이스를 제공하고 Prometheus가 정의한 데이터 형식에 부합하기만 하면 Prometheus 모니터링에 접근할 수 있다.
Prometheus Server는 지정된 시간에 대상에 metrics(지표) 데이터를 캡처하여 로컬 저장소에 저장합니다.이것은 Pull(당김) 방식으로 데이터를 얻는데 클라이언트의 복잡도를 낮출 뿐만 아니라 클라이언트는 데이터만 수집할 수 있고 서비스 측의 상황을 알 필요가 없을 뿐만 아니라 서비스 측이 더욱 편리하게 수평적으로 확장할 수 있다.
모니터링 데이터가 경고 한도값에 도달하면 Prometheus Server는 HTTP를 통해 경고 모듈alertmanger에 경고를 보내고 경고 억제를 통해 메일이나 Webhook을 터치합니다.Prometheus는 PromQL을 지원하여 다차원 데이터 모델과 유연한 조회를 제공하고 모니터링 지표와 여러 개의 tag를 연결하는 방식으로 모니터링 데이터를 임의의 차원으로 조합하고 집합한다.
python에서 서버 사이드를 실현하고 대외적으로 인터페이스를 제공합니다.Prometheus에서 요청 주소를 설정하면 Prometheus는 정기적으로 이 주소로 돌아가고 싶은 데이터를 요청합니다.
또한 Prometheus는 4가지 유형의 Metrics:Counter, Gauge, Summary, Histogram을 제공합니다.
준비
pip install flask
pip install prometheus_client
Counter
Counter는 성장할 수 있고 프로그램이 다시 시작될 때 0으로 재설정됩니다. 방문량, 작업 개수, 총 처리 시간, 오류 개수 등 줄지 않는 지표에만 사용됩니다.
정의하려면 2개의 매개 변수가 필요합니다. 첫 번째는 metrics의 이름이고, 두 번째는 metrics의 설명 정보입니다.
c = Counter('c1', 'A counter')
counter는 증가할 수 밖에 없기 때문에 오직 한 가지 방법:
def inc(self, amount=1):
'''Increment counter by the given amount.'''
if amount < 0:
raise ValueError('Counters can only be incremented by non-negative amounts.')
self._value.inc(amount)
테스트 예:
import prometheus_client
from prometheus_client import Counter
from prometheus_client.core import CollectorRegistry
from flask import Response, Flask
app = Flask(__name__)
requests_total = Counter('c1','A counter')
@app.route("/api/metrics/count/")
def requests_count():
requests_total.inc(1)
# requests_total.inc(2)
return Response(prometheus_client.generate_latest(requests_total),mimetype="text/plain")
if __name__ == "__main__":
app.run(host="127.0.0.1",port=8081)
방문http://127.0.0.1:8081/api/metrics/count/:# HELP c1_total A counter
# TYPE c1_total counter
c1_total 1.0
# HELP c1_created A counter
# TYPE c1_created gauge
c1_created 1.6053265493727107e+09
HELP는 c1에 대한 설명으로 Counter 정의를 작성합니다.
TYPE은 c1의 유형 설명입니다.
c1_total이 정의한 지표 출력: 접미사가 많아질 거예요_Total, OpenMetrics와 Prometheus 텍스트 형식 간의 호환성 때문에 OpenMetrics는 _토탈 접미사.
gauge
gauge는 추가할 수 있고 줄일 수 있으며 임의로 설정할 수 있습니다.
예를 들어 현재의 CPU 온도, 메모리 사용량, 디스크, 네트워크 흐름 등을 설정할 수 있다.
정의는 counter와 기본적으로 같습니다.
from prometheus_client import Gauge
g = Gauge('my_inprogress_requests', 'Description of gauge')
g.inc() # Increment by 1
g.dec(10) # Decrement by given value
g.set(4.2) # Set to a given value
방법:
def inc(self, amount=1):
'''Increment gauge by the given amount.'''
self._value.inc(amount)
def dec(self, amount=1):
'''Decrement gauge by the given amount.'''
self._value.inc(-amount)
def set(self, value):
'''Set gauge to the given value.'''
self._value.set(float(value))
테스트 예:
import random
import prometheus_client
from prometheus_client import Gauge
from prometheus_client.core import CollectorRegistry
from flask import Response, Flask
app = Flask(__name__)
random_value = Gauge("g1", 'A gauge')
@app.route("/api/metrics/gauge/")
def r_value():
random_value.set(random.randint(0, 10))
return Response(prometheus_client.generate_latest(random_value),
mimetype="text/plain")
if __name__ == "__main__":
app.run(host="127.0.0.1",port=8081)
방문http://127.0.0.1:8081/api/metrics/gauge/# HELP g1 A gauge
# TYPE g1 gauge
g1 5.0
LABELS 사용법
labels를 사용하여 metric의 특징을 구분하는데 하나의 지표는 그 중의 label이 있을 수도 있고 여러 개의 label이 있을 수도 있다.
from prometheus_client import Counter
c = Counter('requests_total', 'HTTP requests total', ['method', 'clientip'])
c.labels('get', '127.0.0.1').inc()
c.labels('post', '192.168.0.1').inc(3)
c.labels(method="get", clientip="192.168.0.1").inc()
import random
import prometheus_client
from prometheus_client import Gauge
from flask import Response, Flask
app = Flask(__name__)
c = Gauge("c1", 'A counter',['method','clientip'])
@app.route("/api/metrics/counter/")
def r_value():
c.labels(method='get',clientip='192.168.0.%d' % random.randint(1,10)).inc()
return Response(prometheus_client.generate_latest(c),
mimetype="text/plain")
if __name__ == "__main__":
app.run(host="127.0.0.1",port=8081)
연속 9 회 액세스http://127.0.0.1:8081/api/metrics/counter/:# HELP c1 A counter
# TYPE c1 gauge
c1{clientip="192.168.0.7",method="get"} 2.0
c1{clientip="192.168.0.1",method="get"} 1.0
c1{clientip="192.168.0.8",method="get"} 1.0
c1{clientip="192.168.0.5",method="get"} 2.0
c1{clientip="192.168.0.4",method="get"} 1.0
c1{clientip="192.168.0.10",method="get"} 1.0
c1{clientip="192.168.0.2",method="get"} 1.0
histogram
이런 것은 주로 백분위를 통계하는 데 쓰이는데, 무엇이 백분위입니까?영어는 quantiles라고 합니다.
예를 들어 100개의 방문 요청의 소모 시간이 있습니다. 그것들을 작은 것에서 큰 것으로 정렬하고 90번째 시간은 200ms입니다. 그러면 우리는 요청의 90%가 200ms보다 작다고 말할 수 있습니다. 이것을'90분위는 200ms'라고 하는데 서비스의 기본적인 질을 반영할 수 있습니다.물론 91번째 시간이 2000ms일지도 모르니 말할 수 없다.
실제 상황은 우리가 매일 방문량이 적어도 몇 억 위안은 되기 때문에 모든 방문 데이터를 저장한 후에 90분의 위치를 찾는 시간이 얼마나 되는지 정렬할 수 없다.따라서 이와 같은 문제는 모두 일부 추산 알고리즘으로 처리했기 때문에 모든 데이터를 저장할 필요가 없다. 이 안에 수학 원리가 비교적 고급스러우므로 프로메테우스의 용법을 직접 살펴보자.
먼저 histogram을 정의합니다.
h = Histogram('hh', 'A histogram', buckets=(-5, 0, 5))
첫 번째는metrics의 이름이고, 두 번째는 묘사이고, 세 번째는 통별 설정입니다. 중점적으로 버킷을 말씀드리겠습니다.여기(-5,0,5)는 실제적으로 몇 가지 통으로 나뉜다. (무궁소,-5],(-5,0,5],(5,무궁대).
하면, 만약, 만약...
h.observe(8)
그러면 metrics는 다음과 같이 출력됩니다.
# HELP hh A histogram
# TYPE hh histogram
hh_bucket{le="-5.0"} 0.0
hh_bucket{le="0.0"} 0.0
hh_bucket{le="5.0"} 0.0
hh_bucket{le="+Inf"} 1.0
hh_count 1.0
hh_sum 8.0
hh_sum는observe의 총계를 기록하고count는observe의 횟수를 기록한다.bucket은 각종 통이다.le는 <=어떤 값을 나타낸다.
이를 통해 알 수 있듯이 값은 8<= 무한대이기 때문에 마지막 통만 1회를 계산했다(주의, 통은 계수일 뿐, 버킷 작용은 통계 견본이 서로 다른 구간에서 나타나는 횟수에 해당한다).
bucket의 구분은 우리가 데이터의 분포에 따라 머리를 두드려 지정해야 한다. 합리적인 구분은 promql가 백분위를 추산할 때 더욱 정확할 수 있다. 우리가histogram을 사용할 때 통을 먼저 나누고 끊임없이 점수를 매기면 된다. 최종 백분위의 계산은histogram의 원시 데이터를 바탕으로 완성할 수 있다.
테스트 예:
import random
import prometheus_client
from prometheus_client import Histogram
from flask import Response, Flask
app = Flask(__name__)
h = Histogram("h1", 'A Histogram', buckets=(-5, 0, 5))
@app.route("/api/metrics/histogram/")
def r_value():
h.observe(random.randint(-5, 5))
return Response(prometheus_client.generate_latest(h),
mimetype="text/plain")
if __name__ == "__main__":
app.run(host="127.0.0.1",port=8081)
연속 액세스http://127.0.0.1:8081/api/metrics/histogram/:# HELP h1 A Histogram
# TYPE h1 histogram
h1_bucket{le="-5.0"} 0.0
h1_bucket{le="0.0"} 5.0
h1_bucket{le="5.0"} 10.0
h1_bucket{le="+Inf"} 10.0
h1_count 10.0
# HELP h1_created A Histogram
# TYPE h1_created gauge
h1_created 1.6053319432993534e+09
summary
python 클라이언트가summary 알고리즘을 완전하게 실현하지 못했습니다. 여기는 소개하지 않습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.