使用Python编写Prometheus监控的方法——转

使用Python编写Prometheus监控的方法

 更新时间:2018年10月15日 16:15:59   作者:数据架构师  

今天小编就为大家分享一篇关于使用Python编写Prometheus监控的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

要使用python编写Prometheus监控,需要你先开启Prometheus集群。可以参考//www.jb51.net/article/148895.htm 安装。在python中实现服务器端。在Prometheus中配置请求网址,Prometheus会定期向该网址发起申请获取你想要返回的数据。

使用Python和Flask编写Prometheus监控

Installation

1

2

pip install flask

pip install prometheus_client

Metrics

Prometheus提供4种类型Metrics:CounterGaugeSummaryHistogram

Counter

Counter可以增长,并且在程序重启的时候会被重设为0,常被用于任务个数,总处理时间,错误个数等只增不减的指标。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

1

2

3

# HELP request_count Total request cout of the host

# TYPE request_count counter

request_count 3.0

Gauge

Gauge与Counter类似,唯一不同的是Gauge数值可以减少,常被用于温度、利用率等指标。

1

2

3

4

5

6

7

8

9

10

11

12

13

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

1

2

3

# HELP random_value Random value of the request

# TYPE random_value gauge

random_value 3.0

Summary/Histogram

Summary/Histogram概念比较复杂,一般exporter很难用到,暂且不说。

LABELS

使用labels来区分metric的特征

1

2

3

4

5

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监控

1

2

3

4

5

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)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

你可能感兴趣的:(prometheus)