使用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 相关文章推荐
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
Python编写生成验证码的脚本的教程
May 04 Python
Python学习思维导图(必看篇)
Jun 26 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
mac下pycharm设置python版本的图文教程
Jun 13 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
详解python tkinter教程-事件绑定
Mar 28 Python
Python内置random模块生成随机数的方法
May 31 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
python3 sleep 延时秒 毫秒实例
May 04 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在不同页面间传递Json数据示例代码
2013/06/08 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
起点页面传值js,有空研究学习下
2010/01/25 Javascript
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
Python算法之图的遍历
2017/11/16 Python
Django 使用logging打印日志的实例
2018/04/28 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
Django 自定义分页器的实现代码
2019/11/24 Python
python实现批量转换图片为黑白
2020/06/16 Python
Django celery异步任务实现代码示例
2020/11/26 Python
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
关于Java String的一道面试题
2013/09/29 面试题
医院护士工作检讨书
2014/10/26 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
LeetCode189轮转数组python示例
2022/08/05 Python