使用Python編寫(xiě)Prometheus監(jiān)控的方法
要使用python編寫(xiě)Prometheus監(jiān)控,需要你先開(kāi)啟Prometheus集群??梢詤⒖?a href="http://www.dbjr.com.cn/article/148895.htm">//www.dbjr.com.cn/article/148895.htm 安裝。在python中實(shí)現(xiàn)服務(wù)器端。在Prometheus中配置請(qǐng)求網(wǎng)址,Prometheus會(huì)定期向該網(wǎng)址發(fā)起申請(qǐng)獲取你想要返回的數(shù)據(jù)。
使用Python和Flask編寫(xiě)Prometheus監(jiān)控
Installation
pip install flask pip install prometheus_client
Metrics
Prometheus提供4種類型Metrics:Counter
, Gauge
, Summary
和Histogram
Counter
Counter可以增長(zhǎng),并且在程序重啟的時(shí)候會(huì)被重設(shè)為0,常被用于任務(wù)個(gè)數(shù),總處理時(shí)間,錯(cuò)誤個(gè)數(shù)等只增不減的指標(biāo)。
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("request_count", "Total request cout of the host") @app.route("/metrics") def requests_count(): requests_total.inc() # requests_total.inc(2) return Response(prometheus_client.generate_latest(requests_total), mimetype="text/plain") @app.route('/') def index(): requests_total.inc() return "Hello World" if __name__ == "__main__": app.run(host="0.0.0.0")
運(yùn)行該腳本,訪問(wèn)youhost:5000/metrics
# HELP request_count Total request cout of the host # TYPE request_count counter request_count 3.0
Gauge
Gauge與Counter類似,唯一不同的是Gauge數(shù)值可以減少,常被用于溫度、利用率等指標(biāo)。
import random import prometheus_client from prometheus_client import Gauge from flask import Response, Flask app = Flask(__name__) random_value = Gauge("random_value", "Random value of the request") @app.route("/metrics") 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="0.0.0.0")
運(yùn)行該腳本,訪問(wèn)youhost:5000/metrics
# HELP random_value Random value of the request # TYPE random_value gauge random_value 3.0
Summary/Histogram
Summary/Histogram概念比較復(fù)雜,一般exporter很難用到,暫且不說(shuō)。
LABELS
使用labels來(lái)區(qū)分metric的特征
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()
使用Python和asyncio編寫(xiě)Prometheus監(jiān)控
from prometheus_client import Counter, Gauge from prometheus_client.core import CollectorRegistry REGISTRY = CollectorRegistry(auto_describe=False) requests_total = Counter("request_count", "Total request cout of the host", registry=REGISTRY) random_value = Gauge("random_value", "Random value of the request", registry=REGISTRY)
import prometheus_client from prometheus_client import Counter,Gauge from prometheus_client.core import CollectorRegistry from aiohttp import web import aiohttp import asyncio import uvloop import random,logging,time,datetime asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) routes = web.RouteTableDef() # metrics包含 requests_total = Counter("request_count", "Total request cout of the host") # 數(shù)值只增 random_value = Gauge("random_value", "Random value of the request") # 數(shù)值可大可小 @routes.get('/metrics') async def metrics(request): requests_total.inc() # 計(jì)數(shù)器自增 # requests_total.inc(2) data = prometheus_client.generate_latest(requests_total) return web.Response(body = data,content_type="text/plain") # 將計(jì)數(shù)器的值返回 @routes.get("/metrics2") async def metrics2(request): random_value.set(random.randint(0, 10)) # 設(shè)置值任意值,但是一定要為 整數(shù)或者浮點(diǎn)數(shù) return web.Response(body = prometheus_client.generate_latest(random_value),content_type="text/plain") # 將值返回 @routes.get('/') async def hello(request): return web.Response(text="Hello, world") # 使用labels來(lái)區(qū)分metric的特征 c = Counter('requests_total', 'HTTP requests total', ['method', 'clientip']) # 添加lable的key, c.labels('get', '127.0.0.1').inc() #為不同的label進(jìn)行統(tǒng)計(jì) c.labels('post', '192.168.0.1').inc(3) #為不同的label進(jìn)行統(tǒng)計(jì) c.labels(method="get", clientip="192.168.0.1").inc() #為不同的label進(jìn)行統(tǒng)計(jì) g = Gauge('my_inprogress_requests', 'Description of gauge',['mylabelname']) g.labels(mylabelname='str').set(3.6) #value自己定義,但是一定要為 整數(shù)或者浮點(diǎn)數(shù) if __name__ == '__main__': logging.info('server start:%s'% datetime.datetime.now()) app = web.Application(client_max_size=int(2)*1024**2) # 創(chuàng)建app,設(shè)置最大接收?qǐng)D片大小為2M app.add_routes(routes) # 添加路由映射 web.run_app(app,host='0.0.0.0',port=2222) # 啟動(dòng)app logging.info('server close:%s'% datetime.datetime.now())
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
簡(jiǎn)單的Apache+FastCGI+Django配置指南
這篇文章主要介紹了簡(jiǎn)單的Apache+FastCGI+Django配置指南,這也是Python上最流行的web框架Django的最流行搭配環(huán)境:)需要的朋友可以參考下2015-07-07Python MySQLdb模塊連接操作mysql數(shù)據(jù)庫(kù)實(shí)例
這篇文章主要介紹了Python MySQLdb模塊連接操作mysql數(shù)據(jù)庫(kù)實(shí)例,本文直接給出操作mysql代碼實(shí)例,包含創(chuàng)建表、插入數(shù)據(jù)、插入多條數(shù)據(jù)、查詢數(shù)據(jù)等內(nèi)容,需要的朋友可以參考下2015-04-04Python爬蟲(chóng)使用代理IP的實(shí)現(xiàn)
這篇文章主要介紹了Python爬蟲(chóng)使用代理IP的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10python實(shí)現(xiàn)報(bào)表自動(dòng)化詳解
這篇文章主要介紹了python實(shí)現(xiàn)報(bào)表自動(dòng)化詳解,涉及python讀,寫(xiě)excel—xlwt常用功能,xlutils 常用功能,xlwt寫(xiě)Excel時(shí)公式的應(yīng)用等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11python的構(gòu)建工具setup.py的方法使用示例
本篇文章主要介紹了python的構(gòu)建工具setup.py的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10python dict 相同key 合并value的實(shí)例
今天小編就為大家分享一篇python dict 相同key 合并value的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01