使用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对字典进行排序实例
Sep 25 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
May 20 Python
Python命令启动Web服务器实例详解
Feb 23 Python
对numpy中轴与维度的理解
Apr 18 Python
Python中psutil的介绍与用法
May 02 Python
python 随机生成10位数密码的实现代码
Jun 27 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
Python实现图像的垂直投影示例
Jan 17 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 Python
教你怎么用Python监控愉客行车程
Apr 29 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
国内咖啡文化
2021/03/03 咖啡文化
PHP安装问题
2006/10/09 PHP
PHP一些有意思的小区别
2006/12/06 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
php魔术变量用法实例详解
2014/11/13 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
php中this关键字用法分析
2016/12/07 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
python实现获取Ip归属地等信息
2016/08/27 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
结构和类有什么异同
2012/07/16 面试题
旅游管理专业个人求职信范文
2013/12/24 职场文书
创建文明学校实施方案
2014/03/11 职场文书
仓库规划计划书
2014/04/28 职场文书
化工专业自荐书
2014/06/16 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
刘公岛导游词
2015/02/05 职场文书
初中毕业感言300字
2015/07/31 职场文书
股东出资协议书
2016/03/21 职场文书
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis