调研使用 python 开发 Prometheus 自定义监控插件

大家好,我是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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、prometheus简介 Prometheus是一个开源的系统监控和告警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF维护管理的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控prometheus支持多种exporter采集数据,还支持通过pushgateway进行数据上报,Prometheus再性能上可支撑上万台规模的集群。 二、prometheus架构图 三、prometheus组件介绍 1.Prometheus Server: 用于收集和存储时间序列数据。 2.Client Library: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。 3.Exporters: prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端 4.Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。 5.Grafana:监控仪表盘 6.pushgateway: 各个目标主机可上报数据到pushgatewy,然后prometheus server统一从pushgateway拉取数据。 四、课程亮点 五、效果图展示 六、讲师简介 先超(lucky):高级运维工程师、资深DevOps工程师,在互联网上市公司拥有多年一线运维经验,主导过亿级pv项目的架构设计和运维工作 主要研究方向: 1.云计算方向:容器 (kubernetes、docker),虚拟化(kvm、Vmware vSphere),微服务(istio),PaaS(openshift),IaaS(openstack)等2.系统/运维方向:linux系统下的常用组件(nginx,tomcat,elasticsearch,zookeeper,kafka等),DevOps(Jenkins+gitlab+sonarqube+nexus+k8s),CI/CD,监控(zabbix、prometheus、falcon)等 七、课程大纲
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值