使用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读取html中指定元素生成excle文件示例
Apr 03 Python
从Python的源码浅要剖析Python的内存管理
Apr 16 Python
Python通过poll实现异步IO的方法
Jun 04 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
Python给你的头像加上圣诞帽
Jan 04 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
Apr 08 Python
Pycharm调试程序技巧小结
Aug 08 Python
BeautifulSoup中find和find_all的使用详解
Dec 07 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
JAVA/JSP学习系列之四
2006/10/09 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
javascript中this指向详解
2016/04/23 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python fabric实现远程操作和部署示例
2014/03/25 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
Python 实现随机数详解及实例代码
2017/04/15 Python
python使用opencv读取图片的实例
2017/08/17 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
python实现字符串和数字拼接
2020/03/02 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
个人贷款担保书
2014/04/01 职场文书
小学二年级学生评语
2014/04/21 职场文书
会计求职信
2014/05/29 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
分享Python异步爬取知乎热榜
2022/04/12 Python
Elasticsearch 索引操作和增删改查
2022/04/19 Python