使用Python编写Prometheus监控的方法


Posted in Python onOctober 15, 2018

要使用python编写Prometheus监控,需要你先开启Prometheus集群。可以参考//3water.com/article/148895.htm 安装。在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())

总结

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

Python 相关文章推荐
python获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
Python变量和数据类型详解
Feb 15 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
python编写暴力破解zip文档程序的实例讲解
Apr 24 Python
python 在屏幕上逐字显示一行字的实例
Dec 24 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Python request使用方法及问题总结
Apr 26 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
如何验证python安装成功
Jul 06 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
python取数作为临时极大值(极小值)的方法
Oct 15 #Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 #Python
Python并行分布式框架Celery详解
Oct 15 #Python
对Python 内建函数和保留字详解
Oct 15 #Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 #Python
便捷提取python导入包的属性方法
Oct 15 #Python
Django安装配置mysql的方法步骤
Oct 15 #Python
You might like
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP之header函数详解
2021/03/02 PHP
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
浅析vue 函数配置项watch及函数 $watch 源码分享
2018/11/22 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
vue中对象数组去重的实现
2020/02/06 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
Python itertools模块详解
2015/05/09 Python
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
Django实现自定义404,500页面教程
2017/03/26 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
python写一个随机点名软件的实例
2019/11/28 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Python hashlib模块的使用示例
2020/10/09 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
四年级语文教学反思
2016/03/03 职场文书
学生安全责任协议书
2016/03/22 职场文书