当前位置: 移动技术网 > IT编程>脚本编程>Python > 使用Python编写Prometheus监控的方法

使用Python编写Prometheus监控的方法

2018年11月09日  | 移动技术网IT编程  | 我要评论

经纬论坛,夏茗悠博客,一刀插件51cqg

要使用python编写prometheus监控,需要你先开启prometheus集群。可以参考 安装。在python中实现服务器端。在prometheus中配置请求网址,prometheus会定期向该网址发起申请获取你想要返回的数据。

使用python和flask编写prometheus监控

installation

pip install flask
pip install prometheus_client

metrics

prometheus提供4种类型metrics:counter, gauge, summaryhistogram

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


总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对移动技术网的支持。如果你想了解更多相关内容请查看下面相关链接

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网