使用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 相关文章推荐
详解Django框架中的视图级缓存
Jul 23 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
python判断数字是否是超级素数幂
Sep 27 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
Django中自定义查询对象的具体使用
Oct 13 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
Apr 07 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
Python和Bash结合在一起的方法
Nov 13 Python
python 如何读、写、解析CSV文件
Mar 03 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
文章推荐系统(三)
2006/10/09 PHP
PHP的5个安全措施小结
2012/07/17 PHP
php获取linux命令结果的实例
2017/03/13 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
ExtJS 入门
2010/10/29 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
js判断密码强度的方法
2020/03/18 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
基于python实现查询ip地址来源
2020/06/02 Python
Python调用C语言程序方法解析
2020/07/07 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
银行员工职业规划范文
2014/01/21 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
领导班子四风表现材料
2014/08/23 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年班组长工作总结
2014/11/20 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
公司与个人合作协议书
2016/03/19 职场文书
详解php中流行的rpc框架
2021/05/29 PHP
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android