使用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在windows命令行下输出彩色文字的方法
Mar 19 Python
Python基于pygame实现的font游戏字体(附源码)
Nov 11 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Django 跨域请求处理的示例代码
May 02 Python
利用Python如何批量更新服务器文件
Jul 29 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
python进行TCP端口扫描的实现
Dec 21 Python
python pandas时序处理相关功能详解
Jul 03 Python
Django中Middleware中的函数详解
Jul 18 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
Django模板获取field的verbose_name实例
May 19 Python
教你使用Pandas直接核算Excel中快递费用
May 12 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 fclose函数用法总结
2019/02/15 PHP
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
详谈js模块化规范
2017/07/07 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
TensorFlow变量管理详解
2018/03/10 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
认识深刻的检讨书
2014/02/16 职场文书
公司营业员的自我评价
2014/03/04 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
2014年度培训工作总结
2014/11/27 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
校园开放日新闻稿
2015/07/17 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android