使用Python编写Prometheus监控metrics接口

进大厂,身价翻倍的法宝来了!

主讲内容:docker/kubernetes 云原生技术,大数据架构,分布式微服务,自动化测试、运维。

视频地址:ke.qq.com/course/419718


全栈工程师开发手册 (作者:栾鹏)
架构系列文章

要使用python编写Prometheus监控,需要你先开启Prometheus集群。可以参考https://blog.csdn.net/luanpeng825485697/article/details/80905585 安装。在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")

# 如果只返回一个metrics
@app.route("/metrics")
def requests_count():
    requests_total.inc()
    # requests_total.inc(2)
    return Response(prometheus_client.generate_latest(requests_total),mimetype="text/plain")


# 如果返回多个metrics
#### 定义一个仓库,存放数据
REGISTRY = CollectorRegistry(auto_describe=False)
muxStatus = Gauge("mux_api_21","Api response stats is:",registry=REGISTRY)
manageStatus = Gauge("manage_api_21","Api response stats is:",registry=REGISTRY)

#### 定义路由
@app.route("/metrics")
def ApiResponse():
    muxStatus.set(muxCode)
    manageStatus.set(manageCode)
    return Response(prometheus_client.generate_latest(REGISTRY),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很难用到,暂且不说。

PLUS

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()

REGISTRY

#使用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")  # 数值可大可小


# 如果返回一个metrics
@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")   # 将计数器的值返回

# 如果返回多个metrics
参考flask中的写法




@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())

你可能感兴趣的:(架构,微服务架构)