调研使用 python 开发 Prometheus 自定义监控插件
大家好,我是Linux运维工程师 Linke,技术过硬,从不挖坑。这回由于要新做一个中小型网站,百十来个节点,做了一个 40 来个节点的k8s,所以计划只用Prometheus 做监控。于是乎,就有了下面的故事端口监控的代码,放到下一个文档中,此文档记录如何测试的。Prometheus提供4种类型Metrics:Counter, Gauge, Summary和Histogram目前我只用了...
大家好,我是Linux运维工程师 Linke,技术过硬,从不挖坑。
这回由于要新做一个中小型网站,百十来个节点,做了一个 40 来个节点的k8s,所以计划只用Prometheus 做监控。于是乎,就有了下面的故事
端口监控的代码,放到下一个文档中,此文档记录如何测试的。
Prometheus提供4种类型Metrics:Counter, Gauge, Summary和Histogram
目前我只用了 Gauge ,Gauge数值可以增加可减少。因为我最终要写的是端口监控插件。(此类型的适用于大多监控,抓取的值可增可减)
Counter 类型我做了测试,这个是增长型的,并且在程序重启的时候会被重设为0,常被用于任务个数,总处理时间,错误个数等只增不减的指标。(适用于统计某事务)
下面是对 Counter 类型做的测试
# Prometheus monitor server port.
# YangLin
# -*- coding:utf-8 -*-
import prometheus_client
from prometheus_client import Gauge,Counter
from flask import Response, Flask
# 实例化Flask
app = Flask(__name__)
# 定义metrics仓库,其中request_count是抓取的值的名称,Test num ++是帮助说明
requests_total = Counter("request_count", "Test num ++")
# Flask装饰器
@app.route("/metrics")
def requests_count():
# Counter 类型的仓库使用 inc 方法传值,默认是 1,只支持 int 类型,自己测试,可以传一个2看效果
requests_total.inc()
return Response(prometheus_client.generate_latest(requests_total),mimetype="text/plain")
if __name__ == "__main__":
# 启动 Flask
app.run(host="0.0.0.0", port=31672, debug=True)
上面代码通过浏览器 127.0.0.1:31672/metrics 访问,会得到如下返回:
# HELP request_count_total Test num ++
# TYPE request_count_total counter
request_count_total 1.0
# TYPE request_count_created gauge
request_count_created 1.574763298029324e+09
如果刷新页面,会发现 request_count_total 的值随着刷新在增长。
下面测试 Gauge 类型的测试
来个简单的
# Prometheus monitor server port.
# YangLin
# -*- coding:utf-8 -*-
import prometheus_client
from prometheus_client import Gauge,Counter
from flask import Response, Flask
app = Flask(__name__)
# 定义Gauge 类型
requests_total = Gauge("request_count", "Test num ++")
@app.route("/metrics")
def requests_count():
# 此类型的值是用 set 方法传参,没有默认值,必须要传值,否则报错
requests_total.set(5)
return Response(prometheus_client.generate_latest(requests_total),
mimetype="text/plain")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=31672, debug=True)
上面代码通过浏览器 127.0.0.1:31672/metrics 访问,会得到如下返回:
# HELP request_count Test num ++
# TYPE request_count gauge
request_count 5.0
不论怎么刷新页面,值都是 5.0
通过以上的测试,我最终要写个端口监控,但是我监控的主机端口会很多,因此使用 Gauge 类型。但是上面例子只能每次传一个值。页面也只能一次一下,于是我就又继续测。发现用了 labels 就可以加多个了。
下面是测试 Gauge 类型添加 labels (Counter 是同理)
# Prometheus monitor server port.
# YangLin
# -*- coding:utf-8 -*-
import prometheus_client
from prometheus_client import Gauge,Counter
from flask import Response, Flask
app = Flask(__name__)
# 这次在 Gauge 类型里定义两个 labels,分别是"host"和"port",可以定义多个
port_up = Gauge("Server_port", "monitor server port status.",["host","port"])
@app.route("/metrics")
def requests_count():
# 传入不同的 lables 即可一次获得多项
port_up.labels("192.168.1.22", "2181").set(0)
port_up.labels("192.168.1.33", "2181").set(0)
port_up.labels("192.168.1.44", "2181").set(1)
return Response(prometheus_client.generate_latest(port_up),
mimetype="text/plain")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=31672, debug=True)
这次用了 labels ,可以一次加多组值,只要两个 labels 的值 有一个不一样(一个 labels 的话,值都不能一样)
上面代码通过浏览器 127.0.0.1:31672/metrics 访问,会得到如下返回:
# HELP Server_port monitor server port status.
# TYPE Server_port gauge
Server_port{host=“192.168.1.22”,port=“2181”} 0.0
Server_port{host=“192.168.1.33”,port=“2181”} 0.0
Server_port{host=“192.168.1.44”,port=“2181”} 1.0
以上的测试,基本可以完成我的端口监控了,但是这样的写,labels 那里我需要做一些手段才能一次请求获取到多项变量。于是就接的往下找,看还有没有更简单的方法,然后我就找到了 REGISTRY 方式,这才是正确的打开方式。
Gauge 再加入 registry 测试,妥妥的小仓库。于是乎,就有了下面的测试代码
# Prometheus monitor server port.
# YangLin
# -*- coding:utf-8 -*-
import prometheus_client
from prometheus_client import Gauge,Counter
from prometheus_client.core import CollectorRegistry, REGISTRY
from flask import Response, Flask
app = Flask(__name__)
# 实例化 REGISTRY
REGISTRY = CollectorRegistry(auto_describe=False)
# 这里又加了个 sertype 的 labels,定义的 labels 一定要被用到,否则会报错
port_up = Gauge("Server_port", "monitor server port status.",["sertype","host","port"], registry=REGISTRY)
@app.route("/metrics")
def requests_count():
# 模拟多个值传入
a = [{"sertype": "zookeeper", "host": "192.168.1.22", "port": "2181", "status": 0},
{"sertype": "zookeeper", "host": "192.168.1.33", "port": "2181", "status": 0},
{"sertype": "zookeeper", "host": "192.168.1.44", "port": "2181", "status": 1},
{"sertype": "mysql", "host": "192.168.1.88", "port": "3306", "status": 0},
{"sertype": "mysql", "host": "192.168.1.99", "port": "3306", "status": 1}]
for i in a:
ip = "".join(i.get("host"))
port = "".join(i.get("port"))
status = i.get("status")
sertype = "".join(i.get("sertype"))
port_up.labels(sertype,ip, port).set(status)
return Response(prometheus_client.generate_latest(port_up),
mimetype="text/plain")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=31672, debug=True)
上面代码通过浏览器 127.0.0.1:31672/metrics 访问,会得到如下返回:
# HELP Server_port monitor server port status.
# TYPE Server_port gauge
Server_port{host=“192.168.1.22”,port=“2181”,sertype=“zookeeper”} 0.0
Server_port{host=“192.168.1.33”,port=“2181”,sertype=“zookeeper”} 0.0
Server_port{host=“192.168.1.44”,port=“2181”,sertype=“zookeeper”} 1.0
Server_port{host=“192.168.1.88”,port=“3306”,sertype=“mysql”} 0.0
Server_port{host=“192.168.1.99”,port=“3306”,sertype=“mysql”} 1.0
REGISTRY 的数据仓库方式传值的方式与裸用 Gauge 的方式一样。
好吧,测到这么多,我已经可以用这些来写一个 端口 监控 插件了。详见文档:使用 python 开发 Prometheus 的端口监控监控插件
https://blog.csdn.net/qq_31547771/article/details/103263288
更多推荐
所有评论(0)