使用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中逻辑运算符的使用
May 13 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
Python实现学校管理系统
Jan 11 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
python脚本和网页有何区别
Jul 02 Python
Python列表推导式实现代码实例
Sep 09 Python
用python批量下载apk
Dec 29 Python
Python图像处理之图像拼接
Apr 28 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
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
简单了解python的break、continue、pass
2019/07/08 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
老公给老婆的道歉信
2014/01/10 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
致全体运动员广播稿
2014/02/01 职场文书
技能竞赛活动方案
2014/02/21 职场文书
关爱留守儿童标语
2014/06/18 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
数学教师个人工作总结
2015/02/06 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
Python中re模块的元字符使用小结
2022/04/07 Python