使用Python编写Prometheus监控的方法
程序员文章站
2023-01-29 18:53:06
要使用python编写prometheus监控,需要你先开启prometheus集群。可以参考 安装。在python中实现服务器端。在prometheus中配置请求网址,p...
要使用python编写prometheus监控,需要你先开启prometheus集群。可以参考 安装。在python中实现服务器端。在prometheus中配置请求网址,prometheus会定期向该网址发起申请获取你想要返回的数据。
使用python和flask编写prometheus监控
installation
pip install flask pip install prometheus_client
metrics
prometheus提供4种类型metrics:counter
, gauge
, summary
和histogram
counter
counter可以增长,并且在程序重启的时候会被重设为0,常被用于任务个数,总处理时间,错误个数等只增不减的指标。
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")
运行该脚本,访问youhost:5000/metrics
# help request_count total request cout of the host # type request_count counter request_count 3.0
gauge
gauge与counter类似,唯一不同的是gauge数值可以减少,常被用于温度、利用率等指标。
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")
运行该脚本,访问youhost:5000/metrics
# help random_value random value of the request # type random_value gauge random_value 3.0
summary/histogram
summary/histogram概念比较复杂,一般exporter很难用到,暂且不说。
labels
使用labels来区分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编写prometheus监控
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") # 数值只增 random_value = gauge("random_value", "random value of the request") # 数值可大可小 @routes.get('/metrics') async def metrics(request): requests_total.inc() # 计数器自增 # requests_total.inc(2) data = prometheus_client.generate_latest(requests_total) return web.response(body = data,content_type="text/plain") # 将计数器的值返回 @routes.get("/metrics2") async def metrics2(request): random_value.set(random.randint(0, 10)) # 设置值任意值,但是一定要为 整数或者浮点数 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来区分metric的特征 c = counter('requests_total', 'http requests total', ['method', 'clientip']) # 添加lable的key, c.labels('get', '127.0.0.1').inc() #为不同的label进行统计 c.labels('post', '192.168.0.1').inc(3) #为不同的label进行统计 c.labels(method="get", clientip="192.168.0.1").inc() #为不同的label进行统计 g = gauge('my_inprogress_requests', 'description of gauge',['mylabelname']) g.labels(mylabelname='str').set(3.6) #value自己定义,但是一定要为 整数或者浮点数 if __name__ == '__main__': logging.info('server start:%s'% datetime.datetime.now()) app = web.application(client_max_size=int(2)*1024**2) # 创建app,设置最大接收图片大小为2m app.add_routes(routes) # 添加路由映射 web.run_app(app,host='0.0.0.0',port=2222) # 启动app logging.info('server close:%s'% datetime.datetime.now())
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
上一篇: ECMA-262关键词及其作用